update skia to m116

(from m111)

SK_SUPPORT_GPU is now SK_GANESH

GR_OP_ALLOCATE_USE_NEW was removed in skia m111
    commit dd8f8ed3848cbe2032edc7ec08ef648a23e28ad9
    Author: Mike Klein <mtklein@google.com>
    Date:   Thu Apr 22 12:17:33 2021 -0500
    clean up defines that do nothing

the fast-png-write patch was removed. The underlying helper
function we need was removed in
    commit 0ec4c84abd0b578a5c792b04b56653cbc325530e
    Author: Kevin Lubick <kjlubick@google.com>
    Date:   Thu Apr 20 14:46:28 2023 -0400
    Remove SkImageEncoder and SkImage::encodeToData
So I updated our dump() function in SkiaHelper.cxx to
use the new Skia API.

The constexpr-template patch seems to be superceded by skia
changes.

SkOpts: :hash_fn has been replaced with SkChecksum::Hash32
    commit 657ed9cf2379a950b925cb2aba7c85d6e1dd36ed
    Author: Brian Osman <brianosman@google.com>
    Date:   Tue May 23 12:40:12 2023 +0000
    Reland "Replace SkOpts::hash/hash_fn with SkChecksum::Hash32"

The SkDebugf function needs to be exported from the library since
it leaks out to calling code via some of the headers.

Change-Id: I80ace8f25e660fa7889d22ef90676f47264d866c
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/154223
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
diff --git a/bin/update_pch b/bin/update_pch
index 63a39ce..4719e5f 100755
--- a/bin/update_pch
+++ b/bin/update_pch
@@ -706,7 +706,7 @@ def is_allowed_if(line, module):
        return True
    if module == "external/skia":
        # We always set these.
        if line == "#ifdef SK_VULKAN" or line == "#if SK_SUPPORT_GPU":
        if line == "#ifdef SK_VULKAN" or line == "#if SK_GANESH":
            return True
    return False

diff --git a/config_host/config_skia.h.in b/config_host/config_skia.h.in
index 8571148..602e18a3 100644
--- a/config_host/config_skia.h.in
+++ b/config_host/config_skia.h.in
@@ -31,7 +31,7 @@ are the same.


// GPU support (set by configure).
#undef SK_SUPPORT_GPU
#undef SK_GANESH
// Vulkan support enabled (set by configure).
#undef SK_VULKAN
// Metal support enabled (set by configure).
@@ -40,9 +40,6 @@ are the same.
// Memory allocator for Vulkan.
#define SK_USE_VMA 1

// Set by Skia's BUILD.gn.
#define GR_OP_ALLOCATE_USE_NEW

#define SK_CODEC_DECODES_PNG 1
#define SK_ENCODE_PNG 1

diff --git a/configure.ac b/configure.ac
index 80f2e5a..8c4977bf 100644
--- a/configure.ac
+++ b/configure.ac
@@ -12180,12 +12180,12 @@ if test "$enable_skia" != "no" -a "$build_skia" = "yes" -a -z "$DISABLE_GUI"; th
        BUILD_TYPE="$BUILD_TYPE SKIA"

        if test "$OS" = "MACOSX"; then
            AC_DEFINE(SK_SUPPORT_GPU,1)
            AC_DEFINE(SK_GANESH,1)
            AC_DEFINE(SK_METAL,1)
            SKIA_GPU=METAL
            AC_SUBST(SKIA_GPU)
        else
            AC_DEFINE(SK_SUPPORT_GPU,1)
            AC_DEFINE(SK_GANESH,1)
            AC_DEFINE(SK_VULKAN,1)
            SKIA_GPU=VULKAN
            AC_SUBST(SKIA_GPU)
diff --git a/download.lst b/download.lst
index 87821c5..90d2341 100644
--- a/download.lst
+++ b/download.lst
@@ -506,8 +506,8 @@ RHINO_TARBALL := 798b2ffdc8bcfe7bca2cf92b62caf685-rhino1_5R5.zip
# three static lines
# so that git cherry-pick
# will not run into conflicts
SKIA_SHA256SUM := 0d08a99ed46cde43b5ad2672b5d8770c8eb85d0d26cb8f1f85fd9befe1e9ceb9
SKIA_TARBALL := skia-m111-a31e897fb3dcbc96b2b40999751611d029bf5404.tar.xz
SKIA_SHA256SUM := 2223ebce534458a37826e8fe4f24635b0712cde7ed1bd3208f089f6fdd796e01
SKIA_TARBALL := skia-m116-2ddcf183eb260f63698aa74d1bb380f247ad7ccd.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 7a7f59e..77e674a 100644
--- a/external/skia/Library_skia.mk
+++ b/external/skia/Library_skia.mk
@@ -14,7 +14,8 @@ $(eval $(call gb_Library_set_warnings_disabled,skia))
$(eval $(call gb_Library_use_unpacked,skia,skia))

$(eval $(call gb_Library_use_clang,skia))
$(eval $(call gb_Library_set_clang_precompiled_header,skia,external/skia/inc/pch/precompiled_skia))
#This currently results in all sorts of compile complaints
#$(eval $(call gb_Library_set_clang_precompiled_header,skia,external/skia/inc/pch/precompiled_skia))

