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