1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "effect/shader_effect.h"
17
18 #include "impl_factory.h"
19
20 #include "impl_interface/mask_filter_impl.h"
21
22 namespace OHOS {
23 namespace Rosen {
24 namespace Drawing {
ShaderEffect(ShaderEffectType t,ColorQuad color)25 ShaderEffect::ShaderEffect(ShaderEffectType t, ColorQuad color) noexcept : ShaderEffect()
26 {
27 type_ = t;
28 impl_->InitWithColor(color);
29 }
30
ShaderEffect(ShaderEffectType t,ShaderEffect & dst,ShaderEffect & src,BlendMode mode)31 ShaderEffect::ShaderEffect(ShaderEffectType t, ShaderEffect& dst, ShaderEffect& src, BlendMode mode) noexcept
32 : ShaderEffect()
33 {
34 type_ = t;
35 impl_->InitWithBlend(dst, src, mode);
36 }
37
ShaderEffect(ShaderEffectType t,const Image & image,TileMode tileX,TileMode tileY,const SamplingOptions & sampling,const Matrix & matrix)38 ShaderEffect::ShaderEffect(ShaderEffectType t, const Image& image, TileMode tileX, TileMode tileY,
39 const SamplingOptions& sampling, const Matrix& matrix) noexcept
40 : ShaderEffect()
41 {
42 type_ = t;
43 impl_->InitWithImage(image, tileX, tileY, sampling, matrix);
44 }
45
ShaderEffect(ShaderEffectType t,const Picture & picture,TileMode tileX,TileMode tileY,FilterMode mode,const Matrix & matrix,const Rect & rect)46 ShaderEffect::ShaderEffect(ShaderEffectType t, const Picture& picture, TileMode tileX, TileMode tileY, FilterMode mode,
47 const Matrix& matrix, const Rect& rect) noexcept
48 : ShaderEffect()
49 {
50 type_ = t;
51 impl_->InitWithPicture(picture, tileX, tileY, mode, matrix, rect);
52 }
53
ShaderEffect(ShaderEffectType t,const Point & startPt,const Point & endPt,const std::vector<ColorQuad> & colors,const std::vector<scalar> & pos,TileMode mode)54 ShaderEffect::ShaderEffect(ShaderEffectType t, const Point& startPt, const Point& endPt,
55 const std::vector<ColorQuad>& colors, const std::vector<scalar>& pos, TileMode mode) noexcept
56 : ShaderEffect()
57 {
58 type_ = t;
59 impl_->InitWithLinearGradient(startPt, endPt, colors, pos, mode);
60 }
61
ShaderEffect(ShaderEffectType t,const Point & centerPt,scalar radius,const std::vector<ColorQuad> & colors,const std::vector<scalar> & pos,TileMode mode)62 ShaderEffect::ShaderEffect(ShaderEffectType t, const Point& centerPt, scalar radius,
63 const std::vector<ColorQuad>& colors, const std::vector<scalar>& pos, TileMode mode) noexcept
64 : ShaderEffect()
65 {
66 type_ = t;
67 impl_->InitWithRadialGradient(centerPt, radius, colors, pos, mode);
68 }
69
ShaderEffect(ShaderEffectType t,const Point & startPt,scalar startRadius,const Point & endPt,scalar endRadius,const std::vector<ColorQuad> & colors,const std::vector<scalar> & pos,TileMode mode)70 ShaderEffect::ShaderEffect(ShaderEffectType t, const Point& startPt, scalar startRadius, const Point& endPt,
71 scalar endRadius, const std::vector<ColorQuad>& colors, const std::vector<scalar>& pos, TileMode mode) noexcept
72 : ShaderEffect()
73 {
74 type_ = t;
75 impl_->InitWithTwoPointConical(startPt, startRadius, endPt, endRadius, colors, pos, mode);
76 }
77
ShaderEffect(ShaderEffectType t,const Point & centerPt,const std::vector<ColorQuad> & colors,const std::vector<scalar> & pos,TileMode mode,scalar startAngle,scalar endAngle)78 ShaderEffect::ShaderEffect(ShaderEffectType t, const Point& centerPt, const std::vector<ColorQuad>& colors,
79 const std::vector<scalar>& pos, TileMode mode, scalar startAngle, scalar endAngle) noexcept
80 : ShaderEffect()
81 {
82 type_ = t;
83 impl_->InitWithSweepGradient(centerPt, colors, pos, mode, startAngle, endAngle);
84 }
85
ShaderEffect()86 ShaderEffect::ShaderEffect() noexcept
87 : type_(ShaderEffect::ShaderEffectType::NO_TYPE), impl_(ImplFactory::CreateShaderEffectImpl())
88 {}
89
GetType() const90 ShaderEffect::ShaderEffectType ShaderEffect::GetType() const
91 {
92 return type_;
93 }
94
CreateColorShader(ColorQuad color)95 std::shared_ptr<ShaderEffect> ShaderEffect::CreateColorShader(ColorQuad color)
96 {
97 return std::make_shared<ShaderEffect>(ShaderEffect::ShaderEffectType::COLOR, color);
98 }
99
CreateBlendShader(ShaderEffect & dst,ShaderEffect & src,BlendMode mode)100 std::shared_ptr<ShaderEffect> ShaderEffect::CreateBlendShader(ShaderEffect& dst, ShaderEffect& src, BlendMode mode)
101 {
102 return std::make_shared<ShaderEffect>(ShaderEffect::ShaderEffectType::BLEND, dst, src, mode);
103 }
104
CreateImageShader(const Image & image,TileMode tileX,TileMode tileY,const SamplingOptions & sampling,const Matrix & matrix)105 std::shared_ptr<ShaderEffect> ShaderEffect::CreateImageShader(
106 const Image& image, TileMode tileX, TileMode tileY, const SamplingOptions& sampling, const Matrix& matrix)
107 {
108 return std::make_shared<ShaderEffect>(ShaderEffect::ShaderEffectType::IMAGE, image, tileX, tileY, sampling, matrix);
109 }
110
CreatePictureShader(const Picture & picture,TileMode tileX,TileMode tileY,FilterMode mode,const Matrix & matrix,const Rect & rect)111 std::shared_ptr<ShaderEffect> ShaderEffect::CreatePictureShader(
112 const Picture& picture, TileMode tileX, TileMode tileY, FilterMode mode, const Matrix& matrix, const Rect& rect)
113 {
114 return std::make_shared<ShaderEffect>(
115 ShaderEffect::ShaderEffectType::PICTURE, picture, tileX, tileY, mode, matrix, rect);
116 }
117
CreateLinearGradient(const Point & startPt,const Point & endPt,const std::vector<ColorQuad> & colors,const std::vector<scalar> & pos,TileMode mode)118 std::shared_ptr<ShaderEffect> ShaderEffect::CreateLinearGradient(const Point& startPt, const Point& endPt,
119 const std::vector<ColorQuad>& colors, const std::vector<scalar>& pos, TileMode mode)
120 {
121 return std::make_shared<ShaderEffect>(
122 ShaderEffect::ShaderEffectType::LINEAR_GRADIENT, startPt, endPt, colors, pos, mode);
123 }
124
CreateRadialGradient(const Point & centerPt,scalar radius,const std::vector<ColorQuad> & colors,const std::vector<scalar> & pos,TileMode mode)125 std::shared_ptr<ShaderEffect> ShaderEffect::CreateRadialGradient(const Point& centerPt, scalar radius,
126 const std::vector<ColorQuad>& colors, const std::vector<scalar>& pos, TileMode mode)
127 {
128 return std::make_shared<ShaderEffect>(
129 ShaderEffect::ShaderEffectType::RADIAL_GRADIENT, centerPt, radius, colors, pos, mode);
130 }
131
CreateTwoPointConical(const Point & startPt,scalar startRadius,const Point & endPt,scalar endRadius,const std::vector<ColorQuad> & colors,const std::vector<scalar> & pos,TileMode mode)132 std::shared_ptr<ShaderEffect> ShaderEffect::CreateTwoPointConical(const Point& startPt, scalar startRadius,
133 const Point& endPt, scalar endRadius, const std::vector<ColorQuad>& colors, const std::vector<scalar>& pos,
134 TileMode mode)
135 {
136 return std::make_shared<ShaderEffect>(
137 ShaderEffect::ShaderEffectType::CONICAL_GRADIENT, startPt, startRadius, endPt, endRadius, colors, pos, mode);
138 }
139
CreateSweepGradient(const Point & centerPt,const std::vector<ColorQuad> & colors,const std::vector<scalar> & pos,TileMode mode,scalar startAngle,scalar endAngle)140 std::shared_ptr<ShaderEffect> ShaderEffect::CreateSweepGradient(const Point& centerPt,
141 const std::vector<ColorQuad>& colors, const std::vector<scalar>& pos, TileMode mode, scalar startAngle,
142 scalar endAngle)
143 {
144 return std::make_shared<ShaderEffect>(
145 ShaderEffect::ShaderEffectType::SWEEP_GRADIENT, centerPt, colors, pos, mode, startAngle, endAngle);
146 }
147 } // namespace Drawing
148 } // namespace Rosen
149 } // namespace OHOS
150