OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/gfx/image/image.h" | 5 #include "ui/gfx/image/image.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
11 #include "base/stl_util.h" | 11 #include "base/stl_util.h" |
12 #include "third_party/skia/include/core/SkBitmap.h" | 12 #include "third_party/skia/include/core/SkBitmap.h" |
13 #include "ui/gfx/image/image_png_rep.h" | 13 #include "ui/gfx/image/image_png_rep.h" |
14 #include "ui/gfx/image/image_skia.h" | 14 #include "ui/gfx/image/image_skia.h" |
15 #include "ui/gfx/size.h" | 15 #include "ui/gfx/size.h" |
16 | 16 |
17 #if !defined(OS_IOS) | 17 #if !defined(OS_IOS) |
18 #include "ui/gfx/codec/png_codec.h" | 18 #include "ui/gfx/codec/png_codec.h" |
19 #endif | 19 #endif |
20 | 20 |
21 #if defined(TOOLKIT_GTK) | 21 #if defined(OS_IOS) |
22 #include <gdk-pixbuf/gdk-pixbuf.h> | |
23 #include <gdk/gdk.h> | |
24 #include <glib-object.h> | |
25 #include "ui/gfx/canvas.h" | |
26 #include "ui/gfx/gtk_util.h" | |
27 #include "ui/gfx/image/cairo_cached_surface.h" | |
28 #include "ui/gfx/scoped_gobject.h" | |
29 #elif defined(OS_IOS) | |
30 #include "base/mac/foundation_util.h" | 22 #include "base/mac/foundation_util.h" |
31 #include "ui/gfx/image/image_skia_util_ios.h" | 23 #include "ui/gfx/image/image_skia_util_ios.h" |
32 #elif defined(OS_MACOSX) | 24 #elif defined(OS_MACOSX) |
33 #include "base/mac/mac_util.h" | 25 #include "base/mac/mac_util.h" |
34 #include "ui/gfx/image/image_skia_util_mac.h" | 26 #include "ui/gfx/image/image_skia_util_mac.h" |
35 #endif | 27 #endif |
36 | 28 |
37 namespace gfx { | 29 namespace gfx { |
38 | 30 |
39 namespace internal { | 31 namespace internal { |
40 | 32 |
41 #if defined(TOOLKIT_GTK) | |
42 const ImageSkia ImageSkiaFromGdkPixbuf(GdkPixbuf* pixbuf) { | |
43 CHECK(pixbuf); | |
44 gfx::Canvas canvas(gfx::Size(gdk_pixbuf_get_width(pixbuf), | |
45 gdk_pixbuf_get_height(pixbuf)), | |
46 1.0f, | |
47 false); | |
48 skia::ScopedPlatformPaint scoped_platform_paint(canvas.sk_canvas()); | |
49 cairo_t* cr = scoped_platform_paint.GetPlatformSurface(); | |
50 gdk_cairo_set_source_pixbuf(cr, pixbuf, 0, 0); | |
51 cairo_paint(cr); | |
52 return ImageSkia(canvas.ExtractImageRep()); | |
53 } | |
54 | |
55 // Returns a 16x16 red pixbuf to visually show error in decoding PNG. | |
56 // Also logs error to console. | |
57 GdkPixbuf* GetErrorPixbuf() { | |
58 LOG(ERROR) << "Unable to decode PNG."; | |
59 GdkPixbuf* pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, 16, 16); | |
60 gdk_pixbuf_fill(pixbuf, 0xff0000ff); | |
61 return pixbuf; | |
62 } | |
63 | |
64 GdkPixbuf* GdkPixbufFromPNG( | |
65 const std::vector<gfx::ImagePNGRep>& image_png_reps) { | |
66 scoped_refptr<base::RefCountedMemory> png_bytes(NULL); | |
67 for (size_t i = 0; i < image_png_reps.size(); ++i) { | |
68 if (image_png_reps[i].scale == 1.0f) | |
69 png_bytes = image_png_reps[i].raw_data; | |
70 } | |
71 | |
72 if (!png_bytes.get()) | |
73 return GetErrorPixbuf(); | |
74 | |
75 GdkPixbuf* pixbuf = NULL; | |
76 ui::ScopedGObject<GdkPixbufLoader>::Type loader(gdk_pixbuf_loader_new()); | |
77 | |
78 bool ok = gdk_pixbuf_loader_write(loader.get(), | |
79 reinterpret_cast<const guint8*>(png_bytes->front()), png_bytes->size(), | |
80 NULL); | |
81 | |
82 // Calling gdk_pixbuf_loader_close forces the data to be parsed by the | |
83 // loader. This must be done before calling gdk_pixbuf_loader_get_pixbuf. | |
84 if (ok) | |
85 ok = gdk_pixbuf_loader_close(loader.get(), NULL); | |
86 if (ok) | |
87 pixbuf = gdk_pixbuf_loader_get_pixbuf(loader.get()); | |
88 | |
89 if (pixbuf) { | |
90 // The pixbuf is owned by the scoped loader which will delete its ref when | |
91 // it goes out of scope. Add a ref so that the pixbuf still exists. | |
92 g_object_ref(pixbuf); | |
93 } else { | |
94 return GetErrorPixbuf(); | |
95 } | |
96 | |
97 return pixbuf; | |
98 } | |
99 | |
100 scoped_refptr<base::RefCountedMemory> Get1xPNGBytesFromPixbuf( | |
101 GdkPixbuf* pixbuf) { | |
102 gchar* image = NULL; | |
103 gsize image_size; | |
104 GError* error = NULL; | |
105 CHECK(gdk_pixbuf_save_to_buffer( | |
106 pixbuf, &image, &image_size, "png", &error, NULL)); | |
107 scoped_refptr<base::RefCountedBytes> png_bytes( | |
108 new base::RefCountedBytes()); | |
109 png_bytes->data().assign(image, image + image_size); | |
110 g_free(image); | |
111 return png_bytes; | |
112 } | |
113 | |
114 #endif // defined(TOOLKIT_GTK) | |
115 | |
116 #if defined(OS_IOS) | 33 #if defined(OS_IOS) |
117 scoped_refptr<base::RefCountedMemory> Get1xPNGBytesFromUIImage( | 34 scoped_refptr<base::RefCountedMemory> Get1xPNGBytesFromUIImage( |
118 UIImage* uiimage); | 35 UIImage* uiimage); |
119 // Caller takes ownership of the returned UIImage. | 36 // Caller takes ownership of the returned UIImage. |
120 UIImage* CreateUIImageFromPNG( | 37 UIImage* CreateUIImageFromPNG( |
121 const std::vector<gfx::ImagePNGRep>& image_png_reps); | 38 const std::vector<gfx::ImagePNGRep>& image_png_reps); |
122 gfx::Size UIImageSize(UIImage* image); | 39 gfx::Size UIImageSize(UIImage* image); |
123 #elif defined(OS_MACOSX) | 40 #elif defined(OS_MACOSX) |
124 scoped_refptr<base::RefCountedMemory> Get1xPNGBytesFromNSImage( | 41 scoped_refptr<base::RefCountedMemory> Get1xPNGBytesFromNSImage( |
125 NSImage* nsimage); | 42 NSImage* nsimage); |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 ImageRepPNG* AsImageRepPNG() { | 123 ImageRepPNG* AsImageRepPNG() { |
207 CHECK_EQ(type_, Image::kImageRepPNG); | 124 CHECK_EQ(type_, Image::kImageRepPNG); |
208 return reinterpret_cast<ImageRepPNG*>(this); | 125 return reinterpret_cast<ImageRepPNG*>(this); |
209 } | 126 } |
210 | 127 |
211 ImageRepSkia* AsImageRepSkia() { | 128 ImageRepSkia* AsImageRepSkia() { |
212 CHECK_EQ(type_, Image::kImageRepSkia); | 129 CHECK_EQ(type_, Image::kImageRepSkia); |
213 return reinterpret_cast<ImageRepSkia*>(this); | 130 return reinterpret_cast<ImageRepSkia*>(this); |
214 } | 131 } |
215 | 132 |
216 #if defined(TOOLKIT_GTK) | |
217 ImageRepGdk* AsImageRepGdk() { | |
218 CHECK_EQ(type_, Image::kImageRepGdk); | |
219 return reinterpret_cast<ImageRepGdk*>(this); | |
220 } | |
221 | |
222 ImageRepCairo* AsImageRepCairo() { | |
223 CHECK_EQ(type_, Image::kImageRepCairo); | |
224 return reinterpret_cast<ImageRepCairo*>(this); | |
225 } | |
226 #endif | |
227 | |
228 #if defined(OS_IOS) | 133 #if defined(OS_IOS) |
229 ImageRepCocoaTouch* AsImageRepCocoaTouch() { | 134 ImageRepCocoaTouch* AsImageRepCocoaTouch() { |
230 CHECK_EQ(type_, Image::kImageRepCocoaTouch); | 135 CHECK_EQ(type_, Image::kImageRepCocoaTouch); |
231 return reinterpret_cast<ImageRepCocoaTouch*>(this); | 136 return reinterpret_cast<ImageRepCocoaTouch*>(this); |
232 } | 137 } |
233 #elif defined(OS_MACOSX) | 138 #elif defined(OS_MACOSX) |
234 ImageRepCocoa* AsImageRepCocoa() { | 139 ImageRepCocoa* AsImageRepCocoa() { |
235 CHECK_EQ(type_, Image::kImageRepCocoa); | 140 CHECK_EQ(type_, Image::kImageRepCocoa); |
236 return reinterpret_cast<ImageRepCocoa*>(this); | 141 return reinterpret_cast<ImageRepCocoa*>(this); |
237 } | 142 } |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
319 } | 224 } |
320 | 225 |
321 ImageSkia* image() { return image_.get(); } | 226 ImageSkia* image() { return image_.get(); } |
322 | 227 |
323 private: | 228 private: |
324 scoped_ptr<ImageSkia> image_; | 229 scoped_ptr<ImageSkia> image_; |
325 | 230 |
326 DISALLOW_COPY_AND_ASSIGN(ImageRepSkia); | 231 DISALLOW_COPY_AND_ASSIGN(ImageRepSkia); |
327 }; | 232 }; |
328 | 233 |
329 #if defined(TOOLKIT_GTK) | |
330 class ImageRepGdk : public ImageRep { | |
331 public: | |
332 explicit ImageRepGdk(GdkPixbuf* pixbuf) | |
333 : ImageRep(Image::kImageRepGdk), | |
334 pixbuf_(pixbuf) { | |
335 CHECK(pixbuf); | |
336 } | |
337 | |
338 virtual ~ImageRepGdk() { | |
339 if (pixbuf_) { | |
340 g_object_unref(pixbuf_); | |
341 pixbuf_ = NULL; | |
342 } | |
343 } | |
344 | |
345 virtual int Width() const OVERRIDE { | |
346 return gdk_pixbuf_get_width(pixbuf_); | |
347 } | |
348 | |
349 virtual int Height() const OVERRIDE { | |
350 return gdk_pixbuf_get_height(pixbuf_); | |
351 } | |
352 | |
353 virtual gfx::Size Size() const OVERRIDE { | |
354 return gfx::Size(Width(), Height()); | |
355 } | |
356 | |
357 GdkPixbuf* pixbuf() const { return pixbuf_; } | |
358 | |
359 private: | |
360 GdkPixbuf* pixbuf_; | |
361 | |
362 DISALLOW_COPY_AND_ASSIGN(ImageRepGdk); | |
363 }; | |
364 | |
365 // Represents data that lives on the display server instead of in the client. | |
366 class ImageRepCairo : public ImageRep { | |
367 public: | |
368 explicit ImageRepCairo(GdkPixbuf* pixbuf) | |
369 : ImageRep(Image::kImageRepCairo), | |
370 cairo_cache_(new CairoCachedSurface) { | |
371 CHECK(pixbuf); | |
372 cairo_cache_->UsePixbuf(pixbuf); | |
373 } | |
374 | |
375 virtual ~ImageRepCairo() { | |
376 delete cairo_cache_; | |
377 } | |
378 | |
379 virtual int Width() const OVERRIDE { | |
380 return cairo_cache_->Width(); | |
381 } | |
382 | |
383 virtual int Height() const OVERRIDE { | |
384 return cairo_cache_->Height(); | |
385 } | |
386 | |
387 virtual gfx::Size Size() const OVERRIDE { | |
388 return gfx::Size(Width(), Height()); | |
389 } | |
390 | |
391 CairoCachedSurface* surface() const { return cairo_cache_; } | |
392 | |
393 private: | |
394 CairoCachedSurface* cairo_cache_; | |
395 | |
396 DISALLOW_COPY_AND_ASSIGN(ImageRepCairo); | |
397 }; | |
398 #endif // defined(TOOLKIT_GTK) | |
399 | |
400 #if defined(OS_IOS) | 234 #if defined(OS_IOS) |
401 class ImageRepCocoaTouch : public ImageRep { | 235 class ImageRepCocoaTouch : public ImageRep { |
402 public: | 236 public: |
403 explicit ImageRepCocoaTouch(UIImage* image) | 237 explicit ImageRepCocoaTouch(UIImage* image) |
404 : ImageRep(Image::kImageRepCocoaTouch), | 238 : ImageRep(Image::kImageRepCocoaTouch), |
405 image_(image) { | 239 image_(image) { |
406 CHECK(image); | 240 CHECK(image); |
407 } | 241 } |
408 | 242 |
409 virtual ~ImageRepCocoaTouch() { | 243 virtual ~ImageRepCocoaTouch() { |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
543 | 377 |
544 Image::Image(const ImageSkia& image) { | 378 Image::Image(const ImageSkia& image) { |
545 if (!image.isNull()) { | 379 if (!image.isNull()) { |
546 storage_ = new internal::ImageStorage(Image::kImageRepSkia); | 380 storage_ = new internal::ImageStorage(Image::kImageRepSkia); |
547 internal::ImageRepSkia* rep = new internal::ImageRepSkia( | 381 internal::ImageRepSkia* rep = new internal::ImageRepSkia( |
548 new ImageSkia(image)); | 382 new ImageSkia(image)); |
549 AddRepresentation(rep); | 383 AddRepresentation(rep); |
550 } | 384 } |
551 } | 385 } |
552 | 386 |
553 #if defined(TOOLKIT_GTK) | |
554 Image::Image(GdkPixbuf* pixbuf) { | |
555 if (pixbuf) { | |
556 storage_ = new internal::ImageStorage(Image::kImageRepGdk); | |
557 internal::ImageRepGdk* rep = new internal::ImageRepGdk(pixbuf); | |
558 AddRepresentation(rep); | |
559 } | |
560 } | |
561 #endif | |
562 | |
563 #if defined(OS_IOS) | 387 #if defined(OS_IOS) |
564 Image::Image(UIImage* image) | 388 Image::Image(UIImage* image) |
565 : storage_(new internal::ImageStorage(Image::kImageRepCocoaTouch)) { | 389 : storage_(new internal::ImageStorage(Image::kImageRepCocoaTouch)) { |
566 if (image) { | 390 if (image) { |
567 internal::ImageRepCocoaTouch* rep = new internal::ImageRepCocoaTouch(image); | 391 internal::ImageRepCocoaTouch* rep = new internal::ImageRepCocoaTouch(image); |
568 AddRepresentation(rep); | 392 AddRepresentation(rep); |
569 } | 393 } |
570 } | 394 } |
571 #elif defined(OS_MACOSX) | 395 #elif defined(OS_MACOSX) |
572 Image::Image(NSImage* image) { | 396 Image::Image(NSImage* image) { |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
625 internal::ImageRep* rep = GetRepresentation(kImageRepSkia, false); | 449 internal::ImageRep* rep = GetRepresentation(kImageRepSkia, false); |
626 if (!rep) { | 450 if (!rep) { |
627 switch (DefaultRepresentationType()) { | 451 switch (DefaultRepresentationType()) { |
628 case kImageRepPNG: { | 452 case kImageRepPNG: { |
629 internal::ImageRepPNG* png_rep = | 453 internal::ImageRepPNG* png_rep = |
630 GetRepresentation(kImageRepPNG, true)->AsImageRepPNG(); | 454 GetRepresentation(kImageRepPNG, true)->AsImageRepPNG(); |
631 rep = new internal::ImageRepSkia( | 455 rep = new internal::ImageRepSkia( |
632 internal::ImageSkiaFromPNG(png_rep->image_reps())); | 456 internal::ImageSkiaFromPNG(png_rep->image_reps())); |
633 break; | 457 break; |
634 } | 458 } |
635 #if defined(TOOLKIT_GTK) | 459 #if defined(OS_IOS) |
636 case kImageRepGdk: { | |
637 internal::ImageRepGdk* native_rep = | |
638 GetRepresentation(kImageRepGdk, true)->AsImageRepGdk(); | |
639 rep = new internal::ImageRepSkia(new ImageSkia( | |
640 internal::ImageSkiaFromGdkPixbuf(native_rep->pixbuf()))); | |
641 break; | |
642 } | |
643 #elif defined(OS_IOS) | |
644 case kImageRepCocoaTouch: { | 460 case kImageRepCocoaTouch: { |
645 internal::ImageRepCocoaTouch* native_rep = | 461 internal::ImageRepCocoaTouch* native_rep = |
646 GetRepresentation(kImageRepCocoaTouch, true) | 462 GetRepresentation(kImageRepCocoaTouch, true) |
647 ->AsImageRepCocoaTouch(); | 463 ->AsImageRepCocoaTouch(); |
648 rep = new internal::ImageRepSkia(new ImageSkia( | 464 rep = new internal::ImageRepSkia(new ImageSkia( |
649 ImageSkiaFromUIImage(native_rep->image()))); | 465 ImageSkiaFromUIImage(native_rep->image()))); |
650 break; | 466 break; |
651 } | 467 } |
652 #elif defined(OS_MACOSX) | 468 #elif defined(OS_MACOSX) |
653 case kImageRepCocoa: { | 469 case kImageRepCocoa: { |
654 internal::ImageRepCocoa* native_rep = | 470 internal::ImageRepCocoa* native_rep = |
655 GetRepresentation(kImageRepCocoa, true)->AsImageRepCocoa(); | 471 GetRepresentation(kImageRepCocoa, true)->AsImageRepCocoa(); |
656 rep = new internal::ImageRepSkia(new ImageSkia( | 472 rep = new internal::ImageRepSkia(new ImageSkia( |
657 ImageSkiaFromNSImage(native_rep->image()))); | 473 ImageSkiaFromNSImage(native_rep->image()))); |
658 break; | 474 break; |
659 } | 475 } |
660 #endif | 476 #endif |
661 default: | 477 default: |
662 NOTREACHED(); | 478 NOTREACHED(); |
663 } | 479 } |
664 CHECK(rep); | 480 CHECK(rep); |
665 AddRepresentation(rep); | 481 AddRepresentation(rep); |
666 } | 482 } |
667 return rep->AsImageRepSkia()->image(); | 483 return rep->AsImageRepSkia()->image(); |
668 } | 484 } |
669 | 485 |
670 #if defined(TOOLKIT_GTK) | |
671 GdkPixbuf* Image::ToGdkPixbuf() const { | |
672 internal::ImageRep* rep = GetRepresentation(kImageRepGdk, false); | |
673 if (!rep) { | |
674 switch (DefaultRepresentationType()) { | |
675 case kImageRepPNG: { | |
676 internal::ImageRepPNG* png_rep = | |
677 GetRepresentation(kImageRepPNG, true)->AsImageRepPNG(); | |
678 rep = new internal::ImageRepGdk(internal::GdkPixbufFromPNG( | |
679 png_rep->image_reps())); | |
680 break; | |
681 } | |
682 case kImageRepSkia: { | |
683 internal::ImageRepSkia* skia_rep = | |
684 GetRepresentation(kImageRepSkia, true)->AsImageRepSkia(); | |
685 rep = new internal::ImageRepGdk(gfx::GdkPixbufFromSkBitmap( | |
686 *skia_rep->image()->bitmap())); | |
687 break; | |
688 } | |
689 default: | |
690 NOTREACHED(); | |
691 } | |
692 CHECK(rep); | |
693 AddRepresentation(rep); | |
694 } | |
695 return rep->AsImageRepGdk()->pixbuf(); | |
696 } | |
697 | |
698 CairoCachedSurface* const Image::ToCairo() const { | |
699 internal::ImageRep* rep = GetRepresentation(kImageRepCairo, false); | |
700 if (!rep) { | |
701 // Handle any-to-Cairo conversion. This may create and cache an intermediate | |
702 // pixbuf before sending the data to the display server. | |
703 rep = new internal::ImageRepCairo(ToGdkPixbuf()); | |
704 CHECK(rep); | |
705 AddRepresentation(rep); | |
706 } | |
707 return rep->AsImageRepCairo()->surface(); | |
708 } | |
709 #endif | |
710 | |
711 #if defined(OS_IOS) | 486 #if defined(OS_IOS) |
712 UIImage* Image::ToUIImage() const { | 487 UIImage* Image::ToUIImage() const { |
713 internal::ImageRep* rep = GetRepresentation(kImageRepCocoaTouch, false); | 488 internal::ImageRep* rep = GetRepresentation(kImageRepCocoaTouch, false); |
714 if (!rep) { | 489 if (!rep) { |
715 switch (DefaultRepresentationType()) { | 490 switch (DefaultRepresentationType()) { |
716 case kImageRepPNG: { | 491 case kImageRepPNG: { |
717 internal::ImageRepPNG* png_rep = | 492 internal::ImageRepPNG* png_rep = |
718 GetRepresentation(kImageRepPNG, true)->AsImageRepPNG(); | 493 GetRepresentation(kImageRepPNG, true)->AsImageRepPNG(); |
719 rep = new internal::ImageRepCocoaTouch(internal::CreateUIImageFromPNG( | 494 rep = new internal::ImageRepCocoaTouch(internal::CreateUIImageFromPNG( |
720 png_rep->image_reps())); | 495 png_rep->image_reps())); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
781 rep->AsImageRepPNG()->image_reps(); | 556 rep->AsImageRepPNG()->image_reps(); |
782 for (size_t i = 0; i < image_png_reps.size(); ++i) { | 557 for (size_t i = 0; i < image_png_reps.size(); ++i) { |
783 if (image_png_reps[i].scale == 1.0f) | 558 if (image_png_reps[i].scale == 1.0f) |
784 return image_png_reps[i].raw_data; | 559 return image_png_reps[i].raw_data; |
785 } | 560 } |
786 return new base::RefCountedBytes(); | 561 return new base::RefCountedBytes(); |
787 } | 562 } |
788 | 563 |
789 scoped_refptr<base::RefCountedMemory> png_bytes(NULL); | 564 scoped_refptr<base::RefCountedMemory> png_bytes(NULL); |
790 switch (DefaultRepresentationType()) { | 565 switch (DefaultRepresentationType()) { |
791 #if defined(TOOLKIT_GTK) | 566 #if defined(OS_IOS) |
792 case kImageRepGdk: { | |
793 internal::ImageRepGdk* gdk_rep = | |
794 GetRepresentation(kImageRepGdk, true)->AsImageRepGdk(); | |
795 png_bytes = internal::Get1xPNGBytesFromPixbuf(gdk_rep->pixbuf()); | |
796 break; | |
797 } | |
798 #elif defined(OS_IOS) | |
799 case kImageRepCocoaTouch: { | 567 case kImageRepCocoaTouch: { |
800 internal::ImageRepCocoaTouch* cocoa_touch_rep = | 568 internal::ImageRepCocoaTouch* cocoa_touch_rep = |
801 GetRepresentation(kImageRepCocoaTouch, true) | 569 GetRepresentation(kImageRepCocoaTouch, true) |
802 ->AsImageRepCocoaTouch(); | 570 ->AsImageRepCocoaTouch(); |
803 png_bytes = internal::Get1xPNGBytesFromUIImage( | 571 png_bytes = internal::Get1xPNGBytesFromUIImage( |
804 cocoa_touch_rep->image()); | 572 cocoa_touch_rep->image()); |
805 break; | 573 break; |
806 } | 574 } |
807 #elif defined(OS_MACOSX) | 575 #elif defined(OS_MACOSX) |
808 case kImageRepCocoa: { | 576 case kImageRepCocoa: { |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
863 } | 631 } |
864 | 632 |
865 ImageSkia* Image::CopyImageSkia() const { | 633 ImageSkia* Image::CopyImageSkia() const { |
866 return new ImageSkia(*ToImageSkia()); | 634 return new ImageSkia(*ToImageSkia()); |
867 } | 635 } |
868 | 636 |
869 SkBitmap* Image::CopySkBitmap() const { | 637 SkBitmap* Image::CopySkBitmap() const { |
870 return new SkBitmap(*ToSkBitmap()); | 638 return new SkBitmap(*ToSkBitmap()); |
871 } | 639 } |
872 | 640 |
873 #if defined(TOOLKIT_GTK) | |
874 GdkPixbuf* Image::CopyGdkPixbuf() const { | |
875 GdkPixbuf* pixbuf = ToGdkPixbuf(); | |
876 g_object_ref(pixbuf); | |
877 return pixbuf; | |
878 } | |
879 #endif | |
880 | |
881 #if defined(OS_IOS) | 641 #if defined(OS_IOS) |
882 UIImage* Image::CopyUIImage() const { | 642 UIImage* Image::CopyUIImage() const { |
883 UIImage* image = ToUIImage(); | 643 UIImage* image = ToUIImage(); |
884 base::mac::NSObjectRetain(image); | 644 base::mac::NSObjectRetain(image); |
885 return image; | 645 return image; |
886 } | 646 } |
887 #elif defined(OS_MACOSX) | 647 #elif defined(OS_MACOSX) |
888 NSImage* Image::CopyNSImage() const { | 648 NSImage* Image::CopyNSImage() const { |
889 NSImage* image = ToNSImage(); | 649 NSImage* image = ToNSImage(); |
890 base::mac::NSObjectRetain(image); | 650 base::mac::NSObjectRetain(image); |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
955 } | 715 } |
956 return it->second; | 716 return it->second; |
957 } | 717 } |
958 | 718 |
959 void Image::AddRepresentation(internal::ImageRep* rep) const { | 719 void Image::AddRepresentation(internal::ImageRep* rep) const { |
960 CHECK(storage_.get()); | 720 CHECK(storage_.get()); |
961 storage_->representations().insert(std::make_pair(rep->type(), rep)); | 721 storage_->representations().insert(std::make_pair(rep->type(), rep)); |
962 } | 722 } |
963 | 723 |
964 } // namespace gfx | 724 } // namespace gfx |
OLD | NEW |