Chromium Code Reviews| Index: ui/gfx/image/image.cc |
| diff --git a/ui/gfx/image/image.cc b/ui/gfx/image/image.cc |
| index 2ba2eba203349c389d491da3311398c8a28e59be..b6289be1f70ac590dce2ce8d172ac691f9d549b5 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" |
| @@ -43,6 +44,7 @@ const SkBitmap* GdkPixbufToSkBitmap(GdkPixbuf* pixbuf) { |
| class ImageRepSkia; |
| class ImageRepGdk; |
| class ImageRepCocoa; |
| +class ImageRepCairoCached; |
|
Robert Sesek
2011/12/01 19:30:35
nit: put below ImageRepGdk
|
| // An ImageRep is the object that holds the backing memory for an Image. Each |
| // RepresentationType has an ImageRep subclass that is responsible for freeing |
| @@ -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,6 +140,29 @@ class ImageRepGdk : public ImageRep { |
| DISALLOW_COPY_AND_ASSIGN(ImageRepGdk); |
| }; |
| + |
| +// 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); |
| +}; |
| + |
|
Robert Sesek
2011/12/01 19:30:35
nit: remove blank line
|
| #endif |
|
Robert Sesek
2011/12/01 19:30:35
// defined(TOOLKIT_USES_GTK)
|
| #if defined(OS_MACOSX) |
| @@ -244,6 +274,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) |
| @@ -361,6 +396,11 @@ internal::ImageRep* Image::GetRepresentation( |
| if (rep_type == Image::kImageRepGdk) { |
| GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(skia_rep->bitmap()); |
| native_rep = new internal::ImageRepGdk(pixbuf); |
| + } else if (rep_type == Image::kImageRepCairoCache) { |
| + // Send the data that we have in process right now to the display server. |
| + internal::ImageRep* rep = GetRepresentation(Image::kImageRepGdk); |
| + native_rep = new internal::ImageRepCairoCached( |
| + rep->AsImageRepGdk()->pixbuf()); |
| } |
| #elif defined(OS_MACOSX) |
| if (rep_type == Image::kImageRepCocoa) { |