summaryrefslogtreecommitdiffstats
path: root/external/skia/windows-raster-surface-no-copies.patch.1
blob: 3765f70971fd6711b7143b69302f6a8b5ac74dfc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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
@@ -53,7 +53,7 @@
     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));
@@ -63,11 +63,12 @@
     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 = SkSurfaces::WrapPixels(info, pixels, sizeof(uint32_t) * w);
+    fBackbufferSurface = SkSurfaces::Raster(info);
 }
 
 sk_sp<SkSurface> RasterWindowContext_win::getBackbufferSurface() { return fBackbufferSurface; }
@@ -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);
     ReleaseDC(fWnd, dc);
 }