| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 // An Image wraps an image any flavor, be it platform-native GdkBitmap/NSImage, | |
| 6 // or a SkBitmap. This also provides easy conversion to other image types | |
| 7 // through operator overloading. It will cache the converted representations | |
| 8 // internally to prevent double-conversion. | |
| 9 // | |
| 10 // The lifetime of both the initial representation and any converted ones are | |
| 11 // tied to the lifetime of the Image's internal storage. To allow Images to be | |
| 12 // cheaply passed around by value, the actual image data is stored in a ref- | |
| 13 // counted member. When all Images referencing this storage are deleted, the | |
| 14 // actual representations are deleted, too. | |
| 15 // | |
| 16 // Images can be empty, in which case they have no backing representation. | |
| 17 // Attempting to use an empty Image will result in a crash. | |
| 18 | |
| 19 #ifndef UI_GFX_IMAGE_IMAGE_H_ | |
| 20 #define UI_GFX_IMAGE_IMAGE_H_ | |
| 21 | |
| 22 #include <map> | |
| 23 #include <vector> | |
| 24 | |
| 25 #include "base/basictypes.h" | |
| 26 #include "base/gtest_prod_util.h" | |
| 27 #include "base/memory/ref_counted_memory.h" | |
| 28 #include "ui/gfx/gfx_export.h" | |
| 29 #include "ui/gfx/native_widget_types.h" | |
| 30 | |
| 31 #if defined(OS_MACOSX) && !defined(OS_IOS) | |
| 32 typedef struct CGColorSpace* CGColorSpaceRef; | |
| 33 #endif | |
| 34 | |
| 35 class SkBitmap; | |
| 36 | |
| 37 namespace { | |
| 38 class ImageTest; | |
| 39 class ImageMacTest; | |
| 40 } | |
| 41 | |
| 42 namespace gfx { | |
| 43 struct ImagePNGRep; | |
| 44 class ImageSkia; | |
| 45 class Size; | |
| 46 | |
| 47 namespace internal { | |
| 48 class ImageRep; | |
| 49 class ImageStorage; | |
| 50 } | |
| 51 | |
| 52 class GFX_EXPORT Image { | |
| 53 public: | |
| 54 enum RepresentationType { | |
| 55 kImageRepCocoa, | |
| 56 kImageRepCocoaTouch, | |
| 57 kImageRepSkia, | |
| 58 kImageRepPNG, | |
| 59 }; | |
| 60 | |
| 61 typedef std::map<RepresentationType, internal::ImageRep*> RepresentationMap; | |
| 62 | |
| 63 // Creates an empty image with no representations. | |
| 64 Image(); | |
| 65 | |
| 66 // Creates a new image by copying the raw PNG-encoded input for use as the | |
| 67 // default representation. | |
| 68 explicit Image(const std::vector<ImagePNGRep>& image_reps); | |
| 69 | |
| 70 // Creates a new image by copying the ImageSkia for use as the default | |
| 71 // representation. | |
| 72 explicit Image(const ImageSkia& image); | |
| 73 | |
| 74 #if defined(OS_IOS) | |
| 75 // Does not retain |image|; expects to take ownership. | |
| 76 explicit Image(UIImage* image); | |
| 77 #elif defined(OS_MACOSX) | |
| 78 // Does not retain |image|; expects to take ownership. | |
| 79 // A single NSImage object can contain multiple bitmaps so there's no reason | |
| 80 // to pass a vector of these. | |
| 81 explicit Image(NSImage* image); | |
| 82 #endif | |
| 83 | |
| 84 // Initializes a new Image by AddRef()ing |other|'s internal storage. | |
| 85 Image(const Image& other); | |
| 86 | |
| 87 // Copies a reference to |other|'s storage. | |
| 88 Image& operator=(const Image& other); | |
| 89 | |
| 90 // Deletes the image and, if the only owner of the storage, all of its cached | |
| 91 // representations. | |
| 92 ~Image(); | |
| 93 | |
| 94 // Creates an image from the passed in 1x bitmap. | |
| 95 // WARNING: The resulting image will be pixelated when painted on a high | |
| 96 // density display. | |
| 97 static Image CreateFrom1xBitmap(const SkBitmap& bitmap); | |
| 98 | |
| 99 // Creates an image from the PNG encoded input. | |
| 100 // For example (from an std::vector): | |
| 101 // std::vector<unsigned char> png = ...; | |
| 102 // gfx::Image image = | |
| 103 // Image::CreateFrom1xPNGBytes(&png.front(), png.size()); | |
| 104 static Image CreateFrom1xPNGBytes(const unsigned char* input, | |
| 105 size_t input_size); | |
| 106 | |
| 107 // Creates an image from the PNG encoded input. | |
| 108 static Image CreateFrom1xPNGBytes( | |
| 109 const scoped_refptr<base::RefCountedMemory>& input); | |
| 110 | |
| 111 // Converts the Image to the desired representation and stores it internally. | |
| 112 // The returned result is a weak pointer owned by and scoped to the life of | |
| 113 // the Image. Must only be called if IsEmpty() is false. | |
| 114 const SkBitmap* ToSkBitmap() const; | |
| 115 const ImageSkia* ToImageSkia() const; | |
| 116 #if defined(OS_IOS) | |
| 117 UIImage* ToUIImage() const; | |
| 118 #elif defined(OS_MACOSX) | |
| 119 NSImage* ToNSImage() const; | |
| 120 #endif | |
| 121 | |
| 122 // Returns the raw PNG-encoded data for the bitmap at 1x. If the data is | |
| 123 // unavailable, either because the image has no data for 1x or because it is | |
| 124 // empty, an empty RefCountedBytes object is returned. NULL is never | |
| 125 // returned. | |
| 126 scoped_refptr<base::RefCountedMemory> As1xPNGBytes() const; | |
| 127 | |
| 128 // Same as ToSkBitmap(), but returns a null SkBitmap if this image is empty. | |
| 129 SkBitmap AsBitmap() const; | |
| 130 | |
| 131 // Same as ToImageSkia(), but returns an empty ImageSkia if this | |
| 132 // image is empty. | |
| 133 ImageSkia AsImageSkia() const; | |
| 134 | |
| 135 #if defined(OS_MACOSX) && !defined(OS_IOS) | |
| 136 // Same as ToSkBitmap(), but returns nil if this image is empty. | |
| 137 NSImage* AsNSImage() const; | |
| 138 #endif | |
| 139 | |
| 140 // Performs a conversion, like above, but returns a copy of the result rather | |
| 141 // than a weak pointer. The caller is responsible for deleting the result. | |
| 142 // Note that the result is only a copy in terms of memory management; the | |
| 143 // backing pixels are shared amongst all copies (a fact of each of the | |
| 144 // converted representations, rather than a limitation imposed by Image) and | |
| 145 // so the result should be considered immutable. | |
| 146 scoped_refptr<base::RefCountedMemory> Copy1xPNGBytes() const; | |
| 147 ImageSkia* CopyImageSkia() const; | |
| 148 SkBitmap* CopySkBitmap() const; | |
| 149 #if defined(OS_IOS) | |
| 150 UIImage* CopyUIImage() const; | |
| 151 #elif defined(OS_MACOSX) | |
| 152 NSImage* CopyNSImage() const; | |
| 153 #endif | |
| 154 | |
| 155 // Inspects the representations map to see if the given type exists. | |
| 156 bool HasRepresentation(RepresentationType type) const; | |
| 157 | |
| 158 // Returns the number of representations. | |
| 159 size_t RepresentationCount() const; | |
| 160 | |
| 161 // Returns true if this Image has no representations. | |
| 162 bool IsEmpty() const; | |
| 163 | |
| 164 // Width and height of image in DIP coordinate system. | |
| 165 int Width() const; | |
| 166 int Height() const; | |
| 167 gfx::Size Size() const; | |
| 168 | |
| 169 // Swaps this image's internal representations with |other|. | |
| 170 void SwapRepresentations(gfx::Image* other); | |
| 171 | |
| 172 #if defined(OS_MACOSX) && !defined(OS_IOS) | |
| 173 // Set the default representation's color space. This is used for converting | |
| 174 // to NSImage. This is used to compensate for PNGCodec not writing or reading | |
| 175 // colorspace ancillary chunks. (sRGB, iCCP). | |
| 176 void SetSourceColorSpace(CGColorSpaceRef color_space); | |
| 177 #endif // defined(OS_MACOSX) && !defined(OS_IOS) | |
| 178 | |
| 179 private: | |
| 180 // Returns the type of the default representation. | |
| 181 RepresentationType DefaultRepresentationType() const; | |
| 182 | |
| 183 // Returns the ImageRep of the appropriate type or NULL if there is no | |
| 184 // representation of that type (and must_exist is false). | |
| 185 internal::ImageRep* GetRepresentation( | |
| 186 RepresentationType rep_type, bool must_exist) const; | |
| 187 | |
| 188 // Stores a representation into the map. | |
| 189 void AddRepresentation(internal::ImageRep* rep) const; | |
| 190 | |
| 191 // Internal class that holds all the representations. This allows the Image to | |
| 192 // be cheaply copied. | |
| 193 scoped_refptr<internal::ImageStorage> storage_; | |
| 194 | |
| 195 friend class ::ImageTest; | |
| 196 friend class ::ImageMacTest; | |
| 197 }; | |
| 198 | |
| 199 } // namespace gfx | |
| 200 | |
| 201 #endif // UI_GFX_IMAGE_IMAGE_H_ | |
| OLD | NEW |