Index: skia/ext/bitmap_platform_device_cairo.cc |
diff --git a/skia/ext/bitmap_platform_device_cairo.cc b/skia/ext/bitmap_platform_device_cairo.cc |
index 1608354983b1e1a99aa776c714cccc9f15886364..b76ccbc9e5c763a444cff78d3b7e4b21c84efd8d 100644 |
--- a/skia/ext/bitmap_platform_device_cairo.cc |
+++ b/skia/ext/bitmap_platform_device_cairo.cc |
@@ -23,6 +23,10 @@ void CairoSurfaceReleaseProc(void*, void* context) { |
// Back the destination bitmap by a Cairo surface. The bitmap's |
// pixelRef takes ownership of the passed-in surface and will call |
// cairo_surface_destroy() upon destruction. |
+// |
+// Note: it may immediately destroy the surface, if it fails to create a bitmap |
+// with pixels, thus the caller must either ref() the surface before hand, or |
+// it must not refer to the surface after this call. |
bool InstallCairoSurfacePixels(SkBitmap* dst, |
cairo_surface_t* surface, |
bool is_opaque) { |
@@ -99,13 +103,18 @@ BitmapPlatformDevice* BitmapPlatformDevice::Create(int width, int height, |
return NULL; |
} |
+ // must call this before trying to install the surface, since that may result |
+ // in the surface being destroyed. |
+ cairo_t* cairo = cairo_create(surface); |
+ |
SkBitmap bitmap; |
if (!InstallCairoSurfacePixels(&bitmap, surface, is_opaque)) { |
+ cairo_destroy(cairo); |
return NULL; |
} |
// The device object will take ownership of the graphics context. |
- return new BitmapPlatformDevice(bitmap, surface); |
+ return new BitmapPlatformDevice(bitmap, cairo); |
} |
BitmapPlatformDevice* BitmapPlatformDevice::Create(int width, int height, |
@@ -142,13 +151,12 @@ BitmapPlatformDevice* BitmapPlatformDevice::Create(int width, int height, |
return Create(width, height, is_opaque, surface); |
} |
-// The device will own the bitmap, which corresponds to also owning the pixel |
-// data. Therefore, we do not transfer ownership to the SkBitmapDevice's bitmap. |
+// Ownership of the cairo object is transferred. |
BitmapPlatformDevice::BitmapPlatformDevice( |
const SkBitmap& bitmap, |
- cairo_surface_t* surface) |
+ cairo_t* cairo) |
: SkBitmapDevice(bitmap), |
- cairo_(cairo_create(surface)), |
+ cairo_(cairo), |
config_dirty_(true), |
transform_(SkMatrix::I()) { // Want to load the config next time. |
SetPlatformDevice(this, this); |