summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuboš Luňák <l.lunak@collabora.com>2020-11-17 16:49:19 +0100
committerLuboš Luňák <l.lunak@collabora.com>2020-11-17 19:25:42 +0100
commit8b8a988f38b704e466211bb91a3269756c34222b (patch)
treea624280e23a7949334d010a9e3774ac1f8b2bdb4
parent97f084b10caa971ee08730c80a3c3cde85c9475e (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.cxx6
-rw-r--r--vcl/skia/gdiimpl.cxx13
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,