summaryrefslogtreecommitdiff
path: root/external
diff options
context:
space:
mode:
authorLuboš Luňák <l.lunak@collabora.com>2020-05-11 13:00:45 +0200
committerLuboš Luňák <l.lunak@collabora.com>2020-05-11 15:58:06 +0200
commit23d61621058221b9e15d5d49e2fbb281042d8b1d (patch)
tree084052d4ca957578c07b9589a1379dce8d65a1bf /external
parentb55572c8abe2d01e5d8489b6ff32f72fa32bfea2 (diff)
avoid deep copies of pixels with Skia raster surfaces (tdf#132856)
SkCanvas::draw() leads to deep copies of the source bitmap, moreover RasterWindowContext_win allocates the pixels in a way that SkSurface_Raster has to do a deep copy because of not owning the pixels. Change-Id: I22f6a2c0f96faf99f94140eff26ec0c22fae96d9 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/93958 Tested-by: Jenkins Reviewed-by: Luboš Luňák <l.lunak@collabora.com>
Diffstat (limited to 'external')
-rw-r--r--external/skia/UnpackedTarball_skia.mk1
-rw-r--r--external/skia/windows-raster-surface-no-copies.patch.139
2 files changed, 40 insertions, 0 deletions
diff --git a/external/skia/UnpackedTarball_skia.mk b/external/skia/UnpackedTarball_skia.mk
index e0841e432daa..08769b2867a5 100644
--- a/external/skia/UnpackedTarball_skia.mk
+++ b/external/skia/UnpackedTarball_skia.mk
@@ -34,6 +34,7 @@ skia_patches := \
fix-without-gl.patch.0 \
extend-rgb-to-rgba.patch.0 \
windows-typeface-directwrite.patch.0 \
+ windows-raster-surface-no-copies.patch.1 \
$(eval $(call gb_UnpackedTarball_set_patchlevel,skia,1))
diff --git a/external/skia/windows-raster-surface-no-copies.patch.1 b/external/skia/windows-raster-surface-no-copies.patch.1
new file mode 100644
index 000000000000..0c5804d8558b
--- /dev/null
+++ b/external/skia/windows-raster-surface-no-copies.patch.1
@@ -0,0 +1,39 @@
+diff --git a/tools/sk_app/win/RasterWindowContext_win.cpp b/tools/sk_app/win/RasterWindowContext_win.cpp
+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) {
+ fWidth = w;
+ fHeight = h;
+ fBackbufferSurface.reset();
+- const size_t bmpSize = sizeof(BITMAPINFOHEADER) + w * h * sizeof(uint32_t);
++ const size_t bmpSize = sizeof(BITMAPINFO);
+ 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) {
+ bmpInfo->bmiHeader.biPlanes = 1;
+ bmpInfo->bmiHeader.biBitCount = 32;
+ bmpInfo->bmiHeader.biCompression = BI_RGB;
+- void* pixels = bmpInfo->bmiColors;
++ // Do not use a packed DIB bitmap, SkSurface_Raster::onNewImageSnapshot() does
++ // a deep copy if it does not own the pixels.
+
+ 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);
+ }
+
+ sk_sp<SkSurface> RasterWindowContext_win::getBackbufferSurface() { return fBackbufferSurface; }
+@@ -77,7 +78,9 @@ sk_sp<SkSurface> RasterWindowContext_win::getBackbufferSurface() { return fBackb
+ void RasterWindowContext_win::swapBuffers() {
+ BITMAPINFO* bmpInfo = reinterpret_cast<BITMAPINFO*>(fSurfaceMemory.get());
+ HDC dc = GetDC(fWnd);
+- StretchDIBits(dc, 0, 0, fWidth, fHeight, 0, 0, fWidth, fHeight, bmpInfo->bmiColors, bmpInfo,
++ SkPixmap pixmap;
++ fBackbufferSurface->peekPixels(&pixmap);
++ StretchDIBits(dc, 0, 0, fWidth, fHeight, 0, 0, fWidth, fHeight, pixmap.addr(), bmpInfo,
+ DIB_RGB_COLORS, SRCCOPY);
+ ReleaseDC(fWnd, dc);
+ }