external/skia/UnpackedTarball_skia.mk | 1 external/skia/fix-xputimage-depth.patch.1 | 47 ++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+)
New commits: commit eb1fabd39fb5fdceb90c11eaf7740f3396a79bfe Author: Māris Nartišs <[email protected]> AuthorDate: Wed Feb 18 21:03:54 2026 +0200 Commit: Xisco Fauli <[email protected]> CommitDate: Thu Feb 19 14:05:28 2026 +0100 tdf#168138 skia: fix XPutImage BadMatch on 32-bit X11 windows RasterWindowContext_xlib::onSwapBuffers() hardcoded image.depth=24, but LibreOffice's BestVisual() prefers 32-bit TrueColor visuals when available, making window drawables depth=32. XPutImage requires XImage.depth to exactly match the target drawable's depth, so a mismatch causes an asynchronous X11 BadMatch error and crash at the next X11 call. Fix by querying the actual window depth via XGetWindowAttributes in the constructor and using it instead of the hardcoded 24. Change-Id: I202a350ed1159e8322c00821df2c6c5e7391382b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/199648 Reviewed-by: Xisco Fauli <[email protected]> Tested-by: Jenkins diff --git a/external/skia/UnpackedTarball_skia.mk b/external/skia/UnpackedTarball_skia.mk index cbf967752988..e0f7f3e9883e 100644 --- a/external/skia/UnpackedTarball_skia.mk +++ b/external/skia/UnpackedTarball_skia.mk @@ -45,6 +45,7 @@ skia_patches := \ msvc-unknown-attributes.patch.1 \ fix-semaphore-include.patch.1 \ fix-windows-operator-equals.patch.1 \ + fix-xputimage-depth.patch.1 \ ifneq ($(MSYSTEM),) # use binary flag so patch from git-bash won't choke on mixed line-endings in patches diff --git a/external/skia/fix-xputimage-depth.patch.1 b/external/skia/fix-xputimage-depth.patch.1 new file mode 100644 index 000000000000..0250af76bd70 --- /dev/null +++ b/external/skia/fix-xputimage-depth.patch.1 @@ -0,0 +1,47 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: LibreOffice +Date: Wed, 18 Feb 2026 00:00:00 +0000 +Subject: [PATCH] Fix XPutImage BadMatch on 32-bit X11 windows + +RasterWindowContext_xlib::onSwapBuffers() hardcoded image.depth = 24, +but the target X11 window may have depth 32 (when BestVisual() selects +a 32-bit TrueColor visual, which is preferred for compositing). +XPutImage requires image.depth to exactly match the drawable's depth; +mismatched depth results in a BadMatch X11 error. + +Fix: query the actual window depth once during construction via +XGetWindowAttributes and store it as fDepth, then use fDepth instead of +the hardcoded 24 in onSwapBuffers. +--- + tools/window/unix/RasterWindowContext_unix.cpp | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +--- skia.org/tools/window/unix/RasterWindowContext_unix.cpp ++++ skia/tools/window/unix/RasterWindowContext_unix.cpp +@@ -34,6 +34,7 @@ + Display* fDisplay; + XWindow fWindow; + GC fGC; ++ int fDepth; + }; + + RasterWindowContext_xlib::RasterWindowContext_xlib(Display* display, +@@ -43,6 +44,9 @@ + std::unique_ptr<const DisplayParams> params) + : RasterWindowContext(std::move(params)), fDisplay(display), fWindow(window) { + fGC = XCreateGC(fDisplay, fWindow, 0, nullptr); ++ XWindowAttributes attrs; ++ XGetWindowAttributes(fDisplay, fWindow, &attrs); ++ fDepth = attrs.depth; + this->resize(width, height); + fWidth = width; + fHeight = height; +@@ -79,7 +83,7 @@ + image.bitmap_unit = bitsPerPixel; + image.bitmap_bit_order = LSBFirst; + image.bitmap_pad = bitsPerPixel; +- image.depth = 24; ++ image.depth = fDepth; + image.bytes_per_line = pm.rowBytes() - pm.width() * pm.info().bytesPerPixel(); + image.bits_per_pixel = bitsPerPixel; + if (!XInitImage(&image)) {
