• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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