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

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

Issue 10245003: Makes ImageSkia more like SkBitmap (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Updated comment Created 8 years, 7 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.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/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
(...skipping 13 matching lines...) Expand all
24 #include "skia/ext/skia_utils_mac.h" 24 #include "skia/ext/skia_utils_mac.h"
25 #endif 25 #endif
26 26
27 namespace gfx { 27 namespace gfx {
28 28
29 namespace internal { 29 namespace internal {
30 30
31 #if defined(OS_MACOSX) 31 #if defined(OS_MACOSX)
32 // This is a wrapper around gfx::NSImageToSkBitmap() because this cross-platform 32 // This is a wrapper around gfx::NSImageToSkBitmap() because this cross-platform
33 // file cannot include the [square brackets] of ObjC. 33 // file cannot include the [square brackets] of ObjC.
34 bool NSImageToSkBitmaps(NSImage* image, std::vector<const SkBitmap*>* bitmaps); 34 ImageSkia NSImageToImageSkia(NSImage* image);
35 NSImage* ImageSkiaToNSImage(const ImageSkia* image);
35 #endif 36 #endif
36 37
37 #if defined(TOOLKIT_GTK) 38 #if defined(TOOLKIT_GTK)
38 const SkBitmap* GdkPixbufToSkBitmap(GdkPixbuf* pixbuf) { 39 const SkBitmap* GdkPixbufToSkBitmap(GdkPixbuf* pixbuf) {
39 CHECK(pixbuf); 40 CHECK(pixbuf);
40 gfx::Canvas canvas(gfx::Size(gdk_pixbuf_get_width(pixbuf), 41 gfx::Canvas canvas(gfx::Size(gdk_pixbuf_get_width(pixbuf),
41 gdk_pixbuf_get_height(pixbuf)), false); 42 gdk_pixbuf_get_height(pixbuf)), false);
42 skia::ScopedPlatformPaint scoped_platform_paint(canvas.sk_canvas()); 43 skia::ScopedPlatformPaint scoped_platform_paint(canvas.sk_canvas());
43 cairo_t* cr = scoped_platform_paint.GetPlatformSurface(); 44 cairo_t* cr = scoped_platform_paint.GetPlatformSurface();
44 gdk_cairo_set_source_pixbuf(cr, pixbuf, 0, 0); 45 gdk_cairo_set_source_pixbuf(cr, pixbuf, 0, 0);
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 #endif 91 #endif
91 92
92 Image::RepresentationType type() const { return type_; } 93 Image::RepresentationType type() const { return type_; }
93 94
94 private: 95 private:
95 Image::RepresentationType type_; 96 Image::RepresentationType type_;
96 }; 97 };
97 98
98 class ImageRepSkia : public ImageRep { 99 class ImageRepSkia : public ImageRep {
99 public: 100 public:
101 // Takes ownership of |image|.
100 explicit ImageRepSkia(ImageSkia* image) 102 explicit ImageRepSkia(ImageSkia* image)
101 : ImageRep(Image::kImageRepSkia), 103 : ImageRep(Image::kImageRepSkia),
102 image_(image) { 104 image_(image) {
103 } 105 }
104 106
105 virtual ~ImageRepSkia() { 107 virtual ~ImageRepSkia() {
106 } 108 }
107 109
108 ImageSkia* image() { return image_.get(); } 110 ImageSkia* image() { return image_.get(); }
109 111
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 219
218 friend class base::RefCounted<ImageStorage>; 220 friend class base::RefCounted<ImageStorage>;
219 }; 221 };
220 222
221 } // namespace internal 223 } // namespace internal
222 224
223 Image::Image() { 225 Image::Image() {
224 // |storage_| is NULL for empty Images. 226 // |storage_| is NULL for empty Images.
225 } 227 }
226 228
229 Image::Image(const ImageSkia& image)
230 : storage_(new internal::ImageStorage(Image::kImageRepSkia)) {
231 internal::ImageRepSkia* rep = new internal::ImageRepSkia(
232 new ImageSkia(image));
233 AddRepresentation(rep);
234 }
235
227 Image::Image(const SkBitmap& bitmap) 236 Image::Image(const SkBitmap& bitmap)
228 : storage_(new internal::ImageStorage(Image::kImageRepSkia)) { 237 : storage_(new internal::ImageStorage(Image::kImageRepSkia)) {
229 internal::ImageRepSkia* rep = 238 internal::ImageRepSkia* rep =
230 new internal::ImageRepSkia(new ImageSkia(new SkBitmap(bitmap))); 239 new internal::ImageRepSkia(new ImageSkia(bitmap));
231 AddRepresentation(rep); 240 AddRepresentation(rep);
232 } 241 }
233 242
234 Image::Image(const std::vector<const SkBitmap*>& bitmaps)
235 : storage_(new internal::ImageStorage(Image::kImageRepSkia)) {
236 internal::ImageRepSkia* rep = new internal::ImageRepSkia(
237 new ImageSkia(bitmaps));
238 AddRepresentation(rep);
239 }
240
241 #if defined(TOOLKIT_GTK) 243 #if defined(TOOLKIT_GTK)
242 Image::Image(GdkPixbuf* pixbuf) 244 Image::Image(GdkPixbuf* pixbuf)
243 : storage_(new internal::ImageStorage(Image::kImageRepGdk)) { 245 : storage_(new internal::ImageStorage(Image::kImageRepGdk)) {
244 internal::ImageRepGdk* rep = new internal::ImageRepGdk(pixbuf); 246 internal::ImageRepGdk* rep = new internal::ImageRepGdk(pixbuf);
245 AddRepresentation(rep); 247 AddRepresentation(rep);
246 } 248 }
247 #endif 249 #endif
248 250
249 #if defined(OS_MACOSX) 251 #if defined(OS_MACOSX)
250 Image::Image(NSImage* image) 252 Image::Image(NSImage* image)
251 : storage_(new internal::ImageStorage(Image::kImageRepCocoa)) { 253 : storage_(new internal::ImageStorage(Image::kImageRepCocoa)) {
252 internal::ImageRepCocoa* rep = new internal::ImageRepCocoa(image); 254 internal::ImageRepCocoa* rep = new internal::ImageRepCocoa(image);
253 AddRepresentation(rep); 255 AddRepresentation(rep);
254 } 256 }
255 #endif 257 #endif
256 258
257 Image::Image(const Image& other) : storage_(other.storage_) { 259 Image::Image(const Image& other) : storage_(other.storage_) {
258 } 260 }
259 261
260 Image& Image::operator=(const Image& other) { 262 Image& Image::operator=(const Image& other) {
261 storage_ = other.storage_; 263 storage_ = other.storage_;
262 return *this; 264 return *this;
263 } 265 }
264 266
265 Image::~Image() { 267 Image::~Image() {
266 } 268 }
267 269
268 const SkBitmap* Image::ToSkBitmap() const { 270 const SkBitmap* Image::ToSkBitmap() const {
269 internal::ImageRep* rep = GetRepresentation(Image::kImageRepSkia); 271 internal::ImageRep* rep = GetRepresentation(Image::kImageRepSkia);
270 return rep->AsImageRepSkia()->image()->bitmaps()[0]; 272 return rep->AsImageRepSkia()->image()->bitmap();
271 } 273 }
272 274
273 const ImageSkia* Image::ToImageSkia() const { 275 const ImageSkia* Image::ToImageSkia() const {
274 internal::ImageRep* rep = GetRepresentation(Image::kImageRepSkia); 276 internal::ImageRep* rep = GetRepresentation(Image::kImageRepSkia);
275 return rep->AsImageRepSkia()->image(); 277 return rep->AsImageRepSkia()->image();
276 } 278 }
277 279
278 #if defined(TOOLKIT_GTK) 280 #if defined(TOOLKIT_GTK)
279 GdkPixbuf* Image::ToGdkPixbuf() const { 281 GdkPixbuf* Image::ToGdkPixbuf() const {
280 internal::ImageRep* rep = GetRepresentation(Image::kImageRepGdk); 282 internal::ImageRep* rep = GetRepresentation(Image::kImageRepGdk);
281 return rep->AsImageRepGdk()->pixbuf(); 283 return rep->AsImageRepGdk()->pixbuf();
282 } 284 }
283 285
284 CairoCachedSurface* const Image::ToCairo() const { 286 CairoCachedSurface* const Image::ToCairo() const {
285 internal::ImageRep* rep = GetRepresentation(Image::kImageRepCairoCache); 287 internal::ImageRep* rep = GetRepresentation(Image::kImageRepCairoCache);
286 return rep->AsImageRepCairo()->surface(); 288 return rep->AsImageRepCairo()->surface();
287 } 289 }
288 #endif 290 #endif
289 291
290 #if defined(OS_MACOSX) 292 #if defined(OS_MACOSX)
291 NSImage* Image::ToNSImage() const { 293 NSImage* Image::ToNSImage() const {
292 internal::ImageRep* rep = GetRepresentation(Image::kImageRepCocoa); 294 internal::ImageRep* rep = GetRepresentation(Image::kImageRepCocoa);
293 return rep->AsImageRepCocoa()->image(); 295 return rep->AsImageRepCocoa()->image();
294 } 296 }
295 #endif 297 #endif
296 298
299 ImageSkia* Image::CopyImageSkia() const {
300 return new ImageSkia(*ToImageSkia());
301 }
302
297 SkBitmap* Image::CopySkBitmap() const { 303 SkBitmap* Image::CopySkBitmap() const {
298 return new SkBitmap(*ToSkBitmap()); 304 return new SkBitmap(*ToSkBitmap());
299 } 305 }
300 306
301 #if defined(TOOLKIT_GTK) 307 #if defined(TOOLKIT_GTK)
302 GdkPixbuf* Image::CopyGdkPixbuf() const { 308 GdkPixbuf* Image::CopyGdkPixbuf() const {
303 GdkPixbuf* pixbuf = ToGdkPixbuf(); 309 GdkPixbuf* pixbuf = ToGdkPixbuf();
304 g_object_ref(pixbuf); 310 g_object_ref(pixbuf);
305 return pixbuf; 311 return pixbuf;
306 } 312 }
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
363 369
364 // At this point, the requested rep does not exist, so it must be converted 370 // At this point, the requested rep does not exist, so it must be converted
365 // from the default rep. 371 // from the default rep.
366 372
367 // Handle native-to-Skia conversion. 373 // Handle native-to-Skia conversion.
368 if (rep_type == Image::kImageRepSkia) { 374 if (rep_type == Image::kImageRepSkia) {
369 internal::ImageRepSkia* rep = NULL; 375 internal::ImageRepSkia* rep = NULL;
370 #if defined(TOOLKIT_GTK) 376 #if defined(TOOLKIT_GTK)
371 if (storage_->default_representation_type() == Image::kImageRepGdk) { 377 if (storage_->default_representation_type() == Image::kImageRepGdk) {
372 internal::ImageRepGdk* pixbuf_rep = default_rep->AsImageRepGdk(); 378 internal::ImageRepGdk* pixbuf_rep = default_rep->AsImageRepGdk();
373 rep = new internal::ImageRepSkia(new ImageSkia( 379 scoped_ptr<const SkBitmap> bitmap(
374 internal::GdkPixbufToSkBitmap(pixbuf_rep->pixbuf()))); 380 internal::GdkPixbufToSkBitmap(pixbuf_rep->pixbuf()));
381 rep = new internal::ImageRepSkia(new ImageSkia(*bitmap));
375 } 382 }
376 // We don't do conversions from CairoCachedSurfaces to Skia because the 383 // We don't do conversions from CairoCachedSurfaces to Skia because the
377 // 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
378 // have a CairoCachedSurface. 385 // have a CairoCachedSurface.
379 #elif defined(OS_MACOSX) 386 #elif defined(OS_MACOSX)
380 if (storage_->default_representation_type() == Image::kImageRepCocoa) { 387 if (storage_->default_representation_type() == Image::kImageRepCocoa) {
381 internal::ImageRepCocoa* nsimage_rep = default_rep->AsImageRepCocoa(); 388 internal::ImageRepCocoa* nsimage_rep = default_rep->AsImageRepCocoa();
382 std::vector<const SkBitmap*> bitmaps; 389 ImageSkia image_skia = internal::NSImageToImageSkia(nsimage_rep->image());
383 CHECK(internal::NSImageToSkBitmaps(nsimage_rep->image(), &bitmaps)); 390 rep = new internal::ImageRepSkia(new ImageSkia(image_skia));
384 rep = new internal::ImageRepSkia(new ImageSkia(bitmaps));
385 } 391 }
386 #endif 392 #endif
387 CHECK(rep); 393 CHECK(rep);
388 AddRepresentation(rep); 394 AddRepresentation(rep);
389 return rep; 395 return rep;
390 } 396 }
391 #if defined(TOOLKIT_GTK) 397 #if defined(TOOLKIT_GTK)
392 else if (rep_type == Image::kImageRepCairoCache) { 398 else if (rep_type == Image::kImageRepCairoCache) {
393 // Handle any-to-Cairo conversion. This may recursively create an 399 // Handle any-to-Cairo conversion. This may recursively create an
394 // intermediate pixbuf before we send the data to the display server. 400 // intermediate pixbuf before we send the data to the display server.
395 internal::ImageRep* rep = GetRepresentation(Image::kImageRepGdk); 401 internal::ImageRep* rep = GetRepresentation(Image::kImageRepGdk);
396 internal::ImageRepCairoCached* native_rep = 402 internal::ImageRepCairoCached* native_rep =
397 new internal::ImageRepCairoCached(rep->AsImageRepGdk()->pixbuf()); 403 new internal::ImageRepCairoCached(rep->AsImageRepGdk()->pixbuf());
398 404
399 CHECK(native_rep); 405 CHECK(native_rep);
400 AddRepresentation(native_rep); 406 AddRepresentation(native_rep);
401 return native_rep; 407 return native_rep;
402 } 408 }
403 #endif 409 #endif
404 410
405 // Handle Skia-to-native conversions. 411 // Handle Skia-to-native conversions.
406 if (default_rep->type() == Image::kImageRepSkia) { 412 if (default_rep->type() == Image::kImageRepSkia) {
407 internal::ImageRep* native_rep = NULL; 413 internal::ImageRep* native_rep = NULL;
408 #if defined(USE_AURA) 414 #if defined(USE_AURA)
409 NOTIMPLEMENTED(); 415 NOTIMPLEMENTED();
410 #elif defined(TOOLKIT_GTK) 416 #elif defined(TOOLKIT_GTK)
411 if (rep_type == Image::kImageRepGdk) { 417 if (rep_type == Image::kImageRepGdk) {
412 GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap( 418 GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(
413 default_rep->AsImageRepSkia()->image()->bitmaps()[0]); 419 default_rep->AsImageRepSkia()->image()->bitmap());
414 native_rep = new internal::ImageRepGdk(pixbuf); 420 native_rep = new internal::ImageRepGdk(pixbuf);
415 } 421 }
416 #elif defined(OS_MACOSX) 422 #elif defined(OS_MACOSX)
417 if (rep_type == Image::kImageRepCocoa) { 423 if (rep_type == Image::kImageRepCocoa) {
418 NSImage* image = gfx::SkBitmapsToNSImage( 424 NSImage* image = internal::ImageSkiaToNSImage(
419 default_rep->AsImageRepSkia()->image()->bitmaps()); 425 default_rep->AsImageRepSkia()->image());
420 base::mac::NSObjectRetain(image); 426 base::mac::NSObjectRetain(image);
421 native_rep = new internal::ImageRepCocoa(image); 427 native_rep = new internal::ImageRepCocoa(image);
422 } 428 }
423 #endif 429 #endif
424 CHECK(native_rep); 430 CHECK(native_rep);
425 AddRepresentation(native_rep); 431 AddRepresentation(native_rep);
426 return native_rep; 432 return native_rep;
427 } 433 }
428 434
429 // Something went seriously wrong... 435 // Something went seriously wrong...
430 return NULL; 436 return NULL;
431 } 437 }
432 438
433 void Image::AddRepresentation(internal::ImageRep* rep) const { 439 void Image::AddRepresentation(internal::ImageRep* rep) const {
434 CHECK(storage_.get()); 440 CHECK(storage_.get());
435 storage_->representations().insert(std::make_pair(rep->type(), rep)); 441 storage_->representations().insert(std::make_pair(rep->type(), rep));
436 } 442 }
437 443
438 } // namespace gfx 444 } // namespace gfx
OLDNEW
« no previous file with comments | « ui/gfx/image/image.h ('k') | ui/gfx/image/image_mac.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698