diff options
author | Luboš Luňák <l.lunak@collabora.com> | 2020-11-17 16:49:19 +0100 |
---|---|---|
committer | Luboš Luňák <l.lunak@collabora.com> | 2020-11-17 19:25:42 +0100 |
commit | 8b8a988f38b704e466211bb91a3269756c34222b (patch) | |
tree | a624280e23a7949334d010a9e3774ac1f8b2bdb4 | |
parent | 97f084b10caa971ee08730c80a3c3cde85c9475e (diff) |
implement also axial gradient for skia
Change-Id: Ie708250f970f2ce08c8c89e4bf001a5df23b99bb
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106015
Tested-by: Jenkins
Reviewed-by: Luboš Luňák <l.lunak@collabora.com>
-rw-r--r-- | vcl/backendtest/outputdevice/common.cxx | 6 | ||||
-rw-r--r-- | vcl/skia/gdiimpl.cxx | 13 |
2 files changed, 16 insertions, 3 deletions
diff --git a/vcl/backendtest/outputdevice/common.cxx b/vcl/backendtest/outputdevice/common.cxx index a002868715b8..2f893141e895 100644 --- a/vcl/backendtest/outputdevice/common.cxx +++ b/vcl/backendtest/outputdevice/common.cxx @@ -642,9 +642,9 @@ TestResult OutputDeviceTestCommon::checkAxialGradient(Bitmap& bitmap) for(int y = 1; y <= 11; ++y) { // Middle horizontal line is white, gradients to the sides. - checkValue(pAccess, 6, y, COL_WHITE, nNumberOfQuirks, nNumberOfErrors, false); - checkValue(pAccess, 1, y, COL_BLACK, nNumberOfQuirks, nNumberOfErrors, false); - checkValue(pAccess, 11, y, COL_BLACK, nNumberOfQuirks, nNumberOfErrors, false); + checkValue(pAccess, 6, y, COL_WHITE, nNumberOfQuirks, nNumberOfErrors, 255 / 10, 255 / 5); + checkValue(pAccess, 1, y, COL_BLACK, nNumberOfQuirks, nNumberOfErrors, 255 / 10, 255 / 5); + checkValue(pAccess, 11, y, COL_BLACK, nNumberOfQuirks, nNumberOfErrors, 255 / 10, 255 / 5); if( !checkGradient( pAccess, 1, y, 6, 1, 0 )) return TestResult::Failed; if( !checkGradient( pAccess, 11, y, 6, -1, 0 )) diff --git a/vcl/skia/gdiimpl.cxx b/vcl/skia/gdiimpl.cxx index d89ec093a964..1f1c4002f94d 100644 --- a/vcl/skia/gdiimpl.cxx +++ b/vcl/skia/gdiimpl.cxx @@ -1807,6 +1807,7 @@ bool SkiaSalGraphicsImpl::drawGradient(const tools::PolyPolygon& rPolyPolygon, const Gradient& rGradient) { if (rGradient.GetStyle() != GradientStyle::Linear + && rGradient.GetStyle() != GradientStyle::Axial && rGradient.GetStyle() != GradientStyle::Radial) return false; // unsupported if (rGradient.GetSteps() != 0) @@ -1852,6 +1853,18 @@ bool SkiaSalGraphicsImpl::drawGradient(const tools::PolyPolygon& rPolyPolygon, SkScalar pos[2] = { SkDoubleToScalar(aGradient.GetBorder() / 100.0), 1.0 }; shader = SkGradientShader::MakeLinear(points, colors, pos, 2, SkTileMode::kClamp); } + else if (rGradient.GetStyle() == GradientStyle::Axial) + { + tools::Polygon aPoly(aBoundRect); + aPoly.Rotate(aCenter, aGradient.GetAngle() % Degree10(3600)); + SkPoint points[2] = { SkPoint::Make(toSkX(aPoly[0].X()), toSkY(aPoly[0].Y())), + SkPoint::Make(toSkX(aPoly[1].X()), toSkY(aPoly[1].Y())) }; + SkColor colors[3] = { endColor, startColor, endColor }; + SkScalar border = SkDoubleToScalar(aGradient.GetBorder() / 100.0); + SkScalar pos[3] + = { std::min<SkScalar>(border, 0.5), 0.5, std::max<SkScalar>(1 - border, 0.5) }; + shader = SkGradientShader::MakeLinear(points, colors, pos, 3, SkTileMode::kClamp); + } else { // Move the center by (-1,-1) (the default VCL algorithm is a bit off-center that way, |