$(eval $(call gb_Library_add_defs,skia,\
    -DSKIA_IMPLEMENTATION=1 \
@@ -130,14 +131,21 @@ $(eval $(call gb_Library_set_generated_cxx_suffix,skia,cpp))

$(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/base/SkArenaAlloc \
    UnpackedTarball/skia/src/base/SkBezierCurves \
    UnpackedTarball/skia/src/base/SkBlockAllocator \
    UnpackedTarball/skia/src/base/SkBuffer \
    UnpackedTarball/skia/src/base/SkContainers \
    UnpackedTarball/skia/src/base/SkCubics \
    UnpackedTarball/skia/src/base/SkDeque \
    UnpackedTarball/skia/src/base/SkFloatingPoint \
    UnpackedTarball/skia/src/base/SkHalf \
    UnpackedTarball/skia/src/base/SkMalloc \
    UnpackedTarball/skia/src/base/SkMathPriv \
    UnpackedTarball/skia/src/base/SkQuads \
    UnpackedTarball/skia/src/base/SkSafeMath \
    UnpackedTarball/skia/src/base/SkSemaphore \
    UnpackedTarball/skia/src/base/SkSharedMutex \
    UnpackedTarball/skia/src/base/SkSpinlock \
    UnpackedTarball/skia/src/base/SkTDArray \
    UnpackedTarball/skia/src/base/SkThreadID \
    UnpackedTarball/skia/src/base/SkTSearch \
@@ -152,12 +160,13 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/codec/SkBmpStandardCodec \
    UnpackedTarball/skia/src/codec/SkCodec \
    UnpackedTarball/skia/src/codec/SkCodecImageGenerator \
    UnpackedTarball/skia/src/codec/SkColorTable \
    UnpackedTarball/skia/src/codec/SkColorPalette \
    UnpackedTarball/skia/src/codec/SkEncodedInfo \
    UnpackedTarball/skia/src/codec/SkIcoCodec \
    UnpackedTarball/skia/src/codec/SkMasks \
    UnpackedTarball/skia/src/codec/SkMaskSwizzler \
    UnpackedTarball/skia/src/codec/SkParseEncodedOrigin \
    UnpackedTarball/skia/src/codec/SkPixmapUtils \
    UnpackedTarball/skia/src/codec/SkPngCodec \
    UnpackedTarball/skia/src/codec/SkSampledCodec \
    UnpackedTarball/skia/src/codec/SkSampler \
@@ -184,19 +193,21 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/core/SkBlitter \
    UnpackedTarball/skia/src/core/SkBlitter_Sprite \
    UnpackedTarball/skia/src/core/SkBlurMask \
    UnpackedTarball/skia/src/core/SkBlurMF \
    UnpackedTarball/skia/src/core/SkBlurMaskFilterImpl \
    UnpackedTarball/skia/src/core/SkCachedData \
    UnpackedTarball/skia/src/core/SkCanvas \
    UnpackedTarball/skia/src/core/SkCanvas_Raster \
    UnpackedTarball/skia/src/core/SkCanvasPriv \
    UnpackedTarball/skia/src/core/SkCapabilities \
    UnpackedTarball/skia/src/core/SkChecksum \
    UnpackedTarball/skia/src/core/SkChromeRemoteGlyphCache \
    UnpackedTarball/skia/src/core/SkClipStack \
    UnpackedTarball/skia/src/core/SkClipStackDevice \
    UnpackedTarball/skia/src/core/SkColor \
    UnpackedTarball/skia/src/core/SkColorFilter \
    UnpackedTarball/skia/src/core/SkColorFilter_Matrix \
    UnpackedTarball/skia/src/core/SkColorSpace \
    UnpackedTarball/skia/src/core/SkColorSpaceXformSteps \
    UnpackedTarball/skia/src/core/SkColorTable \
    UnpackedTarball/skia/src/core/SkCompressedDataUtils \
    UnpackedTarball/skia/src/core/SkContourMeasure \
    UnpackedTarball/skia/src/core/SkConvertPixels \
@@ -206,14 +217,13 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/core/SkData \
    UnpackedTarball/skia/src/core/SkDataTable \
    UnpackedTarball/skia/src/core/SkDebug \
    UnpackedTarball/skia/src/core/SkDeferredDisplayList \
    UnpackedTarball/skia/src/core/SkDeferredDisplayListRecorder \
    UnpackedTarball/skia/src/core/SkDescriptor \
    UnpackedTarball/skia/src/core/SkDevice \
    UnpackedTarball/skia/src/core/SkDistanceFieldGen \
    UnpackedTarball/skia/src/core/SkDocument \
    UnpackedTarball/skia/src/core/SkDrawable \
    UnpackedTarball/skia/src/core/SkDraw \
    UnpackedTarball/skia/src/core/SkDrawBase \
    UnpackedTarball/skia/src/core/SkDrawLooper \
    UnpackedTarball/skia/src/core/SkDrawShadowInfo \
    UnpackedTarball/skia/src/core/SkDraw_atlas \
@@ -227,6 +237,7 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/core/SkFont \
    UnpackedTarball/skia/src/core/SkFont_serial \
    UnpackedTarball/skia/src/core/SkFontDescriptor \
    UnpackedTarball/skia/src/core/SkFontMetricsPriv \
    UnpackedTarball/skia/src/core/SkFontMgr \
    UnpackedTarball/skia/src/core/SkFontStream \
    UnpackedTarball/skia/src/core/SkGaussFilter \
@@ -234,11 +245,8 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/core/SkIDChangeListener \
    UnpackedTarball/skia/src/core/SkGlobalInitialization_core \
    UnpackedTarball/skia/src/core/SkGlyph \
    UnpackedTarball/skia/src/core/SkGlyphBuffer \
    UnpackedTarball/skia/src/core/SkGlyphRunPainter \
    UnpackedTarball/skia/src/core/SkGraphics \
    UnpackedTarball/skia/src/core/SkHalf \
    UnpackedTarball/skia/src/core/SkICC \
    UnpackedTarball/skia/src/core/SkImageFilterCache \
    UnpackedTarball/skia/src/core/SkImageFilterTypes \
    UnpackedTarball/skia/src/core/SkImageFilter \
@@ -260,7 +268,7 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/core/SkMesh \
    UnpackedTarball/skia/src/core/SkMipmap \
    UnpackedTarball/skia/src/core/SkMipmapAccessor \
    UnpackedTarball/skia/src/core/SkModeColorFilter \
    UnpackedTarball/skia/src/core/SkMipmapBuilder \
    UnpackedTarball/skia/src/core/SkOpts \
    UnpackedTarball/skia/src/core/SkOpts_erms \
    UnpackedTarball/skia/src/core/SkOverdrawCanvas \
@@ -276,15 +284,14 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/core/SkPicture \
    UnpackedTarball/skia/src/core/SkPictureData \
    UnpackedTarball/skia/src/core/SkPictureFlat \
    UnpackedTarball/skia/src/core/SkPictureImageGenerator \
    UnpackedTarball/skia/src/core/SkPicturePlayback \
    UnpackedTarball/skia/src/core/SkPictureRecord \
    UnpackedTarball/skia/src/core/SkPictureRecorder \
    UnpackedTarball/skia/src/core/SkPixelRef \
    UnpackedTarball/skia/src/core/SkPixmap \
    UnpackedTarball/skia/src/core/SkPixmapDraw \
    UnpackedTarball/skia/src/core/SkPoint \
    UnpackedTarball/skia/src/core/SkPoint3 \
    UnpackedTarball/skia/src/core/SkPromiseImageTexture \
    UnpackedTarball/skia/src/core/SkPtrRecorder \
    UnpackedTarball/skia/src/core/SkQuadClipper \
    UnpackedTarball/skia/src/core/SkRasterClip \
@@ -292,6 +299,7 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/core/SkRasterPipeline \
    UnpackedTarball/skia/src/core/SkReadBuffer \
    UnpackedTarball/skia/src/core/SkRecord \
    UnpackedTarball/skia/src/core/SkReadPixelsRec \
    UnpackedTarball/skia/src/core/SkRecordDraw \
    UnpackedTarball/skia/src/core/SkRecordedDrawable \
    UnpackedTarball/skia/src/core/SkRecorder \
@@ -302,7 +310,9 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/core/SkRegion_path \
    UnpackedTarball/skia/src/core/SkResourceCache \
    UnpackedTarball/skia/src/core/SkRRect \
    UnpackedTarball/skia/src/core/SkRSXform \
    UnpackedTarball/skia/src/core/SkRTree \
    UnpackedTarball/skia/src/core/SkRuntimeBlender \
    UnpackedTarball/skia/src/core/SkRuntimeEffect \
    UnpackedTarball/skia/src/core/SkScalar \
    UnpackedTarball/skia/src/core/SkScalerContext \
@@ -312,11 +322,10 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/core/SkScan \
    UnpackedTarball/skia/src/core/SkScan_Hairline \
    UnpackedTarball/skia/src/core/SkScan_Path \
    UnpackedTarball/skia/src/core/SkSharedMutex \
    UnpackedTarball/skia/src/core/SkScan_SAAPath \
    UnpackedTarball/skia/src/core/SkSLTypeShared \
    UnpackedTarball/skia/src/core/SkSpecialImage \
    UnpackedTarball/skia/src/core/SkSpecialSurface \
    UnpackedTarball/skia/src/core/SkSpinlock \
    UnpackedTarball/skia/src/core/SkSpriteBlitter_ARGB32 \
    UnpackedTarball/skia/src/core/SkStream \
    UnpackedTarball/skia/src/core/SkStrike \
@@ -327,7 +336,6 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/core/SkStroke \
    UnpackedTarball/skia/src/core/SkStrokeRec \
    UnpackedTarball/skia/src/core/SkStrokerPriv \
    UnpackedTarball/skia/src/core/SkSurfaceCharacterization \
    UnpackedTarball/skia/src/core/SkSwizzle \
    UnpackedTarball/skia/src/core/SkTaskGroup \
    UnpackedTarball/skia/src/core/SkTextBlob \
@@ -342,15 +350,24 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/core/SkVM \
    UnpackedTarball/skia/src/core/SkVMBlitter \
    UnpackedTarball/skia/src/core/SkWriteBuffer \
    UnpackedTarball/skia/src/core/SkWritePixelsRec \
    UnpackedTarball/skia/src/core/SkWriter32 \
    UnpackedTarball/skia/src/core/SkXfermode \
    UnpackedTarball/skia/src/core/SkXfermodeInterpretation \
    UnpackedTarball/skia/src/core/SkYUVAInfo \
    UnpackedTarball/skia/src/core/SkYUVAPixmaps \
    UnpackedTarball/skia/src/core/SkYUVMath \
    UnpackedTarball/skia/src/core/SkYUVPlanesCache \
    UnpackedTarball/skia/src/effects/imagefilters/SkAlphaThresholdImageFilter \
    UnpackedTarball/skia/src/effects/imagefilters/SkArithmeticImageFilter \
    UnpackedTarball/skia/src/encode/SkICC \
    UnpackedTarball/skia/src/encode/SkPngEncoderImpl \
    UnpackedTarball/skia/src/encode/SkEncoder \
    UnpackedTarball/skia/src/effects/colorfilters/SkBlendModeColorFilter \
    UnpackedTarball/skia/src/effects/colorfilters/SkColorFilterBase \
    UnpackedTarball/skia/src/effects/colorfilters/SkColorSpaceXformColorFilter \
    UnpackedTarball/skia/src/effects/colorfilters/SkComposeColorFilter \
    UnpackedTarball/skia/src/effects/colorfilters/SkGaussianColorFilter \
    UnpackedTarball/skia/src/effects/colorfilters/SkMatrixColorFilter \
    UnpackedTarball/skia/src/effects/colorfilters/SkRuntimeColorFilter \
    UnpackedTarball/skia/src/effects/colorfilters/SkTableColorFilter \
    UnpackedTarball/skia/src/effects/colorfilters/SkWorkingFormatColorFilter \
    UnpackedTarball/skia/src/effects/imagefilters/SkBlendImageFilter \
    UnpackedTarball/skia/src/effects/imagefilters/SkBlurImageFilter \
    UnpackedTarball/skia/src/effects/imagefilters/SkColorFilterImageFilter \
@@ -379,25 +396,27 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/effects/SkEmbossMaskFilter \
    UnpackedTarball/skia/src/effects/SkHighContrastFilter \
    UnpackedTarball/skia/src/effects/SkLayerDrawLooper \
    UnpackedTarball/skia/src/effects/SkLumaColorFilter \
    UnpackedTarball/skia/src/effects/SkOpPathEffect \
    UnpackedTarball/skia/src/effects/SkOverdrawColorFilter \
    UnpackedTarball/skia/src/effects/SkShaderMaskFilter \
    UnpackedTarball/skia/src/effects/SkTableColorFilter \
    UnpackedTarball/skia/src/effects/SkShaderMaskFilterImpl \
    UnpackedTarball/skia/src/effects/SkTableMaskFilter \
    UnpackedTarball/skia/src/effects/SkTrimPathEffect \
    UnpackedTarball/skia/src/effects/Sk1DPathEffect \
    UnpackedTarball/skia/src/effects/Sk2DPathEffect \
    UnpackedTarball/skia/src/fonts/SkRemotableFontMgr \
    UnpackedTarball/skia/src/image/SkImage \
    UnpackedTarball/skia/src/image/SkImage_Base \
    UnpackedTarball/skia/src/image/SkImage_Lazy \
    UnpackedTarball/skia/src/image/SkImage_LazyFactories \
    UnpackedTarball/skia/src/image/SkImage_Picture \
    UnpackedTarball/skia/src/image/SkImage_Raster \
    UnpackedTarball/skia/src/image/SkImage_RasterFactories \
    UnpackedTarball/skia/src/image/SkPictureImageGenerator \
    UnpackedTarball/skia/src/image/SkRescaleAndReadPixels \
    UnpackedTarball/skia/src/image/SkSurface \
    UnpackedTarball/skia/src/image/SkSurface_Base\
    UnpackedTarball/skia/src/image/SkSurface_Null \
    UnpackedTarball/skia/src/image/SkSurface_Raster \
    UnpackedTarball/skia/src/images/SkImageEncoder \
    UnpackedTarball/skia/src/images/SkPngEncoder \
    UnpackedTarball/skia/src/images/SkWebpEncoder \
    UnpackedTarball/skia/src/image/SkTiledImageUtils \
    UnpackedTarball/skia/src/lazy/SkDiscardableMemoryPool \
    UnpackedTarball/skia/src/pathops/SkAddIntersections \
    UnpackedTarball/skia/src/pathops/SkDConicLineIntersection \
@@ -433,33 +452,29 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/pathops/SkReduceOrder \
    UnpackedTarball/skia/src/sfnt/SkOTTable_name \
    UnpackedTarball/skia/src/sfnt/SkOTUtils \
    UnpackedTarball/skia/src/shaders/gradients/SkGradientShader \
    UnpackedTarball/skia/src/shaders/gradients/SkGradientShaderBase \
    UnpackedTarball/skia/src/shaders/gradients/SkConicalGradient \
    UnpackedTarball/skia/src/shaders/gradients/SkGradientBaseShader \
    UnpackedTarball/skia/src/shaders/gradients/SkLinearGradient \
    UnpackedTarball/skia/src/shaders/gradients/SkRadialGradient \
    UnpackedTarball/skia/src/shaders/gradients/SkSweepGradient \
    UnpackedTarball/skia/src/shaders/gradients/SkTwoPointConicalGradient \
    UnpackedTarball/skia/src/shaders/SkBlendShader \
    UnpackedTarball/skia/src/shaders/SkBitmapProcShader \
    UnpackedTarball/skia/src/shaders/SkColorFilterShader \
    UnpackedTarball/skia/src/shaders/SkColorShader \
    UnpackedTarball/skia/src/shaders/SkComposeShader \
    UnpackedTarball/skia/src/shaders/SkCoordClampShader \
    UnpackedTarball/skia/src/shaders/SkEmptyShader \
    UnpackedTarball/skia/src/shaders/SkImageShader \
    UnpackedTarball/skia/src/shaders/SkLocalMatrixShader \
    UnpackedTarball/skia/src/shaders/SkPerlinNoiseShader \
    UnpackedTarball/skia/src/shaders/SkPictureShader \
    UnpackedTarball/skia/src/shaders/SkPerlinNoiseShaderImpl \
    UnpackedTarball/skia/src/shaders/SkRuntimeShader \
    UnpackedTarball/skia/src/shaders/SkShader \
    UnpackedTarball/skia/src/shaders/SkShaderBase \
    UnpackedTarball/skia/src/shaders/SkTransformShader \
    UnpackedTarball/skia/src/sksl/dsl/DSLBlock \
    UnpackedTarball/skia/src/sksl/dsl/DSLCase \
    UnpackedTarball/skia/src/sksl/dsl/DSLCore \
    UnpackedTarball/skia/src/shaders/SkTriColorShader \
    UnpackedTarball/skia/src/sksl/dsl/DSLExpression \
    UnpackedTarball/skia/src/sksl/dsl/DSLFunction \
    UnpackedTarball/skia/src/sksl/dsl/DSLLayout \
    UnpackedTarball/skia/src/sksl/dsl/DSLStatement \
    UnpackedTarball/skia/src/sksl/dsl/DSLType \
    UnpackedTarball/skia/src/sksl/dsl/DSLVar \
    UnpackedTarball/skia/src/sksl/dsl/priv/DSLWriter \
    UnpackedTarball/skia/src/sksl/ir/SkSLBinaryExpression \
    UnpackedTarball/skia/src/sksl/ir/SkSLBlock \
    UnpackedTarball/skia/src/sksl/ir/SkSLChildCall \
@@ -477,6 +492,7 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/sksl/ir/SkSLDoStatement \
    UnpackedTarball/skia/src/sksl/ir/SkSLExpression \
    UnpackedTarball/skia/src/sksl/ir/SkSLExpressionStatement \
    UnpackedTarball/skia/src/sksl/ir/SkSLExtension \
    UnpackedTarball/skia/src/sksl/ir/SkSLFieldAccess \
    UnpackedTarball/skia/src/sksl/ir/SkSLForStatement \
    UnpackedTarball/skia/src/sksl/ir/SkSLFunctionCall \
@@ -488,10 +504,13 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/sksl/ir/SkSLLayout \
    UnpackedTarball/skia/src/sksl/ir/SkSLLiteral \
    UnpackedTarball/skia/src/sksl/ir/SkSLModifiers \
    UnpackedTarball/skia/src/sksl/ir/SkSLModifiersDeclaration \
    UnpackedTarball/skia/src/sksl/ir/SkSLProgram \
    UnpackedTarball/skia/src/sksl/ir/SkSLPrefixExpression \
    UnpackedTarball/skia/src/sksl/ir/SkSLPostfixExpression \
    UnpackedTarball/skia/src/sksl/ir/SkSLSetting \
    UnpackedTarball/skia/src/sksl/ir/SkSLStructDefinition \
    UnpackedTarball/skia/src/sksl/ir/SkSLSwitchCase \
    UnpackedTarball/skia/src/sksl/ir/SkSLSwitchStatement \
    UnpackedTarball/skia/src/sksl/ir/SkSLSwizzle \
    UnpackedTarball/skia/src/sksl/ir/SkSLSymbolTable \
@@ -501,6 +520,9 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/sksl/ir/SkSLVarDeclarations \
    UnpackedTarball/skia/src/sksl/ir/SkSLVariable \
    UnpackedTarball/skia/src/sksl/ir/SkSLVariableReference \
    UnpackedTarball/skia/src/sksl/tracing/SkSLTraceHook \
    UnpackedTarball/skia/src/sksl/tracing/SkSLDebugTracePriv \
    UnpackedTarball/skia/src/sksl/tracing/SkSLDebugTracePlayer \
    UnpackedTarball/skia/src/sksl/SkSLAnalysis \
    UnpackedTarball/skia/src/sksl/SkSLBuiltinTypes \
    UnpackedTarball/skia/src/sksl/SkSLCompiler \
@@ -531,6 +553,7 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/sksl/analysis/SkSLIsSameExpressionTree \
    UnpackedTarball/skia/src/sksl/analysis/SkSLIsTrivialExpression \
    UnpackedTarball/skia/src/sksl/analysis/SkSLProgramUsage \
    UnpackedTarball/skia/src/sksl/analysis/SkSLReturnsInputAlpha \
    UnpackedTarball/skia/src/sksl/analysis/SkSLSymbolTableStackBuilder \
    UnpackedTarball/skia/src/sksl/analysis/SkSLSwitchCaseContainsExit \
    UnpackedTarball/skia/src/sksl/codegen/SkSLGLSLCodeGenerator \
@@ -540,7 +563,6 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/sksl/codegen/SkSLSPIRVtoHLSL \
    UnpackedTarball/skia/src/sksl/codegen/SkSLVMCodeGenerator \
    UnpackedTarball/skia/src/sksl/codegen/SkSLWGSLCodeGenerator \
    UnpackedTarball/skia/src/sksl/tracing/SkVMDebugTrace \
    UnpackedTarball/skia/src/sksl/transform/SkSLAddConstToVarModifiers \
    UnpackedTarball/skia/src/sksl/transform/SkSLEliminateDeadFunctions \
    UnpackedTarball/skia/src/sksl/transform/SkSLEliminateDeadGlobalVariables \
@@ -549,8 +571,10 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/sksl/transform/SkSLEliminateUnreachableCode \
    UnpackedTarball/skia/src/sksl/transform/SkSLFindAndDeclareBuiltinFunctions \
    UnpackedTarball/skia/src/sksl/transform/SkSLFindAndDeclareBuiltinVariables \
    UnpackedTarball/skia/src/sksl/transform/SkSLHoistSwitchVarDeclarationsAtTopLevel \
    UnpackedTarball/skia/src/sksl/transform/SkSLRenamePrivateSymbols \
    UnpackedTarball/skia/src/sksl/transform/SkSLReplaceConstVarsWithLiterals \
    UnpackedTarball/skia/src/sksl/transform/SkSLRewriteIndexedSwizzle \
    UnpackedTarball/skia/src/utils/SkBase64 \
    UnpackedTarball/skia/src/utils/SkCamera \
    UnpackedTarball/skia/src/utils/SkCanvasStack \
@@ -561,7 +585,6 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/utils/SkCharToGlyphCache \
    UnpackedTarball/skia/src/utils/SkClipStackUtils \
    UnpackedTarball/skia/src/utils/SkCustomTypeface \
    UnpackedTarball/skia/src/utils/SkGaussianColorFilter \
    UnpackedTarball/skia/src/utils/SkJSON \
    UnpackedTarball/skia/src/utils/SkJSONWriter \
    UnpackedTarball/skia/src/utils/SkMatrix22 \
@@ -580,7 +603,6 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/utils/SkShadowTessellator \
    UnpackedTarball/skia/src/utils/SkShadowUtils \
    UnpackedTarball/skia/src/utils/SkTextUtils \
    UnpackedTarball/skia/src/utils/SkVMVisualizer \
    UnpackedTarball/skia/src/xps/SkXPSDevice \
    UnpackedTarball/skia/src/xps/SkXPSDocument \
))
@@ -590,16 +612,20 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/core/SkGpuBlurUtils \
    UnpackedTarball/skia/src/gpu/AtlasTypes \
    UnpackedTarball/skia/src/gpu/Blend \
    UnpackedTarball/skia/src/gpu/BlendFormula \
    UnpackedTarball/skia/src/gpu/DitherUtils \
    UnpackedTarball/skia/src/gpu/RectanizerPow2 \
    UnpackedTarball/skia/src/gpu/RectanizerSkyline \
    UnpackedTarball/skia/src/gpu/ResourceKey \
    UnpackedTarball/skia/src/gpu/ShaderErrorHandler \
    UnpackedTarball/skia/src/gpu/Swizzle \
    UnpackedTarball/skia/src/gpu/TiledTextureUtils \
    UnpackedTarball/skia/src/gpu/ganesh/ClipStack \
    UnpackedTarball/skia/src/gpu/ganesh/Device \
    UnpackedTarball/skia/src/gpu/ganesh/Device_drawTexture \
    UnpackedTarball/skia/src/gpu/ganesh/GrBufferTransferRenderTask \
    UnpackedTarball/skia/src/gpu/ganesh/GrBufferUpdateRenderTask \
    UnpackedTarball/skia/src/gpu/ganesh/GrFragmentProcessors \
    UnpackedTarball/skia/src/gpu/ganesh/GrSurfaceProxyView \
    UnpackedTarball/skia/src/gpu/ganesh/PathRenderer \
    UnpackedTarball/skia/src/gpu/ganesh/PathRendererChain \
@@ -609,6 +635,7 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/gpu/ganesh/effects/GrBicubicEffect \
    UnpackedTarball/skia/src/gpu/ganesh/effects/GrBitmapTextGeoProc \
    UnpackedTarball/skia/src/gpu/ganesh/effects/GrBlendFragmentProcessor \
    UnpackedTarball/skia/src/gpu/ganesh/effects/GrColorTableEffect \
    UnpackedTarball/skia/src/gpu/ganesh/effects/GrConvexPolyEffect \
    UnpackedTarball/skia/src/gpu/ganesh/effects/GrCoverageSetOpXP \
    UnpackedTarball/skia/src/gpu/ganesh/effects/GrCustomXfermode \
@@ -619,6 +646,7 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/gpu/ganesh/effects/GrMatrixEffect \
    UnpackedTarball/skia/src/gpu/ganesh/effects/GrModulateAtlasCoverageEffect \
    UnpackedTarball/skia/src/gpu/ganesh/effects/GrOvalEffect \
    UnpackedTarball/skia/src/gpu/ganesh/effects/GrPerlinNoise2Effect \
    UnpackedTarball/skia/src/gpu/ganesh/effects/GrPorterDuffXferProcessor \
    UnpackedTarball/skia/src/gpu/ganesh/effects/GrRRectEffect \
    UnpackedTarball/skia/src/gpu/ganesh/effects/GrShadowGeoProc \
@@ -640,6 +668,14 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/gpu/ganesh/glsl/GrGLSLVertexGeoBuilder \
    UnpackedTarball/skia/src/gpu/ganesh/gradients/GrGradientBitmapCache \
    UnpackedTarball/skia/src/gpu/ganesh/gradients/GrGradientShader \
    UnpackedTarball/skia/src/gpu/ganesh/image/GrImageUtils \
    UnpackedTarball/skia/src/gpu/ganesh/image/GrTextureGenerator \
    UnpackedTarball/skia/src/gpu/ganesh/image/SkImage_Ganesh \
    UnpackedTarball/skia/src/gpu/ganesh/image/SkImage_GaneshBase \
    UnpackedTarball/skia/src/gpu/ganesh/image/SkImage_GaneshFactories \
    UnpackedTarball/skia/src/gpu/ganesh/image/SkImage_GaneshYUVA \
    UnpackedTarball/skia/src/gpu/ganesh/image/SkImage_LazyTexture \
    UnpackedTarball/skia/src/gpu/ganesh/image/SkImage_RasterPinnable \
    UnpackedTarball/skia/src/gpu/ganesh/GrAHardwareBufferImageGenerator \
    UnpackedTarball/skia/src/gpu/ganesh/GrAHardwareBufferUtils \
    UnpackedTarball/skia/src/gpu/ganesh/GrAttachment \
@@ -659,6 +695,7 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/gpu/ganesh/GrDDLContext \
    UnpackedTarball/skia/src/gpu/ganesh/GrDDLTask \
    UnpackedTarball/skia/src/gpu/ganesh/GrDefaultGeoProcFactory \
    UnpackedTarball/skia/src/gpu/ganesh/GrDeferredDisplayList \
    UnpackedTarball/skia/src/gpu/ganesh/GrDirectContext \
    UnpackedTarball/skia/src/gpu/ganesh/GrDirectContextPriv \
    UnpackedTarball/skia/src/gpu/ganesh/GrDistanceFieldGenFromVector \
@@ -691,6 +728,7 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/gpu/ganesh/GrProcessorUnitTest \
    UnpackedTarball/skia/src/gpu/ganesh/GrProgramDesc \
    UnpackedTarball/skia/src/gpu/ganesh/GrProgramInfo \
    UnpackedTarball/skia/src/gpu/ganesh/GrPromiseImageTexture \
    UnpackedTarball/skia/src/gpu/ganesh/GrProxyProvider \
    UnpackedTarball/skia/src/gpu/ganesh/GrRecordingContext \
    UnpackedTarball/skia/src/gpu/ganesh/GrRecordingContextPriv \
@@ -710,6 +748,7 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/gpu/ganesh/GrStencilSettings \
    UnpackedTarball/skia/src/gpu/ganesh/GrStyle \
    UnpackedTarball/skia/src/gpu/ganesh/GrSurface \
    UnpackedTarball/skia/src/gpu/ganesh/GrSurfaceCharacterization \
    UnpackedTarball/skia/src/gpu/ganesh/GrSurfaceInfo \
    UnpackedTarball/skia/src/gpu/ganesh/GrSurfaceProxy \
    UnpackedTarball/skia/src/gpu/ganesh/GrSWMaskHelper \
@@ -735,6 +774,7 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/gpu/ganesh/mock/GrMockCaps \
    UnpackedTarball/skia/src/gpu/ganesh/mock/GrMockGpu \
    UnpackedTarball/skia/src/gpu/ganesh/mock/GrMockTypes \
    UnpackedTarball/skia/src/gpu/ganesh/surface/SkSurface_Ganesh \
    UnpackedTarball/skia/src/gpu/ganesh/SkGr \
    UnpackedTarball/skia/src/gpu/ganesh/SurfaceContext \
    UnpackedTarball/skia/src/gpu/ganesh/SurfaceFillContext \
@@ -744,17 +784,15 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/gpu/ganesh/tessellate/PathTessellator \
    UnpackedTarball/skia/src/gpu/ganesh/tessellate/StrokeTessellator \
    UnpackedTarball/skia/src/gpu/ganesh/text/GrAtlasManager \
    UnpackedTarball/skia/src/gpu/PipelineUtils \
    UnpackedTarball/skia/src/gpu/tessellate/FixedCountBufferUtils \
    UnpackedTarball/skia/src/gpu/tessellate/Tessellation \
    UnpackedTarball/skia/src/image/SkImage_GpuBase \
    UnpackedTarball/skia/src/image/SkImage_Gpu \
    UnpackedTarball/skia/src/image/SkImage_GpuYUVA \
    UnpackedTarball/skia/src/image/SkSurface_Gpu \
    UnpackedTarball/skia/src/text/GlyphRun \
    UnpackedTarball/skia/src/text/StrikeForGPU \
    UnpackedTarball/skia/src/text/gpu/DistanceFieldAdjustTable \
    UnpackedTarball/skia/src/text/gpu/GlyphVector \
    UnpackedTarball/skia/src/text/gpu/Slug \
    UnpackedTarball/skia/src/text/gpu/SlugImpl \
    UnpackedTarball/skia/src/text/gpu/StrikeCache \
    UnpackedTarball/skia/src/text/gpu/SubRunContainer \
    UnpackedTarball/skia/src/text/gpu/SubRunAllocator \
@@ -762,6 +800,7 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/text/gpu/SDFTControl \
    UnpackedTarball/skia/src/text/gpu/TextBlob \
    UnpackedTarball/skia/src/text/gpu/TextBlobRedrawCoordinator \
    UnpackedTarball/skia/src/text/gpu/VertexFiller \
))

