canvas/source/vcl/canvashelper_texturefill.cxx | 44 +++++++++++++++++++++++++ 1 file changed, 44 insertions(+)
New commits: commit a46cb5dc607d1d1af402ff3e8fce731e7427854d Author: Luboš Luňák <l.lu...@collabora.com> AuthorDate: Tue Nov 17 16:52:38 2020 +0100 Commit: Luboš Luňák <l.lu...@collabora.com> CommitDate: Tue Nov 17 19:25:58 2020 +0100 try to use directly VCL's DrawGradient() in vclcanvas (tdf#136523) VCL implementations may have an optimized implementation, and with Skia decomposing to polygons also causes drawing problems. Change-Id: Ib1e317c627f01a43b77b9a8ee2335f4e319c37e2 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106016 Tested-by: Jenkins Reviewed-by: Luboš Luňák <l.lu...@collabora.com> diff --git a/canvas/source/vcl/canvashelper_texturefill.cxx b/canvas/source/vcl/canvashelper_texturefill.cxx index 501e91f2782c..857710acb102 100644 --- a/canvas/source/vcl/canvashelper_texturefill.cxx +++ b/canvas/source/vcl/canvashelper_texturefill.cxx @@ -39,6 +39,7 @@ #include <vcl/bitmapex.hxx> #include <vcl/canvastools.hxx> #include <vcl/virdev.hxx> +#include <vcl/gradient.hxx> #include <canvas/canvastools.hxx> #include <parametricpolypolygon.hxx> @@ -144,6 +145,49 @@ namespace vclcanvas // render gradient // =============== + // First try to use directly VCL's DrawGradient(), as that one is generally + // a better choice than here decomposing to polygons. The VCL API allows + // only 2 colors, but that should generally do. + // Do not use nStepCount, it limits optimized implementations, and it's computed + // by vclcanvas based on number of colors, so it's practically irrelevant. + + // 2 colors and 2 stops (at 0 and 1) is a linear gradient: + if( rColors.size() == 2 && rValues.maStops.size() == 2 && rValues.maStops[0] == 0 && rValues.maStops[1] == 1) + { + Gradient vclGradient( GradientStyle::Linear, rColors[ 0 ], rColors[ 1 ] ); + ::tools::Polygon aTempPoly( static_cast<sal_uInt16>(5) ); + aTempPoly[0] = ::Point( ::basegfx::fround( aLeftTop.getX() ), + ::basegfx::fround( aLeftTop.getY() ) ); + aTempPoly[1] = ::Point( ::basegfx::fround( aRightTop.getX() ), + ::basegfx::fround( aRightTop.getY() ) ); + aTempPoly[2] = ::Point( ::basegfx::fround( aRightBottom.getX() ), + ::basegfx::fround( aRightBottom.getY() ) ); + aTempPoly[3] = ::Point( ::basegfx::fround( aLeftBottom.getX() ), + ::basegfx::fround( aLeftBottom.getY() ) ); + aTempPoly[4] = aTempPoly[0]; + rOutDev.DrawGradient( aTempPoly, vclGradient ); + return; + } + // 3 colors with first and last being equal and 3 stops (at 0, 0.5 and 1) is an axial gradient: + if( rColors.size() == 3 && rColors[ 0 ] == rColors[ 2 ] + && rValues.maStops.size() == 3 && rValues.maStops[0] == 0 + && rValues.maStops[1] == 0.5 && rValues.maStops[2] == 1) + { + Gradient vclGradient( GradientStyle::Axial, rColors[ 1 ], rColors[ 0 ] ); + ::tools::Polygon aTempPoly( static_cast<sal_uInt16>(5) ); + aTempPoly[0] = ::Point( ::basegfx::fround( aLeftTop.getX() ), + ::basegfx::fround( aLeftTop.getY() ) ); + aTempPoly[1] = ::Point( ::basegfx::fround( aRightTop.getX() ), + ::basegfx::fround( aRightTop.getY() ) ); + aTempPoly[2] = ::Point( ::basegfx::fround( aRightBottom.getX() ), + ::basegfx::fround( aRightBottom.getY() ) ); + aTempPoly[3] = ::Point( ::basegfx::fround( aLeftBottom.getX() ), + ::basegfx::fround( aLeftBottom.getY() ) ); + aTempPoly[4] = aTempPoly[0]; + rOutDev.DrawGradient( aTempPoly, vclGradient ); + return; + } + // for linear gradients, it's easy to render // non-overlapping polygons: just split the gradient into // nStepCount small strips. Prepare the strip now. _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits