office-gobmx/external/skia/windows-raster-surface-no-copies.patch.1
Luboš Luňák 23d6162105 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>
2020-05-11 15:58:06 +02:00

39 lines
2 KiB
Groff

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