$(eval $(call gb_Library_add_generated_exception_objects,skia,\
@@ -878,16 +917,9 @@ $(eval $(call gb_Library_add_generated_exception_objects,skia,\
        $(LO_SKIA_AVOID_INLINE_COPIES) \
))
$(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/opts/SkOpts_sse42, $(CXXFLAGS_INTRINSICS_SSE42) $(LO_CLANG_CXXFLAGS_INTRINSICS_SSE42) \
        $(LO_SKIA_AVOID_INLINE_COPIES) \
))
$(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/opts/SkOpts_ssse3, $(CXXFLAGS_INTRINSICS_SSSE3) $(LO_CLANG_CXXFLAGS_INTRINSICS_SSSE3) \
        $(LO_SKIA_AVOID_INLINE_COPIES) \
))
$(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/opts/SkOpts_crc32 \
))

$(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/opts/SkOpts_skx, $(CXXFLAGS_INTRINSICS_AVX512)  $(LO_CLANG_CXXFLAGS_INTRINSICS_AVX512)\
@@ -930,7 +962,6 @@ endif
else ifeq ($(OS),MACOSX)
$(eval $(call gb_Library_add_generated_exception_objects,skia,\
    UnpackedTarball/skia/src/ports/SkDebug_stdio \
    UnpackedTarball/skia/src/ports/SkImageEncoder_CG \
    UnpackedTarball/skia/src/ports/SkImageGeneratorCG \
    UnpackedTarball/skia/src/ports/SkFontMgr_mac_ct \
    UnpackedTarball/skia/src/ports/SkFontMgr_mac_ct_factory \
@@ -974,7 +1005,8 @@ $(eval $(call gb_Library_add_generated_objcxxobjects,skia,\
    UnpackedTarball/skia/src/gpu/ganesh/mtl/GrMtlUniformHandler \
    UnpackedTarball/skia/src/gpu/ganesh/mtl/GrMtlUtil \
    UnpackedTarball/skia/src/gpu/ganesh/mtl/GrMtlVaryingHandler \
    UnpackedTarball/skia/src/image/SkSurface_GpuMtl \
    UnpackedTarball/skia/src/gpu/ganesh/surface/SkSurface_GaneshMtl \
    UnpackedTarball/skia/src/gpu/mtl/MtlUtils \
    , -fobjc-arc \
))
endif
diff --git a/external/skia/UnpackedTarball_skia.mk b/external/skia/UnpackedTarball_skia.mk
index cafc7a9..f6e97fb 100644
--- a/external/skia/UnpackedTarball_skia.mk
+++ b/external/skia/UnpackedTarball_skia.mk
@@ -30,15 +30,14 @@ skia_patches := \
    fix-windows-dwrite.patch.1 \
    swap-buffers-rect.patch.1 \
    ubsan.patch.1 \
    fast-png-write.patch.1 \
    fix-warnings.patch.1 \
    windows-libraries-system32.patch.1 \
    allow-no-es2restrictions.patch.1 \
    vk_mem_alloc.patch.1 \
    constexpr-template.patch.0 \
    tdf147342.patch.0 \
    redefinition-of-op.patch.0 \
    0001-Added-missing-include-cstdio.patch \
    fix-SkDebugf-link-error.patch.1 \

$(eval $(call gb_UnpackedTarball_set_patchlevel,skia,1))

diff --git a/external/skia/constexpr-template.patch.0 b/external/skia/constexpr-template.patch.0
deleted file mode 100644
index 2e96266..0000000
--- a/external/skia/constexpr-template.patch.0
+++ /dev/null
@@ -1,65 +0,0 @@
--- include/sksl/DSLFunction.h
+++ include/sksl/DSLFunction.h
@@ -93,17 +93,20 @@
     DSLExpression call(ExpressionArray args, Position pos = {});
 
 private:
+    static void push_back(ExpressionArray& args, DSLExpression& expr);
+
     void collectArgs(ExpressionArray& args) {}
 
     template<class... RemainingArgs>
     void collectArgs(ExpressionArray& args, DSLVar& var, RemainingArgs&&... remaining) {
-        args.push_back(DSLExpression(var).release());
+        DSLExpression expr(var);
+        push_back(args, expr);
         collectArgs(args, std::forward<RemainingArgs>(remaining)...);
     }
 
     template<class... RemainingArgs>
     void collectArgs(ExpressionArray& args, DSLExpression expr, RemainingArgs&&... remaining) {
-        args.push_back(expr.release());
+        push_back(args, expr);
         collectArgs(args, std::forward<RemainingArgs>(remaining)...);
     }
 
--- src/core/SkStrikeCache.h
+++ src/core/SkStrikeCache.h
@@ -13,11 +13,10 @@
 #include "include/private/base/SkLoadUserConfig.h" // IWYU pragma: keep
 #include "include/private/base/SkMutex.h"
 #include "src/core/SkDescriptor.h"
+#include "src/core/SkStrike.h"
 #include "src/core/SkStrikeSpec.h"
 #include "src/text/StrikeForGPU.h"
 
-class SkStrike;
-class SkStrikePinner;
 class SkTraceMemoryDump;
 
 //  SK_DEFAULT_FONT_CACHE_COUNT_LIMIT and SK_DEFAULT_FONT_CACHE_LIMIT can be set using -D on your
--- src/gpu/ganesh/effects/GrBlendFragmentProcessor.h
+++ src/gpu/ganesh/effects/GrBlendFragmentProcessor.h
@@ -10,8 +10,7 @@
 #include "include/core/SkRefCnt.h"
 
 #include <memory>
-
-class GrFragmentProcessor;
+#include "src/gpu/ganesh/GrFragmentProcessor.h"
 
 namespace GrBlendFragmentProcessor {
 
--- src/sksl/dsl/DSLFunction.cpp
+++ src/sksl/dsl/DSLFunction.cpp
@@ -41,6 +41,10 @@
     return context.fConfig->fIsBuiltinCode && SkSL::FindIntrinsicKind(name) != kNotIntrinsic;
 }
 
+void DSLFunction::push_back(ExpressionArray& args, DSLExpression& expr) {
+    args.push_back(expr.release());
+}
+
 void DSLFunction::init(DSLModifiers modifiers, const DSLType& returnType, std::string_view name,
                        SkSpan<DSLParameter*> params, Position pos) {
     fPosition = pos;
diff --git a/external/skia/fast-png-write.patch.1 b/external/skia/fast-png-write.patch.1
deleted file mode 100644
index f47a2af..0000000
--- a/external/skia/fast-png-write.patch.1
+++ /dev/null
@@ -1,15 +0,0 @@
diff --git a/src/images/SkImageEncoder.cpp b/src/images/SkImageEncoder.cpp
index a96a93e0fc..1c110afa58 100644
--- a/src/images/SkImageEncoder.cpp
+++ b/src/images/SkImageEncoder.cpp
@@ -46,6 +46,10 @@ bool SkEncodeImage(SkWStream* dst, const SkPixmap& src,
             }
             case SkEncodedImageFormat::kPNG: {
                 SkPngEncoder::Options opts;
+                if (quality == 1) {
+                    opts.fFilterFlags = SkPngEncoder::FilterFlag::kNone;
+                    opts.fZLibLevel = 1;
+                }
                 return SkPngEncoder::Encode(dst, src, opts);
             }
             case SkEncodedImageFormat::kWEBP: {
diff --git a/external/skia/fix-SkDebugf-link-error.patch.1 b/external/skia/fix-SkDebugf-link-error.patch.1
new file mode 100644
index 0000000..989e8c4
--- /dev/null
+++ b/external/skia/fix-SkDebugf-link-error.patch.1
@@ -0,0 +1,20 @@
diff -ur skia.org/src/ports/SkDebug_stdio.cpp skia/src/ports/SkDebug_stdio.cpp
--- skia.org/src/ports/SkDebug_stdio.cpp	2023-07-09 19:30:53.272682125 +0200
+++ skia/src/ports/SkDebug_stdio.cpp	2023-07-09 19:34:44.812723870 +0200
@@ -5,6 +5,7 @@
  * found in the LICENSE file.
  */
 
+#include "include/private/base/SkAPI.h"
 #include "include/private/base/SkFeatures.h"
 #include "include/private/base/SkLoadUserConfig.h"
 
@@ -13,7 +14,7 @@
 #include <stdarg.h>
 #include <stdio.h>
 
-void SkDebugf(const char format[], ...) {
+SK_API void SkDebugf(const char format[], ...) {
     va_list args;
     va_start(args, format);
 #pragma GCC diagnostic push
diff --git a/external/skia/fix-alpha-difference-copy.patch.1 b/external/skia/fix-alpha-difference-copy.patch.1
index 61a61e6..a8db737 100644
--- a/external/skia/fix-alpha-difference-copy.patch.1
+++ b/external/skia/fix-alpha-difference-copy.patch.1
@@ -3,7 +3,7 @@ index df7d9a7025..7f94c2a660 100644
--- a/src/core/SkBlitter_Sprite.cpp
+++ b/src/core/SkBlitter_Sprite.cpp
@@ -191,7 +191,7 @@ SkBlitter* SkBlitter::ChooseSprite(const SkPixmap& dst, const SkPaint& paint,
     }
     SkASSERT(alloc != nullptr);
 
     // TODO: in principle SkRasterPipelineSpriteBlitter could be made to handle this.
-    if (source.alphaType() == kUnpremul_SkAlphaType) {
diff --git a/external/skia/fix-pch.patch.1 b/external/skia/fix-pch.patch.1
index f3e7073..9adb479 100644
--- a/external/skia/fix-pch.patch.1
+++ b/external/skia/fix-pch.patch.1
@@ -45,9 +45,9 @@ index 035f94e1f6..3cf12db902 100644
+#ifndef SKSL_POISON
+#define SKSL_POISON
+
 #include "src/sksl/SkSLBuiltinTypes.h"
 #include "src/sksl/SkSLCompiler.h"
 #include "src/sksl/SkSLContext.h"
 
@@ -38,3 +41,5 @@ private:
 };
 
diff --git a/external/skia/inc/pch/precompiled_skia.hxx b/external/skia/inc/pch/precompiled_skia.hxx
index 1234f28..a37318b 100644
--- a/external/skia/inc/pch/precompiled_skia.hxx
+++ b/external/skia/inc/pch/precompiled_skia.hxx
@@ -13,7 +13,7 @@
 manual changes will be rewritten by the next run of update_pch.sh (which presumably
 also fixes all possible problems, so it's usually better to use it).

 Generated on 2022-05-20 16:24:18 using:
 Generated on 2023-07-09 12:12:38 using:
 ./bin/update_pch external/skia skia --cutoff=1 --exclude:system --include:module --include:local

 If after updating build fails, use the following command to locate conflicting headers:
@@ -26,19 +26,24 @@
#include <array>
#include <atomic>
#include <bitset>
#include <cassert>
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <chrono>
#include <cinttypes>
#include <climits>
#include <cmath>
#include <csetjmp>
#include <cstddef>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctype.h>
#include <deque>
#include <errno.h>
#include <float.h>
#include <forward_list>
#include <functional>
#include <initializer_list>
@@ -47,14 +52,14 @@
#include <limits.h>
#include <limits>
#include <locale>
#include <map>
#include <math.h>
#include <memory>
#include <new>
#include <numeric>
#include <optional>
#include <png.h>
#include <pngconf.h>
#include <queue>
#include <ratio>
#include <set>
#include <sstream>
#include <stdarg.h>
@@ -68,7 +73,6 @@
#include <tuple>
#include <type_traits>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>
#endif // PCH_LEVEL >= 1
@@ -79,6 +83,11 @@
#if PCH_LEVEL >= 3
#include <include/codec/SkAndroidCodec.h>
#include <include/codec/SkCodec.h>
#include <include/codec/SkCodecAnimation.h>
#include <include/codec/SkEncodedImageFormat.h>
#include <include/codec/SkEncodedOrigin.h>
#include <include/codec/SkPixmapUtils.h>
#include <include/codec/SkPngChunkReader.h>
#include <include/core/SkAlphaType.h>
#include <include/core/SkAnnotation.h>
#include <include/core/SkBBHFactory.h>
@@ -87,18 +96,18 @@
#include <include/core/SkBlender.h>
#include <include/core/SkBlurTypes.h>
#include <include/core/SkCanvas.h>
#include <include/core/SkCapabilities.h>
#include <include/core/SkClipOp.h>
#include <include/core/SkColor.h>
#include <include/core/SkColorFilter.h>
#include <include/core/SkColorPriv.h>
#include <include/core/SkColorSpace.h>
#include <include/core/SkColorTable.h>
#include <include/core/SkColorType.h>
#include <include/core/SkContourMeasure.h>
#include <include/core/SkCubicMap.h>
#include <include/core/SkData.h>
#include <include/core/SkDataTable.h>
#include <include/core/SkDeferredDisplayList.h>
#include <include/core/SkDeferredDisplayListRecorder.h>
#include <include/core/SkDocument.h>
#include <include/core/SkDrawable.h>
#include <include/core/SkExecutor.h>
@@ -111,16 +120,13 @@
#include <include/core/SkFontStyle.h>
#include <include/core/SkFontTypes.h>
#include <include/core/SkGraphics.h>
#include <include/core/SkICC.h>
#include <include/core/SkImage.h>
#include <include/core/SkImageEncoder.h>
#include <include/core/SkImageFilter.h>
#include <include/core/SkImageGenerator.h>
#include <include/core/SkImageInfo.h>
#include <include/core/SkM44.h>
#include <include/core/SkMallocPixelRef.h>
#include <include/core/SkMaskFilter.h>
#include <include/private/base/SkMath.h>
#include <include/core/SkMatrix.h>
#include <include/core/SkMesh.h>
#include <include/core/SkOpenTypeSVGDecoder.h>
@@ -131,13 +137,13 @@
#include <include/core/SkPathEffect.h>
#include <include/core/SkPathMeasure.h>
#include <include/core/SkPathTypes.h>
#include <include/core/SkPathUtils.h>
#include <include/core/SkPicture.h>
#include <include/core/SkPictureRecorder.h>
#include <include/core/SkPixelRef.h>
#include <include/core/SkPixmap.h>
#include <include/core/SkPoint.h>
#include <include/core/SkPoint3.h>
#include <include/core/SkPromiseImageTexture.h>
#include <include/core/SkRRect.h>
#include <include/core/SkRSXform.h>
#include <include/core/SkRasterHandleAllocator.h>
@@ -154,10 +160,11 @@
#include <include/core/SkString.h>
#include <include/core/SkStrokeRec.h>
#include <include/core/SkSurface.h>
#include <include/core/SkSurfaceCharacterization.h>
#include <include/core/SkSurfaceProps.h>
#include <include/core/SkSwizzle.h>
#include <include/core/SkTextBlob.h>
#include <include/core/SkTileMode.h>
#include <include/core/SkTiledImageUtils.h>
#include <include/core/SkTime.h>
#include <include/core/SkTraceMemoryDump.h>
#include <include/core/SkTypeface.h>
@@ -169,9 +176,7 @@
#include <include/effects/Sk1DPathEffect.h>
#include <include/effects/Sk2DPathEffect.h>
#include <include/effects/SkBlenders.h>
#include <include/effects/SkBlurMaskFilter.h>
#include <include/effects/SkColorMatrix.h>
#include <include/effects/SkColorMatrixFilter.h>
#include <include/effects/SkCornerPathEffect.h>
#include <include/effects/SkDashPathEffect.h>
#include <include/effects/SkDiscretePathEffect.h>
@@ -185,62 +190,55 @@
#include <include/effects/SkRuntimeEffect.h>
#include <include/effects/SkShaderMaskFilter.h>
#include <include/effects/SkStrokeAndFillPathEffect.h>
#include <include/effects/SkTableColorFilter.h>
#include <include/effects/SkTableMaskFilter.h>
#include <include/effects/SkTrimPathEffect.h>
#include <include/encode/SkJpegEncoder.h>
#include <include/encode/SkEncoder.h>
#include <include/encode/SkICC.h>
#include <include/encode/SkPngEncoder.h>
#include <include/encode/SkWebpEncoder.h>
#include <include/gpu/GrBackendSurface.h>
#include <include/gpu/GrContextOptions.h>
#include <include/gpu/GrContextThreadSafeProxy.h>
#include <include/gpu/GrDirectContext.h>
#include <include/gpu/GrRecordingContext.h>
#include <include/pathops/SkPathOps.h>
#include <include/ports/SkRemotableFontMgr.h>
#include <include/private/SkBitmaskEnum.h>
#include <include/private/SkChecksum.h>
#include <include/private/SkColorData.h>
#include <include/private/base/SkDeque.h>
#include <include/private/SkEncodedInfo.h>
#include <include/private/SkFixed.h>
#include <include/private/base/SkFloatBits.h>
#include <include/private/base/SkFloatingPoint.h>
#include <include/private/SkHalf.h>
#include <include/private/SkGainmapInfo.h>
#include <include/private/SkIDChangeListener.h>
#include <include/private/base/SkMacros.h>
#include <include/private/SkMalloc.h>
#include <include/private/base/SkMutex.h>
#include <include/private/base/SkOnce.h>
#include <include/private/SkOpts_spi.h>
#include <include/private/SkPathRef.h>
#include <include/private/SkSLDefines.h>
#include <include/private/SkSLLayout.h>
#include <include/private/SkSLModifiers.h>
#include <include/private/SkSLProgramElement.h>
#include <include/private/SkSLProgramKind.h>
#include <include/private/SkSLSampleUsage.h>
#include <include/private/SkSLStatement.h>
#include <include/private/SkSLString.h>
#include <include/private/SkSLSymbol.h>
#include <include/private/SkShadowFlags.h>
#include <include/private/base/SkAlign.h>
#include <include/private/base/SkAssert.h>
#include <include/private/base/SkCPUTypes.h>
#include <include/private/base/SkContainers.h>
#include <include/private/base/SkDebug.h>
#include <include/private/base/SkDeque.h>
#include <include/private/base/SkFeatures.h>
#include <include/private/base/SkFixed.h>
#include <include/private/base/SkFloatBits.h>
#include <include/private/base/SkFloatingPoint.h>
#include <include/private/base/SkMacros.h>
#include <include/private/base/SkMalloc.h>
#include <include/private/base/SkMath.h>
#include <include/private/base/SkMutex.h>
#include <include/private/base/SkNoncopyable.h>
#include <include/private/base/SkOnce.h>
#include <include/private/base/SkPathEnums.h>
#include <include/private/base/SkPoint_impl.h>
#include <include/private/base/SkSafe32.h>
#include <include/private/base/SkSemaphore.h>
#include <include/private/SkShadowFlags.h>
#include <include/private/SkSpinlock.h>
#include <include/private/base/SkSpan_impl.h>
#include <include/private/base/SkTArray.h>
#include <include/private/base/SkTDArray.h>
#include <include/private/base/SkTFitsIn.h>
#include <include/private/base/SkTPin.h>
#include <include/private/SkTemplates.h>
#include <include/private/base/SkTemplates.h>
#include <include/private/base/SkThreadAnnotations.h>
#include <include/private/base/SkThreadID.h>
#include <include/private/base/SkTo.h>
#include <include/private/base/SkVx.h>
#include <include/private/chromium/GrSlug.h>
#include <include/private/chromium/SkChromeRemoteGlyphCache.h>
#include <include/private/gpu/ganesh/GrImageContext.h>
#include <include/private/gpu/ganesh/GrTypesPriv.h>
#include <modules/skcms/skcms.h>
#include <include/private/chromium/SkDiscardableMemory.h>
#include <include/private/chromium/Slug.h>
#include <include/utils/SkBase64.h>
#include <include/utils/SkCamera.h>
#include <include/utils/SkCanvasStateUtils.h>
@@ -253,9 +251,39 @@
#include <include/utils/SkPaintFilterCanvas.h>
#include <include/utils/SkParse.h>
#include <include/utils/SkParsePath.h>
#include <include/utils/SkRandom.h>
#include <include/utils/SkShadowUtils.h>
#include <include/utils/SkTextUtils.h>
#include <include/utils/SkTraceEventPhase.h>
#include <modules/skcms/skcms.h>
#include <src/base/SkArenaAlloc.h>
#include <src/base/SkAutoMalloc.h>
#include <src/base/SkBezierCurves.h>
#include <src/base/SkBlockAllocator.h>
#include <src/base/SkBuffer.h>
#include <src/base/SkCubics.h>
#include <src/base/SkEndian.h>
#include <src/base/SkHalf.h>
#include <src/base/SkLeanWindows.h>
#include <src/base/SkMSAN.h>
#include <src/base/SkMathPriv.h>
#include <src/base/SkNoDestructor.h>
#include <src/base/SkQuads.h>
#include <src/base/SkRandom.h>
#include <src/base/SkRectMemcpy.h>
#include <src/base/SkSafeMath.h>
#include <src/base/SkScopeExit.h>
#include <src/base/SkSharedMutex.h>
#include <src/base/SkSpinlock.h>
#include <src/base/SkStringView.h>
#include <src/base/SkTDPQueue.h>
#include <src/base/SkTInternalLList.h>
#include <src/base/SkTLazy.h>
#include <src/base/SkTSearch.h>
#include <src/base/SkTSort.h>
#include <src/base/SkUTF.h>
#include <src/base/SkUtils.h>
#include <src/base/SkVx.h>
#include <src/base/SkZip.h>
#include <src/codec/SkAndroidCodecAdapter.h>
#include <src/codec/SkBmpBaseCodec.h>
#include <src/codec/SkBmpCodec.h>
@@ -264,11 +292,12 @@
#include <src/codec/SkBmpStandardCodec.h>
#include <src/codec/SkCodecImageGenerator.h>
#include <src/codec/SkCodecPriv.h>
#include <src/codec/SkColorTable.h>
#include <src/codec/SkColorPalette.h>
#include <src/codec/SkFrameHolder.h>
#include <src/codec/SkIcoCodec.h>
#include <src/codec/SkMaskSwizzler.h>
#include <src/codec/SkMasks.h>
#include <src/codec/SkPixmapUtilsPriv.h>
#include <src/codec/SkPngCodec.h>
#include <src/codec/SkPngPriv.h>
#include <src/codec/SkSampledCodec.h>
@@ -278,12 +307,10 @@
#include <src/core/SkAAClip.h>
#include <src/core/SkATrace.h>
#include <src/core/SkAdvancedTypefaceMetrics.h>
#include <src/core/SkAlphaRuns.h>
#include <src/core/SkAnalyticEdge.h>
#include <src/core/SkAnnotationKeys.h>
#include <src/core/SkAntiRun.h>
#include <src/base/SkArenaAlloc.h>
#include <src/core/SkAutoBlitterChoose.h>
#include <src/base/SkAutoMalloc.h>
#include <src/core/SkAutoPixmapStorage.h>
#include <src/core/SkBigPicture.h>
#include <src/core/SkBitmapCache.h>
@@ -294,14 +321,14 @@
#include <src/core/SkBlenderBase.h>
#include <src/core/SkBlitRow.h>
#include <src/core/SkBlitter.h>
#include <src/base/SkBlockAllocator.h>
#include <src/core/SkBlitter_A8.h>
#include <src/core/SkBlurMask.h>
#include <src/base/SkBuffer.h>
#include <src/core/SkBlurMaskFilterImpl.h>
#include <src/core/SkCachedData.h>
#include <src/core/SkCanvasPriv.h>
#include <src/core/SkChecksum.h>
#include <src/core/SkClipStack.h>
#include <src/core/SkClipStackDevice.h>
#include <src/core/SkColorFilterBase.h>
#include <src/core/SkColorFilterPriv.h>
#include <src/core/SkColorSpacePriv.h>
#include <src/core/SkColorSpaceXformSteps.h>
@@ -310,54 +337,48 @@
#include <src/core/SkCoreBlitters.h>
#include <src/core/SkCpu.h>
#include <src/core/SkCubicClipper.h>
#include <src/core/SkDebugUtils.h>
#include <src/core/SkDescriptor.h>
#include <src/core/SkDevice.h>
#include <include/private/chromium/SkDiscardableMemory.h>
#include <src/core/SkDistanceFieldGen.h>
#include <src/core/SkDraw.h>
#include <src/core/SkDrawBase.h>
#include <src/core/SkDrawProcs.h>
#include <src/core/SkDrawShadowInfo.h>
#include <src/core/SkEdge.h>
#include <src/core/SkEdgeBuilder.h>
#include <src/core/SkEdgeClipper.h>
#include <src/core/SkEffectPriv.h>
#include <src/core/SkEndian.h>
#include <src/core/SkEnumerate.h>
#include <src/core/SkFDot6.h>
#include <src/core/SkFilterColorProgram.h>
#include <src/core/SkFontDescriptor.h>
#include <src/core/SkFontMetricsPriv.h>
#include <src/core/SkFontPriv.h>
#include <src/core/SkFontStream.h>
#include <src/core/SkFuzzLogging.h>
#include <src/core/SkGaussFilter.h>
#include <src/core/SkGeometry.h>
#include <src/core/SkGlyph.h>
#include <src/core/SkGlyphBuffer.h>
#include <src/core/SkGlyphRunPainter.h>
#include <src/core/SkGpuBlurUtils.h>
#include <src/core/SkICCPriv.h>
#include <src/core/SkImageFilterCache.h>
#include <src/core/SkImageFilterTypes.h>
#include <src/core/SkImageFilter_Base.h>
#include <src/core/SkImageInfoPriv.h>
#include <src/core/SkImagePriv.h>
#include <src/core/SkLRUCache.h>
#include <src/core/SkLatticeIter.h>
#include <src/base/SkLeanWindows.h>
#include <src/core/SkLineClipper.h>
#include <src/core/SkLocalMatrixImageFilter.h>
#include <src/core/SkMD5.h>
#include <src/core/SkMSAN.h>
#include <src/core/SkMask.h>
#include <src/core/SkMaskBlurFilter.h>
#include <src/core/SkMaskCache.h>
#include <src/core/SkMaskFilterBase.h>
#include <src/core/SkMaskGamma.h>
#include <src/base/SkMathPriv.h>
#include <src/core/SkMatrixInvert.h>
#include <src/core/SkMatrixPriv.h>
#include <src/core/SkMatrixProvider.h>
#include <src/core/SkMatrixUtils.h>
#include <src/core/SkMeshPriv.h>
#include <src/core/SkMessageBus.h>
#include <src/core/SkMipmap.h>
#include <src/core/SkMipmapAccessor.h>
@@ -377,7 +398,6 @@
#include <src/core/SkPicturePriv.h>
#include <src/core/SkPictureRecord.h>
#include <src/core/SkPixelRefPriv.h>
#include <src/core/SkPixmapPriv.h>
#include <src/core/SkPointPriv.h>
#include <src/core/SkPtrRecorder.h>
#include <src/core/SkQuadClipper.h>
@@ -385,7 +405,10 @@
#include <src/core/SkRTree.h>
#include <src/core/SkRasterClip.h>
#include <src/core/SkRasterPipeline.h>
#include <src/core/SkRasterPipelineOpContexts.h>
#include <src/core/SkRasterPipelineOpList.h>
#include <src/core/SkReadBuffer.h>
#include <src/core/SkReadPixelsRec.h>
#include <src/core/SkRecord.h>
#include <src/core/SkRecordDraw.h>
#include <src/core/SkRecordOpts.h>
@@ -396,42 +419,36 @@
#include <src/core/SkRectPriv.h>
#include <src/core/SkRegionPriv.h>
#include <src/core/SkResourceCache.h>
#include <src/core/SkRuntimeBlender.h>
#include <src/core/SkRuntimeEffectPriv.h>
#include <src/core/SkSLTypeShared.h>
#include <src/base/SkSafeMath.h>
#include <src/core/SkSafeRange.h>
#include <src/core/SkSamplingPriv.h>
#include <src/core/SkScaleToSides.h>
#include <src/core/SkScalerContext.h>
#include <src/core/SkScan.h>
#include <src/core/SkScanPriv.h>
#include <src/base/SkScopeExit.h>
#include <src/core/SkSharedMutex.h>
#include <src/core/SkSpecialImage.h>
#include <src/core/SkSpecialSurface.h>
#include <src/core/SkSpriteBlitter.h>
#include <src/core/SkStreamPriv.h>
#include <src/core/SkStrike.h>
#include <src/core/SkStrikeCache.h>
#include <src/core/SkStrikeSpec.h>
#include <src/core/SkStringUtils.h>
#include <src/core/SkStroke.h>
#include <src/core/SkStrokerPriv.h>
#include <src/core/SkSurfacePriv.h>
#include <src/base/SkTDPQueue.h>
#include <src/core/SkSwizzlePriv.h>
#include <src/core/SkTDynamicHash.h>
#include <src/base/SkTInternalLList.h>
#include <src/base/SkTLazy.h>
#include <src/core/SkTSearch.h>
#include <src/base/SkTSort.h>
#include <src/core/SkTHash.h>
#include <src/core/SkTaskGroup.h>
#include <src/core/SkTextBlobPriv.h>
#include <src/core/SkTextBlobTrace.h>
#include <src/core/SkTextFormatParams.h>
#include <src/core/SkTraceEvent.h>
#include <src/core/SkTraceEventCommon.h>
#include <src/core/SkTypefaceCache.h>
#include <src/core/SkTypeface_remote.h>
#include <src/base/SkUtils.h>
#include <src/core/SkVM.h>
#include <src/core/SkVMBlitter.h>
#include <src/core/SkValidationUtils.h>
@@ -440,8 +457,6 @@
#include <src/core/SkWriteBuffer.h>
#include <src/core/SkWritePixelsRec.h>
#include <src/core/SkWriter32.h>
#include <src/core/SkXfermodeInterpretation.h>
#include <src/core/SkXfermodePriv.h>
#include <src/core/SkYUVAInfoLocation.h>
#include <src/core/SkYUVMath.h>
#include <src/core/SkYUVPlanesCache.h>
@@ -449,61 +464,31 @@
#include <src/effects/SkEmbossMask.h>
#include <src/effects/SkEmbossMaskFilter.h>
#include <src/effects/SkOpPE.h>
#include <src/effects/SkShaderMaskFilterImpl.h>
#include <src/effects/SkTrimPE.h>
#include <src/effects/colorfilters/SkBlendModeColorFilter.h>
#include <src/effects/colorfilters/SkColorFilterBase.h>
#include <src/effects/colorfilters/SkColorSpaceXformColorFilter.h>
#include <src/effects/colorfilters/SkComposeColorFilter.h>
#include <src/effects/colorfilters/SkGaussianColorFilter.h>
#include <src/effects/colorfilters/SkMatrixColorFilter.h>
#include <src/effects/colorfilters/SkRuntimeColorFilter.h>
#include <src/effects/colorfilters/SkTableColorFilter.h>
#include <src/effects/colorfilters/SkWorkingFormatColorFilter.h>
#include <src/effects/imagefilters/SkCropImageFilter.h>
#include <src/effects/imagefilters/SkRuntimeImageFilter.h>
#include <src/gpu/Blend.h>
#include <src/gpu/KeyBuilder.h>
#include <src/gpu/ResourceKey.h>
#include <src/gpu/ganesh/GrCaps.h>
#include <src/gpu/ganesh/GrColorInfo.h>
#include <src/gpu/ganesh/GrColorSpaceXform.h>
#include <src/gpu/ganesh/GrContextThreadSafeProxyPriv.h>
#include <src/gpu/ganesh/GrDirectContextPriv.h>
#include <src/gpu/ganesh/GrDrawOpAtlas.h>
#include <src/gpu/ganesh/GrFPArgs.h>
#include <src/gpu/ganesh/GrFragmentProcessor.h>
#include <src/gpu/ganesh/GrGpuResourcePriv.h>
#include <src/gpu/ganesh/GrImageContextPriv.h>
#include <src/gpu/ganesh/GrImageInfo.h>
#include <src/gpu/ganesh/GrMemoryPool.h>
#include <src/gpu/ganesh/GrPaint.h>
#include <src/gpu/ganesh/GrProxyProvider.h>
#include <src/gpu/ganesh/GrRecordingContextPriv.h>
#include <src/gpu/ganesh/GrRenderTask.h>
#include <src/gpu/ganesh/GrResourceProvider.h>
#include <src/gpu/ganesh/GrSamplerState.h>
#include <src/gpu/ganesh/GrShaderCaps.h>
#include <src/gpu/ganesh/GrStyle.h>
#include <src/gpu/ganesh/GrSurfaceProxyView.h>
#include <src/gpu/ganesh/GrTexture.h>
#include <src/gpu/ganesh/GrTextureProxy.h>
#include <src/gpu/ganesh/GrThreadSafeCache.h>
#include <src/gpu/ganesh/GrYUVATextureProxies.h>
#include <src/gpu/ganesh/SkGr.h>
#include <src/gpu/ganesh/SurfaceFillContext.h>
#include <src/gpu/ganesh/effects/GrBicubicEffect.h>
#include <src/gpu/ganesh/effects/GrBlendFragmentProcessor.h>
#include <src/gpu/ganesh/effects/GrCustomXfermode.h>
#include <src/gpu/ganesh/effects/GrMatrixConvolutionEffect.h>
#include <src/gpu/ganesh/effects/GrMatrixEffect.h>
#include <src/gpu/ganesh/effects/GrPorterDuffXferProcessor.h>
#include <src/gpu/ganesh/effects/GrSkSLFP.h>
#include <src/gpu/ganesh/effects/GrTextureEffect.h>
#include <src/gpu/ganesh/effects/GrYUVtoRGBEffect.h>
#include <src/gpu/ganesh/geometry/GrPathUtils.h>
#include <src/gpu/ganesh/geometry/GrStyledShape.h>
#include <src/gpu/ganesh/glsl/GrGLSLFragmentShaderBuilder.h>
#include <src/gpu/ganesh/glsl/GrGLSLProgramDataManager.h>
#include <src/gpu/ganesh/glsl/GrGLSLUniformHandler.h>
#include <src/gpu/ganesh/gradients/GrGradientShader.h>
#include <src/encode/SkICCPriv.h>
#include <src/encode/SkImageEncoderFns.h>
#include <src/encode/SkImageEncoderPriv.h>
#include <src/encode/SkPngEncoderImpl.h>
#include <src/image/SkImageGeneratorPriv.h>
#include <src/image/SkImage_Base.h>
#include <src/image/SkImage_Gpu.h>
#include <src/image/SkImage_Lazy.h>
#include <src/image/SkReadPixelsRec.h>
#include <src/image/SkImage_Picture.h>
#include <src/image/SkImage_Raster.h>
#include <src/image/SkPictureImageGenerator.h>
#include <src/image/SkRescaleAndReadPixels.h>
#include <src/image/SkSurface_Base.h>
#include <src/images/SkImageEncoderPriv.h>
#include <src/image/SkSurface_Raster.h>
#include <src/lazy/SkDiscardableMemoryPool.h>
#include <src/pathops/SkAddIntersections.h>
#include <src/pathops/SkIntersectionHelper.h>
@@ -525,6 +510,7 @@
#include <src/pathops/SkPathOpsPoint.h>
#include <src/pathops/SkPathOpsQuad.h>
#include <src/pathops/SkPathOpsRect.h>
#include <src/pathops/SkPathOpsTCurve.h>
#include <src/pathops/SkPathOpsTSect.h>
#include <src/pathops/SkPathOpsTypes.h>
#include <src/pathops/SkPathWriter.h>
@@ -535,15 +521,27 @@
#include <src/sfnt/SkOTTable_name.h>
#include <src/sfnt/SkOTUtils.h>
#include <src/shaders/SkBitmapProcShader.h>
#include <src/shaders/SkBlendShader.h>
#include <src/shaders/SkColorFilterShader.h>
#include <src/shaders/SkColorShader.h>
#include <src/shaders/SkCoordClampShader.h>
#include <src/shaders/SkEmptyShader.h>
#include <src/shaders/SkImageShader.h>
#include <src/shaders/SkLocalMatrixShader.h>
#include <src/shaders/SkPerlinNoiseShaderImpl.h>
#include <src/shaders/SkPictureShader.h>
#include <src/shaders/SkRuntimeShader.h>
#include <src/shaders/SkShaderBase.h>
#include <src/shaders/SkTransformShader.h>
#include <src/shaders/SkTriColorShader.h>
#include <src/shaders/gradients/SkConicalGradient.h>
#include <src/shaders/gradients/SkGradientBaseShader.h>
#include <src/shaders/gradients/SkLinearGradient.h>
#include <src/text/gpu/StrikeCache.h>
#include <src/utils/SkBlitterTrace.h>
#include <src/shaders/gradients/SkRadialGradient.h>
#include <src/shaders/gradients/SkSweepGradient.h>
#include <src/text/GlyphRun.h>
#include <src/text/StrikeForGPU.h>
#include <src/utils/SkBitSet.h>
#include <src/utils/SkCanvasStack.h>
#include <src/utils/SkCharToGlyphCache.h>
#include <src/utils/SkClipStackUtils.h>
@@ -559,9 +557,6 @@
#include <src/utils/SkPolyUtils.h>
#include <src/utils/SkShaderUtils.h>
#include <src/utils/SkShadowTessellator.h>
#include <src/utils/SkTestCanvas.h>
#include <src/base/SkUTF.h>
#include <src/utils/SkVMVisualizer.h>
#include <tools/sk_app/WindowContext.h>
#endif // PCH_LEVEL >= 3
#if PCH_LEVEL >= 4
diff --git a/external/skia/make-api-visible.patch.1 b/external/skia/make-api-visible.patch.1
index 30eefa1..4248fb5 100644
--- a/external/skia/make-api-visible.patch.1
+++ b/external/skia/make-api-visible.patch.1
@@ -21,7 +21,7 @@ index 3e136a8f57..affb89e43e 100644
 #ifdef SK_METAL
-std::unique_ptr<WindowContext> MakeMetalForMac(const MacWindowInfo&, const DisplayParams&);
+SK_API std::unique_ptr<WindowContext> MakeMetalForMac(const MacWindowInfo&, const DisplayParams&);
 #ifdef SK_GRAPHITE_ENABLED
 #if defined(SK_GRAPHITE)
 std::unique_ptr<WindowContext> MakeGraphiteMetalForMac(const MacWindowInfo&, const DisplayParams&);
 #endif
diff --git a/tools/sk_app/unix/WindowContextFactory_unix.h b/tools/sk_app/unix/WindowContextFactory_unix.h
@@ -43,7 +43,7 @@ index 11bd2d2ac2..09c92dc417 100644
+SK_API std::unique_ptr<WindowContext> MakeDawnVulkanForXlib(const XlibWindowInfo&, const DisplayParams&);
 #endif
 
 #if defined(SK_DAWN) && defined(SK_GRAPHITE_ENABLED)
 #if defined(SK_DAWN) && defined(SK_GRAPHITE)
 std::unique_ptr<WindowContext> MakeGraphiteDawnVulkanForXlib(const XlibWindowInfo&,
                                                              const DisplayParams&);
 #endif
@@ -87,7 +87,7 @@ index c05a4f0acf..fc27cd2afb 100644
 #ifdef SK_DAWN
-std::unique_ptr<WindowContext> MakeDawnD3D12ForWin(HWND, const DisplayParams&);
+SK_API std::unique_ptr<WindowContext> MakeDawnD3D12ForWin(HWND, const DisplayParams&);
 #ifdef SK_GRAPHITE_ENABLED
 #if defined(SK_GRAPHITE)
 std::unique_ptr<WindowContext> MakeGraphiteDawnD3D12ForWin(HWND, const DisplayParams&);
 #endif
 #endif
diff --git a/external/skia/share-grcontext.patch.1 b/external/skia/share-grcontext.patch.1
index c2f1320..9d49186 100644
--- a/external/skia/share-grcontext.patch.1
+++ b/external/skia/share-grcontext.patch.1
@@ -21,12 +21,14 @@ index 106d366415..08dc19b5c8 100644
     sk_sp<SkSurface> getBackbufferSurface() override;
 
     bool isValid() override { return fValid; }
@@ -46,16 +51,34 @@ protected:
@@ -44,18 +49,36 @@
     void destroyContext();
     virtual void onDestroyContext() = 0;
 
+    static void checkDestroyShared();
+
     void onSwapBuffers() override;
 
     bool                        fValid;
+
+    // We need to use just one GrDirectContext, so share all the relevant data.
@@ -36,7 +38,7 @@ index 106d366415..08dc19b5c8 100644
     sk_cfp<id<MTLCommandQueue>> fQueue;
-    CAMetalLayer*               fMetalLayer;
-    GrMTLHandle                 fDrawableHandle;
 #if GR_METAL_SDK_VERSION >= 230
 #if SKGPU_GRAPHITE_METAL_SDK_VERSION >= 230
     // wrapping this in sk_cfp throws up an availability warning, so we'll track lifetime manually
     id<MTLBinaryArchive>        fPipelineArchive SK_API_AVAILABLE(macos(11.0), ios(14.0));
 #endif
@@ -62,7 +64,7 @@ diff --git a/tools/sk_app/MetalWindowContext.mm b/tools/sk_app/MetalWindowContex
index d972e321a6..9f576944b7 100644
--- a/tools/sk_app/MetalWindowContext.mm
+++ b/tools/sk_app/MetalWindowContext.mm
@@ -37,24 +37,30 @@ NSURL* MetalWindowContext::CacheURL() {
@@ -40,24 +40,30 @@ NSURL* MetalWindowContext::CacheURL() {
 }
 
 void MetalWindowContext::initializeContext() {
@@ -98,7 +100,7 @@ index d972e321a6..9f576944b7 100644
-
-    fValid = this->onInitializeContext();
 
 #if GR_METAL_SDK_VERSION >= 230
 #if SKGPU_GRAPHITE_METAL_SDK_VERSION >= 230
     if (fDisplayParams.fEnableBinaryArchive) {
@@ -62,11 +68,11 @@ void MetalWindowContext::initializeContext() {
             sk_cfp<MTLBinaryArchiveDescriptor*> desc([MTLBinaryArchiveDescriptor new]);
@@ -116,7 +118,7 @@ index d972e321a6..9f576944b7 100644
                     SkDebugf("Error creating MTLBinaryArchive:\n%s\n",
                              error.debugDescription.UTF8String);
                 }
@@ -74,46 +80,75 @@ void MetalWindowContext::initializeContext() {
@@ -77,46 +83,75 @@ void MetalWindowContext::initializeContext() {
         }
     } else {
         if (@available(macOS 11.0, iOS 14.0, *)) {
@@ -131,7 +133,7 @@ index d972e321a6..9f576944b7 100644
-    backendContext.fQueue.retain((GrMTLHandle)fQueue.get());
+    backendContext.fDevice.retain((GrMTLHandle)d->fDevice.get());
+    backendContext.fQueue.retain((GrMTLHandle)d->fQueue.get());
 #if GR_METAL_SDK_VERSION >= 230
 #if SKGPU_GRAPHITE_METAL_SDK_VERSION >= 230
     if (@available(macOS 11.0, iOS 14.0, *)) {
-        backendContext.fBinaryArchive.retain((__bridge GrMTLHandle)fPipelineArchive);
+        backendContext.fBinaryArchive.retain((__bridge GrMTLHandle)d->fPipelineArchive);
@@ -192,7 +194,7 @@ index d972e321a6..9f576944b7 100644
+        fGlobalShared->fContext.reset();
+    }
+
 #if GR_METAL_SDK_VERSION >= 230
 #if SKGPU_GRAPHITE_METAL_SDK_VERSION >= 230
     if (@available(macOS 11.0, iOS 14.0, *)) {
-        [fPipelineArchive release];
+        [fGlobalShared->fPipelineArchive release];
@@ -207,8 +209,8 @@ index d972e321a6..9f576944b7 100644
 }
 
 sk_sp<SkSurface> MetalWindowContext::getBackbufferSurface() {
@@ -154,7 +189,7 @@ sk_sp<SkSurface> MetalWindowContext::getBackbufferSurface() {
 void MetalWindowContext::swapBuffers() {
@@ -159,7 +194,7 @@ sk_sp<SkSurface> MetalWindowContext::getBackbufferSurface() {
 void MetalWindowContext::onSwapBuffers() {
     id<CAMetalDrawable> currentDrawable = (id<CAMetalDrawable>)fDrawableHandle;
 
-    id<MTLCommandBuffer> commandBuffer([*fQueue commandBuffer]);
@@ -216,9 +218,9 @@ index d972e321a6..9f576944b7 100644
     commandBuffer.label = @"Present";
 
     [commandBuffer presentDrawable:currentDrawable];
@@ -175,9 +210,9 @@ void MetalWindowContext::activate(bool isActive) {
@@ -180,9 +215,9 @@ void MetalWindowContext::activate(bool isActive) {
     if (!isActive) {
 #if GR_METAL_SDK_VERSION >= 230
 #if SKGPU_GRAPHITE_METAL_SDK_VERSION >= 230
         if (@available(macOS 11.0, iOS 14.0, *)) {
-            if (fPipelineArchive) {
+            if (fShared->fPipelineArchive) {
@@ -646,15 +648,15 @@ index c9db528ca4..634034da5a 100644
             return nullptr;
         }
     }
@@ -542,7 +577,7 @@ void VulkanWindowContext::swapBuffers() {
@@ -547,7 +582,7 @@ void VulkanWindowContext::swapBuffers() {
     GrFlushInfo info;
     info.fNumSemaphores = 1;
     info.fSignalSemaphores = &beSemaphore;
-    skgpu::MutableTextureState presentState(VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, fPresentQueueIndex);
+    skgpu::MutableTextureState presentState(VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, fShared->fPresentQueueIndex);
     surface->flush(info, &presentState);
     surface->recordingContext()->asDirectContext()->submit();
 
     auto dContext = surface->recordingContext()->asDirectContext();
     dContext->flush(surface, info, &presentState);
     dContext->submit();
@@ -562,4 +597,6 @@ void VulkanWindowContext::swapBuffers() {
     fQueuePresentKHR(fPresentQueue, &presentInfo);
 }
@@ -666,7 +668,7 @@ diff --git a/tools/sk_app/VulkanWindowContext.h b/tools/sk_app/VulkanWindowConte
index 7e1fdd9af5..946bca7522 100644
--- a/tools/sk_app/VulkanWindowContext.h
+++ b/tools/sk_app/VulkanWindowContext.h
@@ -19,20 +19,24 @@
@@ -16,19 +16,23 @@
 #include "tools/gpu/vk/VkTestUtils.h"
 #include "tools/sk_app/WindowContext.h"
 
@@ -686,7 +688,6 @@ index 7e1fdd9af5..946bca7522 100644
+    static GrDirectContext* getSharedGrDirectContext() { return fGlobalShared ? fGlobalShared->fContext.get() : nullptr; }
+
     sk_sp<SkSurface> getBackbufferSurface() override;
     void swapBuffers() override;
 
-    bool isValid() override { return fDevice != VK_NULL_HANDLE; }
+    bool isValid() override { return fSurface != VK_NULL_HANDLE; }
@@ -710,8 +711,8 @@ index 7e1fdd9af5..946bca7522 100644
     struct BackbufferInfo {
         uint32_t        fImageIndex;          // image this is associated with
@@ -64,11 +74,6 @@ private:
     bool createBuffers(VkFormat format, VkImageUsageFlags, SkColorType colorType, VkSharingMode);
     void destroyBuffers();
     void onSwapBuffers() override;
 
-    VkInstance fInstance = VK_NULL_HANDLE;
-    VkPhysicalDevice fPhysicalDevice = VK_NULL_HANDLE;
@@ -786,7 +787,7 @@ index 65ab8b9aa4..2d222385a3 100644
 
-class GrDirectContext;
 class SkSurface;
 #ifdef SK_GRAPHITE_ENABLED
 #if defined(SK_GRAPHITE)
 namespace skgpu::graphite {
diff --git a/tools/sk_app/mac/MetalWindowContext_mac.mm b/tools/sk_app/mac/MetalWindowContext_mac.mm
index 5bea8578fa..f7df061af0 100644
diff --git a/external/skia/source/SkMemory_malloc.cxx b/external/skia/source/SkMemory_malloc.cxx
index 9e2da3c..d1f0cd3 100644
--- a/external/skia/source/SkMemory_malloc.cxx
+++ b/external/skia/source/SkMemory_malloc.cxx
@@ -4,7 +4,7 @@
 */

#include "include/core/SkTypes.h"
#include "include/private/SkMalloc.h"
#include "include/private/base/SkMalloc.h"

#include <sal/log.hxx>
#include <rtl/alloc.h>
diff --git a/external/skia/swap-buffers-rect.patch.1 b/external/skia/swap-buffers-rect.patch.1
index 628a7e2..7ccfaca 100644
--- a/external/skia/swap-buffers-rect.patch.1
+++ b/external/skia/swap-buffers-rect.patch.1
@@ -1,112 +1,49 @@
diff --git a/tools/sk_app/GLWindowContext.h b/tools/sk_app/GLWindowContext.h
index c519903006..5dc5bcd180 100644
--- a/tools/sk_app/GLWindowContext.h
+++ b/tools/sk_app/GLWindowContext.h
@@ -25,7 +25,7 @@ public:
     bool isValid() override { return SkToBool(fBackendContext.get()); }
diff -ur skia.org/tools/sk_app/MetalWindowContext.h skia/tools/sk_app/MetalWindowContext.h
--- skia.org/tools/sk_app/MetalWindowContext.h	2023-07-08 21:49:27.179700423 +0200
+++ skia/tools/sk_app/MetalWindowContext.h	2023-07-08 21:51:53.416328675 +0200
@@ -51,7 +51,7 @@
 
     void resize(int w, int h) override;
-    void swapBuffers() override;
+    void swapBuffers(const SkIRect* rect = nullptr) override;
     static void checkDestroyShared();
 
     void setDisplayParams(const DisplayParams& params) override;
-    void onSwapBuffers() override;
+    void onSwapBuffers(const SkIRect* rect = nullptr) override;
 
diff --git a/tools/sk_app/MetalWindowContext.h b/tools/sk_app/MetalWindowContext.h
index fbf35c3c2b..2194277922 100644
--- a/tools/sk_app/MetalWindowContext.h
+++ b/tools/sk_app/MetalWindowContext.h
@@ -29,7 +29,7 @@ public:
     bool                        fValid;
 
     bool isValid() override { return fValid; }
 
-    void swapBuffers() override;
+    void swapBuffers(const SkIRect* rect = nullptr) override;
 
     void setDisplayParams(const DisplayParams& params) override;
 
diff --git a/tools/sk_app/MetalWindowContext.mm b/tools/sk_app/MetalWindowContext.mm
index 49dc77b74d..ca1d74dc6c 100644
--- a/tools/sk_app/MetalWindowContext.mm
+++ b/tools/sk_app/MetalWindowContext.mm
@@ -187,7 +187,7 @@ GrBackendRenderTarget backendRT(fWidth,
diff -ur skia.org/tools/sk_app/MetalWindowContext.mm skia/tools/sk_app/MetalWindowContext.mm
--- skia.org/tools/sk_app/MetalWindowContext.mm	2023-07-08 21:49:27.179700423 +0200
+++ skia/tools/sk_app/MetalWindowContext.mm	2023-07-08 21:52:10.064396318 +0200
@@ -191,7 +191,7 @@
     return surface;
 }
 
-void MetalWindowContext::swapBuffers() {
+void MetalWindowContext::swapBuffers(const SkIRect*) {
-void MetalWindowContext::onSwapBuffers() {
+void MetalWindowContext::onSwapBuffers(const SkIRect*) {
     id<CAMetalDrawable> currentDrawable = (id<CAMetalDrawable>)fDrawableHandle;
 
     id<MTLCommandBuffer> commandBuffer([*fShared->fQueue commandBuffer]);
diff --git a/tools/sk_app/VulkanWindowContext.cpp b/tools/sk_app/VulkanWindowContext.cpp
index 2b36d60076..d73978c9e4 100644
--- a/tools/sk_app/VulkanWindowContext.cpp
+++ b/tools/sk_app/VulkanWindowContext.cpp
@@ -572,7 +572,7 @@ sk_sp<SkSurface> VulkanWindowContext::getBackbufferSurface() {
     return sk_ref_sp(surface);
 }
 
-void VulkanWindowContext::swapBuffers() {
+void VulkanWindowContext::swapBuffers(const SkIRect*) {
 
     BackbufferInfo* backbuffer = fBackbuffers + fCurrentBackbufferIndex;
     SkSurface* surface = fSurfaces[backbuffer->fImageIndex].get();
diff --git a/tools/sk_app/VulkanWindowContext.h b/tools/sk_app/VulkanWindowContext.h
index 92bfba6dff..46f7fd97bd 100644
--- a/tools/sk_app/VulkanWindowContext.h
+++ b/tools/sk_app/VulkanWindowContext.h
@@ -32,7 +32,7 @@ public:
     static GrDirectContext* getSharedGrDirectContext() { return fGlobalShared ? fGlobalShared->fContext.get() : nullptr; }
 
     sk_sp<SkSurface> getBackbufferSurface() override;
-    void swapBuffers() override;
+    void swapBuffers(const SkIRect* rect = nullptr) override;
 
     bool isValid() override { return fSurface != VK_NULL_HANDLE; }
 
diff --git a/tools/sk_app/WindowContext.h b/tools/sk_app/WindowContext.h
index 68bb84b988..e15c1a3cf3 100644
--- a/tools/sk_app/WindowContext.h
+++ b/tools/sk_app/WindowContext.h
@@ -8,6 +8,7 @@
 #define WindowContext_DEFINED
 
 #include "include/core/SkRefCnt.h"
+#include "include/core/SkRect.h"
 #include "include/core/SkSurfaceProps.h"
 #include "include/gpu/GrTypes.h"
 #include "include/gpu/GrDirectContext.h"
@@ -25,7 +26,7 @@ public:
 
     virtual sk_sp<SkSurface> getBackbufferSurface() = 0;
 
-    virtual void swapBuffers() = 0;
+    virtual void swapBuffers(const SkIRect* rect = nullptr) = 0;
 
     virtual bool isValid() = 0;
 
diff --git a/tools/sk_app/unix/RasterWindowContext_unix.cpp b/tools/sk_app/unix/RasterWindowContext_unix.cpp
index 6ac20962b7..2ea9e07588 100644
--- a/tools/sk_app/unix/RasterWindowContext_unix.cpp
+++ b/tools/sk_app/unix/RasterWindowContext_unix.cpp
@@ -19,7 +19,7 @@ public:
     RasterWindowContext_xlib(Display*, XWindow, int width, int height, const DisplayParams&);
 
     sk_sp<SkSurface> getBackbufferSurface() override;
-    void swapBuffers() override;
+    void swapBuffers(const SkIRect* rect) override;
     bool isValid() override { return SkToBool(fWindow); }
     void resize(int  w, int h) override;
diff -ur skia.org/tools/sk_app/unix/RasterWindowContext_unix.cpp skia/tools/sk_app/unix/RasterWindowContext_unix.cpp
--- skia.org/tools/sk_app/unix/RasterWindowContext_unix.cpp	2023-07-08 21:49:27.183700444 +0200
+++ skia/tools/sk_app/unix/RasterWindowContext_unix.cpp	2023-07-08 21:54:06.840852252 +0200
@@ -24,7 +24,7 @@
     void setDisplayParams(const DisplayParams& params) override;
@@ -60,7 +60,7 @@ void RasterWindowContext_xlib::resize(int  w, int h) {
 
 protected:
-    void onSwapBuffers() override;
+    void onSwapBuffers(const SkIRect* rect = nullptr) override;
 
     sk_sp<SkSurface> fBackbufferSurface;
     Display* fDisplay;
@@ -58,7 +58,7 @@
 
 sk_sp<SkSurface> RasterWindowContext_xlib::getBackbufferSurface() { return fBackbufferSurface; }
 
-void RasterWindowContext_xlib::swapBuffers() {
+void RasterWindowContext_xlib::swapBuffers(const SkIRect* rect) {
-void RasterWindowContext_xlib::onSwapBuffers() {
+void RasterWindowContext_xlib::onSwapBuffers(const SkIRect* rect) {
     SkPixmap pm;
     if (!fBackbufferSurface->peekPixels(&pm)) {
         return;
@@ -82,7 +82,9 @@ void RasterWindowContext_xlib::swapBuffers() {
@@ -80,7 +80,9 @@
     if (!XInitImage(&image)) {
         return;
     }
@@ -117,31 +54,54 @@ index 6ac20962b7..2ea9e07588 100644
 }
 
 }  // anonymous namespace
diff --git a/tools/sk_app/win/RasterWindowContext_win.cpp b/tools/sk_app/win/RasterWindowContext_win.cpp
index d80c6fbeec..72df8d5170 100644
--- a/tools/sk_app/win/RasterWindowContext_win.cpp
+++ b/tools/sk_app/win/RasterWindowContext_win.cpp
@@ -22,7 +22,7 @@ public:
     RasterWindowContext_win(HWND, const DisplayParams&);
diff -ur skia.org/tools/sk_app/VulkanWindowContext.cpp skia/tools/sk_app/VulkanWindowContext.cpp
--- skia.org/tools/sk_app/VulkanWindowContext.cpp	2023-07-08 21:49:27.179700423 +0200
+++ skia/tools/sk_app/VulkanWindowContext.cpp	2023-07-08 21:52:53.676570245 +0200
@@ -572,7 +572,7 @@
     return sk_ref_sp(surface);
 }
 
     sk_sp<SkSurface> getBackbufferSurface() override;
-    void swapBuffers() override;
+    void swapBuffers(const SkIRect* rect) override;
     bool isValid() override { return SkToBool(fWnd); }
     void resize(int w, int h) override;
-void VulkanWindowContext::onSwapBuffers() {
+void VulkanWindowContext::onSwapBuffers(const SkIRect*) {
 
     BackbufferInfo* backbuffer = fBackbuffers + fCurrentBackbufferIndex;
     sk_sp<SkSurface> surface = fSurfaces[backbuffer->fImageIndex];
diff -ur skia.org/tools/sk_app/VulkanWindowContext.h skia/tools/sk_app/VulkanWindowContext.h
--- skia.org/tools/sk_app/VulkanWindowContext.h	2023-07-08 21:49:27.179700423 +0200
+++ skia/tools/sk_app/VulkanWindowContext.h	2023-07-08 21:52:34.580494658 +0200
@@ -71,7 +71,7 @@
     bool createSwapchain(int width, int height, const DisplayParams& params);
     bool createBuffers(VkFormat format, VkImageUsageFlags, SkColorType colorType, VkSharingMode);
     void destroyBuffers();
-    void onSwapBuffers() override;
+    void onSwapBuffers(const SkIRect* rect = nullptr) override;
 
     // Create functions
     CreateVkSurfaceFn fCreateVkSurfaceFn;
diff -ur skia.org/tools/sk_app/win/RasterWindowContext_win.cpp skia/tools/sk_app/win/RasterWindowContext_win.cpp
--- skia.org/tools/sk_app/win/RasterWindowContext_win.cpp	2023-07-08 21:49:27.183700444 +0200
+++ skia/tools/sk_app/win/RasterWindowContext_win.cpp	2023-07-08 21:55:26.169145828 +0200
@@ -27,7 +27,7 @@
     void setDisplayParams(const DisplayParams& params) override;
@@ -75,13 +75,17 @@ void RasterWindowContext_win::resize(int w, int h) {
 
 protected:
-    void onSwapBuffers() override;
+    void onSwapBuffers(const SkIRect* rect=nullptr) override;
 
     SkAutoMalloc fSurfaceMemory;
     sk_sp<SkSurface> fBackbufferSurface;
@@ -73,13 +73,17 @@
 
 sk_sp<SkSurface> RasterWindowContext_win::getBackbufferSurface() { return fBackbufferSurface; }
 
-void RasterWindowContext_win::swapBuffers() {
+void RasterWindowContext_win::swapBuffers(const SkIRect* rect) {
-void RasterWindowContext_win::onSwapBuffers() {
+void RasterWindowContext_win::onSwapBuffers(const SkIRect* rect) {
     BITMAPINFO* bmpInfo = reinterpret_cast<BITMAPINFO*>(fSurfaceMemory.get());
     HDC dc = GetDC(fWnd);
     SkPixmap pixmap;
     fBackbufferSurface->peekPixels(&pixmap);
-    StretchDIBits(dc, 0, 0, fWidth, fHeight, 0, 0, fWidth, fHeight, pixmap.addr(), bmpInfo,
-                  DIB_RGB_COLORS, SRCCOPY);
-                   DIB_RGB_COLORS, SRCCOPY);
+    SkIRect update = rect ? *rect : SkIRect::MakeWH( fWidth, fHeight );
+    // It appears that y-axis handling is broken if it doesn't match the window size.
+    update = SkIRect::MakeXYWH( update.x(), 0, update.width(), fHeight );
@@ -151,3 +111,45 @@ index d80c6fbeec..72df8d5170 100644
     ReleaseDC(fWnd, dc);
 }
 
diff -ur skia.org/tools/sk_app/WindowContext.cpp skia/tools/sk_app/WindowContext.cpp
--- skia.org/tools/sk_app/WindowContext.cpp	2023-07-08 21:49:27.179700423 +0200
+++ skia/tools/sk_app/WindowContext.cpp	2023-07-08 21:56:23.373350669 +0200
@@ -20,7 +20,7 @@
 
 WindowContext::~WindowContext() {}
 
-void WindowContext::swapBuffers() {
+void WindowContext::swapBuffers(const SkIRect* rect) {
 #if defined(SK_GRAPHITE)
     if (fGraphiteContext) {
         SkASSERT(fGraphiteRecorder);
@@ -33,7 +33,7 @@
         }
     }
 #endif
-    this->onSwapBuffers();
+    this->onSwapBuffers(rect);
 }
 
 }   //namespace sk_app
diff -ur skia.org/tools/sk_app/WindowContext.h skia/tools/sk_app/WindowContext.h
--- skia.org/tools/sk_app/WindowContext.h	2023-07-08 21:49:27.179700423 +0200
+++ skia/tools/sk_app/WindowContext.h	2023-07-08 21:51:08.804143750 +0200
@@ -31,7 +31,7 @@
 
     virtual sk_sp<SkSurface> getBackbufferSurface() = 0;
 
-    void swapBuffers();
+    void swapBuffers(const SkIRect* rect = nullptr);
 
     virtual bool isValid() = 0;
 
@@ -57,7 +57,7 @@
 protected:
     virtual bool isGpuContext() { return true;  }
 
-    virtual void onSwapBuffers() = 0;
+    virtual void onSwapBuffers(const SkIRect* rect = nullptr) = 0;
 
     sk_sp<GrDirectContext> fContext;
 #if defined(SK_GRAPHITE)
diff --git a/external/skia/ubsan.patch.1 b/external/skia/ubsan.patch.1
index 005fdfe..8d422fb 100644
--- a/external/skia/ubsan.patch.1
+++ b/external/skia/ubsan.patch.1
@@ -3,8 +3,8 @@ index 847e76f232..e27d9454f8 100644
--- a/include/private/gpu/ganesh/GrContext_Base.h
+++ b/include/private/gpu/ganesh/GrContext_Base.h
@@ -20,7 +20,7 @@ class GrDirectContext;
 class GrImageContext;
 class GrRecordingContext;
 struct GrContextOptions;
 class GrBackendFormat;
 
-class GrContext_Base : public SkRefCnt {
+class SK_API GrContext_Base : public SkRefCnt {
@@ -27,8 +27,8 @@ index 847e76f232..e27d9454f8 100644
-    SK_API GrBackendFormat defaultBackendFormat(SkColorType, GrRenderable) const;
+    GrBackendFormat defaultBackendFormat(SkColorType, GrRenderable) const;
 
-    SK_API GrBackendFormat compressedBackendFormat(SkImage::CompressionType) const;
+    GrBackendFormat compressedBackendFormat(SkImage::CompressionType) const;
-    SK_API GrBackendFormat compressedBackendFormat(SkTextureCompressionType) const;
+    GrBackendFormat compressedBackendFormat(SkTextureCompressionType) const;
 
     /**
      * Gets the maximum supported sample count for a color type. 1 is returned if only non-MSAA
diff --git a/external/skia/windows-do-not-modify-logfont.patch.0 b/external/skia/windows-do-not-modify-logfont.patch.0
index 30c5c1e..b2c067d 100644
--- a/external/skia/windows-do-not-modify-logfont.patch.0
+++ b/external/skia/windows-do-not-modify-logfont.patch.0
@@ -1,8 +1,8 @@
--- ./src/ports/SkFontHost_win.cpp
+++ ./src/ports/SkFontHost_win.cpp
@@ -349,7 +349,7 @@ static bool FindByLogFont(SkTypeface* face, void* ctx) {
@@ -357,7 +357,7 @@ static bool FindByLogFont(SkTypeface* face, void* ctx) {
  */
 SkTypeface* SkCreateTypefaceFromLOGFONT(const LOGFONT& origLF) {
 sk_sp<SkTypeface> SkCreateTypefaceFromLOGFONT(const LOGFONT& origLF) {
     LOGFONT lf = origLF;
-    make_canonical(&lf);
+//    make_canonical(&lf);
diff --git a/external/skia/windows-force-unicode-api.patch.0 b/external/skia/windows-force-unicode-api.patch.0
index f73de176..13c0536 100644
--- a/external/skia/windows-force-unicode-api.patch.0
+++ b/external/skia/windows-force-unicode-api.patch.0
@@ -6,8 +6,8 @@ index f659adf0e9..34446fc7a1 100644
  *  corresponding typeface for the specified logfont. The caller is responsible
  *  for calling unref() when it is finished.
  */
-SK_API SkTypeface* SkCreateTypefaceFromLOGFONT(const LOGFONT&);
+SK_API SkTypeface* SkCreateTypefaceFromLOGFONT(const LOGFONTW&);
-SK_API sk_sp<SkTypeface> SkCreateTypefaceFromLOGFONT(const LOGFONT&);
+SK_API sk_sp<SkTypeface> SkCreateTypefaceFromLOGFONT(const LOGFONTW&);
 
 /**
  *  Copy the LOGFONT associated with this typeface into the lf parameter. Note
diff --git a/external/skia/windows-raster-surface-no-copies.patch.1 b/external/skia/windows-raster-surface-no-copies.patch.1
index 0c5804d..3765f70 100644
--- a/external/skia/windows-raster-surface-no-copies.patch.1
+++ b/external/skia/windows-raster-surface-no-copies.patch.1
@@ -2,7 +2,7 @@ diff --git a/tools/sk_app/win/RasterWindowContext_win.cpp b/tools/sk_app/win/Ras
index 9548220ce6..49f1f9ed17 100644
--- a/tools/sk_app/win/RasterWindowContext_win.cpp
+++ b/tools/sk_app/win/RasterWindowContext_win.cpp
@@ -55,7 +55,7 @@ void RasterWindowContext_win::resize(int w, int h) {
@@ -53,7 +53,7 @@
     fWidth = w;
     fHeight = h;
     fBackbufferSurface.reset();
@@ -11,7 +11,7 @@ index 9548220ce6..49f1f9ed17 100644
     fSurfaceMemory.reset(bmpSize);
     BITMAPINFO* bmpInfo = reinterpret_cast<BITMAPINFO*>(fSurfaceMemory.get());
     ZeroMemory(bmpInfo, sizeof(BITMAPINFO));
@@ -65,11 +65,12 @@ void RasterWindowContext_win::resize(int w, int h) {
@@ -63,11 +63,12 @@
     bmpInfo->bmiHeader.biPlanes = 1;
     bmpInfo->bmiHeader.biBitCount = 32;
     bmpInfo->bmiHeader.biCompression = BI_RGB;
@@ -21,19 +21,21 @@ index 9548220ce6..49f1f9ed17 100644
 
     SkImageInfo info = SkImageInfo::Make(w, h, fDisplayParams.fColorType, kPremul_SkAlphaType,
                                          fDisplayParams.fColorSpace);
-    fBackbufferSurface = SkSurface::MakeRasterDirect(info, pixels, sizeof(uint32_t) * w);
+    fBackbufferSurface = SkSurface::MakeRaster(info);
-    fBackbufferSurface = SkSurfaces::WrapPixels(info, pixels, sizeof(uint32_t) * w);
+    fBackbufferSurface = SkSurfaces::Raster(info);
 }
 
 sk_sp<SkSurface> RasterWindowContext_win::getBackbufferSurface() { return fBackbufferSurface; }
@@ -77,7 +78,9 @@ sk_sp<SkSurface> RasterWindowContext_win::getBackbufferSurface() { return fBackb
 void RasterWindowContext_win::swapBuffers() {
@@ -75,8 +76,10 @@
 void RasterWindowContext_win::onSwapBuffers() {
     BITMAPINFO* bmpInfo = reinterpret_cast<BITMAPINFO*>(fSurfaceMemory.get());
     HDC dc = GetDC(fWnd);
-    StretchDIBits(dc, 0, 0, fWidth, fHeight, 0, 0, fWidth, fHeight, bmpInfo->bmiColors, bmpInfo,
-                  DIB_RGB_COLORS, SRCCOPY);
+    SkPixmap pixmap;
+    fBackbufferSurface->peekPixels(&pixmap);
+    StretchDIBits(dc, 0, 0, fWidth, fHeight, 0, 0, fWidth, fHeight, pixmap.addr(), bmpInfo,
                   DIB_RGB_COLORS, SRCCOPY);
+                   DIB_RGB_COLORS, SRCCOPY);
     ReleaseDC(fWnd, dc);
 }
 
diff --git a/vcl/inc/skia/gdiimpl.hxx b/vcl/inc/skia/gdiimpl.hxx
index d86f89e..c898683 100644
--- a/vcl/inc/skia/gdiimpl.hxx
+++ b/vcl/inc/skia/gdiimpl.hxx
@@ -28,6 +28,7 @@
#include <skia/utils.hxx>

#include <SkPaint.h>
#include <SkBlendMode.h>
#include <optional>

class SkiaFlushIdle;
diff --git a/vcl/skia/SkiaHelper.cxx b/vcl/skia/SkiaHelper.cxx
index 16cbdd3..ec66831 100644
--- a/vcl/skia/SkiaHelper.cxx
+++ b/vcl/skia/SkiaHelper.cxx
@@ -46,11 +46,42 @@ bool isVCLSkiaEnabled() { return false; }
#include <SkGraphics.h>
#include <GrDirectContext.h>
#include <SkRuntimeEffect.h>
#include <SkOpts_spi.h>
#include <SkStream.h>
#include <SkTileMode.h>
#include <skia_compiler.hxx>
#include <skia_opts.hxx>
#if defined(MACOSX)
#include <premac.h>
#endif
#include <tools/sk_app/VulkanWindowContext.h>
#include <tools/sk_app/MetalWindowContext.h>
#if defined(MACOSX)
#include <postmac.h>
#endif
#include <src/core/SkOpts.h>
#include <src/core/SkChecksum.h>
#include <include/encode/SkPngEncoder.h>
#include <ganesh/SkSurfaceGanesh.h>
#if defined _MSC_VER
#pragma warning(disable : 4100) // "unreferenced formal parameter"
#pragma warning(disable : 4324) // "structure was padded due to alignment specifier"
#endif
#if defined __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-parameter"
#endif
#if defined __GNUC__ && !defined __clang__
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-unused-parameter"
#endif
#include <src/image/SkImage_Base.h>
#if defined __GNUC__ && !defined __clang__
#pragma GCC diagnostic pop
#endif
#if defined __clang__
#pragma clang diagnostic pop
#endif

#include <fstream>

namespace SkiaHelper
@@ -513,9 +544,9 @@ sk_sp<SkSurface> createSkSurface(int width, int height, SkColorType type, SkAlph
        {
            if (GrDirectContext* grDirectContext = getSharedGrDirectContext())
            {
                surface = SkSurface::MakeRenderTarget(grDirectContext, skgpu::Budgeted::kNo,
                                                      SkImageInfo::Make(width, height, type, alpha),
                                                      0, surfaceProps());
                surface = SkSurfaces::RenderTarget(grDirectContext, skgpu::Budgeted::kNo,
                                                   SkImageInfo::Make(width, height, type, alpha), 0,
                                                   surfaceProps());
                if (surface)
                {
#ifdef DBG_UTIL
@@ -534,7 +565,7 @@ sk_sp<SkSurface> createSkSurface(int width, int height, SkColorType type, SkAlph
            break;
    }
    // Create raster surface as a fallback.
    surface = SkSurface::MakeRaster(SkImageInfo::Make(width, height, type, alpha), surfaceProps());
    surface = SkSurfaces::Raster(SkImageInfo::Make(width, height, type, alpha), surfaceProps());
    assert(surface);
    if (surface)
    {
@@ -559,7 +590,7 @@ sk_sp<SkImage> createSkImage(const SkBitmap& bitmap)
        {
            if (GrDirectContext* grDirectContext = getSharedGrDirectContext())
            {
                sk_sp<SkSurface> surface = SkSurface::MakeRenderTarget(
                sk_sp<SkSurface> surface = SkSurfaces::RenderTarget(
                    grDirectContext, skgpu::Budgeted::kNo,
                    bitmap.info().makeAlphaType(kPremul_SkAlphaType), 0, surfaceProps());
                if (surface)
@@ -582,7 +613,7 @@ sk_sp<SkImage> createSkImage(const SkBitmap& bitmap)
            break;
    }
    // Create raster image as a fallback.
    sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);
    sk_sp<SkImage> image = SkImages::RasterFromBitmap(bitmap);
    assert(image);
    return image;
}
@@ -684,14 +715,14 @@ static o3tl::lru_map<uint32_t, uint32_t> checksumCache(256);

static uint32_t computeSkPixmapChecksum(const SkPixmap& pixmap)
{
    // Use uint32_t because that's what SkOpts::hash_fn() returns.
    static_assert(std::is_same_v<uint32_t, decltype(SkOpts::hash_fn(nullptr, 0, 0))>);
    // Use uint32_t because that's what SkChecksum::Hash32() returns.
    static_assert(std::is_same_v<uint32_t, decltype(SkChecksum::Hash32(nullptr, 0, 0))>);
    const size_t dataRowBytes = pixmap.width() << pixmap.shiftPerPixel();
    if (dataRowBytes == pixmap.rowBytes())
        return SkOpts::hash_fn(pixmap.addr(), pixmap.height() * dataRowBytes, 0);
        return SkChecksum::Hash32(pixmap.addr(), pixmap.height() * dataRowBytes, 0);
    uint32_t sum = 0;
    for (int row = 0; row < pixmap.height(); ++row)
        sum = SkOpts::hash_fn(pixmap.addr(0, row), dataRowBytes, sum);
        sum = SkChecksum::Hash32(pixmap.addr(0, row), dataRowBytes, sum);
    return sum;
}

@@ -806,7 +837,10 @@ void prepareSkia(std::unique_ptr<sk_app::WindowContext> (*createGpuWindowContext
    skiaSupportedByBackend = true;
}

void dump(const SkBitmap& bitmap, const char* file) { dump(SkImage::MakeFromBitmap(bitmap), file); }
void dump(const SkBitmap& bitmap, const char* file)
{
    dump(SkImages::RasterFromBitmap(bitmap), file);
}

void dump(const sk_sp<SkSurface>& surface, const char* file)
{
@@ -816,7 +850,19 @@ void dump(const sk_sp<SkSurface>& surface, const char* file)

void dump(const sk_sp<SkImage>& image, const char* file)
{
    sk_sp<SkData> data = image->encodeToData(SkEncodedImageFormat::kPNG, 1);
    SkBitmap bm;
    if (!as_IB(image)->getROPixels(getSharedGrDirectContext(), &bm))
        return;
    SkPixmap pixmap;
    if (!bm.peekPixels(&pixmap))
        return;
    SkPngEncoder::Options opts;
    opts.fFilterFlags = SkPngEncoder::FilterFlag::kNone;
    opts.fZLibLevel = 1;
    SkDynamicMemoryWStream stream;
    if (!SkPngEncoder::Encode(&stream, pixmap, opts))
        return;
    sk_sp<SkData> data = stream.detachAsData();
    std::ofstream ostream(file, std::ios::binary);
    ostream.write(static_cast<const char*>(data->data()), data->size());
}
diff --git a/vcl/skia/gdiimpl.cxx b/vcl/skia/gdiimpl.cxx
index 94e1f7c..3c0957b 100644
--- a/vcl/skia/gdiimpl.cxx
+++ b/vcl/skia/gdiimpl.cxx
@@ -1445,7 +1445,7 @@ void SkiaSalGraphicsImpl::invert(basegfx::B2DPolygon const& rPoly, SalInvert eFl
        aPaint.setStrokeWidth(2);
        constexpr float intervals[] = { 4.0f, 4.0f };
        aPaint.setStyle(SkPaint::kStroke_Style);
        aPaint.setPathEffect(SkDashPathEffect::Make(intervals, SK_ARRAY_COUNT(intervals), 0));
        aPaint.setPathEffect(SkDashPathEffect::Make(intervals, std::size(intervals), 0));
    }
    else
    {
diff --git a/vcl/skia/osx/bitmap.cxx b/vcl/skia/osx/bitmap.cxx
index d622f64..1052efc 100644
--- a/vcl/skia/osx/bitmap.cxx
+++ b/vcl/skia/osx/bitmap.cxx
@@ -26,6 +26,7 @@

#include <SkBitmap.h>
#include <SkCanvas.h>
#include <SkShader.h>

using namespace SkiaHelper;

diff --git a/vcl/skia/salbmp.cxx b/vcl/skia/salbmp.cxx
index 97609c1..778917b 100644
--- a/vcl/skia/salbmp.cxx
+++ b/vcl/skia/salbmp.cxx
@@ -33,9 +33,11 @@
#include <skia/utils.hxx>
#include <skia/zone.hxx>

#include <SkBitmap.h>
#include <SkCanvas.h>
#include <SkImage.h>
#include <SkPixelRef.h>
#include <SkShader.h>
#include <SkSurface.h>
#include <SkSwizzle.h>
#include <SkColorFilter.h>
@@ -1123,7 +1125,7 @@ void SkiaSalBitmap::EnsureBitmapData()
                                                       << static_cast<int>(mScaleQuality));
        Size savedSize = mSize;
        mSize = mPixelsSize;
        ResetToSkImage(SkImage::MakeFromBitmap(GetAsSkBitmap()));
        ResetToSkImage(SkImages::RasterFromBitmap(GetAsSkBitmap()));
        mSize = savedSize;
    }

diff --git a/vcl/skia/win/gdiimpl.cxx b/vcl/skia/win/gdiimpl.cxx
index d063b44..0d7d60f 100644
--- a/vcl/skia/win/gdiimpl.cxx
+++ b/vcl/skia/win/gdiimpl.cxx
@@ -20,6 +20,7 @@
#include <comphelper/windowserrorstring.hxx>
#include <sal/log.hxx>

#include <SkBitmap.h>
#include <SkCanvas.h>
#include <SkPaint.h>
#include <SkPixelRef.h>
@@ -244,7 +245,7 @@ bool WinSkiaSalGraphicsImpl::DrawTextLayout(const GenericSalLayout& rLayout)
            // Resetting it here does not seem to cause any problem.
            logFont.lfOrientation = 0;
            logFont.lfEscapement = 0;
            typeface.reset(SkCreateTypefaceFromLOGFONT(logFont));
            typeface = SkCreateTypefaceFromLOGFONT(logFont);
            dwrite = false;
            if (!typeface)
                return false;
diff --git a/vcl/skia/x11/textrender.cxx b/vcl/skia/x11/textrender.cxx
index fed5daa..81d6efa 100644
--- a/vcl/skia/x11/textrender.cxx
+++ b/vcl/skia/x11/textrender.cxx
@@ -19,6 +19,15 @@

#include <sal/config.h>

#if defined __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-value"
#endif
#if defined __GNUC__ && !defined __clang__
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-unused-value"
#endif

#include <skia/x11/textrender.hxx>

#include <unx/fc_fontoptions.hxx>
@@ -30,6 +39,13 @@
#include <SkFont.h>
#include <SkFontMgr_fontconfig.h>

#if defined __GNUC__ && !defined __clang__
#pragma GCC diagnostic pop
#endif
#if defined __clang__
#pragma clang diagnostic pop
#endif

void SkiaTextRender::DrawTextLayout(const GenericSalLayout& rLayout, const SalGraphics& rGraphics)
{
    const FreetypeFontInstance& rInstance = static_cast<FreetypeFontInstance&>(rLayout.GetFont());