From 31deabeb07941990cb7b97164c47753fb3e76893 Mon Sep 17 00:00:00 2001 From: pengpenglottie Date: Thu, 29 Jun 2023 22:11:37 +0800 Subject: [PATCH] rotation problem Signed-off-by: pengpenglottie Change-Id: I2223af8d4b68b8a3238fe2d1b96d57abdfe7509e --- .../include/property/rs_properties_painter.h | 7 ++- .../src/property/rs_properties_painter.cpp | 58 ++++++++++++++++++- 2 files changed, 60 insertions(+), 5 deletions(-) diff --git a/rosen/modules/render_service_base/include/property/rs_properties_painter.h b/rosen/modules/render_service_base/include/property/rs_properties_painter.h index bbf0f809b6..211eb9e661 100644 --- a/rosen/modules/render_service_base/include/property/rs_properties_painter.h +++ b/rosen/modules/render_service_base/include/property/rs_properties_painter.h @@ -84,9 +84,11 @@ private: static void DrawColorfulShadowInner(const RSProperties& properties, RSPaintFilterCanvas& canvas, SkPath& path); static void DrawShadowInner(const RSProperties& properties, RSPaintFilterCanvas& canvas, SkPath& path); #ifdef NEW_SKIA - static bool GetGradientDirectionPoints(SkPoint* pts, const SkRect& clipBounds, GradientDirection direction); + static bool GetGradientDirectionPoints(SkPoint* pts, + const SkRect& clipBounds, GradientDirection direction); + static void TransformGradientBlurDirection(uint8_t& direction, const uint8_t directionBias); static sk_sp MakeAlphaGradientShader(const SkRect& clipBounds, - const std::shared_ptr& para); + const std::shared_ptr& para, uint8_t directionBias); static sk_sp MakeHorizontalMeanBlurShader(float radiusIn, sk_sp shader, sk_sp gradientShader); static sk_sp MakeVerticalMeanBlurShader(float radiusIn, @@ -96,6 +98,7 @@ private: float radius, sk_sp alphaGradientShader, const SkIRect& clipIPadding); static void DrawVerticalLinearGradientBlur(SkSurface* skSurface, RSPaintFilterCanvas& canvas, float radius, sk_sp alphaGradientShader, const SkIRect& clipIPadding); + static uint8_t CalcDirectionBias(const SkMatrix& mat); #endif #else static void Clip(Drawing::Canvas& canvas, RectF rect); diff --git a/rosen/modules/render_service_base/src/property/rs_properties_painter.cpp b/rosen/modules/render_service_base/src/property/rs_properties_painter.cpp index 77e0d11d71..80228db4f5 100644 --- a/rosen/modules/render_service_base/src/property/rs_properties_painter.cpp +++ b/rosen/modules/render_service_base/src/property/rs_properties_painter.cpp @@ -69,6 +69,8 @@ constexpr float MAX_TRANS_RATIO = 0.95f; constexpr float MIN_SPOT_RATIO = 1.0f; constexpr float MAX_SPOT_RATIO = 1.95f; constexpr float MAX_AMBIENT_RADIUS = 150.0f; +constexpr static float FLOAT_ZERO_THRESHOLD = 0.001f; +constexpr static uint8_t DIRECTION_NUM = 4; } // namespace #ifndef USE_ROSEN_DRAWING @@ -770,14 +772,47 @@ bool RSPropertiesPainter::GetGradientDirectionPoints( } return true; } +void RSPropertiesPainter::TransformGradientBlurDirection(uint8_t& direction, const uint8_t directionBias) +{ + if (direction == static_cast(GradientDirection::LEFT_BOTTOM)) { + direction += 2; // 2 is used to transtorm diagnal direction. + } else if (direction == static_cast(GradientDirection::RIGHT_TOP) || + direction == static_cast(GradientDirection::RIGHT_BOTTOM)) { + direction -= 1; // 1 is used to transtorm diagnal direction. + } + if (direction <= static_cast(GradientDirection::BOTTOM)) { + if (direction < directionBias) { + direction += DIRECTION_NUM; + } + direction -= directionBias; + } else { + direction -= DIRECTION_NUM; + if (direction < directionBias) { + direction += DIRECTION_NUM; + } + direction -= directionBias; + direction += DIRECTION_NUM; + } + if (direction == static_cast(GradientDirection::RIGHT_BOTTOM)) { + direction -= 2; // 2 is used to restore diagnal direction. + } else if (direction == static_cast(GradientDirection::LEFT_BOTTOM) || + direction == static_cast(GradientDirection::RIGHT_TOP)) { + direction += 1; // 1 is used to restore diagnal direction. + } +} sk_sp RSPropertiesPainter::MakeAlphaGradientShader( - const SkRect& clipBounds, const std::shared_ptr& para) + const SkRect& clipBounds, const std::shared_ptr& para, uint8_t directionBias) { std::vector c; std::vector p; SkPoint pts[2]; - bool result = GetGradientDirectionPoints(pts, clipBounds, para->direction_); + uint8_t direction = static_cast(para->direction_); + if (directionBias != 0) { + TransformGradientBlurDirection(direction, directionBias); + } + bool result = GetGradientDirectionPoints( + pts, clipBounds, static_cast(direction)); if (!result) { return nullptr; } @@ -905,6 +940,21 @@ void RSPropertiesPainter::DrawVerticalLinearGradientBlur(SkSurface* skSurface, R paint.setShader(shader); canvas.drawRect(SkRect::Make(clipIPadding.makeOffset(-clipIPadding.left(), -clipIPadding.top())), paint); } + +uint8_t RSPropertiesPainter::CalcDirectionBias(const SkMatrix& mat) { + uint8_t directionBias = 0; + // 1 and 3 represents rotate matrix's index + if ((mat.get(1) > FLOAT_ZERO_THRESHOLD) && (mat.get(3) < (0 - FLOAT_ZERO_THRESHOLD))) { + directionBias = 1; // 1 represents rotate 90 degree + // 0 and 4 represents rotate matrix's index + } else if ((mat.get(0) < (0 - FLOAT_ZERO_THRESHOLD)) && (mat.get(4) < (0 - FLOAT_ZERO_THRESHOLD))) { + directionBias = 2; // 2 represents rotate 180 degree + // 1 and 3 represents rotate matrix's index + } else if ((mat.get(1) < (0 - FLOAT_ZERO_THRESHOLD)) && (mat.get(3) > FLOAT_ZERO_THRESHOLD)) { + directionBias = 3; // 3 represents rotate 270 degree + } + return directionBias; +} #endif void RSPropertiesPainter::DrawLinearGradientBlurFilter( @@ -926,9 +976,11 @@ void RSPropertiesPainter::DrawLinearGradientBlurFilter( auto clipBounds = canvas.getDeviceClipBounds(); auto clipIPadding = clipBounds.makeOutset(-1, -1); + SkMatrix mat = canvas.getTotalMatrix(); + uint8_t directionBias = CalcDirectionBias(mat); auto para = properties.GetLinearGradientBlurPara(); - auto alphaGradientShader = MakeAlphaGradientShader(SkRect::Make(clipIPadding), para); + auto alphaGradientShader = MakeAlphaGradientShader(SkRect::Make(clipIPadding), para, directionBias); if (alphaGradientShader == nullptr) { ROSEN_LOGE("RSPropertiesPainter::DrawLinearGradientBlurFilter alphaGradientShader null"); return;