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

Side by Side Diff: chrome/browser/icon_loader_chromeos.cc

Issue 9167019: Consolidate icon loading on ChromeOS (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add comment. Created 8 years, 10 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
(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 #include "chrome/browser/icon_loader.h"
6
7 #include <map>
8 #include <string>
9 #include <utility>
10
11 #include "base/bind.h"
12 #include "base/lazy_instance.h"
13 #include "base/message_loop.h"
14 #include "chrome/browser/icon_loader.h"
15 #include "grit/component_extension_resources.h"
16 #include "skia/ext/image_operations.h"
17 #include "third_party/skia/include/core/SkBitmap.h"
18 #include "ui/base/resource/resource_bundle.h"
19 #include "ui/gfx/canvas_skia.h"
20 #include "ui/gfx/codec/png_codec.h"
21 #include "ui/gfx/image/image.h"
22 #include "webkit/glue/image_decoder.h"
23
24 namespace {
25
26 // Used with GenerateBitmapWithSize() to indicate that the image shouldn't be
27 // resized.
28 const int kDoNotResize = -1;
29
30 struct IdrBySize {
31 int idr_small;
32 int idr_normal;
33 int idr_large;
34 };
35
36 // Performs mapping of <file extension, icon size> to icon resource IDs.
37 class IconMapper {
38 public:
39 IconMapper();
40
41 // Lookup icon resource ID for a given filename |extension| and
42 // |icon_size|. Defaults to generic icons if there are no icons for the given
43 // extension.
44 int Lookup(const std::string& extension, IconLoader::IconSize icon_size);
45
46 private:
47 typedef std::map<std::string, IdrBySize> ExtensionIconMap;
48
49 ExtensionIconMap extension_icon_map_;
50 };
51
52 const IdrBySize kAudioIdrs = {
53 IDR_FILE_MANAGER_IMG_FILETYPE_AUDIO,
54 IDR_FILE_MANAGER_IMG_FILETYPE_LARGE_AUDIO,
55 IDR_FILE_MANAGER_IMG_FILETYPE_LARGE_AUDIO
56 };
57 const IdrBySize kGenericIdrs = {
58 IDR_FILE_MANAGER_IMG_FILETYPE_GENERIC,
59 IDR_FILE_MANAGER_IMG_FILETYPE_LARGE_GENERIC,
60 IDR_FILE_MANAGER_IMG_FILETYPE_LARGE_GENERIC
61 };
62 const IdrBySize kHtmlIdrs = {
63 IDR_FILE_MANAGER_IMG_FILETYPE_HTML,
64 IDR_FILE_MANAGER_IMG_FILETYPE_HTML,
65 IDR_FILE_MANAGER_IMG_FILETYPE_HTML
66 };
67 const IdrBySize kImageIdrs = {
68 IDR_FILE_MANAGER_IMG_FILETYPE_IMAGE,
69 IDR_FILE_MANAGER_IMG_FILETYPE_IMAGE,
70 IDR_FILE_MANAGER_IMG_FILETYPE_IMAGE
71 };
72 const IdrBySize kPdfIdrs = {
73 IDR_FILE_MANAGER_IMG_FILETYPE_PDF,
74 IDR_FILE_MANAGER_IMG_FILETYPE_PDF,
75 IDR_FILE_MANAGER_IMG_FILETYPE_PDF
76 };
77 const IdrBySize kTextIdrs = {
78 IDR_FILE_MANAGER_IMG_FILETYPE_TEXT,
79 IDR_FILE_MANAGER_IMG_FILETYPE_TEXT,
80 IDR_FILE_MANAGER_IMG_FILETYPE_TEXT
81 };
82 const IdrBySize kVideoIdrs = {
83 IDR_FILE_MANAGER_IMG_FILETYPE_VIDEO,
84 IDR_FILE_MANAGER_IMG_FILETYPE_LARGE_VIDEO,
85 IDR_FILE_MANAGER_IMG_FILETYPE_LARGE_VIDEO
86 };
87
88 IconMapper::IconMapper() {
89 // The code below should match translation in
90 // chrome/browser/resources/file_manager/js/file_manager.js
91 // chrome/browser/resources/file_manager/css/file_manager.css
92 // 'audio': /\.(mp3|m4a|oga|ogg|wav)$/i,
93 // 'html': /\.(html?)$/i,
94 // 'image': /\.(bmp|gif|jpe?g|ico|png|webp)$/i,
95 // 'pdf' : /\.(pdf)$/i,
96 // 'text': /\.(pod|rst|txt|log)$/i,
97 // 'video': /\.(mov|mp4|m4v|mpe?g4?|ogm|ogv|ogx|webm)$/i
98
99 const ExtensionIconMap::value_type kExtensionIdrBySizeData[] = {
100 #if defined(GOOGLE_CHROME_BUILD) || defined(USE_PROPRIETARY_CODECS)
101 std::make_pair(".m4a", kAudioIdrs),
102 std::make_pair(".mp3", kAudioIdrs),
103 std::make_pair(".pdf", kPdfIdrs),
104 std::make_pair(".3gp", kVideoIdrs),
105 std::make_pair(".avi", kVideoIdrs),
106 std::make_pair(".m4v", kVideoIdrs),
107 std::make_pair(".mov", kVideoIdrs),
108 std::make_pair(".mp4", kVideoIdrs),
109 std::make_pair(".mpeg", kVideoIdrs),
110 std::make_pair(".mpg", kVideoIdrs),
111 std::make_pair(".mpeg4", kVideoIdrs),
112 std::make_pair(".mpg4", kVideoIdrs),
113 #endif
114 std::make_pair(".flac", kAudioIdrs),
115 std::make_pair(".oga", kAudioIdrs),
116 std::make_pair(".ogg", kAudioIdrs),
117 std::make_pair(".wav", kAudioIdrs),
118 std::make_pair(".htm", kHtmlIdrs),
119 std::make_pair(".html", kHtmlIdrs),
120 std::make_pair(".bmp", kImageIdrs),
121 std::make_pair(".gif", kImageIdrs),
122 std::make_pair(".ico", kImageIdrs),
123 std::make_pair(".jpeg", kImageIdrs),
124 std::make_pair(".jpg", kImageIdrs),
125 std::make_pair(".png", kImageIdrs),
126 std::make_pair(".webp", kImageIdrs),
127 std::make_pair(".log", kTextIdrs),
128 std::make_pair(".pod", kTextIdrs),
129 std::make_pair(".rst", kTextIdrs),
130 std::make_pair(".txt", kTextIdrs),
131 std::make_pair(".ogm", kVideoIdrs),
132 std::make_pair(".ogv", kVideoIdrs),
133 std::make_pair(".ogx", kVideoIdrs),
134 std::make_pair(".webm", kVideoIdrs),
135 };
136
137 const size_t kESize = arraysize(kExtensionIdrBySizeData);
138 ExtensionIconMap source(&kExtensionIdrBySizeData[0],
139 &kExtensionIdrBySizeData[kESize]);
140 extension_icon_map_.swap(source);
141 }
142
143 int IconMapper::Lookup(const std::string& extension,
144 IconLoader::IconSize icon_size) {
145 DCHECK(icon_size == IconLoader::SMALL ||
146 icon_size == IconLoader::NORMAL ||
147 icon_size == IconLoader::LARGE);
148 ExtensionIconMap::const_iterator it = extension_icon_map_.find(extension);
149 const IdrBySize& idrbysize =
150 ((it == extension_icon_map_.end()) ? kGenericIdrs : it->second);
151 int idr = -1;
152 switch (icon_size) {
153 case IconLoader::SMALL: idr = idrbysize.idr_small; break;
154 case IconLoader::NORMAL: idr = idrbysize.idr_normal; break;
155 case IconLoader::LARGE: idr = idrbysize.idr_large; break;
156 case IconLoader::ALL:
157 default:
158 NOTREACHED();
159 }
160 return idr;
161 }
162
163 // Returns a copy of |source| that is |pixel_size| in width and height. If
164 // |pixel_size| is |kDoNotResize|, returns an unmodified copy of |source|.
165 // |source| must be a square image (width == height).
166 SkBitmap* GenerateBitmapWithSize(SkBitmap* source, int pixel_size) {
167 DCHECK(source);
168 DCHECK(source->width() == source->height());
169
170 if (pixel_size == kDoNotResize || source->width() == pixel_size)
171 return new SkBitmap(*source);
172
173 return new SkBitmap(skia::ImageOperations::Resize(
174 *source, skia::ImageOperations::RESIZE_BEST, pixel_size, pixel_size));
175 }
176
177 int IconSizeToPixelSize(IconLoader::IconSize size) {
178 switch (size) {
179 case IconLoader::SMALL: return 16;
180 case IconLoader::NORMAL: return 32;
181 case IconLoader::LARGE: // fallthrough
182 // On ChromeOS, we consider LARGE to mean "the largest image we have."
183 // Since we have already chosen the largest applicable image resource, we
184 // return the image as-is.
185 case IconLoader::ALL: // fallthrough
186 default:
187 return kDoNotResize;
188 }
189 }
190
191 } // namespace
192
193 void IconLoader::ReadIcon() {
194 static base::LazyInstance<IconMapper>::Leaky icon_mapper =
195 LAZY_INSTANCE_INITIALIZER;
196 int idr = icon_mapper.Get().Lookup(group_, icon_size_);
197 ResourceBundle& rb = ResourceBundle::GetSharedInstance();
198 scoped_refptr<RefCountedStaticMemory> bytes(rb.LoadDataResourceBytes(idr));
199 DCHECK(bytes.get());
200 SkBitmap bitmap;
201 if (!gfx::PNGCodec::Decode(bytes->front(), bytes->size(), &bitmap))
202 NOTREACHED();
203 image_.reset(new gfx::Image(
204 GenerateBitmapWithSize(&bitmap, IconSizeToPixelSize(icon_size_))));
205 target_message_loop_->PostTask(
206 FROM_HERE, base::Bind(&IconLoader::NotifyDelegate, this));
207 }
OLDNEW
« no previous file with comments | « chrome/browser/download/download_extension_test.cc ('k') | chrome/browser/icon_manager_chromeos.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698