| 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 |