Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(478)

Side by Side Diff: skia/ext/bitmap_platform_device_win.cc

Issue 57053002: Aggressively assert on BITMAP object deletions (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remove unecessary new include Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <windows.h> 5 #include <windows.h>
6 #include <psapi.h> 6 #include <psapi.h>
7 7
8 #include "skia/ext/bitmap_platform_device_win.h" 8 #include "skia/ext/bitmap_platform_device_win.h"
9 #include "skia/ext/bitmap_platform_device_data.h" 9 #include "skia/ext/bitmap_platform_device_data.h"
10 #include "skia/ext/platform_canvas.h" 10 #include "skia/ext/platform_canvas.h"
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 hdr.biBitCount = 32; 50 hdr.biBitCount = 32;
51 hdr.biCompression = BI_RGB; // no compression 51 hdr.biCompression = BI_RGB; // no compression
52 hdr.biSizeImage = 0; 52 hdr.biSizeImage = 0;
53 hdr.biXPelsPerMeter = 1; 53 hdr.biXPelsPerMeter = 1;
54 hdr.biYPelsPerMeter = 1; 54 hdr.biYPelsPerMeter = 1;
55 hdr.biClrUsed = 0; 55 hdr.biClrUsed = 0;
56 hdr.biClrImportant = 0; 56 hdr.biClrImportant = 0;
57 57
58 HBITMAP hbitmap = CreateDIBSection(NULL, reinterpret_cast<BITMAPINFO*>(&hdr), 58 HBITMAP hbitmap = CreateDIBSection(NULL, reinterpret_cast<BITMAPINFO*>(&hdr),
59 0, data, shared_section, 0); 59 0, data, shared_section, 0);
60
61 if (!hbitmap) {
62 // Attempt to create a smaller DIBSection to debug whether
63 // the failure was due to memory exhaustion/fragmentation
64 // or GDI resource exhaution.
65 // See crbug.com/275046
66 hdr.biWidth = 5;
67 hdr.biHeight = 5;
68 void* small_data;
69 HBITMAP small_bitmap = CreateDIBSection(NULL, reinterpret_cast<BITMAPINFO*>( &hdr),
70 0, &small_data, shared_section, 0);
71 SkASSERT(small_bitmap);
72 DeleteObject(small_bitmap);
73 BITMAP bitmap_data;
74 if (GetObject(small_bitmap, sizeof(BITMAP), &bitmap_data))
75 SkASSERT(DeleteObject(small_bitmap));
76 }
77
60 return hbitmap; 78 return hbitmap;
61 } 79 }
62 80
63 PlatformBitmapPixelRef::PlatformBitmapPixelRef(HBITMAP bitmap_handle, 81 PlatformBitmapPixelRef::PlatformBitmapPixelRef(HBITMAP bitmap_handle,
64 void* pixels) 82 void* pixels)
65 : bitmap_handle_(bitmap_handle), 83 : bitmap_handle_(bitmap_handle),
66 pixels_(pixels) { 84 pixels_(pixels) {
67 setPreLocked(pixels, NULL); 85 setPreLocked(pixels, NULL);
68 } 86 }
69 87
70 PlatformBitmapPixelRef::~PlatformBitmapPixelRef() { 88 PlatformBitmapPixelRef::~PlatformBitmapPixelRef() {
71 if (bitmap_handle_) 89 if (bitmap_handle_)
72 DeleteObject(bitmap_handle_); 90 SkASSERT(DeleteObject(bitmap_handle_));
reed1 2013/11/04 16:49:28 SkASSERT becomes a no-op in release builds, so I t
73 } 91 }
74 92
75 void* PlatformBitmapPixelRef::onLockPixels(SkColorTable** color_table) { 93 void* PlatformBitmapPixelRef::onLockPixels(SkColorTable** color_table) {
76 *color_table = NULL; 94 *color_table = NULL;
77 return pixels_; 95 return pixels_;
78 } 96 }
79 97
80 void PlatformBitmapPixelRef::onUnlockPixels() { 98 void PlatformBitmapPixelRef::onUnlockPixels() {
81 // Nothing to do. 99 // Nothing to do.
82 return; 100 return;
(...skipping 16 matching lines...) Expand all
99 rect.set(0, 0, bitmap_data.bmWidth, bitmap_data.bmHeight); 117 rect.set(0, 0, bitmap_data.bmWidth, bitmap_data.bmHeight);
100 clip_region_ = SkRegion(rect); 118 clip_region_ = SkRegion(rect);
101 } 119 }
102 } 120 }
103 121
104 BitmapPlatformDevice::BitmapPlatformDeviceData::~BitmapPlatformDeviceData() { 122 BitmapPlatformDevice::BitmapPlatformDeviceData::~BitmapPlatformDeviceData() {
105 if (hdc_) 123 if (hdc_)
106 ReleaseBitmapDC(); 124 ReleaseBitmapDC();
107 125
108 // this will free the bitmap data as well as the bitmap handle 126 // this will free the bitmap data as well as the bitmap handle
109 DeleteObject(bitmap_context_); 127 SkASSERT(DeleteObject(bitmap_context_));
110 } 128 }
111 129
112 HDC BitmapPlatformDevice::BitmapPlatformDeviceData::GetBitmapDC() { 130 HDC BitmapPlatformDevice::BitmapPlatformDeviceData::GetBitmapDC() {
113 if (!hdc_) { 131 if (!hdc_) {
114 hdc_ = CreateCompatibleDC(NULL); 132 hdc_ = CreateCompatibleDC(NULL);
115 InitializeDC(hdc_); 133 InitializeDC(hdc_);
116 HGDIOBJ old_bitmap = SelectObject(hdc_, bitmap_context_); 134 HGDIOBJ old_bitmap = SelectObject(hdc_, bitmap_context_);
117 // When the memory DC is created, its display surface is exactly one 135 // When the memory DC is created, its display surface is exactly one
118 // monochrome pixel wide and one monochrome pixel high. Since we select our 136 // monochrome pixel wide and one monochrome pixel high. Since we select our
119 // own bitmap, we must delete the previous one. 137 // own bitmap, we must delete the previous one.
120 DeleteObject(old_bitmap); 138 SkASSERT(DeleteObject(old_bitmap));
121 } 139 }
122 140
123 LoadConfig(); 141 LoadConfig();
124 return hdc_; 142 return hdc_;
125 } 143 }
126 144
127 void BitmapPlatformDevice::BitmapPlatformDeviceData::ReleaseBitmapDC() { 145 void BitmapPlatformDevice::BitmapPlatformDeviceData::ReleaseBitmapDC() {
128 SkASSERT(hdc_); 146 SkASSERT(hdc_);
129 DeleteDC(hdc_); 147 DeleteDC(hdc_);
130 hdc_ = NULL; 148 hdc_ = NULL;
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 is_opaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType); 365 is_opaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType);
348 // PlatformBitmapPixelRef takes ownership of |hbitmap|. 366 // PlatformBitmapPixelRef takes ownership of |hbitmap|.
349 bitmap_.setPixelRef( 367 bitmap_.setPixelRef(
350 skia::AdoptRef(new PlatformBitmapPixelRef(hbitmap, data)).get()); 368 skia::AdoptRef(new PlatformBitmapPixelRef(hbitmap, data)).get());
351 bitmap_.lockPixels(); 369 bitmap_.lockPixels();
352 370
353 return true; 371 return true;
354 } 372 }
355 373
356 } // namespace skia 374 } // namespace skia
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698