1 /*
2  * Copyright (c) 2021-2023 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 #ifndef RENDER_SERVICE_CLIENT_CORE_PROPERTY_RS_PROPERTIES_PAINTER_H
17 #define RENDER_SERVICE_CLIENT_CORE_PROPERTY_RS_PROPERTIES_PAINTER_H
18 
19 #include "common/rs_macros.h"
20 #include "property/rs_properties.h"
21 #include "recording/draw_cmd_list.h"
22 #include "draw/surface.h"
23 #include "effect/runtime_shader_builder.h"
24 
25 namespace OHOS {
26 namespace Rosen {
27 namespace {
28 constexpr int MAX_LIGHT_SOURCES = 12;
29 }
30 class RSPaintFilterCanvas;
31 class RSDrawingFilter;
32 class RSDrawingFilterOriginal;
33 enum class FilterType {
34     BACKGROUND_FILTER,
35     FOREGROUND_FILTER,
36 };
37 class RSB_EXPORT RSPropertiesPainter {
38 public:
39     static void SetBgAntiAlias(bool forceBgAntiAlias);
40     static bool GetBgAntiAlias();
41     static void DrawBackground(const RSProperties& properties, RSPaintFilterCanvas& canvas,
42         bool isAntiAlias = true, bool isSurfaceView = false);
43     static void GetShadowDirtyRect(RectI& dirtyShadow, const RSProperties& properties,
44         const RRect* rrect = nullptr, bool isAbsCoordinate = true, bool radiusInclude = true);
45     static void GetForegroundEffectDirtyRect(RectI& dirtyForegroundEffect,
46         const RSProperties& properties, const bool isAbsCoordinate = true);
47     static void GetDistortionEffectDirtyRect(RectI& dirtyDistortionEffect, const RSProperties& properties);
48     static void DrawShadow(const RSProperties& properties, RSPaintFilterCanvas& canvas, const RRect* rrect = nullptr);
49     static int GetAndResetBlurCnt();
50     static void GetOutlineDirtyRect(RectI& dirtyOutline,
51         const RSProperties& properties, const bool isAbsCoordinate = true);
52     static void GetDarkColor(RSColor& color);
53     // todo: doublecheck if calculate correct
54     static void GetPixelStretchDirtyRect(RectI& dirtyPixelStretch,
55         const RSProperties& properties, const bool isAbsCoordinate = true);
56     static void DrawPixelStretch(const RSProperties& properties, RSPaintFilterCanvas& canvas);
57     static void DrawForegroundEffect(const RSProperties& properties, RSPaintFilterCanvas& canvas);
58     static void ApplyBackgroundEffect(const RSProperties& properties, RSPaintFilterCanvas& canvas);
59 
60     // Foreground Color filter
61     static void DrawColorFilter(const RSProperties& properties, RSPaintFilterCanvas& canvas);
62 
63     static void DrawBinarizationShader(const RSProperties& properties, RSPaintFilterCanvas& canvas);
64     static void DrawLightUpEffect(const RSProperties& properties, RSPaintFilterCanvas& canvas);
65     static void DrawDynamicLightUp(const RSProperties& properties, RSPaintFilterCanvas& canvas);
66     static void DrawDynamicDim(const RSProperties& properties, RSPaintFilterCanvas& canvas);
67     static void DrawParticle(const RSProperties& properties, RSPaintFilterCanvas& canvas);
68 
69     // BlendMode
70     static bool IsDangerousBlendMode(int blendMode, int blendApplyType);
71 
72     static void Clip(Drawing::Canvas& canvas, RectF rect, bool isAntiAlias = true);
73     static void DrawBorder(const RSProperties& properties, Drawing::Canvas& canvas);
74     static void DrawOutline(const RSProperties& properties, Drawing::Canvas& canvas);
75     static void DrawLight(const RSProperties& properties, Drawing::Canvas& canvas);
76     static void DrawFrame(
77         const RSProperties& properties, RSPaintFilterCanvas& canvas, Drawing::DrawCmdListPtr& drawCmdList);
78     static void DrawFilter(const RSProperties& properties, RSPaintFilterCanvas& canvas, FilterType filterType,
79         const std::optional<Drawing::Rect>& rect = std::nullopt,
80         const std::shared_ptr<RSFilter>& externalFilter = nullptr);
81     static void DrawForegroundFilter(const RSProperties& properties, RSPaintFilterCanvas& canvas);
82     static void DrawForegroundColor(const RSProperties& properties, Drawing::Canvas& canvas);
83     static void DrawMask(const RSProperties& properties, Drawing::Canvas& canvas);
84     static void DrawMask(const RSProperties& properties, Drawing::Canvas& canvas, Drawing::Rect maskBounds);
85     static bool GetGravityMatrix(Gravity gravity, RectF rect, float w, float h, Drawing::Matrix& mat);
86     static Drawing::RoundRect RRect2DrawingRRect(const RRect& rr);
87     static Drawing::Rect Rect2DrawingRect(const RectF& r);
88     static Drawing::ColorQuad CalcAverageColor(std::shared_ptr<Drawing::Image> imageSnapshot);
89     static void DrawSpherize(const RSProperties& properties, RSPaintFilterCanvas& canvas,
90         const std::shared_ptr<Drawing::Surface>& spherizeSurface);
91     static std::shared_ptr<Drawing::Blender> MakeDynamicLightUpBlender(
92         float dynamicLightUpRate, float dynamicLightUpDeg);
93     static std::shared_ptr<Drawing::Image> DrawGreyAdjustment(
94         Drawing::Canvas& canvas, const std::shared_ptr<Drawing::Image>& image, const Vector2f& greyCoef);
95     static std::shared_ptr<Drawing::Blender> MakeLightUpEffectBlender(const float lightUpDeg);
96 
97     // EffectView and useEffect
98     static void DrawBackgroundImageAsEffect(const RSProperties& properties, RSPaintFilterCanvas& canvas);
99     static void DrawBackgroundEffect(const RSProperties& properties, RSPaintFilterCanvas& canvas);
100 
101     static const bool BLUR_ENABLED;
102     static const bool FOREGROUND_FILTER_ENABLED;
103 
104 private:
105     static void ApplyBackgroundEffectFallback(const RSProperties& properties, RSPaintFilterCanvas& canvas);
106     static RRect GetRRectForDrawingBorder(const RSProperties& properties, const std::shared_ptr<RSBorder>& border,
107         const bool isOutline);
108     static RRect GetInnerRRectForDrawingBorder(const RSProperties& properties, const std::shared_ptr<RSBorder>& border,
109         const bool isOutline);
110     static void ClipVisibleCanvas(const RSProperties& properties, RSPaintFilterCanvas& canvas);
111 
112     static void DrawColorfulShadowInner(
113         const RSProperties& properties, RSPaintFilterCanvas& canvas, Drawing::Path& path);
114     static void DrawShadowInner(const RSProperties& properties, RSPaintFilterCanvas& canvas, Drawing::Path& path);
115     static void DrawLightInner(const RSProperties& properties, Drawing::Canvas& canvas,
116         std::shared_ptr<Drawing::RuntimeShaderBuilder>& lightBuilder,
117         const std::vector<std::pair<std::shared_ptr<RSLightSource>, Vector4f>>& lightSourcesAndPosVec);
118     static void DrawContentLight(const RSProperties& properties, Drawing::Canvas& canvas,
119         std::shared_ptr<Drawing::RuntimeShaderBuilder>& lightBuilder, Drawing::Brush& brush,
120         const std::array<float, MAX_LIGHT_SOURCES>& lightIntensityArray);
121     static void DrawBorderLight(const RSProperties& properties, Drawing::Canvas& canvas,
122         std::shared_ptr<Drawing::RuntimeShaderBuilder>& lightBuilder, Drawing::Pen& pen,
123         const std::array<float, MAX_LIGHT_SOURCES>& lightIntensityArray);
124     static std::shared_ptr<Drawing::ShaderEffect> MakeLightUpEffectShader(
125         float lightUpDeg, std::shared_ptr<Drawing::ShaderEffect> imageShader);
126     static std::shared_ptr<Drawing::ShaderEffect> MakeDynamicDimShader(
127         float dynamicDimDeg, std::shared_ptr<Drawing::ShaderEffect> imageShader);
128     static std::shared_ptr<Drawing::ShaderEffect> MakeBinarizationShader(float low, float high,
129         float thresholdLow, float thresholdHigh,
130         std::shared_ptr<Drawing::ShaderEffect> imageShader);
131     static std::shared_ptr<Drawing::RuntimeEffect> MakeGreyAdjustmentEffect();
132 
133     static void DrawBorderBase(const RSProperties& properties, Drawing::Canvas& canvas,
134         const std::shared_ptr<RSBorder>& border, const bool isOutline);
135     static const std::shared_ptr<Drawing::RuntimeShaderBuilder>& GetPhongShaderBuilder();
136 
137     static std::shared_ptr<Drawing::RuntimeEffect> greyAdjustEffect_;
138     static std::shared_ptr<Drawing::RuntimeEffect> binarizationShaderEffect_;
139     static std::shared_ptr<Drawing::RuntimeEffect> lightUpEffectShaderEffect_;
140     static std::shared_ptr<Drawing::RuntimeEffect> dynamicLightUpBlenderEffect_;
141     static std::shared_ptr<Drawing::RuntimeEffect> dynamicDimShaderEffect_;
142     static std::shared_ptr<Drawing::RuntimeEffect> lightUpEffectBlender_;
143     inline static int g_blurCnt = 0;
144 };
145 } // namespace Rosen
146 } // namespace OHOS
147 
148 #endif // RENDER_SERVICE_CLIENT_CORE_PROPERTY_RS_PROPERTIES_PAINTER_H
149