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

Side by Side Diff: ui/gfx/image/image.cc

Issue 16370006: Make the favicons look visually the same after refreshing (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 6 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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"
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 scoped_refptr<base::RefCountedMemory> Get1xPNGBytesFromUIImage( 117 scoped_refptr<base::RefCountedMemory> Get1xPNGBytesFromUIImage(
118 UIImage* uiimage); 118 UIImage* uiimage);
119 // Caller takes ownership of the returned UIImage. 119 // Caller takes ownership of the returned UIImage.
120 UIImage* CreateUIImageFromPNG( 120 UIImage* CreateUIImageFromPNG(
121 const std::vector<gfx::ImagePNGRep>& image_png_reps); 121 const std::vector<gfx::ImagePNGRep>& image_png_reps);
122 gfx::Size UIImageSize(UIImage* image); 122 gfx::Size UIImageSize(UIImage* image);
123 #elif defined(OS_MACOSX) 123 #elif defined(OS_MACOSX)
124 scoped_refptr<base::RefCountedMemory> Get1xPNGBytesFromNSImage( 124 scoped_refptr<base::RefCountedMemory> Get1xPNGBytesFromNSImage(
125 NSImage* nsimage); 125 NSImage* nsimage);
126 // Caller takes ownership of the returned NSImage. 126 // Caller takes ownership of the returned NSImage.
127 NSImage* NSImageFromPNG(const std::vector<gfx::ImagePNGRep>& image_png_reps); 127 NSImage* NSImageFromPNG(const std::vector<gfx::ImagePNGRep>& image_png_reps,
128 CGColorSpaceRef color_space);
128 gfx::Size NSImageSize(NSImage* image); 129 gfx::Size NSImageSize(NSImage* image);
129 #endif // defined(OS_MACOSX) 130 #endif // defined(OS_MACOSX)
130 131
131 #if defined(OS_IOS) 132 #if defined(OS_IOS)
132 ImageSkia* ImageSkiaFromPNG( 133 ImageSkia* ImageSkiaFromPNG(
133 const std::vector<gfx::ImagePNGRep>& image_png_reps); 134 const std::vector<gfx::ImagePNGRep>& image_png_reps);
134 scoped_refptr<base::RefCountedMemory> Get1xPNGBytesFromImageSkia( 135 scoped_refptr<base::RefCountedMemory> Get1xPNGBytesFromImageSkia(
135 const ImageSkia* skia); 136 const ImageSkia* skia);
136 #else 137 #else
137 // Returns a 16x16 red image to visually show error in decoding PNG. 138 // Returns a 16x16 red image to visually show error in decoding PNG.
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after
465 }; 466 };
466 #endif // defined(OS_MACOSX) 467 #endif // defined(OS_MACOSX)
467 468
468 // The Storage class acts similarly to the pixels in a SkBitmap: the Image 469 // The Storage class acts similarly to the pixels in a SkBitmap: the Image
469 // class holds a refptr instance of Storage, which in turn holds all the 470 // class holds a refptr instance of Storage, which in turn holds all the
470 // ImageReps. This way, the Image can be cheaply copied. 471 // ImageReps. This way, the Image can be cheaply copied.
471 class ImageStorage : public base::RefCounted<ImageStorage> { 472 class ImageStorage : public base::RefCounted<ImageStorage> {
472 public: 473 public:
473 ImageStorage(gfx::Image::RepresentationType default_type) 474 ImageStorage(gfx::Image::RepresentationType default_type)
474 : default_representation_type_(default_type), 475 : default_representation_type_(default_type),
476 #if defined(OS_MACOSX)
477 default_representation_color_space_(
478 base::mac::GetGenericRGBColorSpace()),
479 #endif // OS_MACOSX
475 representations_deleter_(&representations_) { 480 representations_deleter_(&representations_) {
476 } 481 }
477 482
478 gfx::Image::RepresentationType default_representation_type() { 483 gfx::Image::RepresentationType default_representation_type() {
479 return default_representation_type_; 484 return default_representation_type_;
480 } 485 }
481 gfx::Image::RepresentationMap& representations() { return representations_; } 486 gfx::Image::RepresentationMap& representations() { return representations_; }
482 487
488 #if defined(OS_MACOSX)
489 void set_default_representation_color_space(CGColorSpaceRef color_space) {
490 default_representation_color_space_ = color_space;
491 }
492 CGColorSpaceRef default_representation_color_space() {
493 return default_representation_color_space_;
494 }
495 #endif // OS_MACOSX
496
483 private: 497 private:
484 friend class base::RefCounted<ImageStorage>; 498 friend class base::RefCounted<ImageStorage>;
485 499
486 ~ImageStorage() {} 500 ~ImageStorage() {}
487 501
488 // The type of image that was passed to the constructor. This key will always 502 // The type of image that was passed to the constructor. This key will always
489 // exist in the |representations_| map. 503 // exist in the |representations_| map.
490 gfx::Image::RepresentationType default_representation_type_; 504 gfx::Image::RepresentationType default_representation_type_;
491 505
506 #if defined(OS_MACOSX)
507 // The default representation's colorspace. This is used for converting to
508 // NSImage. This field exists to compensate for PNGCodec not writing or
509 // reading colorspace ancillary chunks. (sRGB, iCCP).
510 // Not owned.
511 CGColorSpaceRef default_representation_color_space_;
512 #endif // OS_MACOSX
513
492 // All the representations of an Image. Size will always be at least one, with 514 // All the representations of an Image. Size will always be at least one, with
493 // more for any converted representations. 515 // more for any converted representations.
494 gfx::Image::RepresentationMap representations_; 516 gfx::Image::RepresentationMap representations_;
495 517
496 STLValueDeleter<Image::RepresentationMap> representations_deleter_; 518 STLValueDeleter<Image::RepresentationMap> representations_deleter_;
497 519
498 DISALLOW_COPY_AND_ASSIGN(ImageStorage); 520 DISALLOW_COPY_AND_ASSIGN(ImageStorage);
499 }; 521 };
500 522
501 } // namespace internal 523 } // namespace internal
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
703 } 725 }
704 CHECK(rep); 726 CHECK(rep);
705 AddRepresentation(rep); 727 AddRepresentation(rep);
706 } 728 }
707 return rep->AsImageRepCocoaTouch()->image(); 729 return rep->AsImageRepCocoaTouch()->image();
708 } 730 }
709 #elif defined(OS_MACOSX) 731 #elif defined(OS_MACOSX)
710 NSImage* Image::ToNSImage() const { 732 NSImage* Image::ToNSImage() const {
711 internal::ImageRep* rep = GetRepresentation(kImageRepCocoa, false); 733 internal::ImageRep* rep = GetRepresentation(kImageRepCocoa, false);
712 if (!rep) { 734 if (!rep) {
735 CGColorSpaceRef default_representation_color_space =
736 storage_->default_representation_color_space();
737
713 switch (DefaultRepresentationType()) { 738 switch (DefaultRepresentationType()) {
714 case kImageRepPNG: { 739 case kImageRepPNG: {
715 internal::ImageRepPNG* png_rep = 740 internal::ImageRepPNG* png_rep =
716 GetRepresentation(kImageRepPNG, true)->AsImageRepPNG(); 741 GetRepresentation(kImageRepPNG, true)->AsImageRepPNG();
717 rep = new internal::ImageRepCocoa(internal::NSImageFromPNG( 742 rep = new internal::ImageRepCocoa(internal::NSImageFromPNG(
718 png_rep->image_reps())); 743 png_rep->image_reps(), default_representation_color_space));
719 break; 744 break;
720 } 745 }
721 case kImageRepSkia: { 746 case kImageRepSkia: {
722 internal::ImageRepSkia* skia_rep = 747 internal::ImageRepSkia* skia_rep =
723 GetRepresentation(kImageRepSkia, true)->AsImageRepSkia(); 748 GetRepresentation(kImageRepSkia, true)->AsImageRepSkia();
724 NSImage* image = NSImageFromImageSkia(*skia_rep->image()); 749 NSImage* image = NSImageFromImageSkiaWithColorSpace(*skia_rep->image(),
750 default_representation_color_space);
725 base::mac::NSObjectRetain(image); 751 base::mac::NSObjectRetain(image);
726 rep = new internal::ImageRepCocoa(image); 752 rep = new internal::ImageRepCocoa(image);
727 break; 753 break;
728 } 754 }
729 default: 755 default:
730 NOTREACHED(); 756 NOTREACHED();
731 } 757 }
732 CHECK(rep); 758 CHECK(rep);
733 AddRepresentation(rep); 759 AddRepresentation(rep);
734 } 760 }
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
889 gfx::Size Image::Size() const { 915 gfx::Size Image::Size() const {
890 if (IsEmpty()) 916 if (IsEmpty())
891 return gfx::Size(); 917 return gfx::Size();
892 return GetRepresentation(DefaultRepresentationType(), true)->Size(); 918 return GetRepresentation(DefaultRepresentationType(), true)->Size();
893 } 919 }
894 920
895 void Image::SwapRepresentations(gfx::Image* other) { 921 void Image::SwapRepresentations(gfx::Image* other) {
896 storage_.swap(other->storage_); 922 storage_.swap(other->storage_);
897 } 923 }
898 924
925 #if defined(OS_MACOSX)
926 void Image::SetSourceColorSpace(CGColorSpaceRef color_space) {
927 if (storage_.get())
928 storage_->set_default_representation_color_space(color_space);
929 }
930 #endif // OS_MACOSX
931
899 Image::RepresentationType Image::DefaultRepresentationType() const { 932 Image::RepresentationType Image::DefaultRepresentationType() const {
900 CHECK(storage_.get()); 933 CHECK(storage_.get());
901 RepresentationType default_type = storage_->default_representation_type(); 934 RepresentationType default_type = storage_->default_representation_type();
902 // The conversions above assume that the default representation type is never 935 // The conversions above assume that the default representation type is never
903 // kImageRepCairo. 936 // kImageRepCairo.
904 DCHECK_NE(default_type, kImageRepCairo); 937 DCHECK_NE(default_type, kImageRepCairo);
905 return default_type; 938 return default_type;
906 } 939 }
907 940
908 internal::ImageRep* Image::GetRepresentation( 941 internal::ImageRep* Image::GetRepresentation(
909 RepresentationType rep_type, bool must_exist) const { 942 RepresentationType rep_type, bool must_exist) const {
910 CHECK(storage_.get()); 943 CHECK(storage_.get());
911 RepresentationMap::iterator it = storage_->representations().find(rep_type); 944 RepresentationMap::iterator it = storage_->representations().find(rep_type);
912 if (it == storage_->representations().end()) { 945 if (it == storage_->representations().end()) {
913 CHECK(!must_exist); 946 CHECK(!must_exist);
914 return NULL; 947 return NULL;
915 } 948 }
916 return it->second; 949 return it->second;
917 } 950 }
918 951
919 void Image::AddRepresentation(internal::ImageRep* rep) const { 952 void Image::AddRepresentation(internal::ImageRep* rep) const {
920 CHECK(storage_.get()); 953 CHECK(storage_.get());
921 storage_->representations().insert(std::make_pair(rep->type(), rep)); 954 storage_->representations().insert(std::make_pair(rep->type(), rep));
922 } 955 }
923 956
924 } // namespace gfx 957 } // namespace gfx
OLDNEW
« no previous file with comments | « ui/gfx/image/image.h ('k') | ui/gfx/image/image_mac.mm » ('j') | ui/gfx/image/image_mac.mm » ('J')

Powered by Google App Engine
This is Rietveld 408576698