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

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

Issue 10780010: Introduces ImageSkia::GetRepresentations() for Mac (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 5 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_skia.h" 5 #include "ui/gfx/image/image_skia.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cmath> 8 #include <cmath>
9 #include <limits> 9 #include <limits>
10 10
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
46 // A helper class such that ImageSkia can be cheaply copied. ImageSkia holds a 46 // A helper class such that ImageSkia can be cheaply copied. ImageSkia holds a
47 // refptr instance of ImageSkiaStorage, which in turn holds all of ImageSkia's 47 // refptr instance of ImageSkiaStorage, which in turn holds all of ImageSkia's
48 // information. 48 // information.
49 class ImageSkiaStorage : public base::RefCounted<ImageSkiaStorage> { 49 class ImageSkiaStorage : public base::RefCounted<ImageSkiaStorage> {
50 public: 50 public:
51 ImageSkiaStorage(ImageSkiaSource* source, const gfx::Size& size) 51 ImageSkiaStorage(ImageSkiaSource* source, const gfx::Size& size)
52 : source_(source), 52 : source_(source),
53 size_(size) { 53 size_(size) {
54 } 54 }
55 55
56 bool has_source() const { return source_.get() != NULL; }
57
56 std::vector<gfx::ImageSkiaRep>& image_reps() { return image_reps_; } 58 std::vector<gfx::ImageSkiaRep>& image_reps() { return image_reps_; }
57 59
58 const gfx::Size& size() const { return size_; } 60 const gfx::Size& size() const { return size_; }
59 61
60 // Returns the iterator of the image rep whose density best matches 62 // Returns the iterator of the image rep whose density best matches
61 // |scale_factor|. If the image for the |scale_factor| doesn't exist 63 // |scale_factor|. If the image for the |scale_factor| doesn't exist
62 // in the storage and |storage| is set, it fetches new image by calling 64 // in the storage and |storage| is set, it fetches new image by calling
63 // |ImageSkiaSource::GetImageForScale|. If the source returns the 65 // |ImageSkiaSource::GetImageForScale|. If the source returns the
64 // image with different scale factor (if the image doesn't exist in 66 // image with different scale factor (if the image doesn't exist in
65 // resource, for example), it will fallback to closest image rep. 67 // resource, for example), it will fallback to closest image rep.
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 if (isNull()) 186 if (isNull())
185 return; 187 return;
186 188
187 ImageSkiaReps& image_reps = storage_->image_reps(); 189 ImageSkiaReps& image_reps = storage_->image_reps();
188 ImageSkiaReps::iterator it = 190 ImageSkiaReps::iterator it =
189 storage_->FindRepresentation(scale_factor, false); 191 storage_->FindRepresentation(scale_factor, false);
190 if (it != image_reps.end() && it->scale_factor() == scale_factor) 192 if (it != image_reps.end() && it->scale_factor() == scale_factor)
191 image_reps.erase(it); 193 image_reps.erase(it);
192 } 194 }
193 195
194 bool ImageSkia::HasRepresentation(ui::ScaleFactor scale_factor) { 196 bool ImageSkia::HasRepresentation(ui::ScaleFactor scale_factor) const {
195 if (isNull()) 197 if (isNull())
196 return false; 198 return false;
197 199
198 ImageSkiaReps::iterator it = 200 ImageSkiaReps::iterator it =
199 storage_->FindRepresentation(scale_factor, false); 201 storage_->FindRepresentation(scale_factor, false);
200 return (it != storage_->image_reps().end() && 202 return (it != storage_->image_reps().end() &&
201 it->scale_factor() == scale_factor); 203 it->scale_factor() == scale_factor);
202 } 204 }
203 205
204 const ImageSkiaRep& ImageSkia::GetRepresentation( 206 const ImageSkiaRep& ImageSkia::GetRepresentation(
205 ui::ScaleFactor scale_factor) const { 207 ui::ScaleFactor scale_factor) const {
206 if (isNull()) 208 if (isNull())
207 return NullImageRep(); 209 return NullImageRep();
208 210
209 ImageSkiaReps::iterator it = storage_->FindRepresentation(scale_factor, true); 211 ImageSkiaReps::iterator it = storage_->FindRepresentation(scale_factor, true);
210 if (it == storage_->image_reps().end()) 212 if (it == storage_->image_reps().end())
211 return NullImageRep(); 213 return NullImageRep();
212 214
213 return *it; 215 return *it;
214 } 216 }
215 217
218 std::vector<ImageSkiaRep> ImageSkia::GetRepresentations() const {
219 if (isNull())
220 return std::vector<ImageSkiaRep>();
221
222 if (!storage_->has_source())
223 return image_reps();
224
225 // Attempt to generate image reps for as many scale factors supported by
226 // this platform as possible.
227 // Do not build return array here because the mapping from scale factor to
228 // image rep is one to many in some cases.
229 std::vector<ui::ScaleFactor> supported_scale_factors =
230 ui::GetSupportedScaleFactors();
231 for (size_t i = 0; i < supported_scale_factors.size(); ++i) {
232 storage_->FindRepresentation(supported_scale_factors[i], true);
233 }
234
235 ImageSkiaReps internal_image_reps = storage_->image_reps();
236 // Create list of image reps to return, skipping null image reps which were
237 // added for caching purposes only.
238 ImageSkiaReps image_reps;
239 for (ImageSkiaReps::iterator it = internal_image_reps.begin();
240 it != internal_image_reps.end(); ++it) {
241 if (!it->is_null())
242 image_reps.push_back(*it);
243 }
244
245 return image_reps;
246 }
247
216 bool ImageSkia::empty() const { 248 bool ImageSkia::empty() const {
217 return isNull() || storage_->size().IsEmpty(); 249 return isNull() || storage_->size().IsEmpty();
218 } 250 }
219 251
220 int ImageSkia::width() const { 252 int ImageSkia::width() const {
221 return isNull() ? 0 : storage_->size().width(); 253 return isNull() ? 0 : storage_->size().width();
222 } 254 }
223 255
224 gfx::Size ImageSkia::size() const { 256 gfx::Size ImageSkia::size() const {
225 return gfx::Size(width(), height()); 257 return gfx::Size(width(), height());
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
263 return storage_->image_reps(); 295 return storage_->image_reps();
264 } 296 }
265 297
266 const SkBitmap* ImageSkia::bitmap() const { 298 const SkBitmap* ImageSkia::bitmap() const {
267 if (isNull()) { 299 if (isNull()) {
268 // Callers expect a ImageSkiaRep even if it is |isNull()|. 300 // Callers expect a ImageSkiaRep even if it is |isNull()|.
269 // TODO(pkotwicz): Fix this. 301 // TODO(pkotwicz): Fix this.
270 return &NullImageRep().sk_bitmap(); 302 return &NullImageRep().sk_bitmap();
271 } 303 }
272 304
273 return &storage_->image_reps()[0].sk_bitmap(); 305 ImageSkiaReps::iterator it =
306 storage_->FindRepresentation(ui::SCALE_FACTOR_100P, true);
307 return &it->sk_bitmap();
274 } 308 }
275 309
276 void ImageSkia::Init(const ImageSkiaRep& image_rep) { 310 void ImageSkia::Init(const ImageSkiaRep& image_rep) {
277 // TODO(pkotwicz): The image should be null whenever image rep is null. 311 // TODO(pkotwicz): The image should be null whenever image rep is null.
278 if (image_rep.sk_bitmap().empty()) { 312 if (image_rep.sk_bitmap().empty()) {
279 storage_ = NULL; 313 storage_ = NULL;
280 return; 314 return;
281 } 315 }
282 storage_ = new internal::ImageSkiaStorage( 316 storage_ = new internal::ImageSkiaStorage(
283 NULL, gfx::Size(image_rep.GetWidth(), image_rep.GetHeight())); 317 NULL, gfx::Size(image_rep.GetWidth(), image_rep.GetHeight()));
284 storage_->image_reps().push_back(image_rep); 318 storage_->image_reps().push_back(image_rep);
285 } 319 }
286 320
287 } // namespace gfx 321 } // namespace gfx
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698