| Index: skia/ext/bitmap_platform_device_win.cc
|
| diff --git a/skia/ext/bitmap_platform_device_win.cc b/skia/ext/bitmap_platform_device_win.cc
|
| index 203281d327128671574873225de435510fadd1fc..4ae8b504376ff1438f67474cf87e484bfdf79d1f 100644
|
| --- a/skia/ext/bitmap_platform_device_win.cc
|
| +++ b/skia/ext/bitmap_platform_device_win.cc
|
| @@ -57,6 +57,26 @@ HBITMAP CreateHBitmap(int width, int height, bool is_opaque,
|
|
|
| HBITMAP hbitmap = CreateDIBSection(NULL, reinterpret_cast<BITMAPINFO*>(&hdr),
|
| 0, data, shared_section, 0);
|
| +
|
| + if (!hbitmap) {
|
| + // Attempt to create a smaller DIBSection to debug whether
|
| + // the failure was due to memory exhaustion/fragmentation
|
| + // or GDI resource exhaution.
|
| + // See crbug.com/275046
|
| + hdr.biWidth = 5;
|
| + hdr.biHeight = 5;
|
| + void* small_data;
|
| + HBITMAP small_bitmap = CreateDIBSection(
|
| + NULL, reinterpret_cast<BITMAPINFO*>(&hdr),
|
| + 0, &small_data, shared_section, 0);
|
| + if (!small_bitmap)
|
| + SK_CRASH();
|
| + BITMAP bitmap_data;
|
| + if (GetObject(small_bitmap, sizeof(BITMAP), &bitmap_data))
|
| + if (!DeleteObject(small_bitmap))
|
| + SK_CRASH();
|
| + }
|
| +
|
| return hbitmap;
|
| }
|
|
|
| @@ -69,7 +89,8 @@ PlatformBitmapPixelRef::PlatformBitmapPixelRef(HBITMAP bitmap_handle,
|
|
|
| PlatformBitmapPixelRef::~PlatformBitmapPixelRef() {
|
| if (bitmap_handle_)
|
| - DeleteObject(bitmap_handle_);
|
| + if (!DeleteObject(bitmap_handle_))
|
| + SK_CRASH();
|
| }
|
|
|
| void* PlatformBitmapPixelRef::onLockPixels(SkColorTable** color_table) {
|
| @@ -106,7 +127,8 @@ BitmapPlatformDevice::BitmapPlatformDeviceData::~BitmapPlatformDeviceData() {
|
| ReleaseBitmapDC();
|
|
|
| // this will free the bitmap data as well as the bitmap handle
|
| - DeleteObject(bitmap_context_);
|
| + if (!DeleteObject(bitmap_context_))
|
| + SK_CRASH();
|
| }
|
|
|
| HDC BitmapPlatformDevice::BitmapPlatformDeviceData::GetBitmapDC() {
|
| @@ -117,7 +139,8 @@ HDC BitmapPlatformDevice::BitmapPlatformDeviceData::GetBitmapDC() {
|
| // When the memory DC is created, its display surface is exactly one
|
| // monochrome pixel wide and one monochrome pixel high. Since we select our
|
| // own bitmap, we must delete the previous one.
|
| - DeleteObject(old_bitmap);
|
| + if (!DeleteObject(old_bitmap))
|
| + SK_CRASH();
|
| }
|
|
|
| LoadConfig();
|
| @@ -126,7 +149,8 @@ HDC BitmapPlatformDevice::BitmapPlatformDeviceData::GetBitmapDC() {
|
|
|
| void BitmapPlatformDevice::BitmapPlatformDeviceData::ReleaseBitmapDC() {
|
| SkASSERT(hdc_);
|
| - DeleteDC(hdc_);
|
| + if (!DeleteDC(hdc_))
|
| + SK_CRASH();
|
| hdc_ = NULL;
|
| }
|
|
|
| @@ -325,7 +349,8 @@ PlatformBitmap::~PlatformBitmap() {
|
| if (surface_) {
|
| if (platform_extra_)
|
| SelectObject(surface_, reinterpret_cast<HGDIOBJ>(platform_extra_));
|
| - DeleteDC(surface_);
|
| + if (!DeleteDC(surface_))
|
| + SK_CRASH();
|
| }
|
| }
|
|
|
|
|