Chromium Code Reviews| Index: ui/gfx/image.cc |
| diff --git a/ui/gfx/image.cc b/ui/gfx/image.cc |
| index b42e2156c375f1a312fb0ea173faa8e084748558..d9d0208bbd0cc1ddfb769842c4e958e2c5a60db9 100644 |
| --- a/ui/gfx/image.cc |
| +++ b/ui/gfx/image.cc |
| @@ -7,6 +7,7 @@ |
| #include <algorithm> |
| #include "base/logging.h" |
| +#include "base/stl_util-inl.h" |
| #include "third_party/skia/include/core/SkBitmap.h" |
| #if defined(OS_LINUX) |
| @@ -26,7 +27,7 @@ namespace internal { |
| #if defined(OS_MACOSX) |
| // This is a wrapper around gfx::NSImageToSkBitmap() because this cross-platform |
| // file cannot include the [square brackets] of ObjC. |
| -const SkBitmap* NSImageToSkBitmap(NSImage* image); |
| +bool NSImageToSkBitmaps(NSImage* image, std::vector<const SkBitmap*>& bitmaps); |
| #endif |
| #if defined(OS_LINUX) |
| @@ -84,20 +85,27 @@ class ImageRep { |
| class SkBitmapRep : public ImageRep { |
| public: |
| explicit SkBitmapRep(const SkBitmap* bitmap) |
| - : ImageRep(Image::kSkBitmapRep), |
| - bitmap_(bitmap) { |
| + : ImageRep(Image::kSkBitmapRep) { |
| CHECK(bitmap); |
| + bitmaps_.push_back(bitmap); |
| + } |
| + |
| + explicit SkBitmapRep(const std::vector<const SkBitmap*>& bitmaps) |
| + : ImageRep(Image::kSkBitmapRep), |
| + bitmaps_(bitmaps) { |
| + CHECK(!bitmaps_.empty()); |
| } |
| virtual ~SkBitmapRep() { |
| - delete bitmap_; |
| - bitmap_ = NULL; |
| + STLDeleteElements(&bitmaps_); |
| } |
| - const SkBitmap* bitmap() const { return bitmap_; } |
| + const SkBitmap* bitmap() const { return bitmaps_[0]; } |
| + |
| + const std::vector<const SkBitmap*>& bitmaps() const { return bitmaps_; } |
| private: |
| - const SkBitmap* bitmap_; |
| + std::vector<const SkBitmap*> bitmaps_; |
| DISALLOW_COPY_AND_ASSIGN(SkBitmapRep); |
| }; |
| @@ -158,6 +166,12 @@ Image::Image(const SkBitmap* bitmap) |
| AddRepresentation(rep); |
| } |
| +Image::Image(const std::vector<const SkBitmap*>& bitmaps) |
| + : default_representation_(Image::kSkBitmapRep) { |
| + internal::SkBitmapRep* rep = new internal::SkBitmapRep(bitmaps); |
| + AddRepresentation(rep); |
| +} |
| + |
| #if defined(OS_LINUX) |
| Image::Image(GdkPixbuf* pixbuf) |
| : default_representation_(Image::kGdkPixbufRep) { |
| @@ -246,8 +260,9 @@ internal::ImageRep* Image::GetRepresentation(RepresentationType rep_type) { |
| #elif defined(OS_MACOSX) |
| if (default_representation_ == Image::kNSImageRep) { |
| internal::NSImageRep* nsimage_rep = default_rep->AsNSImageRep(); |
| - rep = new internal::SkBitmapRep( |
| - internal::NSImageToSkBitmap(nsimage_rep->image())); |
| + std::vector<const SkBitmap*> bitmaps; |
| + if (internal::NSImageToSkBitmaps(nsimage_rep->image(), bitmaps)) |
|
Robert Sesek
2011/04/18 22:48:13
I'd maybe change this to a CHECK() so it's more cl
sail
2011/04/19 00:21:53
Done.
|
| + rep = new internal::SkBitmapRep(bitmaps); |
| } |
| #endif |
| CHECK(rep); |
| @@ -266,7 +281,7 @@ internal::ImageRep* Image::GetRepresentation(RepresentationType rep_type) { |
| } |
| #elif defined(OS_MACOSX) |
| if (rep_type == Image::kNSImageRep) { |
| - NSImage* image = gfx::SkBitmapToNSImage(*(skia_rep->bitmap())); |
| + NSImage* image = gfx::SkBitmapsToNSImage(skia_rep->bitmaps()); |
| base::mac::NSObjectRetain(image); |
| native_rep = new internal::NSImageRep(image); |
| } |
| @@ -284,4 +299,14 @@ void Image::AddRepresentation(internal::ImageRep* rep) { |
| representations_.insert(std::make_pair(rep->type(), rep)); |
| } |
| +size_t Image::GetNumberOfSkBitmaps() { |
| + return GetRepresentation(Image::kSkBitmapRep)->AsSkBitmapRep()-> |
| + bitmaps().size(); |
| +} |
| + |
| +const SkBitmap* Image::GetSkBitmapAtIndex(size_t index) { |
| + return GetRepresentation(Image::kSkBitmapRep)->AsSkBitmapRep()-> |
| + bitmaps()[index]; |
| +} |
| + |
| } // namespace gfx |