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