download.lst | 4 external/skia/Library_skia.mk | 7 - external/skia/UnpackedTarball_skia.mk | 1 external/skia/fix-windows-operator-equals.patch.1 | 113 ++++++++++++++++ vcl/inc/skia/utils.hxx | 7 - vcl/skia/gdiimpl.cxx | 151 +++++++++++----------- 6 files changed, 201 insertions(+), 82 deletions(-)
New commits: commit 54f3aac48832bd63665f0a2764772bf3d716638b Author: Xisco Fauli <[email protected]> AuthorDate: Mon Jan 26 13:19:55 2026 +0100 Commit: Xisco Fauli <[email protected]> CommitDate: Tue Jan 27 11:58:19 2026 +0100 skia: upgrade to m145 (*) the windows build tends to want more operator== for various things. This particular issue has been fixed in the next milestone of skia. Co-authored-by: Noel Grandin <[email protected]> Change-Id: Ic36a67468c09eb5a673c1948d16c84212a7060e9 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/198141 Reviewed-by: Xisco Fauli <[email protected]> Tested-by: Jenkins diff --git a/download.lst b/download.lst index e96c89b12bf6..1c2f1acf35a1 100644 --- a/download.lst +++ b/download.lst @@ -652,8 +652,8 @@ RHINO_TARBALL := rhino-1.7.15.1.zip # three static lines # so that git cherry-pick # will not run into conflicts -SKIA_SHA256SUM := 31ad00946dd858f4d069173e411162cd81e72646e274fb2cba0a55ca7872be78 -SKIA_TARBALL := skia-m144-ee20d565acb08dece4a32e3f209cdd41119015ca.tar.xz +SKIA_SHA256SUM := a0e8f2e0616436414a8cadf647808bf2c4017c787d7851adc189b541298dae8c +SKIA_TARBALL := skia-m145-2ab8add5be2c46eb6238f4c217f6d6dbc9bccd23.tar.xz # three static lines # so that git cherry-pick # will not run into conflicts diff --git a/external/skia/Library_skia.mk b/external/skia/Library_skia.mk index 765d178bf5ca..619d35a43e5c 100644 --- a/external/skia/Library_skia.mk +++ b/external/skia/Library_skia.mk @@ -314,10 +314,13 @@ endif # $(eval $(call gb_Library_add_generated_exception_objects,skia,\ UnpackedTarball/skia/src/codec/SkCodec \ + UnpackedTarball/skia/src/codec/SkCodecColorProfile \ UnpackedTarball/skia/src/codec/SkCodecImageGenerator \ UnpackedTarball/skia/src/codec/SkColorPalette \ UnpackedTarball/skia/src/codec/SkExif \ UnpackedTarball/skia/src/codec/SkGainmapInfo \ + UnpackedTarball/skia/src/codec/SkHdrAgtm \ + UnpackedTarball/skia/src/codec/SkHdrAgtmParse \ UnpackedTarball/skia/src/codec/SkHdrMetadata \ UnpackedTarball/skia/src/codec/SkImageGenerator_FromEncoded \ UnpackedTarball/skia/src/codec/SkMaskSwizzler \ @@ -491,10 +494,8 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\ UnpackedTarball/skia/src/core/SkPathPriv \ UnpackedTarball/skia/src/core/SkPathRaw \ UnpackedTarball/skia/src/core/SkPathRawShapes \ - UnpackedTarball/skia/src/core/SkPathRef \ UnpackedTarball/skia/src/core/SkPathUtils \ - UnpackedTarball/skia/src/core/SkPath_editing \ - UnpackedTarball/skia/src/core/SkPath_pathref \ + UnpackedTarball/skia/src/core/SkPath_pathdata \ UnpackedTarball/skia/src/core/SkPath_serial \ UnpackedTarball/skia/src/core/SkPixelRef \ UnpackedTarball/skia/src/core/SkPixmap \ diff --git a/external/skia/UnpackedTarball_skia.mk b/external/skia/UnpackedTarball_skia.mk index 692eba0130e5..cbf967752988 100644 --- a/external/skia/UnpackedTarball_skia.mk +++ b/external/skia/UnpackedTarball_skia.mk @@ -44,6 +44,7 @@ skia_patches := \ 0004-loong64-Fix-the-remaining-implicit-vector-casts.patch \ msvc-unknown-attributes.patch.1 \ fix-semaphore-include.patch.1 \ + fix-windows-operator-equals.patch.1 \ ifneq ($(MSYSTEM),) # use binary flag so patch from git-bash won't choke on mixed line-endings in patches diff --git a/external/skia/fix-windows-operator-equals.patch.1 b/external/skia/fix-windows-operator-equals.patch.1 new file mode 100644 index 000000000000..5c99dd4797ba --- /dev/null +++ b/external/skia/fix-windows-operator-equals.patch.1 @@ -0,0 +1,113 @@ +diff -ur skia.org/include/core/SkColorSpace.h skia/include/core/SkColorSpace.h +--- skia.org/include/core/SkColorSpace.h 2026-01-27 09:40:11.413189600 +0200 ++++ skia/include/core/SkColorSpace.h 2026-01-27 09:45:24.942227100 +0200 +@@ -37,6 +37,11 @@ + * representation of SkColorSpace. + */ + bool toXYZD50(skcms_Matrix3x3* toXYZD50) const; ++ ++ bool operator==(const SkColorSpacePrimaries& other) const { ++ return fRX == other.fRX && fRY == other.fRY && fGX == other.fGX && fGY == other.fGY && ++ fBX == other.fBX && fBY == other.fBY && fWX == other.fWX && fWY == other.fWY; ++ } + }; + + namespace SkNamedPrimaries { +diff -ur skia.org/include/private/SkHdrMetadata.h skia/include/private/SkHdrMetadata.h +--- skia.org/include/private/SkHdrMetadata.h 2026-01-27 09:40:11.335068400 +0200 ++++ skia/include/private/SkHdrMetadata.h 2026-01-27 09:53:46.338379800 +0200 +@@ -141,12 +141,20 @@ + float fX = 0.f; + float fY = 0.f; + float fM = 0.f; ++ ++ bool operator==(const ControlPoint& other) const { ++ return fX == other.fX && fY == other.fY && fM == other.fM; ++ } + }; + + // The size of this vector is the value of the GainCurveNumControlPoints metadata item. + static constexpr size_t kMinNumControlPoints = 1u; + static constexpr size_t kMaxNumControlPoints = 32u; + std::vector<ControlPoint> fControlPoints; ++ ++ bool operator==(const GainCurve& other) const { ++ return fControlPoints == other.fControlPoints; ++ } + }; + + // A ComponentMix metadata group. +@@ -158,6 +166,11 @@ + float fMax = 0.f; + float fMin = 0.f; + float fComponent = 0.f; ++ ++ bool operator==(const ComponentMixingFunction& other) const { ++ return fRed == other.fRed && fGreen == other.fGreen && fBlue == other.fBlue && ++ fMax == other.fMax && fMin == other.fMin && fComponent == other.fComponent; ++ } + }; + + // A ColorGainFunction metadata group. +@@ -167,6 +180,10 @@ + + // The GainCurve metadata group. + GainCurve fGainCurve; ++ ++ bool operator==(const ColorGainFunction& other) const { ++ return fComponentMixing == other.fComponentMixing && fGainCurve == other.fGainCurve; ++ } + }; + + // Structure holding the metadata items and groups for an alternate image. +@@ -176,6 +193,10 @@ + + // The ColorGainFunction metadata group. + ColorGainFunction fColorGainFunction; ++ ++ bool operator==(const AlternateImage& other) const { ++ return fHdrHeadroom == other.fHdrHeadroom && fColorGainFunction == other.fColorGainFunction; ++ } + }; + + // HeadroomAdaptiveToneMap metadata group. +@@ -192,6 +213,12 @@ + // The size of this vector is the NumAlternateImages metadata item. + static constexpr size_t kMaxNumAlternateImages = 4u; + std::vector<AlternateImage> fAlternateImages; ++ ++ bool operator==(const HeadroomAdaptiveToneMap& other) const { ++ return fBaselineHdrHeadroom == other.fBaselineHdrHeadroom && ++ fGainApplicationSpacePrimaries == other.fGainApplicationSpacePrimaries && ++ fAlternateImages == other.fAlternateImages; ++ } + }; + + // The default value for the HdrReferenceWhite metadata item. +@@ -218,7 +245,10 @@ + */ + SkString toString() const; + +- bool operator==(const AdaptiveGlobalToneMap& other) const; ++ bool operator==(const AdaptiveGlobalToneMap& other) const { ++ return fHdrReferenceWhite == other.fHdrReferenceWhite && ++ fHeadroomAdaptiveToneMap == other.fHeadroomAdaptiveToneMap; ++ } + bool operator!=(const AdaptiveGlobalToneMap& other) const { + return !(*this == other); + } +diff -ur skia.org/src/codec/SkHdrAgtmParse.cpp skia/src/codec/SkHdrAgtmParse.cpp +--- skia.org/src/codec/SkHdrAgtmParse.cpp 2026-01-27 09:40:06.084287800 +0200 ++++ skia/src/codec/SkHdrAgtmParse.cpp 2026-01-27 09:56:03.168285100 +0200 +@@ -12,11 +12,6 @@ + + namespace { + +-// TODO(https://issuetracker.google.com/issues/40044808): Include operator== in SkColorSpace.h. +-bool operator==(const SkColorSpacePrimaries& a, const SkColorSpacePrimaries& b) { +- return memcmp(&a, &b, sizeof(a)) == 0; +-} +- + // Return x clamped to [a, b]. + template<typename T, typename U, typename V> + T clamp(T x, U a, V b) { diff --git a/vcl/inc/skia/utils.hxx b/vcl/inc/skia/utils.hxx index 0617de466744..e78abdd5ab70 100644 --- a/vcl/inc/skia/utils.hxx +++ b/vcl/inc/skia/utils.hxx @@ -92,10 +92,11 @@ inline SkColor toSkColorWithTransparency(Color aColor, double fTransparency) return SkColorSetA(toSkColor(aColor), 255 * (1.0 - fTransparency)); } -inline SkColor toSkColorWithIntensity(Color color, int intensity) +inline SkColor4f toSkColorWithIntensity(Color color, int intensity) { - return SkColorSetARGB(color.GetAlpha(), color.GetRed() * intensity / 100, - color.GetGreen() * intensity / 100, color.GetBlue() * intensity / 100); + return SkColor4f::FromColor(SkColorSetARGB(color.GetAlpha(), color.GetRed() * intensity / 100, + color.GetGreen() * intensity / 100, + color.GetBlue() * intensity / 100)); } inline Color fromSkColor(SkColor color) diff --git a/vcl/skia/gdiimpl.cxx b/vcl/skia/gdiimpl.cxx index 65aa0d7499ac..6d40440c30d8 100644 --- a/vcl/skia/gdiimpl.cxx +++ b/vcl/skia/gdiimpl.cxx @@ -35,7 +35,7 @@ #include <SkBitmap.h> #include <SkCanvas.h> #include <SkGradientShader.h> -#include <SkPath.h> +#include <SkPathBuilder.h> #include <SkRegion.h> #include <SkPathEffect.h> #include <SkDashPathEffect.h> @@ -62,9 +62,10 @@ namespace // bottom-most line of pixels of the bounding rectangle (see // https://lists.freedesktop.org/archives/libreoffice/2019-November/083709.html). // So be careful with rectangle->polygon conversions (generally avoid them). -void addPolygonToPath(const basegfx::B2DPolygon& rPolygon, SkPath& rPath, sal_uInt32 nFirstIndex, - sal_uInt32 nLastIndex, const sal_uInt32 nPointCount, const bool bClosePath, - const bool bHasCurves, bool* hasOnlyOrthogonal = nullptr) +void addPolygonToPath(const basegfx::B2DPolygon& rPolygon, SkPathBuilder& rPathBuilder, + sal_uInt32 nFirstIndex, sal_uInt32 nLastIndex, const sal_uInt32 nPointCount, + const bool bClosePath, const bool bHasCurves, + bool* hasOnlyOrthogonal = nullptr) { assert(nFirstIndex < nPointCount || (nFirstIndex == 0 && nPointCount == 0)); assert(nLastIndex <= nPointCount); @@ -87,12 +88,12 @@ void addPolygonToPath(const basegfx::B2DPolygon& rPolygon, SkPath& rPath, sal_uI if (bFirst) { - rPath.moveTo(aCurrentPoint.getX(), aCurrentPoint.getY()); + rPathBuilder.moveTo(aCurrentPoint.getX(), aCurrentPoint.getY()); bFirst = false; } else if (!bHasCurves) { - rPath.lineTo(aCurrentPoint.getX(), aCurrentPoint.getY()); + rPathBuilder.lineTo(aCurrentPoint.getX(), aCurrentPoint.getY()); // If asked for, check whether the polygon has a line that is not // strictly horizontal or vertical. if (hasOnlyOrthogonal != nullptr && aCurrentPoint.getX() != aPreviousPoint.getX() @@ -107,7 +108,7 @@ void addPolygonToPath(const basegfx::B2DPolygon& rPolygon, SkPath& rPath, sal_uI if (aPreviousControlPoint.equal(aPreviousPoint) && aCurrentControlPoint.equal(aCurrentPoint)) { - rPath.lineTo(aCurrentPoint.getX(), aCurrentPoint.getY()); // a straight line + rPathBuilder.lineTo(aCurrentPoint.getX(), aCurrentPoint.getY()); // a straight line if (hasOnlyOrthogonal != nullptr && aCurrentPoint.getX() != aPreviousPoint.getX() && aCurrentPoint.getY() != aPreviousPoint.getY()) *hasOnlyOrthogonal = false; @@ -124,9 +125,9 @@ void addPolygonToPath(const basegfx::B2DPolygon& rPolygon, SkPath& rPath, sal_uI aCurrentControlPoint = aCurrentPoint + ((aCurrentControlPoint - aPreviousPoint) * 0.0005); } - rPath.cubicTo(aPreviousControlPoint.getX(), aPreviousControlPoint.getY(), - aCurrentControlPoint.getX(), aCurrentControlPoint.getY(), - aCurrentPoint.getX(), aCurrentPoint.getY()); + rPathBuilder.cubicTo(aPreviousControlPoint.getX(), aPreviousControlPoint.getY(), + aCurrentControlPoint.getX(), aCurrentControlPoint.getY(), + aCurrentPoint.getX(), aCurrentPoint.getY()); if (hasOnlyOrthogonal != nullptr) *hasOnlyOrthogonal = false; } @@ -136,18 +137,18 @@ void addPolygonToPath(const basegfx::B2DPolygon& rPolygon, SkPath& rPath, sal_uI } if (bClosePath && nFirstIndex == 0 && nLastIndex == nPointCount) { - rPath.close(); + rPathBuilder.close(); } } -void addPolygonToPath(const basegfx::B2DPolygon& rPolygon, SkPath& rPath, +void addPolygonToPath(const basegfx::B2DPolygon& rPolygon, SkPathBuilder& rPathBuilder, bool* hasOnlyOrthogonal = nullptr) { - addPolygonToPath(rPolygon, rPath, 0, rPolygon.count(), rPolygon.count(), rPolygon.isClosed(), - rPolygon.areControlPointsUsed(), hasOnlyOrthogonal); + addPolygonToPath(rPolygon, rPathBuilder, 0, rPolygon.count(), rPolygon.count(), + rPolygon.isClosed(), rPolygon.areControlPointsUsed(), hasOnlyOrthogonal); } -void addPolyPolygonToPath(const basegfx::B2DPolyPolygon& rPolyPolygon, SkPath& rPath, +void addPolyPolygonToPath(const basegfx::B2DPolyPolygon& rPolyPolygon, SkPathBuilder& rPathBuilder, bool* hasOnlyOrthogonal = nullptr) { const sal_uInt32 nPolygonCount(rPolyPolygon.count()); @@ -158,11 +159,11 @@ void addPolyPolygonToPath(const basegfx::B2DPolyPolygon& rPolyPolygon, SkPath& r sal_uInt32 nPointCount = 0; for (const auto& rPolygon : rPolyPolygon) nPointCount += rPolygon.count() * 3; // because cubicTo is 3 elements - rPath.incReserve(nPointCount); + rPathBuilder.incReserve(nPointCount); for (const auto& rPolygon : rPolyPolygon) { - addPolygonToPath(rPolygon, rPath, hasOnlyOrthogonal); + addPolygonToPath(rPolygon, rPathBuilder, hasOnlyOrthogonal); } } @@ -644,18 +645,18 @@ void SkiaSalGraphicsImpl::setClipRegion(const vcl::Region& region) void SkiaSalGraphicsImpl::setCanvasClipRegion(SkCanvas* canvas, const vcl::Region& region) { SkiaZone zone; - SkPath path; + SkPathBuilder pathBuilder; // Always use region rectangles, regardless of what the region uses internally. // That's what other VCL backends do, and trying to use addPolyPolygonToPath() // in case a polygon is used leads to off-by-one errors such as tdf#133208. RectangleVector rectangles; region.GetRegionRectangles(rectangles); - path.incReserve(rectangles.size() + 1); + pathBuilder.incReserve(rectangles.size() + 1); for (const tools::Rectangle& rectangle : rectangles) - path.addRect(SkRect::MakeXYWH(rectangle.getX(), rectangle.getY(), rectangle.GetWidth(), - rectangle.GetHeight())); - path.setFillType(SkPathFillType::kEvenOdd); - canvas->clipPath(path); + pathBuilder.addRect(SkRect::MakeXYWH(rectangle.getX(), rectangle.getY(), + rectangle.GetWidth(), rectangle.GetHeight())); + pathBuilder.setFillType(SkPathFillType::kEvenOdd); + canvas->clipPath(pathBuilder.detach()); } void SkiaSalGraphicsImpl::ResetClipRegion() @@ -927,11 +928,11 @@ void SkiaSalGraphicsImpl::performDrawPolyPolygon(const basegfx::B2DPolyPolygon& { preDraw(); - SkPath polygonPath; + SkPathBuilder polygonPathBuilder; bool hasOnlyOrthogonal = true; - addPolyPolygonToPath(aPolyPolygon, polygonPath, &hasOnlyOrthogonal); - polygonPath.setFillType(SkPathFillType::kEvenOdd); - addUpdateRegion(polygonPath.getBounds()); + addPolyPolygonToPath(aPolyPolygon, polygonPathBuilder, &hasOnlyOrthogonal); + polygonPathBuilder.setFillType(SkPathFillType::kEvenOdd); + addUpdateRegion(polygonPathBuilder.computeBounds()); // For lines we use toSkX()/toSkY() in order to pass centers of pixels to Skia, // as that leads to better results with floating-point coordinates @@ -962,7 +963,7 @@ void SkiaSalGraphicsImpl::performDrawPolyPolygon(const basegfx::B2DPolyPolygon& #endif { const SkScalar posFix = useAA ? toSkXYFix : 0; - polygonPath.offset(toSkX(0) + posFix, toSkY(0) + posFix, nullptr); + polygonPathBuilder.offset(toSkX(0) + posFix, toSkY(0) + posFix); } } if (moFillColor) @@ -971,15 +972,15 @@ void SkiaSalGraphicsImpl::performDrawPolyPolygon(const basegfx::B2DPolyPolygon& aPaint.setAntiAlias(useAA); // HACK: If the polygon is just a line, it still should be drawn. But when filling // Skia doesn't draw empty polygons, so in that case ensure the line is drawn. - if (!moLineColor && polygonPath.getBounds().isEmpty()) + if (!moLineColor && polygonPathBuilder.computeBounds().isEmpty()) aPaint.setStyle(SkPaint::kStroke_Style); - getDrawCanvas()->drawPath(polygonPath, aPaint); + getDrawCanvas()->drawPath(polygonPathBuilder.detach(), aPaint); } if (moLineColor && moLineColor != moFillColor) // otherwise handled by fill { SkPaint aPaint = makeLinePaint(fTransparency); aPaint.setAntiAlias(useAA); - getDrawCanvas()->drawPath(polygonPath, aPaint); + getDrawCanvas()->drawPath(polygonPathBuilder.detach(), aPaint); } postDraw(); } @@ -1194,12 +1195,12 @@ bool SkiaSalGraphicsImpl::drawPolyLine(const basegfx::B2DHomMatrix& rObjectToDev // are not wider than a pixel. if (eLineJoin != basegfx::B2DLineJoin::NONE || fLineWidth <= 1.0) { - SkPath aPath; - aPath.incReserve(aPolyLine.count() * 3); // because cubicTo is 3 elements - addPolygonToPath(aPolyLine, aPath); - aPath.offset(toSkX(0) + posFix, toSkY(0) + posFix, nullptr); - addUpdateRegion(aPath.getBounds()); - getDrawCanvas()->drawPath(aPath, aPaint); + SkPathBuilder aPathBuilder; + aPathBuilder.incReserve(aPolyLine.count() * 3); // because cubicTo is 3 elements + addPolygonToPath(aPolyLine, aPathBuilder); + aPathBuilder.offset(toSkX(0) + posFix, toSkY(0) + posFix); + addUpdateRegion(aPathBuilder.computeBounds()); + getDrawCanvas()->drawPath(aPathBuilder.detach(), aPaint); } else { @@ -1208,12 +1209,12 @@ bool SkiaSalGraphicsImpl::drawPolyLine(const basegfx::B2DHomMatrix& rObjectToDev bool bHasCurves = aPolyLine.areControlPointsUsed(); for (sal_uInt32 j = 0; j < nPoints; ++j) { - SkPath aPath; - aPath.incReserve(2 * 3); // because cubicTo is 3 elements - addPolygonToPath(aPolyLine, aPath, j, j + 1, nPoints, bClosed, bHasCurves); - aPath.offset(toSkX(0) + posFix, toSkY(0) + posFix, nullptr); - addUpdateRegion(aPath.getBounds()); - getDrawCanvas()->drawPath(aPath, aPaint); + SkPathBuilder aPathBuilder; + aPathBuilder.incReserve(2 * 3); // because cubicTo is 3 elements + addPolygonToPath(aPolyLine, aPathBuilder, j, j + 1, nPoints, bClosed, bHasCurves); + aPathBuilder.offset(toSkX(0) + posFix, toSkY(0) + posFix); + addUpdateRegion(aPathBuilder.computeBounds()); + getDrawCanvas()->drawPath(aPathBuilder.detach(), aPaint); } } @@ -1433,11 +1434,11 @@ void SkiaSalGraphicsImpl::invert(basegfx::B2DPolygon const& rPoly, SalInvert eFl preDraw(); SAL_INFO("vcl.skia.trace", "invert(" << this << "): " << rPoly << ":" << int(eFlags)); assert(mXorMode == XorMode::None); - SkPath aPath; - aPath.incReserve(rPoly.count()); - addPolygonToPath(rPoly, aPath); - aPath.setFillType(SkPathFillType::kEvenOdd); - addUpdateRegion(aPath.getBounds()); + SkPathBuilder aPathBuilder; + aPathBuilder.incReserve(rPoly.count()); + addPolygonToPath(rPoly, aPathBuilder); + aPathBuilder.setFillType(SkPathFillType::kEvenOdd); + addUpdateRegion(aPathBuilder.computeBounds()); { SkAutoCanvasRestore autoRestore(getDrawCanvas(), true); SkPaint aPaint; @@ -1451,7 +1452,7 @@ void SkiaSalGraphicsImpl::invert(basegfx::B2DPolygon const& rPoly, SalInvert eFl // TrackFrame is not supposed to paint outside of the polygon (usually rectangle), // but wider stroke width usually results in that, so ensure the requirement // by clipping. - getDrawCanvas()->clipRect(aPath.getBounds(), SkClipOp::kIntersect, false); + getDrawCanvas()->clipRect(aPathBuilder.computeBounds(), SkClipOp::kIntersect, false); aPaint.setStrokeWidth(2); static constexpr float intervals[] = { 4.0f, 4.0f }; aPaint.setStyle(SkPaint::kStroke_Style); @@ -1504,7 +1505,7 @@ void SkiaSalGraphicsImpl::invert(basegfx::B2DPolygon const& rPoly, SalInvert eFl } #endif } - getDrawCanvas()->drawPath(aPath, aPaint); + getDrawCanvas()->drawPath(aPathBuilder.detach(), aPaint); } postDraw(); } @@ -1953,19 +1954,19 @@ bool SkiaSalGraphicsImpl::drawGradient(const tools::PolyPolygon& rPolyPolygon, tools::Rectangle boundRect(rPolyPolygon.GetBoundRect()); if (boundRect.IsEmpty()) return true; - SkPath path; + SkPathBuilder pathBuilder; if (rPolyPolygon.IsRect()) { // Rect->Polygon conversion loses the right and bottom edge, fix that. - path.addRect(SkRect::MakeXYWH(boundRect.getX(), boundRect.getY(), boundRect.GetWidth(), - boundRect.GetHeight())); + pathBuilder.addRect(SkRect::MakeXYWH(boundRect.getX(), boundRect.getY(), + boundRect.GetWidth(), boundRect.GetHeight())); boundRect.AdjustRight(1); boundRect.AdjustBottom(1); } else - addPolyPolygonToPath(rPolyPolygon.getB2DPolyPolygon(), path); - path.setFillType(SkPathFillType::kEvenOdd); - addUpdateRegion(path.getBounds()); + addPolyPolygonToPath(rPolyPolygon.getB2DPolyPolygon(), pathBuilder); + pathBuilder.setFillType(SkPathFillType::kEvenOdd); + addUpdateRegion(pathBuilder.computeBounds()); Gradient aGradient(rGradient); tools::Rectangle aBoundRect; @@ -1973,9 +1974,10 @@ bool SkiaSalGraphicsImpl::drawGradient(const tools::PolyPolygon& rPolyPolygon, aGradient.SetAngle(aGradient.GetAngle() + 2700_deg10); aGradient.GetBoundRect(boundRect, aBoundRect, aCenter); - SkColor startColor + SkColor4f startColor = toSkColorWithIntensity(rGradient.GetStartColor(), rGradient.GetStartIntensity()); - SkColor endColor = toSkColorWithIntensity(rGradient.GetEndColor(), rGradient.GetEndIntensity()); + SkColor4f endColor + = toSkColorWithIntensity(rGradient.GetEndColor(), rGradient.GetEndIntensity()); sk_sp<SkShader> shader; if (rGradient.GetStyle() == css::awt::GradientStyle_LINEAR) @@ -1984,9 +1986,9 @@ bool SkiaSalGraphicsImpl::drawGradient(const tools::PolyPolygon& rPolyPolygon, aPoly.Rotate(aCenter, aGradient.GetAngle() % 3600_deg10); 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[2] = { startColor, endColor }; + SkColor4f colors[2] = { startColor, endColor }; SkScalar pos[2] = { SkDoubleToScalar(aGradient.GetBorder() / 100.0), 1.0 }; - shader = SkGradientShader::MakeLinear(points, colors, pos, 2, SkTileMode::kClamp); + shader = SkShaders::LinearGradient(points, { { colors, pos, SkTileMode::kClamp }, {} }); } else if (rGradient.GetStyle() == css::awt::GradientStyle_AXIAL) { @@ -1994,11 +1996,11 @@ bool SkiaSalGraphicsImpl::drawGradient(const tools::PolyPolygon& rPolyPolygon, aPoly.Rotate(aCenter, aGradient.GetAngle() % 3600_deg10); 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 }; + SkColor4f colors[3] = { endColor, startColor, endColor }; SkScalar border = SkDoubleToScalar(aGradient.GetBorder() / 100.0); SkScalar pos[3] = { std::min<SkScalar>(border * 0.5f, 0.5f), 0.5f, std::max<SkScalar>(1 - border * 0.5f, 0.5f) }; - shader = SkGradientShader::MakeLinear(points, colors, pos, 3, SkTileMode::kClamp); + shader = SkShaders::LinearGradient(points, { { colors, pos, SkTileMode::kClamp }, {} }); } else { @@ -2006,15 +2008,16 @@ bool SkiaSalGraphicsImpl::drawGradient(const tools::PolyPolygon& rPolyPolygon, // Skia is the opposite way). SkPoint center = SkPoint::Make(toSkX(aCenter.X()) - 1, toSkY(aCenter.Y()) - 1); SkScalar radius = std::max(aBoundRect.GetWidth() / 2.0, aBoundRect.GetHeight() / 2.0); - SkColor colors[2] = { endColor, startColor }; + SkColor4f colors[2] = { endColor, startColor }; SkScalar pos[2] = { SkDoubleToScalar(aGradient.GetBorder() / 100.0), 1.0 }; - shader = SkGradientShader::MakeRadial(center, radius, colors, pos, 2, SkTileMode::kClamp); + shader = SkShaders::RadialGradient(center, radius, + { { colors, pos, SkTileMode::kClamp }, {} }); } SkPaint paint = makeGradientPaint(); paint.setAntiAlias(mParent.getAntiAlias()); paint.setShader(shader); - getDrawCanvas()->drawPath(path, paint); + getDrawCanvas()->drawPath(pathBuilder.detach(), paint); postDraw(); return true; } @@ -2027,27 +2030,27 @@ bool SkiaSalGraphicsImpl::implDrawGradient(const basegfx::B2DPolyPolygon& rPolyP "impldrawgradient(" << this << "): " << rPolyPolygon << ":" << rGradient.maPoint1 << "->" << rGradient.maPoint2 << ":" << rGradient.maStops.size()); - SkPath path; - addPolyPolygonToPath(rPolyPolygon, path); - path.setFillType(SkPathFillType::kEvenOdd); - addUpdateRegion(path.getBounds()); + SkPathBuilder pathBuilder; + addPolyPolygonToPath(rPolyPolygon, pathBuilder); + pathBuilder.setFillType(SkPathFillType::kEvenOdd); + addUpdateRegion(pathBuilder.computeBounds()); SkPoint points[2] = { SkPoint::Make(toSkX(rGradient.maPoint1.getX()), toSkY(rGradient.maPoint1.getY())), SkPoint::Make(toSkX(rGradient.maPoint2.getX()), toSkY(rGradient.maPoint2.getY())) }; - std::vector<SkColor> colors; + std::vector<SkColor4f> colors; std::vector<SkScalar> pos; for (const SalGradientStop& stop : rGradient.maStops) { - colors.emplace_back(toSkColor(stop.maColor)); + colors.emplace_back(SkColor4f::FromColor(toSkColor(stop.maColor))); pos.emplace_back(stop.mfOffset); } - sk_sp<SkShader> shader = SkGradientShader::MakeLinear(points, colors.data(), pos.data(), - colors.size(), SkTileMode::kDecal); + sk_sp<SkShader> shader + = SkShaders::LinearGradient(points, { { colors, pos, SkTileMode::kDecal }, {} }); SkPaint paint = makeGradientPaint(); paint.setAntiAlias(mParent.getAntiAlias()); paint.setShader(shader); - getDrawCanvas()->drawPath(path, paint); + getDrawCanvas()->drawPath(pathBuilder.detach(), paint); postDraw(); return true; }
