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 #ifndef UI_GFX_IMAGE_IMAGE_SKIA_H_ | |
6 #define UI_GFX_IMAGE_IMAGE_SKIA_H_ | |
7 | |
8 #include <vector> | |
9 | |
10 #include "base/basictypes.h" | |
11 #include "base/gtest_prod_util.h" | |
12 #include "base/memory/ref_counted.h" | |
13 #include "base/memory/scoped_ptr.h" | |
14 #include "ui/gfx/gfx_export.h" | |
15 #include "ui/gfx/image/image_skia_rep.h" | |
16 | |
17 namespace gfx { | |
18 class ImageSkiaSource; | |
19 class Size; | |
20 | |
21 namespace internal { | |
22 class ImageSkiaStorage; | |
23 } // namespace internal | |
24 | |
25 namespace test { | |
26 class TestOnThread; | |
27 } | |
28 | |
29 // Container for the same image at different densities, similar to NSImage. | |
30 // Image height and width are in DIP (Density Indepent Pixel) coordinates. | |
31 // | |
32 // ImageSkia should be used whenever possible instead of SkBitmap. | |
33 // Functions that mutate the image should operate on the gfx::ImageSkiaRep | |
34 // returned from ImageSkia::GetRepresentation, not on ImageSkia. | |
35 // | |
36 // ImageSkia is cheap to copy and intentionally supports copy semantics. | |
37 class GFX_EXPORT ImageSkia { | |
38 public: | |
39 typedef std::vector<ImageSkiaRep> ImageSkiaReps; | |
40 | |
41 // Creates an instance with no bitmaps. | |
42 ImageSkia(); | |
43 | |
44 // Creates an instance that will use the |source| to get the image | |
45 // for scale factors. |size| specifes the size of the image in DIP. | |
46 // ImageSkia owns |source|. | |
47 ImageSkia(ImageSkiaSource* source, const gfx::Size& size); | |
48 | |
49 // Creates an instance that uses the |source|. The constructor loads the image | |
50 // at |scale| and uses its dimensions to calculate the size in DIP. ImageSkia | |
51 // owns |source|. | |
52 ImageSkia(ImageSkiaSource* source, float scale); | |
53 | |
54 explicit ImageSkia(const gfx::ImageSkiaRep& image_rep); | |
55 | |
56 // Copies a reference to |other|'s storage. | |
57 ImageSkia(const ImageSkia& other); | |
58 | |
59 // Copies a reference to |other|'s storage. | |
60 ImageSkia& operator=(const ImageSkia& other); | |
61 | |
62 ~ImageSkia(); | |
63 | |
64 // Changes the value of GetSupportedScales() to |scales|. | |
65 static void SetSupportedScales(const std::vector<float>& scales); | |
66 | |
67 // Returns a vector with the scale factors which are supported by this | |
68 // platform, in ascending order. | |
69 static const std::vector<float>& GetSupportedScales(); | |
70 | |
71 // Returns the maximum scale supported by this platform. | |
72 static float GetMaxSupportedScale(); | |
73 | |
74 // Creates an image from the passed in bitmap. | |
75 // DIP width and height are based on scale factor of 1x. | |
76 // Adds ref to passed in bitmap. | |
77 // WARNING: The resulting image will be pixelated when painted on a high | |
78 // density display. | |
79 static ImageSkia CreateFrom1xBitmap(const SkBitmap& bitmap); | |
80 | |
81 // Returns a deep copy of this ImageSkia which has its own storage with | |
82 // the ImageSkiaRep instances that this ImageSkia currently has. | |
83 // This can be safely passed to and manipulated by another thread. | |
84 // Note that this does NOT generate ImageSkiaReps from its source. | |
85 // If you want to create a deep copy with ImageSkiaReps for supported | |
86 // scale factors, you need to explicitly call | |
87 // |EnsureRepsForSupportedScales()| first. | |
88 scoped_ptr<ImageSkia> DeepCopy() const; | |
89 | |
90 // Returns true if this object is backed by the same ImageSkiaStorage as | |
91 // |other|. Will also return true if both images are isNull(). | |
92 bool BackedBySameObjectAs(const gfx::ImageSkia& other) const; | |
93 | |
94 // Adds |image_rep| to the image reps contained by this object. | |
95 void AddRepresentation(const gfx::ImageSkiaRep& image_rep); | |
96 | |
97 // Removes the image rep of |scale| if present. | |
98 void RemoveRepresentation(float scale); | |
99 | |
100 // Returns true if the object owns an image rep whose density matches | |
101 // |scale| exactly. | |
102 bool HasRepresentation(float scale) const; | |
103 | |
104 // Returns the image rep whose density best matches |scale|. | |
105 // Returns a null image rep if the object contains no image reps. | |
106 const gfx::ImageSkiaRep& GetRepresentation(float scale) const; | |
107 | |
108 // Make the ImageSkia instance read-only. Note that this only prevent | |
109 // modification from client code, and the storage may still be | |
110 // modified by the source if any (thus, it's not thread safe). This | |
111 // detaches the storage from currently accessing thread, so its safe | |
112 // to pass it to other thread as long as it is accessed only by that | |
113 // thread. If this ImageSkia's storage will be accessed by multiple | |
114 // threads, use |MakeThreadSafe()| method. | |
115 void SetReadOnly(); | |
116 | |
117 // Make the image thread safe by making the storage read only and remove | |
118 // its source if any. All ImageSkia that shares the same storage will also | |
119 // become thread safe. Note that in order to make it 100% thread safe, | |
120 // this must be called before it's been passed to anther thread. | |
121 void MakeThreadSafe(); | |
122 bool IsThreadSafe() const; | |
123 | |
124 // Returns true if this is a null object. | |
125 bool isNull() const { return storage_.get() == NULL; } | |
126 | |
127 // Width and height of image in DIP coordinate system. | |
128 int width() const; | |
129 int height() const; | |
130 gfx::Size size() const; | |
131 | |
132 // Returns pointer to 1x bitmap contained by this object. If there is no 1x | |
133 // bitmap, the bitmap whose scale factor is closest to 1x is returned. | |
134 // This function should only be used in unittests and on platforms which do | |
135 // not support scale factors other than 1x. | |
136 // TODO(pkotwicz): Return null SkBitmap when the object has no 1x bitmap. | |
137 const SkBitmap* bitmap() const { return &GetBitmap(); } | |
138 | |
139 // Returns a vector with the image reps contained in this object. | |
140 // There is no guarantee that this will return all images rep for | |
141 // supported scale factors. | |
142 std::vector<gfx::ImageSkiaRep> image_reps() const; | |
143 | |
144 // When the source is available, generates all ImageReps for | |
145 // supported scale factors. This method is defined as const as | |
146 // the state change in the storage is agnostic to the caller. | |
147 void EnsureRepsForSupportedScales() const; | |
148 | |
149 private: | |
150 friend class test::TestOnThread; | |
151 FRIEND_TEST_ALL_PREFIXES(ImageSkiaTest, EmptyOnThreadTest); | |
152 FRIEND_TEST_ALL_PREFIXES(ImageSkiaTest, StaticOnThreadTest); | |
153 FRIEND_TEST_ALL_PREFIXES(ImageSkiaTest, SourceOnThreadTest); | |
154 | |
155 // Initialize ImageSkiaStorage with passed in parameters. | |
156 // If the image rep's bitmap is empty, ImageStorage is set to NULL. | |
157 void Init(const gfx::ImageSkiaRep& image_rep); | |
158 | |
159 SkBitmap& GetBitmap() const; | |
160 | |
161 // Checks if the current thread can read/modify the ImageSkia. | |
162 bool CanRead() const; | |
163 bool CanModify() const; | |
164 | |
165 // Detach the storage from the currently assinged thread | |
166 // so that other thread can access the storage. | |
167 void DetachStorageFromThread(); | |
168 | |
169 // A refptr so that ImageRepSkia can be copied cheaply. | |
170 scoped_refptr<internal::ImageSkiaStorage> storage_; | |
171 }; | |
172 | |
173 } // namespace gfx | |
174 | |
175 #endif // UI_GFX_IMAGE_IMAGE_SKIA_H_ | |
OLD | NEW |