Index: ui/gfx/image/image.cc |
diff --git a/ui/gfx/image/image.cc b/ui/gfx/image/image.cc |
index c5c0c76c02152783a00047e2292be58a3117b227..007956fe6e834e59e498cab0c948059b14b708f6 100644 |
--- a/ui/gfx/image/image.cc |
+++ b/ui/gfx/image/image.cc |
@@ -9,10 +9,13 @@ |
#include "base/logging.h" |
#include "base/memory/scoped_ptr.h" |
#include "third_party/skia/include/core/SkBitmap.h" |
-#include "ui/gfx/codec/png_codec.h" |
#include "ui/gfx/image/image_skia.h" |
#include "ui/gfx/size.h" |
+#if !defined(OS_IOS) |
+#include "ui/gfx/codec/png_codec.h" |
+#endif |
+ |
#if defined(TOOLKIT_GTK) |
#include <gdk-pixbuf/gdk-pixbuf.h> |
#include <gdk/gdk.h> |
@@ -21,6 +24,9 @@ |
#include "ui/gfx/canvas.h" |
#include "ui/gfx/gtk_util.h" |
#include "ui/gfx/image/cairo_cached_surface.h" |
+#elif defined(OS_IOS) |
+#include "base/mac/foundation_util.h" |
+#include "ui/gfx/image/image_skia_util_ios.h" |
#elif defined(OS_MACOSX) |
#include "base/mac/mac_util.h" |
#include "ui/gfx/image/image_skia_util_mac.h" |
@@ -84,11 +90,18 @@ void PNGFromGdkPixbuf(GdkPixbuf* pixbuf, std::vector<unsigned char>* png) { |
#endif // defined(TOOLKIT_GTK) |
-#if defined(OS_MACOSX) |
+#if defined(OS_IOS) |
+void PNGFromUIImage(UIImage* nsimage, std::vector<unsigned char>* png); |
+UIImage* CreateUIImageFromPNG(const std::vector<unsigned char>& png); |
+#elif defined(OS_MACOSX) |
void PNGFromNSImage(NSImage* nsimage, std::vector<unsigned char>* png); |
NSImage* NSImageFromPNG(const std::vector<unsigned char>& png); |
#endif // defined(OS_MACOSX) |
+#if defined(OS_IOS) |
+ImageSkia* ImageSkiaFromPNG(const std::vector<unsigned char>& png); |
+void PNGFromImageSkia(const ImageSkia* skia, std::vector<unsigned char>* png); |
+#else |
ImageSkia* ImageSkiaFromPNG(const std::vector<unsigned char>& png) { |
SkBitmap bitmap; |
if (!gfx::PNGCodec::Decode(&png.front(), png.size(), &bitmap)) { |
@@ -104,12 +117,14 @@ ImageSkia* ImageSkiaFromPNG(const std::vector<unsigned char>& png) { |
void PNGFromImageSkia(const ImageSkia* skia, std::vector<unsigned char>* png) { |
CHECK(gfx::PNGCodec::EncodeBGRASkBitmap(*skia->bitmap(), false, png)); |
} |
+#endif |
class ImageRepPNG; |
class ImageRepSkia; |
class ImageRepGdk; |
class ImageRepCairo; |
class ImageRepCocoa; |
+class ImageRepCocoaTouch; |
// An ImageRep is the object that holds the backing memory for an Image. Each |
// RepresentationType has an ImageRep subclass that is responsible for freeing |
@@ -146,7 +161,12 @@ class ImageRep { |
} |
#endif |
-#if defined(OS_MACOSX) |
+#if defined(OS_IOS) |
+ ImageRepCocoaTouch* AsImageRepCocoaTouch() { |
+ CHECK_EQ(type_, Image::kImageRepCocoaTouch); |
+ return reinterpret_cast<ImageRepCocoaTouch*>(this); |
+ } |
+#elif defined(OS_MACOSX) |
ImageRepCocoa* AsImageRepCocoa() { |
CHECK_EQ(type_, Image::kImageRepCocoa); |
return reinterpret_cast<ImageRepCocoa*>(this); |
@@ -245,7 +265,28 @@ class ImageRepCairo : public ImageRep { |
}; |
#endif // defined(TOOLKIT_GTK) |
-#if defined(OS_MACOSX) |
+#if defined(OS_IOS) |
+class ImageRepCocoaTouch : public ImageRep { |
+ public: |
+ explicit ImageRepCocoaTouch(UIImage* image) |
+ : ImageRep(Image::kImageRepCocoaTouch), |
+ image_(image) { |
+ CHECK(image); |
+ } |
+ |
+ virtual ~ImageRepCocoaTouch() { |
+ base::mac::NSObjectRelease(image_); |
+ image_ = nil; |
+ } |
+ |
+ UIImage* image() const { return image_; } |
+ |
+ private: |
+ UIImage* image_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ImageRepCocoaTouch); |
+}; |
+#elif defined(OS_MACOSX) |
class ImageRepCocoa : public ImageRep { |
public: |
explicit ImageRepCocoa(NSImage* image) |
@@ -343,7 +384,15 @@ Image::Image(GdkPixbuf* pixbuf) { |
} |
#endif |
-#if defined(OS_MACOSX) |
+#if defined(OS_IOS) |
+Image::Image(UIImage* image) |
+ : storage_(new internal::ImageStorage(Image::kImageRepCocoaTouch)) { |
+ if (image) { |
+ internal::ImageRepCocoaTouch* rep = new internal::ImageRepCocoaTouch(image); |
+ AddRepresentation(rep); |
+ } |
+} |
+#elif defined(OS_MACOSX) |
Image::Image(NSImage* image) { |
if (image) { |
storage_ = new internal::ImageStorage(Image::kImageRepCocoa); |
@@ -376,6 +425,14 @@ const std::vector<unsigned char>* Image::ToImagePNG() const { |
internal::PNGFromGdkPixbuf(gdk_rep->pixbuf(), png_rep->image()); |
break; |
} |
+#elif defined(OS_IOS) |
+ case kImageRepCocoaTouch: { |
+ internal::ImageRepCocoaTouch* cocoa_touch_rep = |
+ GetRepresentation(kImageRepCocoaTouch, true) |
+ ->AsImageRepCocoaTouch(); |
+ internal::PNGFromUIImage(cocoa_touch_rep->image(), png_rep->image()); |
+ break; |
+ } |
#elif defined(OS_MACOSX) |
case kImageRepCocoa: { |
internal::ImageRepCocoa* cocoa_rep = |
@@ -424,6 +481,15 @@ const ImageSkia* Image::ToImageSkia() const { |
internal::ImageSkiaFromGdkPixbuf(native_rep->pixbuf()))); |
break; |
} |
+#elif defined(OS_IOS) |
+ case kImageRepCocoaTouch: { |
+ internal::ImageRepCocoaTouch* native_rep = |
+ GetRepresentation(kImageRepCocoaTouch, true) |
+ ->AsImageRepCocoaTouch(); |
+ rep = new internal::ImageRepSkia(new ImageSkia( |
+ ImageSkiaFromUIImage(native_rep->image()))); |
+ break; |
+ } |
#elif defined(OS_MACOSX) |
case kImageRepCocoa: { |
internal::ImageRepCocoa* native_rep = |
@@ -483,7 +549,35 @@ CairoCachedSurface* const Image::ToCairo() const { |
} |
#endif |
-#if defined(OS_MACOSX) |
+#if defined(OS_IOS) |
+UIImage* Image::ToUIImage() const { |
+ internal::ImageRep* rep = GetRepresentation(kImageRepCocoaTouch, false); |
+ if (!rep) { |
+ switch (DefaultRepresentationType()) { |
+ case kImageRepPNG: { |
+ internal::ImageRepPNG* png_rep = |
+ GetRepresentation(kImageRepPNG, true)->AsImageRepPNG(); |
+ rep = new internal::ImageRepCocoaTouch(internal::CreateUIImageFromPNG( |
+ *png_rep->image())); |
+ break; |
+ } |
+ case kImageRepSkia: { |
+ internal::ImageRepSkia* skia_rep = |
+ GetRepresentation(kImageRepSkia, true)->AsImageRepSkia(); |
+ UIImage* image = UIImageFromImageSkia(*skia_rep->image()); |
+ base::mac::NSObjectRetain(image); |
+ rep = new internal::ImageRepCocoaTouch(image); |
+ break; |
+ } |
+ default: |
+ NOTREACHED(); |
+ } |
+ CHECK(rep); |
+ AddRepresentation(rep); |
+ } |
+ return rep->AsImageRepCocoaTouch()->image(); |
+} |
+#elif defined(OS_MACOSX) |
NSImage* Image::ToNSImage() const { |
internal::ImageRep* rep = GetRepresentation(kImageRepCocoa, false); |
if (!rep) { |
@@ -525,7 +619,7 @@ ImageSkia Image::AsImageSkia() const { |
return IsEmpty() ? ImageSkia() : *ToImageSkia(); |
} |
-#if defined(OS_MACOSX) |
+#if defined(OS_MACOSX) && !defined(OS_IOS) |
NSImage* Image::AsNSImage() const { |
return IsEmpty() ? nil : ToNSImage(); |
} |
@@ -547,7 +641,13 @@ GdkPixbuf* Image::CopyGdkPixbuf() const { |
} |
#endif |
-#if defined(OS_MACOSX) |
+#if defined(OS_IOS) |
+UIImage* Image::CopyUIImage() const { |
+ UIImage* image = ToUIImage(); |
+ base::mac::NSObjectRetain(image); |
+ return image; |
+} |
+#elif defined(OS_MACOSX) |
NSImage* Image::CopyNSImage() const { |
NSImage* image = ToNSImage(); |
base::mac::NSObjectRetain(image); |
@@ -555,7 +655,11 @@ NSImage* Image::CopyNSImage() const { |
} |
#endif |
-#if defined(OS_MACOSX) |
+#if defined(OS_IOS) |
+Image::operator UIImage*() const { |
+ return ToUIImage(); |
+} |
+#elif defined(OS_MACOSX) |
Image::operator NSImage*() const { |
return ToNSImage(); |
} |