• 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 
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