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

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

Issue 6849030: Add support for multi resolution icons (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Added comments Created 9 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.h ('k') | ui/gfx/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) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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.h" 5 #include "ui/gfx/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-inl.h"
10 #include "third_party/skia/include/core/SkBitmap.h" 11 #include "third_party/skia/include/core/SkBitmap.h"
11 12
12 #if defined(OS_LINUX) 13 #if defined(OS_LINUX)
13 #include <gdk-pixbuf/gdk-pixbuf.h> 14 #include <gdk-pixbuf/gdk-pixbuf.h>
14 #include <glib-object.h> 15 #include <glib-object.h>
15 #include "ui/gfx/canvas_skia.h" 16 #include "ui/gfx/canvas_skia.h"
16 #include "ui/gfx/gtk_util.h" 17 #include "ui/gfx/gtk_util.h"
17 #elif defined(OS_MACOSX) 18 #elif defined(OS_MACOSX)
18 #include "base/mac/mac_util.h" 19 #include "base/mac/mac_util.h"
19 #include "skia/ext/skia_utils_mac.h" 20 #include "skia/ext/skia_utils_mac.h"
20 #endif 21 #endif
21 22
22 namespace gfx { 23 namespace gfx {
23 24
24 namespace internal { 25 namespace internal {
25 26
26 #if defined(OS_MACOSX) 27 #if defined(OS_MACOSX)
27 // This is a wrapper around gfx::NSImageToSkBitmap() because this cross-platform 28 // This is a wrapper around gfx::NSImageToSkBitmap() because this cross-platform
28 // file cannot include the [square brackets] of ObjC. 29 // file cannot include the [square brackets] of ObjC.
29 const SkBitmap* NSImageToSkBitmap(NSImage* image); 30 bool NSImageToSkBitmaps(NSImage* image, std::vector<const SkBitmap*>& bitmaps);
30 #endif 31 #endif
31 32
32 #if defined(OS_LINUX) 33 #if defined(OS_LINUX)
33 const SkBitmap* GdkPixbufToSkBitmap(GdkPixbuf* pixbuf) { 34 const SkBitmap* GdkPixbufToSkBitmap(GdkPixbuf* pixbuf) {
34 gfx::CanvasSkia canvas(gdk_pixbuf_get_width(pixbuf), 35 gfx::CanvasSkia canvas(gdk_pixbuf_get_width(pixbuf),
35 gdk_pixbuf_get_height(pixbuf), 36 gdk_pixbuf_get_height(pixbuf),
36 /*is_opaque=*/false); 37 /*is_opaque=*/false);
37 canvas.DrawGdkPixbuf(pixbuf, 0, 0); 38 canvas.DrawGdkPixbuf(pixbuf, 0, 0);
38 return new SkBitmap(canvas.ExtractBitmap()); 39 return new SkBitmap(canvas.ExtractBitmap());
39 } 40 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
77 78
78 Image::RepresentationType type() const { return type_; } 79 Image::RepresentationType type() const { return type_; }
79 80
80 private: 81 private:
81 Image::RepresentationType type_; 82 Image::RepresentationType type_;
82 }; 83 };
83 84
84 class SkBitmapRep : public ImageRep { 85 class SkBitmapRep : public ImageRep {
85 public: 86 public:
86 explicit SkBitmapRep(const SkBitmap* bitmap) 87 explicit SkBitmapRep(const SkBitmap* bitmap)
88 : ImageRep(Image::kSkBitmapRep) {
89 CHECK(bitmap);
90 bitmaps_.push_back(bitmap);
91 }
92
93 explicit SkBitmapRep(const std::vector<const SkBitmap*>& bitmaps)
87 : ImageRep(Image::kSkBitmapRep), 94 : ImageRep(Image::kSkBitmapRep),
88 bitmap_(bitmap) { 95 bitmaps_(bitmaps) {
89 CHECK(bitmap); 96 CHECK(!bitmaps_.empty());
90 } 97 }
91 98
92 virtual ~SkBitmapRep() { 99 virtual ~SkBitmapRep() {
93 delete bitmap_; 100 STLDeleteElements(&bitmaps_);
94 bitmap_ = NULL;
95 } 101 }
96 102
97 const SkBitmap* bitmap() const { return bitmap_; } 103 const SkBitmap* bitmap() const { return bitmaps_[0]; }
104
105 const std::vector<const SkBitmap*>& bitmaps() const { return bitmaps_; }
98 106
99 private: 107 private:
100 const SkBitmap* bitmap_; 108 std::vector<const SkBitmap*> bitmaps_;
101 109
102 DISALLOW_COPY_AND_ASSIGN(SkBitmapRep); 110 DISALLOW_COPY_AND_ASSIGN(SkBitmapRep);
103 }; 111 };
104 112
105 #if defined(OS_LINUX) 113 #if defined(OS_LINUX)
106 class GdkPixbufRep : public ImageRep { 114 class GdkPixbufRep : public ImageRep {
107 public: 115 public:
108 explicit GdkPixbufRep(GdkPixbuf* pixbuf) 116 explicit GdkPixbufRep(GdkPixbuf* pixbuf)
109 : ImageRep(Image::kGdkPixbufRep), 117 : ImageRep(Image::kGdkPixbufRep),
110 pixbuf_(pixbuf) { 118 pixbuf_(pixbuf) {
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
151 #endif 159 #endif
152 160
153 } // namespace internal 161 } // namespace internal
154 162
155 Image::Image(const SkBitmap* bitmap) 163 Image::Image(const SkBitmap* bitmap)
156 : default_representation_(Image::kSkBitmapRep) { 164 : default_representation_(Image::kSkBitmapRep) {
157 internal::SkBitmapRep* rep = new internal::SkBitmapRep(bitmap); 165 internal::SkBitmapRep* rep = new internal::SkBitmapRep(bitmap);
158 AddRepresentation(rep); 166 AddRepresentation(rep);
159 } 167 }
160 168
169 Image::Image(const std::vector<const SkBitmap*>& bitmaps)
170 : default_representation_(Image::kSkBitmapRep) {
171 internal::SkBitmapRep* rep = new internal::SkBitmapRep(bitmaps);
172 AddRepresentation(rep);
173 }
174
161 #if defined(OS_LINUX) 175 #if defined(OS_LINUX)
162 Image::Image(GdkPixbuf* pixbuf) 176 Image::Image(GdkPixbuf* pixbuf)
163 : default_representation_(Image::kGdkPixbufRep) { 177 : default_representation_(Image::kGdkPixbufRep) {
164 internal::GdkPixbufRep* rep = new internal::GdkPixbufRep(pixbuf); 178 internal::GdkPixbufRep* rep = new internal::GdkPixbufRep(pixbuf);
165 AddRepresentation(rep); 179 AddRepresentation(rep);
166 } 180 }
167 #endif 181 #endif
168 182
169 #if defined(OS_MACOSX) 183 #if defined(OS_MACOSX)
170 Image::Image(NSImage* image) : default_representation_(Image::kNSImageRep) { 184 Image::Image(NSImage* image) : default_representation_(Image::kNSImageRep) {
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
239 internal::SkBitmapRep* rep = NULL; 253 internal::SkBitmapRep* rep = NULL;
240 #if defined(OS_LINUX) 254 #if defined(OS_LINUX)
241 if (default_representation_ == Image::kGdkPixbufRep) { 255 if (default_representation_ == Image::kGdkPixbufRep) {
242 internal::GdkPixbufRep* pixbuf_rep = default_rep->AsGdkPixbufRep(); 256 internal::GdkPixbufRep* pixbuf_rep = default_rep->AsGdkPixbufRep();
243 rep = new internal::SkBitmapRep( 257 rep = new internal::SkBitmapRep(
244 internal::GdkPixbufToSkBitmap(pixbuf_rep->pixbuf())); 258 internal::GdkPixbufToSkBitmap(pixbuf_rep->pixbuf()));
245 } 259 }
246 #elif defined(OS_MACOSX) 260 #elif defined(OS_MACOSX)
247 if (default_representation_ == Image::kNSImageRep) { 261 if (default_representation_ == Image::kNSImageRep) {
248 internal::NSImageRep* nsimage_rep = default_rep->AsNSImageRep(); 262 internal::NSImageRep* nsimage_rep = default_rep->AsNSImageRep();
249 rep = new internal::SkBitmapRep( 263 std::vector<const SkBitmap*> bitmaps;
250 internal::NSImageToSkBitmap(nsimage_rep->image())); 264 CHECK(internal::NSImageToSkBitmaps(nsimage_rep->image(), bitmaps));
265 rep = new internal::SkBitmapRep(bitmaps);
251 } 266 }
252 #endif 267 #endif
253 CHECK(rep); 268 CHECK(rep);
254 AddRepresentation(rep); 269 AddRepresentation(rep);
255 return rep; 270 return rep;
256 } 271 }
257 272
258 // Handle Skia-to-native conversions. 273 // Handle Skia-to-native conversions.
259 if (default_rep->type() == Image::kSkBitmapRep) { 274 if (default_rep->type() == Image::kSkBitmapRep) {
260 internal::SkBitmapRep* skia_rep = default_rep->AsSkBitmapRep(); 275 internal::SkBitmapRep* skia_rep = default_rep->AsSkBitmapRep();
261 internal::ImageRep* native_rep = NULL; 276 internal::ImageRep* native_rep = NULL;
262 #if defined(OS_LINUX) 277 #if defined(OS_LINUX)
263 if (rep_type == Image::kGdkPixbufRep) { 278 if (rep_type == Image::kGdkPixbufRep) {
264 GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(skia_rep->bitmap()); 279 GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(skia_rep->bitmap());
265 native_rep = new internal::GdkPixbufRep(pixbuf); 280 native_rep = new internal::GdkPixbufRep(pixbuf);
266 } 281 }
267 #elif defined(OS_MACOSX) 282 #elif defined(OS_MACOSX)
268 if (rep_type == Image::kNSImageRep) { 283 if (rep_type == Image::kNSImageRep) {
269 NSImage* image = gfx::SkBitmapToNSImage(*(skia_rep->bitmap())); 284 NSImage* image = gfx::SkBitmapsToNSImage(skia_rep->bitmaps());
270 base::mac::NSObjectRetain(image); 285 base::mac::NSObjectRetain(image);
271 native_rep = new internal::NSImageRep(image); 286 native_rep = new internal::NSImageRep(image);
272 } 287 }
273 #endif 288 #endif
274 CHECK(native_rep); 289 CHECK(native_rep);
275 AddRepresentation(native_rep); 290 AddRepresentation(native_rep);
276 return native_rep; 291 return native_rep;
277 } 292 }
278 293
279 // Something went seriously wrong... 294 // Something went seriously wrong...
280 return NULL; 295 return NULL;
281 } 296 }
282 297
283 void Image::AddRepresentation(internal::ImageRep* rep) { 298 void Image::AddRepresentation(internal::ImageRep* rep) {
284 representations_.insert(std::make_pair(rep->type(), rep)); 299 representations_.insert(std::make_pair(rep->type(), rep));
285 } 300 }
286 301
302 size_t Image::GetNumberOfSkBitmaps() {
303 return GetRepresentation(Image::kSkBitmapRep)->AsSkBitmapRep()->
304 bitmaps().size();
305 }
306
307 const SkBitmap* Image::GetSkBitmapAtIndex(size_t index) {
308 return GetRepresentation(Image::kSkBitmapRep)->AsSkBitmapRep()->
309 bitmaps()[index];
310 }
311
287 } // namespace gfx 312 } // namespace gfx
OLDNEW
« no previous file with comments | « ui/gfx/image.h ('k') | ui/gfx/image_mac.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698