Index: ui/gfx/image/image.cc |
diff --git a/ui/gfx/image/image.cc b/ui/gfx/image/image.cc |
index 2ba2eba203349c389d491da3311398c8a28e59be..f14b9ec0e2413a45db546a3955ec691e604e81e7 100644 |
--- a/ui/gfx/image/image.cc |
+++ b/ui/gfx/image/image.cc |
@@ -15,6 +15,7 @@ |
#include <glib-object.h> |
#include "ui/gfx/canvas_skia.h" |
#include "ui/gfx/gtk_util.h" |
+#include "ui/gfx/image/cairo_cached_surface.h" |
#elif defined(OS_MACOSX) |
#include "base/mac/mac_util.h" |
#include "skia/ext/skia_utils_mac.h" |
@@ -42,6 +43,7 @@ const SkBitmap* GdkPixbufToSkBitmap(GdkPixbuf* pixbuf) { |
class ImageRepSkia; |
class ImageRepGdk; |
+class ImageRepCairoCached; |
class ImageRepCocoa; |
// An ImageRep is the object that holds the backing memory for an Image. Each |
@@ -67,6 +69,11 @@ class ImageRep { |
CHECK_EQ(type_, Image::kImageRepGdk); |
return reinterpret_cast<ImageRepGdk*>(this); |
} |
+ |
+ ImageRepCairoCached* AsImageRepCairo() { |
+ CHECK_EQ(type_, Image::kImageRepCairoCache); |
+ return reinterpret_cast<ImageRepCairoCached*>(this); |
+ } |
#endif |
#if defined(OS_MACOSX) |
@@ -133,7 +140,29 @@ class ImageRepGdk : public ImageRep { |
DISALLOW_COPY_AND_ASSIGN(ImageRepGdk); |
}; |
-#endif |
+ |
+// Represents data that lives on the display server instead of in the client. |
+class ImageRepCairoCached : public ImageRep { |
+ public: |
+ explicit ImageRepCairoCached(GdkPixbuf* pixbuf) |
+ : ImageRep(Image::kImageRepCairoCache), |
+ cairo_cache_(new CairoCachedSurface) { |
+ CHECK(pixbuf); |
+ cairo_cache_->UsePixbuf(pixbuf); |
+ } |
+ |
+ virtual ~ImageRepCairoCached() { |
+ delete cairo_cache_; |
+ } |
+ |
+ CairoCachedSurface* surface() const { return cairo_cache_; } |
+ |
+ private: |
+ CairoCachedSurface* cairo_cache_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ImageRepCairoCached); |
+}; |
+#endif // defined(TOOLKIT_USES_GTK) |
#if defined(OS_MACOSX) |
class ImageRepCocoa : public ImageRep { |
@@ -156,7 +185,7 @@ class ImageRepCocoa : public ImageRep { |
DISALLOW_COPY_AND_ASSIGN(ImageRepCocoa); |
}; |
-#endif |
+#endif // defined(OS_MACOSX) |
// The Storage class acts similarly to the pixels in a SkBitmap: the Image |
// class holds a refptr instance of Storage, which in turn holds all the |
@@ -244,6 +273,11 @@ GdkPixbuf* Image::ToGdkPixbuf() const { |
internal::ImageRep* rep = GetRepresentation(Image::kImageRepGdk); |
return rep->AsImageRepGdk()->pixbuf(); |
} |
+ |
+CairoCachedSurface* const Image::ToCairo() const { |
+ internal::ImageRep* rep = GetRepresentation(Image::kImageRepCairoCache); |
+ return rep->AsImageRepCairo()->surface(); |
+} |
#endif |
#if defined(OS_MACOSX) |
@@ -337,6 +371,9 @@ internal::ImageRep* Image::GetRepresentation( |
rep = new internal::ImageRepSkia( |
internal::GdkPixbufToSkBitmap(pixbuf_rep->pixbuf())); |
} |
+ // We don't do conversions from CairoCachedSurfaces to Skia because the |
+ // data lives on the display server and we'll always have a GdkPixbuf if we |
+ // have a CairoCachedSurface. |
#elif defined(OS_MACOSX) |
if (storage_->default_representation_type() == Image::kImageRepCocoa) { |
internal::ImageRepCocoa* nsimage_rep = default_rep->AsImageRepCocoa(); |
@@ -349,6 +386,19 @@ internal::ImageRep* Image::GetRepresentation( |
AddRepresentation(rep); |
return rep; |
} |
+#if defined(TOOLKIT_USES_GTK) |
+ else if (rep_type == Image::kImageRepCairoCache) { |
+ // Handle any-to-Cairo conversion. This may recursively create an |
+ // intermediate pixbuf before we send the data to the display server. |
+ internal::ImageRep* rep = GetRepresentation(Image::kImageRepGdk); |
+ internal::ImageRepCairoCached* native_rep = |
+ new internal::ImageRepCairoCached(rep->AsImageRepGdk()->pixbuf()); |
+ |
+ CHECK(native_rep); |
+ AddRepresentation(native_rep); |
+ return native_rep; |
+ } |
+#endif |
// Handle Skia-to-native conversions. |
if (default_rep->type() == Image::kImageRepSkia) { |