| 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 63108209abc313b305256319246a06fa7d03424c..5712df3eaea311f4a490a3ef9e16c694051ee50c 100644 | 
| --- a/skia/ext/bitmap_platform_device_win.cc | 
| +++ b/skia/ext/bitmap_platform_device_win.cc | 
| @@ -7,6 +7,7 @@ | 
|  | 
| #include "base/debug/gdi_debug_util_win.h" | 
| #include "base/logging.h" | 
| +#include "base/win/win_util.h" | 
| #include "skia/ext/bitmap_platform_device_win.h" | 
| #include "skia/ext/platform_canvas.h" | 
| #include "third_party/skia/include/core/SkMatrix.h" | 
| @@ -108,7 +109,12 @@ void BitmapPlatformDevice::LoadConfig() { | 
| } | 
|  | 
| static void DeleteHBitmapCallback(void* addr, void* context) { | 
| -  DeleteObject(static_cast<HBITMAP>(context)); | 
| +  // If context is not NULL then it's a valid HBITMAP to delete. | 
| +  // Otherwise we just unmap the pixel memory. | 
| +  if (context) | 
| +    DeleteObject(static_cast<HBITMAP>(context)); | 
| +  else | 
| +    UnmapViewOfFile(addr); | 
| } | 
|  | 
| static bool InstallHBitmapPixels(SkBitmap* bitmap, int width, int height, | 
| @@ -133,10 +139,25 @@ BitmapPlatformDevice* BitmapPlatformDevice::Create( | 
| bool do_clear) { | 
|  | 
| void* data; | 
| -  HBITMAP hbitmap = CreateHBitmap(width, height, is_opaque, shared_section, | 
| -                                  &data); | 
| -  if (!hbitmap) | 
| -    return NULL; | 
| +  HBITMAP hbitmap = NULL; | 
| + | 
| +  // This function contains an implementation of a Skia platform bitmap for | 
| +  // drawing and compositing graphics. The original implementation uses Windows | 
| +  // GDI to create the backing bitmap memory, however it's possible for a | 
| +  // process to not have access to GDI which will cause this code to fail. It's | 
| +  // possible to detect when GDI is unavailable and instead directly map the | 
| +  // shared memory as the bitmap. | 
| +  if (base::win::IsUser32AndGdi32Available()) { | 
| +    hbitmap = CreateHBitmap(width, height, is_opaque, shared_section, &data); | 
| +    if (!hbitmap) | 
| +      return NULL; | 
| +  } else { | 
| +    DCHECK(shared_section != NULL); | 
| +    data = MapViewOfFile(shared_section, FILE_MAP_WRITE, 0, 0, | 
| +                         PlatformCanvasStrideForWidth(width) * height); | 
| +    if (!data) | 
| +      return NULL; | 
| +  } | 
|  | 
| SkBitmap bitmap; | 
| if (!InstallHBitmapPixels(&bitmap, width, height, is_opaque, data, hbitmap)) | 
| @@ -179,13 +200,15 @@ BitmapPlatformDevice::BitmapPlatformDevice( | 
| transform_(SkMatrix::I()) { | 
| // The data object is already ref'ed for us by create(). | 
| SkDEBUGCODE(begin_paint_count_ = 0); | 
| -  SetPlatformDevice(this, this); | 
| -  // Initialize the clip region to the entire bitmap. | 
| -  BITMAP bitmap_data; | 
| -  if (GetObject(hbitmap_, sizeof(BITMAP), &bitmap_data)) { | 
| -    SkIRect rect; | 
| -    rect.set(0, 0, bitmap_data.bmWidth, bitmap_data.bmHeight); | 
| -    clip_region_ = SkRegion(rect); | 
| +  if (hbitmap) { | 
| +    SetPlatformDevice(this, this); | 
| +    // Initialize the clip region to the entire bitmap. | 
| +    BITMAP bitmap_data; | 
| +    if (GetObject(hbitmap_, sizeof(BITMAP), &bitmap_data)) { | 
| +      SkIRect rect; | 
| +      rect.set(0, 0, bitmap_data.bmWidth, bitmap_data.bmHeight); | 
| +      clip_region_ = SkRegion(rect); | 
| +    } | 
| } | 
| } | 
|  | 
|  |