• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2025 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 GRAPHICS_EFFECT_CONTOUR_DIAGONAL_FLOW_LIGHT_SHADER_H
17 #define GRAPHICS_EFFECT_CONTOUR_DIAGONAL_FLOW_LIGHT_SHADER_H
18 
19 #include <queue>
20 #include "common/rs_vector4.h"
21 #include "effect/runtime_shader_builder.h"
22 #include "ge_shader.h"
23 #include "ge_shader_filter_params.h"
24 #include "utils/matrix.h"
25 #include "ge_shader_filter_params.h"
26 
27 namespace OHOS {
28 namespace Rosen {
29 
30 const int box4fSize = 4;
31 using Box4f = std::array<float, box4fSize>;
32 
33 struct Grid {
34     Box4f bbox;
35     std::vector<int> curveIndices;
36     bool curvesNumExceedLimit = false;
37 };
38 
39 class GEKawaseBlurShaderFilter;
40 class GE_EXPORT GEContourDiagonalFlowLightShader : public GEShader {
41 
42 public:
43     GEContourDiagonalFlowLightShader();
44     GEContourDiagonalFlowLightShader(Drawing::GEContentDiagonalFlowLightShaderParams& contourDiagonalFlowLightParams);
45     ~GEContourDiagonalFlowLightShader() override = default;
46     void MakeDrawingShader(const Drawing::Rect& rect, float progress) override;
GetDescription()47     const std::string GetDescription() const { return "GEContourDiagonalFlowLightShader"; }
SetGEContentDiagonalFlowLightShaderParams(const Drawing::GEContentDiagonalFlowLightShaderParams & params)48     void SetGEContentDiagonalFlowLightShaderParams(const Drawing::GEContentDiagonalFlowLightShaderParams& params)
49     {
50         contourDiagonalFlowLightParams_ = params;
51     }
52     void Preprocess(Drawing::Canvas& canvas, const Drawing::Rect& rect) override;
53     void DrawShader(Drawing::Canvas& canvas, const Drawing::Rect& rect) override;
54 private:
55     GEContourDiagonalFlowLightShader(const GEContourDiagonalFlowLightShader&) = delete;
56     GEContourDiagonalFlowLightShader(const GEContourDiagonalFlowLightShader&&) = delete;
57     GEContourDiagonalFlowLightShader& operator=(const GEContourDiagonalFlowLightShader&) = delete;
58     GEContourDiagonalFlowLightShader& operator=(const GEContourDiagonalFlowLightShader&&) = delete;
59     std::shared_ptr<Drawing::Image> DrawRuntimeShader(Drawing::Canvas& canvas, const Drawing::Rect& rect);
60     std::shared_ptr<Drawing::Image> BlendImg(Drawing::Canvas& canvas,
61         std::shared_ptr<Drawing::Image> precalculationImg,
62         std::shared_ptr<Drawing::Image> lightImg, std::shared_ptr<Drawing::Image> haloImg);
63     static std::shared_ptr<GEContourDiagonalFlowLightShader>
64         CreateFlowLightShader(Drawing::GEContentDiagonalFlowLightShaderParams& param);
65     std::shared_ptr<Drawing::RuntimeShaderBuilder> GetContourDiagonalFlowLightBuilder();
66     std::shared_ptr<Drawing::RuntimeShaderBuilder> GetFlowLightPrecalBuilder();
67     std::shared_ptr<Drawing::RuntimeShaderBuilder> FlowLightConvertBuilder();
68     Box4f ComputeCurveBoundingBox(size_t curveIndex, float maxThickness, int width, int height);
69     void CreateSurfaceAndCanvas(Drawing::Canvas& canvas, const Drawing::Rect& rect);
70     void PreCalculateRegion(Drawing::Canvas& canvas, int gridIndex,
71         const Drawing::Rect& wholeRect, const Drawing::Rect& rect);
72     void PreCalculateRegionForMoreCurves(Drawing::Canvas& mainCanvas, Drawing::Canvas& canvas, int gridIndex,
73         const Drawing::Rect& wholeRect, const Drawing::Rect& rect);
74     void AutoPartitionCal(Drawing::Canvas& canvas, const Drawing::Rect& rect);
75     void AutoGridPartition(int width, int height, float maxThickness);
76     void ComputeAllCurveBoundingBoxes(int width, int height, float maxThickness,
77                                       Box4f& canvasBBox, std::vector<Box4f>& curveBBoxes);
78     void InitializeWorkQueue(const Box4f& canvasBBox, const std::vector<Box4f>& curveBBoxes,
79                             std::queue<Grid>& workQueue);
80     void SplitGrid(const Grid& current, const std::vector<Box4f>& curveBBoxes,
81                   std::queue<Grid>& workQueue, float minGridSize);
82     std::vector<int> SelectTopCurves(const Grid& current, const std::vector<Box4f>& curveBBoxes,
83                                     size_t topK);
84     void ProcessFinalGrid(Grid& current, const std::vector<Box4f>& curveBBoxes, bool shouldLoopCurves);
85     std::shared_ptr<Drawing::Image> CreateImg(Drawing::Canvas& canvas, const Drawing::Rect& rect);
86     std::shared_ptr<Drawing::Image> CreateDrawImg(Drawing::Canvas& canvas, const Drawing::Rect& wholeRect,
87         const Drawing::Rect& rect, const Drawing::Brush& brush);
88     void ConvertImg(Drawing::Canvas& canvas, const Drawing::Rect& rect,
89         std::shared_ptr<Drawing::Image> sdfImg);
90     std::shared_ptr<Drawing::Image> LoopAllCurvesInBatches(Drawing::Canvas& mainCanvas, Drawing::Canvas& canvas,
91         int gridIndex, const Drawing::Rect& wholeRect, const Drawing::Rect& rect);
92     void ResizeCurvesData(int gridIndex, size_t subCurveCnt, size_t perSubCurveSize);
93 private:
94     int numCurves_ = 0;
95     int capacity_ = 0;
96     std::shared_ptr<Drawing::Surface> offscreenSurface_;
97     std::shared_ptr<Drawing::Canvas> offscreenCanvas_;
98     Drawing::GEContentDiagonalFlowLightShaderParams contourDiagonalFlowLightParams_;
99     std::shared_ptr<Drawing::RuntimeShaderBuilder> builder_;
100     std::vector<float> controlPoints_{}; // fix 64 X 2
101     size_t pointCnt_ = 0; // real input Point Cnt
102     std::shared_ptr<GEKawaseBlurShaderFilter> blurShader_ = nullptr;
103 
104     // grid : curves, boundingbox(xmin, xmax, ymin, ymax)
105     std::vector<std::pair<std::vector<float>, Box4f>> curvesInGrid_{};
106     std::vector<std::vector<float>> segmentIndex_{};
107 
108 };
109 
110 } // namespace Rosen
111 } // namespace OHOS
112 #endif // GRAPHICS_EFFECT_EXT_DOT_MATRIX_SHADER_H