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;
 }

Reply via email to