Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(390)

Unified Diff: ui/gfx/image/image.cc

Issue 10928093: Adds an iOS implementation of gfx::Image. (Closed) Base URL: http://git.chromium.org/chromium/src.git@skia
Patch Set: Moar GYP and TODOs. Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/gfx/image/image.h ('k') | ui/gfx/image/image_ios.mm » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/gfx/image/image.cc
diff --git a/ui/gfx/image/image.cc b/ui/gfx/image/image.cc
index c5c0c76c02152783a00047e2292be58a3117b227..7a87cc3140636c6d0859943c4d40a527b16fda59 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,7 @@ NSImage* Image::CopyNSImage() const {
}
#endif
-#if defined(OS_MACOSX)
+#if defined(OS_MACOSX) && !defined(OS_IOS)
Image::operator NSImage*() const {
return ToNSImage();
}
« no previous file with comments | « ui/gfx/image/image.h ('k') | ui/gfx/image/image_ios.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698