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 #include "skia_adapter/skia_shader_effect.h"
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,const Matrix * matrix)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,
72 const Matrix *matrix) noexcept
73 : ShaderEffect()
74 {
75 type_ = t;
76 impl_->InitWithTwoPointConical(startPt, startRadius, endPt, endRadius, colors, pos, mode, matrix);
77 }
78
ShaderEffect(ShaderEffectType t,const Point & centerPt,const std::vector<ColorQuad> & colors,const std::vector<scalar> & pos,TileMode mode,scalar startAngle,scalar endAngle,const Matrix * matrix)79 ShaderEffect::ShaderEffect(ShaderEffectType t, const Point& centerPt, const std::vector<ColorQuad>& colors,
80 const std::vector<scalar>& pos, TileMode mode, scalar startAngle, scalar endAngle, const Matrix *matrix) noexcept
81 : ShaderEffect()
82 {
83 type_ = t;
84 impl_->InitWithSweepGradient(centerPt, colors, pos, mode, startAngle, endAngle, matrix);
85 }
86
ShaderEffect()87 ShaderEffect::ShaderEffect() noexcept
88 : type_(ShaderEffect::ShaderEffectType::NO_TYPE), impl_(ImplFactory::CreateShaderEffectImpl())
89 {}
90
ShaderEffect(ShaderEffectType t)91 ShaderEffect::ShaderEffect(ShaderEffectType t) noexcept
92 : type_(t), impl_(ImplFactory::CreateShaderEffectImpl())
93 {}
94
GetType() const95 ShaderEffect::ShaderEffectType ShaderEffect::GetType() const
96 {
97 return type_;
98 }
99
CreateColorShader(ColorQuad color)100 std::shared_ptr<ShaderEffect> ShaderEffect::CreateColorShader(ColorQuad color)
101 {
102 return std::make_shared<ShaderEffect>(ShaderEffect::ShaderEffectType::COLOR_EFFECT, color);
103 }
104
CreateBlendShader(ShaderEffect & dst,ShaderEffect & src,BlendMode mode)105 std::shared_ptr<ShaderEffect> ShaderEffect::CreateBlendShader(ShaderEffect& dst, ShaderEffect& src, BlendMode mode)
106 {
107 return std::make_shared<ShaderEffect>(ShaderEffect::ShaderEffectType::BLEND, dst, src, mode);
108 }
109
CreateImageShader(const Image & image,TileMode tileX,TileMode tileY,const SamplingOptions & sampling,const Matrix & matrix)110 std::shared_ptr<ShaderEffect> ShaderEffect::CreateImageShader(
111 const Image& image, TileMode tileX, TileMode tileY, const SamplingOptions& sampling, const Matrix& matrix)
112 {
113 return std::make_shared<ShaderEffect>(ShaderEffect::ShaderEffectType::IMAGE, image, tileX, tileY, sampling, matrix);
114 }
115
CreatePictureShader(const Picture & picture,TileMode tileX,TileMode tileY,FilterMode mode,const Matrix & matrix,const Rect & rect)116 std::shared_ptr<ShaderEffect> ShaderEffect::CreatePictureShader(
117 const Picture& picture, TileMode tileX, TileMode tileY, FilterMode mode, const Matrix& matrix, const Rect& rect)
118 {
119 return std::make_shared<ShaderEffect>(
120 ShaderEffect::ShaderEffectType::PICTURE, picture, tileX, tileY, mode, matrix, rect);
121 }
122
CreateLinearGradient(const Point & startPt,const Point & endPt,const std::vector<ColorQuad> & colors,const std::vector<scalar> & pos,TileMode mode)123 std::shared_ptr<ShaderEffect> ShaderEffect::CreateLinearGradient(const Point& startPt, const Point& endPt,
124 const std::vector<ColorQuad>& colors, const std::vector<scalar>& pos, TileMode mode)
125 {
126 return std::make_shared<ShaderEffect>(
127 ShaderEffect::ShaderEffectType::LINEAR_GRADIENT, startPt, endPt, colors, pos, mode);
128 }
129
CreateRadialGradient(const Point & centerPt,scalar radius,const std::vector<ColorQuad> & colors,const std::vector<scalar> & pos,TileMode mode)130 std::shared_ptr<ShaderEffect> ShaderEffect::CreateRadialGradient(const Point& centerPt, scalar radius,
131 const std::vector<ColorQuad>& colors, const std::vector<scalar>& pos, TileMode mode)
132 {
133 return std::make_shared<ShaderEffect>(
134 ShaderEffect::ShaderEffectType::RADIAL_GRADIENT, centerPt, radius, colors, pos, mode);
135 }
136
CreateTwoPointConical(const Point & startPt,scalar startRadius,const Point & endPt,scalar endRadius,const std::vector<ColorQuad> & colors,const std::vector<scalar> & pos,TileMode mode,const Matrix * matrix)137 std::shared_ptr<ShaderEffect> ShaderEffect::CreateTwoPointConical(const Point& startPt, scalar startRadius,
138 const Point& endPt, scalar endRadius, const std::vector<ColorQuad>& colors, const std::vector<scalar>& pos,
139 TileMode mode, const Matrix *matrix)
140 {
141 return std::make_shared<ShaderEffect>(
142 ShaderEffect::ShaderEffectType::CONICAL_GRADIENT, startPt, startRadius, endPt, endRadius, colors, pos, mode,
143 matrix);
144 }
145
CreateSweepGradient(const Point & centerPt,const std::vector<ColorQuad> & colors,const std::vector<scalar> & pos,TileMode mode,scalar startAngle,scalar endAngle,const Matrix * matrix)146 std::shared_ptr<ShaderEffect> ShaderEffect::CreateSweepGradient(const Point& centerPt,
147 const std::vector<ColorQuad>& colors, const std::vector<scalar>& pos, TileMode mode, scalar startAngle,
148 scalar endAngle, const Matrix *matrix)
149 {
150 return std::make_shared<ShaderEffect>(
151 ShaderEffect::ShaderEffectType::SWEEP_GRADIENT, centerPt, colors, pos, mode, startAngle, endAngle, matrix);
152 }
153
Serialize() const154 std::shared_ptr<Data> ShaderEffect::Serialize() const
155 {
156 return impl_->Serialize();
157 }
158
Deserialize(std::shared_ptr<Data> data)159 bool ShaderEffect::Deserialize(std::shared_ptr<Data> data)
160 {
161 return impl_->Deserialize(data);
162 }
163
ExportSkShader()164 const sk_sp<SkShader> ShaderEffect::ExportSkShader()
165 {
166 return GetImpl<SkiaShaderEffect>()->GetShader();
167 }
168
SetSkShader(sk_sp<SkShader> shader)169 void ShaderEffect::SetSkShader(sk_sp<SkShader> shader)
170 {
171 GetImpl<SkiaShaderEffect>()->SetSkShader(shader);
172 }
173
174 } // namespace Drawing
175 } // namespace Rosen
176 } // namespace OHOS
177