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

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

Issue 10086023: Expose array of bitmaps contained by gfx::Image similar to NSImage (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Nicer diff Created 8 years, 8 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
« no previous file with comments | « ui/gfx/image/image.h ('k') | ui/gfx/image/image_mac_unittest.mm » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/stl_util.h" 10 #include "base/memory/scoped_ptr.h"
11 #include "third_party/skia/include/core/SkBitmap.h" 11 #include "third_party/skia/include/core/SkBitmap.h"
12 #include "ui/gfx/image/image_skia.h"
12 #include "ui/gfx/size.h" 13 #include "ui/gfx/size.h"
13 14
14 #if defined(TOOLKIT_GTK) 15 #if defined(TOOLKIT_GTK)
15 #include <gdk-pixbuf/gdk-pixbuf.h> 16 #include <gdk-pixbuf/gdk-pixbuf.h>
16 #include <gdk/gdk.h> 17 #include <gdk/gdk.h>
17 #include <glib-object.h> 18 #include <glib-object.h>
18 #include "ui/gfx/canvas.h" 19 #include "ui/gfx/canvas.h"
19 #include "ui/gfx/gtk_util.h" 20 #include "ui/gfx/gtk_util.h"
20 #include "ui/gfx/image/cairo_cached_surface.h" 21 #include "ui/gfx/image/cairo_cached_surface.h"
21 #elif defined(OS_MACOSX) 22 #elif defined(OS_MACOSX)
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 #endif 90 #endif
90 91
91 Image::RepresentationType type() const { return type_; } 92 Image::RepresentationType type() const { return type_; }
92 93
93 private: 94 private:
94 Image::RepresentationType type_; 95 Image::RepresentationType type_;
95 }; 96 };
96 97
97 class ImageRepSkia : public ImageRep { 98 class ImageRepSkia : public ImageRep {
98 public: 99 public:
99 explicit ImageRepSkia(const SkBitmap* bitmap) 100 explicit ImageRepSkia(ImageSkia* image)
100 : ImageRep(Image::kImageRepSkia) {
101 CHECK(bitmap);
102 // TODO(rohitrao): Add a CHECK to ensure that !bitmap->isNull().
103 bitmaps_.push_back(bitmap);
104 }
105
106 explicit ImageRepSkia(const std::vector<const SkBitmap*>& bitmaps)
107 : ImageRep(Image::kImageRepSkia), 101 : ImageRep(Image::kImageRepSkia),
108 bitmaps_(bitmaps) { 102 image_(image) {
109 CHECK(!bitmaps_.empty());
110 // TODO(rohitrao): Add a CHECK to ensure that !bitmap->isNull() for each
111 // vector element.
112 } 103 }
113 104
114 virtual ~ImageRepSkia() { 105 virtual ~ImageRepSkia() {
115 STLDeleteElements(&bitmaps_);
116 } 106 }
117 107
118 const SkBitmap* bitmap() const { return bitmaps_[0]; } 108 ImageSkia* image() { return image_.get(); }
119
120 const std::vector<const SkBitmap*>& bitmaps() const { return bitmaps_; }
121 109
122 private: 110 private:
123 std::vector<const SkBitmap*> bitmaps_; 111 scoped_ptr<ImageSkia> image_;
124 112
125 DISALLOW_COPY_AND_ASSIGN(ImageRepSkia); 113 DISALLOW_COPY_AND_ASSIGN(ImageRepSkia);
126 }; 114 };
127 115
128 #if defined(TOOLKIT_GTK) 116 #if defined(TOOLKIT_GTK)
129 class ImageRepGdk : public ImageRep { 117 class ImageRepGdk : public ImageRep {
130 public: 118 public:
131 explicit ImageRepGdk(GdkPixbuf* pixbuf) 119 explicit ImageRepGdk(GdkPixbuf* pixbuf)
132 : ImageRep(Image::kImageRepGdk), 120 : ImageRep(Image::kImageRepGdk),
133 pixbuf_(pixbuf) { 121 pixbuf_(pixbuf) {
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 }; 219 };
232 220
233 } // namespace internal 221 } // namespace internal
234 222
235 Image::Image() { 223 Image::Image() {
236 // |storage_| is NULL for empty Images. 224 // |storage_| is NULL for empty Images.
237 } 225 }
238 226
239 Image::Image(const SkBitmap* bitmap) 227 Image::Image(const SkBitmap* bitmap)
240 : storage_(new internal::ImageStorage(Image::kImageRepSkia)) { 228 : storage_(new internal::ImageStorage(Image::kImageRepSkia)) {
241 internal::ImageRepSkia* rep = new internal::ImageRepSkia(bitmap); 229 internal::ImageRepSkia* rep = new internal::ImageRepSkia(
230 new ImageSkia(bitmap));
242 AddRepresentation(rep); 231 AddRepresentation(rep);
243 } 232 }
244 233
245 Image::Image(const SkBitmap& bitmap) 234 Image::Image(const SkBitmap& bitmap)
246 : storage_(new internal::ImageStorage(Image::kImageRepSkia)) { 235 : storage_(new internal::ImageStorage(Image::kImageRepSkia)) {
247 internal::ImageRepSkia* rep = 236 internal::ImageRepSkia* rep =
248 new internal::ImageRepSkia(new SkBitmap(bitmap)); 237 new internal::ImageRepSkia(new ImageSkia(new SkBitmap(bitmap)));
249 AddRepresentation(rep); 238 AddRepresentation(rep);
250 } 239 }
251 240
252 Image::Image(const std::vector<const SkBitmap*>& bitmaps) 241 Image::Image(const std::vector<const SkBitmap*>& bitmaps)
253 : storage_(new internal::ImageStorage(Image::kImageRepSkia)) { 242 : storage_(new internal::ImageStorage(Image::kImageRepSkia)) {
254 internal::ImageRepSkia* rep = new internal::ImageRepSkia(bitmaps); 243 internal::ImageRepSkia* rep = new internal::ImageRepSkia(
244 new ImageSkia(bitmaps));
255 AddRepresentation(rep); 245 AddRepresentation(rep);
256 } 246 }
257 247
258 #if defined(TOOLKIT_GTK) 248 #if defined(TOOLKIT_GTK)
259 Image::Image(GdkPixbuf* pixbuf) 249 Image::Image(GdkPixbuf* pixbuf)
260 : storage_(new internal::ImageStorage(Image::kImageRepGdk)) { 250 : storage_(new internal::ImageStorage(Image::kImageRepGdk)) {
261 internal::ImageRepGdk* rep = new internal::ImageRepGdk(pixbuf); 251 internal::ImageRepGdk* rep = new internal::ImageRepGdk(pixbuf);
262 AddRepresentation(rep); 252 AddRepresentation(rep);
263 } 253 }
264 #endif 254 #endif
(...skipping 12 matching lines...) Expand all
277 Image& Image::operator=(const Image& other) { 267 Image& Image::operator=(const Image& other) {
278 storage_ = other.storage_; 268 storage_ = other.storage_;
279 return *this; 269 return *this;
280 } 270 }
281 271
282 Image::~Image() { 272 Image::~Image() {
283 } 273 }
284 274
285 const SkBitmap* Image::ToSkBitmap() const { 275 const SkBitmap* Image::ToSkBitmap() const {
286 internal::ImageRep* rep = GetRepresentation(Image::kImageRepSkia); 276 internal::ImageRep* rep = GetRepresentation(Image::kImageRepSkia);
287 return rep->AsImageRepSkia()->bitmap(); 277 return rep->AsImageRepSkia()->image()->bitmaps()[0];
278 }
279
280 const ImageSkia* Image::ToImageSkia() const {
281 internal::ImageRep* rep = GetRepresentation(Image::kImageRepSkia);
282 return rep->AsImageRepSkia()->image();
288 } 283 }
289 284
290 #if defined(TOOLKIT_GTK) 285 #if defined(TOOLKIT_GTK)
291 GdkPixbuf* Image::ToGdkPixbuf() const { 286 GdkPixbuf* Image::ToGdkPixbuf() const {
292 internal::ImageRep* rep = GetRepresentation(Image::kImageRepGdk); 287 internal::ImageRep* rep = GetRepresentation(Image::kImageRepGdk);
293 return rep->AsImageRepGdk()->pixbuf(); 288 return rep->AsImageRepGdk()->pixbuf();
294 } 289 }
295 290
296 CairoCachedSurface* const Image::ToCairo() const { 291 CairoCachedSurface* const Image::ToCairo() const {
297 internal::ImageRep* rep = GetRepresentation(Image::kImageRepCairoCache); 292 internal::ImageRep* rep = GetRepresentation(Image::kImageRepCairoCache);
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
375 370
376 // At this point, the requested rep does not exist, so it must be converted 371 // At this point, the requested rep does not exist, so it must be converted
377 // from the default rep. 372 // from the default rep.
378 373
379 // Handle native-to-Skia conversion. 374 // Handle native-to-Skia conversion.
380 if (rep_type == Image::kImageRepSkia) { 375 if (rep_type == Image::kImageRepSkia) {
381 internal::ImageRepSkia* rep = NULL; 376 internal::ImageRepSkia* rep = NULL;
382 #if defined(TOOLKIT_GTK) 377 #if defined(TOOLKIT_GTK)
383 if (storage_->default_representation_type() == Image::kImageRepGdk) { 378 if (storage_->default_representation_type() == Image::kImageRepGdk) {
384 internal::ImageRepGdk* pixbuf_rep = default_rep->AsImageRepGdk(); 379 internal::ImageRepGdk* pixbuf_rep = default_rep->AsImageRepGdk();
385 rep = new internal::ImageRepSkia( 380 rep = new internal::ImageRepSkia(new ImageSkia(
386 internal::GdkPixbufToSkBitmap(pixbuf_rep->pixbuf())); 381 internal::GdkPixbufToSkBitmap(pixbuf_rep->pixbuf())));
387 } 382 }
388 // We don't do conversions from CairoCachedSurfaces to Skia because the 383 // We don't do conversions from CairoCachedSurfaces to Skia because the
389 // data lives on the display server and we'll always have a GdkPixbuf if we 384 // data lives on the display server and we'll always have a GdkPixbuf if we
390 // have a CairoCachedSurface. 385 // have a CairoCachedSurface.
391 #elif defined(OS_MACOSX) 386 #elif defined(OS_MACOSX)
392 if (storage_->default_representation_type() == Image::kImageRepCocoa) { 387 if (storage_->default_representation_type() == Image::kImageRepCocoa) {
393 internal::ImageRepCocoa* nsimage_rep = default_rep->AsImageRepCocoa(); 388 internal::ImageRepCocoa* nsimage_rep = default_rep->AsImageRepCocoa();
394 std::vector<const SkBitmap*> bitmaps; 389 std::vector<const SkBitmap*> bitmaps;
395 CHECK(internal::NSImageToSkBitmaps(nsimage_rep->image(), &bitmaps)); 390 CHECK(internal::NSImageToSkBitmaps(nsimage_rep->image(), &bitmaps));
396 rep = new internal::ImageRepSkia(bitmaps); 391 rep = new internal::ImageRepSkia(new ImageSkia(bitmaps));
397 } 392 }
398 #endif 393 #endif
399 CHECK(rep); 394 CHECK(rep);
400 AddRepresentation(rep); 395 AddRepresentation(rep);
401 return rep; 396 return rep;
402 } 397 }
403 #if defined(TOOLKIT_GTK) 398 #if defined(TOOLKIT_GTK)
404 else if (rep_type == Image::kImageRepCairoCache) { 399 else if (rep_type == Image::kImageRepCairoCache) {
405 // Handle any-to-Cairo conversion. This may recursively create an 400 // Handle any-to-Cairo conversion. This may recursively create an
406 // intermediate pixbuf before we send the data to the display server. 401 // intermediate pixbuf before we send the data to the display server.
407 internal::ImageRep* rep = GetRepresentation(Image::kImageRepGdk); 402 internal::ImageRep* rep = GetRepresentation(Image::kImageRepGdk);
408 internal::ImageRepCairoCached* native_rep = 403 internal::ImageRepCairoCached* native_rep =
409 new internal::ImageRepCairoCached(rep->AsImageRepGdk()->pixbuf()); 404 new internal::ImageRepCairoCached(rep->AsImageRepGdk()->pixbuf());
410 405
411 CHECK(native_rep); 406 CHECK(native_rep);
412 AddRepresentation(native_rep); 407 AddRepresentation(native_rep);
413 return native_rep; 408 return native_rep;
414 } 409 }
415 #endif 410 #endif
416 411
417 // Handle Skia-to-native conversions. 412 // Handle Skia-to-native conversions.
418 if (default_rep->type() == Image::kImageRepSkia) { 413 if (default_rep->type() == Image::kImageRepSkia) {
419 internal::ImageRep* native_rep = NULL; 414 internal::ImageRep* native_rep = NULL;
420 #if defined(USE_AURA) 415 #if defined(USE_AURA)
421 NOTIMPLEMENTED(); 416 NOTIMPLEMENTED();
422 #elif defined(TOOLKIT_GTK) 417 #elif defined(TOOLKIT_GTK)
423 if (rep_type == Image::kImageRepGdk) { 418 if (rep_type == Image::kImageRepGdk) {
424 GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap( 419 GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(
425 default_rep->AsImageRepSkia()->bitmap()); 420 default_rep->AsImageRepSkia()->image()->bitmaps()[0]);
426 native_rep = new internal::ImageRepGdk(pixbuf); 421 native_rep = new internal::ImageRepGdk(pixbuf);
427 } 422 }
428 #elif defined(OS_MACOSX) 423 #elif defined(OS_MACOSX)
429 if (rep_type == Image::kImageRepCocoa) { 424 if (rep_type == Image::kImageRepCocoa) {
430 NSImage* image = gfx::SkBitmapsToNSImage( 425 NSImage* image = gfx::SkBitmapsToNSImage(
431 default_rep->AsImageRepSkia()->bitmaps()); 426 default_rep->AsImageRepSkia()->image()->bitmaps());
432 base::mac::NSObjectRetain(image); 427 base::mac::NSObjectRetain(image);
433 native_rep = new internal::ImageRepCocoa(image); 428 native_rep = new internal::ImageRepCocoa(image);
434 } 429 }
435 #endif 430 #endif
436 CHECK(native_rep); 431 CHECK(native_rep);
437 AddRepresentation(native_rep); 432 AddRepresentation(native_rep);
438 return native_rep; 433 return native_rep;
439 } 434 }
440 435
441 // Something went seriously wrong... 436 // Something went seriously wrong...
442 return NULL; 437 return NULL;
443 } 438 }
444 439
445 void Image::AddRepresentation(internal::ImageRep* rep) const { 440 void Image::AddRepresentation(internal::ImageRep* rep) const {
446 CHECK(storage_.get()); 441 CHECK(storage_.get());
447 storage_->representations().insert(std::make_pair(rep->type(), rep)); 442 storage_->representations().insert(std::make_pair(rep->type(), rep));
448 } 443 }
449 444
450 size_t Image::GetNumberOfSkBitmaps() const {
451 return GetRepresentation(Image::kImageRepSkia)->AsImageRepSkia()->
452 bitmaps().size();
453 }
454
455 const SkBitmap* Image::GetSkBitmapAtIndex(size_t index) const {
456 return GetRepresentation(Image::kImageRepSkia)->AsImageRepSkia()->
457 bitmaps()[index];
458 }
459
460 } // namespace gfx 445 } // namespace gfx
OLDNEW
« no previous file with comments | « ui/gfx/image/image.h ('k') | ui/gfx/image/image_mac_unittest.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698