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

Side by Side Diff: chrome/browser/favicon/favicon_service.cc

Issue 336423006: Pass in a set of requested favicon pixel sizes to the HistoryService (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 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 | « chrome/browser/favicon/favicon_service.h ('k') | chrome/browser/history/history_backend.h » ('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 "chrome/browser/favicon/favicon_service.h" 5 #include "chrome/browser/favicon/favicon_service.h"
6 6
7 #include <cmath>
8
7 #include "base/hash.h" 9 #include "base/hash.h"
8 #include "base/message_loop/message_loop_proxy.h" 10 #include "base/message_loop/message_loop_proxy.h"
9 #include "chrome/browser/history/history_backend.h" 11 #include "chrome/browser/history/history_backend.h"
10 #include "chrome/browser/history/history_service.h" 12 #include "chrome/browser/history/history_service.h"
11 #include "chrome/browser/history/history_service_factory.h" 13 #include "chrome/browser/history/history_service_factory.h"
12 #include "chrome/browser/ui/webui/chrome_web_ui_controller_factory.h" 14 #include "chrome/browser/ui/webui/chrome_web_ui_controller_factory.h"
13 #include "chrome/common/importer/imported_favicon_usage.h" 15 #include "chrome/common/importer/imported_favicon_usage.h"
14 #include "chrome/common/url_constants.h" 16 #include "chrome/common/url_constants.h"
15 #include "components/favicon_base/favicon_types.h" 17 #include "components/favicon_base/favicon_types.h"
16 #include "components/favicon_base/favicon_util.h" 18 #include "components/favicon_base/favicon_util.h"
(...skipping 25 matching lines...) Expand all
42 return tracker->PostTask( 44 return tracker->PostTask(
43 base::MessageLoopProxy::current().get(), 45 base::MessageLoopProxy::current().get(),
44 FROM_HERE, 46 FROM_HERE,
45 Bind(callback, std::vector<favicon_base::FaviconRawBitmapResult>())); 47 Bind(callback, std::vector<favicon_base::FaviconRawBitmapResult>()));
46 } 48 }
47 49
48 // Return the TaskId to retreive the favicon from chrome specific URL. 50 // Return the TaskId to retreive the favicon from chrome specific URL.
49 base::CancelableTaskTracker::TaskId GetFaviconForChromeURL( 51 base::CancelableTaskTracker::TaskId GetFaviconForChromeURL(
50 Profile* profile, 52 Profile* profile,
51 const GURL& page_url, 53 const GURL& page_url,
52 const std::vector<ui::ScaleFactor>& desired_scale_factors, 54 const std::vector<int>& desired_sizes_in_pixel,
53 const favicon_base::FaviconResultsCallback& callback, 55 const favicon_base::FaviconResultsCallback& callback,
54 base::CancelableTaskTracker* tracker) { 56 base::CancelableTaskTracker* tracker) {
55 base::CancelableTaskTracker::IsCanceledCallback is_canceled_cb; 57 base::CancelableTaskTracker::IsCanceledCallback is_canceled_cb;
56 base::CancelableTaskTracker::TaskId id = 58 base::CancelableTaskTracker::TaskId id =
57 tracker->NewTrackedTaskId(&is_canceled_cb); 59 tracker->NewTrackedTaskId(&is_canceled_cb);
58 favicon_base::FaviconResultsCallback cancelable_cb = 60 favicon_base::FaviconResultsCallback cancelable_cb =
59 Bind(&CancelOrRunFaviconResultsCallback, is_canceled_cb, callback); 61 Bind(&CancelOrRunFaviconResultsCallback, is_canceled_cb, callback);
60 ChromeWebUIControllerFactory::GetInstance()->GetFaviconForURL(profile, 62 ChromeWebUIControllerFactory::GetInstance()->GetFaviconForURL(profile,
61 page_url, desired_scale_factors, cancelable_cb); 63 page_url, desired_sizes_in_pixel, cancelable_cb);
62 return id; 64 return id;
63 } 65 }
64 66
67 // Returns the size in pixel that a favicon should be based on |size_in_dip|
68 // and |scale_factor|.
69 int GetSizeInPixel(int size_in_dip, ui::ScaleFactor scale_factor) {
70 return ceil(size_in_dip * ui::GetScaleForScaleFactor(scale_factor));
71 }
72
73 // Returns a vector of pixel edge sizes from |size_in_dip| and
74 // favicon_base::GetFaviconScaleFactors().
75 std::vector<int> GetPixelSizesForFaviconScales(int size_in_dip) {
76 std::vector<ui::ScaleFactor> scale_factors =
77 favicon_base::GetFaviconScaleFactors();
78 std::vector<int> sizes_in_pixel;
79 for (size_t i = 0; i < scale_factors.size(); ++i) {
80 sizes_in_pixel.push_back(GetSizeInPixel(size_in_dip, scale_factors[i]));
81 }
82 return sizes_in_pixel;
83 }
84
65 } // namespace 85 } // namespace
66 86
67 FaviconService::FaviconService(Profile* profile) 87 FaviconService::FaviconService(Profile* profile)
68 : history_service_(HistoryServiceFactory::GetForProfile( 88 : history_service_(HistoryServiceFactory::GetForProfile(
69 profile, Profile::EXPLICIT_ACCESS)), 89 profile, Profile::EXPLICIT_ACCESS)),
70 profile_(profile) { 90 profile_(profile) {
71 } 91 }
72 92
73 // static 93 // static
74 void FaviconService::FaviconResultsCallbackRunner( 94 void FaviconService::FaviconResultsCallbackRunner(
75 const favicon_base::FaviconResultsCallback& callback, 95 const favicon_base::FaviconResultsCallback& callback,
76 const std::vector<favicon_base::FaviconRawBitmapResult>* results) { 96 const std::vector<favicon_base::FaviconRawBitmapResult>* results) {
77 callback.Run(*results); 97 callback.Run(*results);
78 } 98 }
79 99
80 base::CancelableTaskTracker::TaskId FaviconService::GetFaviconImage( 100 base::CancelableTaskTracker::TaskId FaviconService::GetFaviconImage(
81 const GURL& icon_url, 101 const GURL& icon_url,
82 favicon_base::IconType icon_type, 102 favicon_base::IconType icon_type,
83 int desired_size_in_dip, 103 int desired_size_in_dip,
84 const favicon_base::FaviconImageCallback& callback, 104 const favicon_base::FaviconImageCallback& callback,
85 base::CancelableTaskTracker* tracker) { 105 base::CancelableTaskTracker* tracker) {
86 favicon_base::FaviconResultsCallback callback_runner = 106 favicon_base::FaviconResultsCallback callback_runner =
87 Bind(&FaviconService::RunFaviconImageCallbackWithBitmapResults, 107 Bind(&FaviconService::RunFaviconImageCallbackWithBitmapResults,
88 base::Unretained(this), callback, desired_size_in_dip); 108 base::Unretained(this), callback, desired_size_in_dip);
89 if (history_service_) { 109 if (history_service_) {
90 std::vector<GURL> icon_urls; 110 std::vector<GURL> icon_urls;
91 icon_urls.push_back(icon_url); 111 icon_urls.push_back(icon_url);
92 return history_service_->GetFavicons(icon_urls, 112 return history_service_->GetFavicons(
93 icon_type, 113 icon_urls,
94 desired_size_in_dip, 114 icon_type,
95 favicon_base::GetFaviconScaleFactors(), 115 GetPixelSizesForFaviconScales(desired_size_in_dip),
96 callback_runner, 116 callback_runner,
97 tracker); 117 tracker);
98 } 118 }
99 return RunWithEmptyResultAsync(callback_runner, tracker); 119 return RunWithEmptyResultAsync(callback_runner, tracker);
100 } 120 }
101 121
102 base::CancelableTaskTracker::TaskId FaviconService::GetRawFavicon( 122 base::CancelableTaskTracker::TaskId FaviconService::GetRawFavicon(
103 const GURL& icon_url, 123 const GURL& icon_url,
104 favicon_base::IconType icon_type, 124 favicon_base::IconType icon_type,
105 int desired_size_in_dip, 125 int desired_size_in_dip,
106 ui::ScaleFactor desired_scale_factor, 126 ui::ScaleFactor desired_scale_factor,
107 const favicon_base::FaviconRawBitmapCallback& callback, 127 const favicon_base::FaviconRawBitmapCallback& callback,
108 base::CancelableTaskTracker* tracker) { 128 base::CancelableTaskTracker* tracker) {
129 int desired_size_in_pixel =
130 GetSizeInPixel(desired_size_in_dip, desired_scale_factor);
109 favicon_base::FaviconResultsCallback callback_runner = 131 favicon_base::FaviconResultsCallback callback_runner =
110 Bind(&FaviconService::RunFaviconRawBitmapCallbackWithBitmapResults, 132 Bind(&FaviconService::RunFaviconRawBitmapCallbackWithBitmapResults,
111 base::Unretained(this), 133 base::Unretained(this),
112 callback, 134 callback,
113 desired_size_in_dip, 135 desired_size_in_pixel);
114 desired_scale_factor);
115 136
116 if (history_service_) { 137 if (history_service_) {
117 std::vector<GURL> icon_urls; 138 std::vector<GURL> icon_urls;
118 icon_urls.push_back(icon_url); 139 icon_urls.push_back(icon_url);
119 std::vector<ui::ScaleFactor> desired_scale_factors; 140 std::vector<int> desired_sizes_in_pixel;
120 desired_scale_factors.push_back(desired_scale_factor); 141 desired_sizes_in_pixel.push_back(desired_size_in_pixel);
121 142
122 return history_service_->GetFavicons( 143 return history_service_->GetFavicons(
123 icon_urls, icon_type, desired_size_in_dip, desired_scale_factors, 144 icon_urls, icon_type, desired_sizes_in_pixel, callback_runner, tracker);
124 callback_runner, tracker);
125 } 145 }
126 return RunWithEmptyResultAsync(callback_runner, tracker); 146 return RunWithEmptyResultAsync(callback_runner, tracker);
127 } 147 }
128 148
129 base::CancelableTaskTracker::TaskId FaviconService::GetFavicon( 149 base::CancelableTaskTracker::TaskId FaviconService::GetFavicon(
130 const GURL& icon_url, 150 const GURL& icon_url,
131 favicon_base::IconType icon_type, 151 favicon_base::IconType icon_type,
132 int desired_size_in_dip, 152 int desired_size_in_dip,
133 const favicon_base::FaviconResultsCallback& callback, 153 const favicon_base::FaviconResultsCallback& callback,
134 base::CancelableTaskTracker* tracker) { 154 base::CancelableTaskTracker* tracker) {
135 if (history_service_) { 155 if (history_service_) {
136 std::vector<GURL> icon_urls; 156 std::vector<GURL> icon_urls;
137 icon_urls.push_back(icon_url); 157 icon_urls.push_back(icon_url);
138 return history_service_->GetFavicons(icon_urls, 158 return history_service_->GetFavicons(
139 icon_type, 159 icon_urls,
140 desired_size_in_dip, 160 icon_type,
141 favicon_base::GetFaviconScaleFactors(), 161 GetPixelSizesForFaviconScales(desired_size_in_dip),
142 callback, 162 callback,
143 tracker); 163 tracker);
144 } 164 }
145 return RunWithEmptyResultAsync(callback, tracker); 165 return RunWithEmptyResultAsync(callback, tracker);
146 } 166 }
147 167
148 base::CancelableTaskTracker::TaskId 168 base::CancelableTaskTracker::TaskId
149 FaviconService::UpdateFaviconMappingsAndFetch( 169 FaviconService::UpdateFaviconMappingsAndFetch(
150 const GURL& page_url, 170 const GURL& page_url,
151 const std::vector<GURL>& icon_urls, 171 const std::vector<GURL>& icon_urls,
152 int icon_types, 172 int icon_types,
153 int desired_size_in_dip, 173 int desired_size_in_dip,
154 const favicon_base::FaviconResultsCallback& callback, 174 const favicon_base::FaviconResultsCallback& callback,
155 base::CancelableTaskTracker* tracker) { 175 base::CancelableTaskTracker* tracker) {
156 if (history_service_) { 176 if (history_service_) {
157 return history_service_->UpdateFaviconMappingsAndFetch( 177 return history_service_->UpdateFaviconMappingsAndFetch(
158 page_url, 178 page_url,
159 icon_urls, 179 icon_urls,
160 icon_types, 180 icon_types,
161 desired_size_in_dip, 181 GetPixelSizesForFaviconScales(desired_size_in_dip),
162 favicon_base::GetFaviconScaleFactors(),
163 callback, 182 callback,
164 tracker); 183 tracker);
165 } 184 }
166 return RunWithEmptyResultAsync(callback, tracker); 185 return RunWithEmptyResultAsync(callback, tracker);
167 } 186 }
168 187
169 base::CancelableTaskTracker::TaskId FaviconService::GetFaviconImageForPageURL( 188 base::CancelableTaskTracker::TaskId FaviconService::GetFaviconImageForPageURL(
170 const FaviconForPageURLParams& params, 189 const FaviconForPageURLParams& params,
171 const favicon_base::FaviconImageCallback& callback, 190 const favicon_base::FaviconImageCallback& callback,
172 base::CancelableTaskTracker* tracker) { 191 base::CancelableTaskTracker* tracker) {
173 return GetFaviconForPageURLImpl( 192 return GetFaviconForPageURLImpl(
174 params, 193 params,
175 favicon_base::GetFaviconScaleFactors(), 194 GetPixelSizesForFaviconScales(params.desired_size_in_dip),
176 Bind(&FaviconService::RunFaviconImageCallbackWithBitmapResults, 195 Bind(&FaviconService::RunFaviconImageCallbackWithBitmapResults,
177 base::Unretained(this), 196 base::Unretained(this),
178 callback, 197 callback,
179 params.desired_size_in_dip), 198 params.desired_size_in_dip),
180 tracker); 199 tracker);
181 } 200 }
182 201
183 base::CancelableTaskTracker::TaskId FaviconService::GetRawFaviconForPageURL( 202 base::CancelableTaskTracker::TaskId FaviconService::GetRawFaviconForPageURL(
184 const FaviconForPageURLParams& params, 203 const FaviconForPageURLParams& params,
185 ui::ScaleFactor desired_scale_factor, 204 ui::ScaleFactor desired_scale_factor,
186 const favicon_base::FaviconRawBitmapCallback& callback, 205 const favicon_base::FaviconRawBitmapCallback& callback,
187 base::CancelableTaskTracker* tracker) { 206 base::CancelableTaskTracker* tracker) {
188 std::vector<ui::ScaleFactor> desired_scale_factors; 207 int desired_size_in_pixel =
189 desired_scale_factors.push_back(desired_scale_factor); 208 GetSizeInPixel(params.desired_size_in_dip, desired_scale_factor);
209 std::vector<int> desired_sizes_in_pixel;
210 desired_sizes_in_pixel.push_back(desired_size_in_pixel);
190 return GetFaviconForPageURLImpl( 211 return GetFaviconForPageURLImpl(
191 params, 212 params,
192 desired_scale_factors, 213 desired_sizes_in_pixel,
193 Bind(&FaviconService::RunFaviconRawBitmapCallbackWithBitmapResults, 214 Bind(&FaviconService::RunFaviconRawBitmapCallbackWithBitmapResults,
194 base::Unretained(this), 215 base::Unretained(this),
195 callback, 216 callback,
196 params.desired_size_in_dip, 217 desired_size_in_pixel),
197 desired_scale_factor),
198 tracker); 218 tracker);
199 } 219 }
200 220
201 base::CancelableTaskTracker::TaskId 221 base::CancelableTaskTracker::TaskId
202 FaviconService::GetLargestRawFaviconForPageURL( 222 FaviconService::GetLargestRawFaviconForPageURL(
203 Profile* profile, 223 Profile* profile,
204 const GURL& page_url, 224 const GURL& page_url,
205 const std::vector<int>& icon_types, 225 const std::vector<int>& icon_types,
206 int minimum_size_in_pixels, 226 int minimum_size_in_pixels,
207 const favicon_base::FaviconRawBitmapCallback& callback, 227 const favicon_base::FaviconRawBitmapCallback& callback,
208 base::CancelableTaskTracker* tracker) { 228 base::CancelableTaskTracker* tracker) {
209 favicon_base::FaviconResultsCallback favicon_results_callback = 229 favicon_base::FaviconResultsCallback favicon_results_callback =
210 Bind(&FaviconService::RunFaviconRawBitmapCallbackWithBitmapResults, 230 Bind(&FaviconService::RunFaviconRawBitmapCallbackWithBitmapResults,
211 base::Unretained(this), 231 base::Unretained(this),
212 callback, 232 callback,
213 0, 233 0);
214 ui::ScaleFactor());
215 if (page_url.SchemeIs(content::kChromeUIScheme) || 234 if (page_url.SchemeIs(content::kChromeUIScheme) ||
216 page_url.SchemeIs(extensions::kExtensionScheme)) { 235 page_url.SchemeIs(extensions::kExtensionScheme)) {
217 std::vector<ui::ScaleFactor> scale_factor; 236 std::vector<int> desired_sizes_in_pixel;
218 scale_factor.push_back(ui::SCALE_FACTOR_100P); 237 desired_sizes_in_pixel.push_back(0);
219 return GetFaviconForChromeURL(profile, page_url, scale_factor, 238 return GetFaviconForChromeURL(profile, page_url, desired_sizes_in_pixel,
220 favicon_results_callback, tracker); 239 favicon_results_callback, tracker);
221 } 240 }
222 if (history_service_) { 241 if (history_service_) {
223 return history_service_->GetLargestFaviconForURL(page_url, icon_types, 242 return history_service_->GetLargestFaviconForURL(page_url, icon_types,
224 minimum_size_in_pixels, callback, tracker); 243 minimum_size_in_pixels, callback, tracker);
225 } 244 }
226 return RunWithEmptyResultAsync(favicon_results_callback, tracker); 245 return RunWithEmptyResultAsync(favicon_results_callback, tracker);
227 } 246 }
228 247
229 base::CancelableTaskTracker::TaskId FaviconService::GetFaviconForPageURL( 248 base::CancelableTaskTracker::TaskId FaviconService::GetFaviconForPageURL(
230 const FaviconForPageURLParams& params, 249 const FaviconForPageURLParams& params,
231 const favicon_base::FaviconResultsCallback& callback, 250 const favicon_base::FaviconResultsCallback& callback,
232 base::CancelableTaskTracker* tracker) { 251 base::CancelableTaskTracker* tracker) {
233 return GetFaviconForPageURLImpl( 252 return GetFaviconForPageURLImpl(
234 params, favicon_base::GetFaviconScaleFactors(), callback, tracker); 253 params,
254 GetPixelSizesForFaviconScales(params.desired_size_in_dip),
255 callback,
256 tracker);
235 } 257 }
236 258
237 base::CancelableTaskTracker::TaskId FaviconService::GetLargestRawFaviconForID( 259 base::CancelableTaskTracker::TaskId FaviconService::GetLargestRawFaviconForID(
238 favicon_base::FaviconID favicon_id, 260 favicon_base::FaviconID favicon_id,
239 const favicon_base::FaviconRawBitmapCallback& callback, 261 const favicon_base::FaviconRawBitmapCallback& callback,
240 base::CancelableTaskTracker* tracker) { 262 base::CancelableTaskTracker* tracker) {
241 // Use 0 as |desired_size_in_dip| to get the largest bitmap for |favicon_id| 263 // Use 0 as |desired_size| to get the largest bitmap for |favicon_id| without
242 // without any resizing. 264 // any resizing.
243 int desired_size_in_dip = 0; 265 int desired_size = 0;
244 ui::ScaleFactor desired_scale_factor = ui::SCALE_FACTOR_100P;
245 favicon_base::FaviconResultsCallback callback_runner = 266 favicon_base::FaviconResultsCallback callback_runner =
246 Bind(&FaviconService::RunFaviconRawBitmapCallbackWithBitmapResults, 267 Bind(&FaviconService::RunFaviconRawBitmapCallbackWithBitmapResults,
247 base::Unretained(this), 268 base::Unretained(this),
248 callback, 269 callback,
249 desired_size_in_dip, 270 desired_size);
250 desired_scale_factor);
251 271
252 if (history_service_) { 272 if (history_service_) {
253 return history_service_->GetFaviconForID( 273 return history_service_->GetFaviconForID(
254 favicon_id, desired_size_in_dip, desired_scale_factor, 274 favicon_id, desired_size, callback_runner, tracker);
255 callback_runner, tracker);
256 } 275 }
257 return RunWithEmptyResultAsync(callback_runner, tracker); 276 return RunWithEmptyResultAsync(callback_runner, tracker);
258 } 277 }
259 278
260 void FaviconService::SetFaviconOutOfDateForPage(const GURL& page_url) { 279 void FaviconService::SetFaviconOutOfDateForPage(const GURL& page_url) {
261 if (history_service_) 280 if (history_service_)
262 history_service_->SetFaviconsOutOfDateForPage(page_url); 281 history_service_->SetFaviconsOutOfDateForPage(page_url);
263 } 282 }
264 283
265 void FaviconService::CloneFavicon(const GURL& old_page_url, 284 void FaviconService::CloneFavicon(const GURL& old_page_url,
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
328 } 347 }
329 348
330 void FaviconService::ClearUnableToDownloadFavicons() { 349 void FaviconService::ClearUnableToDownloadFavicons() {
331 missing_favicon_urls_.clear(); 350 missing_favicon_urls_.clear();
332 } 351 }
333 352
334 FaviconService::~FaviconService() {} 353 FaviconService::~FaviconService() {}
335 354
336 base::CancelableTaskTracker::TaskId FaviconService::GetFaviconForPageURLImpl( 355 base::CancelableTaskTracker::TaskId FaviconService::GetFaviconForPageURLImpl(
337 const FaviconForPageURLParams& params, 356 const FaviconForPageURLParams& params,
338 const std::vector<ui::ScaleFactor>& desired_scale_factors, 357 const std::vector<int>& desired_sizes_in_pixel,
339 const favicon_base::FaviconResultsCallback& callback, 358 const favicon_base::FaviconResultsCallback& callback,
340 base::CancelableTaskTracker* tracker) { 359 base::CancelableTaskTracker* tracker) {
341 if (params.page_url.SchemeIs(content::kChromeUIScheme) || 360 if (params.page_url.SchemeIs(content::kChromeUIScheme) ||
342 params.page_url.SchemeIs(extensions::kExtensionScheme)) { 361 params.page_url.SchemeIs(extensions::kExtensionScheme)) {
343 return GetFaviconForChromeURL(profile_, params.page_url, 362 return GetFaviconForChromeURL(profile_, params.page_url,
344 desired_scale_factors, callback, tracker); 363 desired_sizes_in_pixel, callback, tracker);
345 } 364 }
346 if (history_service_) { 365 if (history_service_) {
347 return history_service_->GetFaviconsForURL(params.page_url, 366 return history_service_->GetFaviconsForURL(params.page_url,
348 params.icon_types, 367 params.icon_types,
349 params.desired_size_in_dip, 368 desired_sizes_in_pixel,
350 desired_scale_factors,
351 callback, 369 callback,
352 tracker); 370 tracker);
353 } 371 }
354 return RunWithEmptyResultAsync(callback, tracker); 372 return RunWithEmptyResultAsync(callback, tracker);
355 } 373 }
356 374
357 void FaviconService::RunFaviconImageCallbackWithBitmapResults( 375 void FaviconService::RunFaviconImageCallbackWithBitmapResults(
358 const favicon_base::FaviconImageCallback& callback, 376 const favicon_base::FaviconImageCallback& callback,
359 int desired_size_in_dip, 377 int desired_size_in_dip,
360 const std::vector<favicon_base::FaviconRawBitmapResult>& 378 const std::vector<favicon_base::FaviconRawBitmapResult>&
361 favicon_bitmap_results) { 379 favicon_bitmap_results) {
362 favicon_base::FaviconImageResult image_result; 380 favicon_base::FaviconImageResult image_result;
363 image_result.image = favicon_base::SelectFaviconFramesFromPNGs( 381 image_result.image = favicon_base::SelectFaviconFramesFromPNGs(
364 favicon_bitmap_results, 382 favicon_bitmap_results,
365 favicon_base::GetFaviconScaleFactors(), 383 favicon_base::GetFaviconScaleFactors(),
366 desired_size_in_dip); 384 desired_size_in_dip);
367 favicon_base::SetFaviconColorSpace(&image_result.image); 385 favicon_base::SetFaviconColorSpace(&image_result.image);
368 386
369 image_result.icon_url = image_result.image.IsEmpty() ? 387 image_result.icon_url = image_result.image.IsEmpty() ?
370 GURL() : favicon_bitmap_results[0].icon_url; 388 GURL() : favicon_bitmap_results[0].icon_url;
371 callback.Run(image_result); 389 callback.Run(image_result);
372 } 390 }
373 391
374 void FaviconService::RunFaviconRawBitmapCallbackWithBitmapResults( 392 void FaviconService::RunFaviconRawBitmapCallbackWithBitmapResults(
375 const favicon_base::FaviconRawBitmapCallback& callback, 393 const favicon_base::FaviconRawBitmapCallback& callback,
376 int desired_size_in_dip, 394 int desired_size_in_pixel,
377 ui::ScaleFactor desired_scale_factor,
378 const std::vector<favicon_base::FaviconRawBitmapResult>& 395 const std::vector<favicon_base::FaviconRawBitmapResult>&
379 favicon_bitmap_results) { 396 favicon_bitmap_results) {
380 if (favicon_bitmap_results.empty() || !favicon_bitmap_results[0].is_valid()) { 397 if (favicon_bitmap_results.empty() || !favicon_bitmap_results[0].is_valid()) {
381 callback.Run(favicon_base::FaviconRawBitmapResult()); 398 callback.Run(favicon_base::FaviconRawBitmapResult());
382 return; 399 return;
383 } 400 }
384 401
385 DCHECK_EQ(1u, favicon_bitmap_results.size()); 402 DCHECK_EQ(1u, favicon_bitmap_results.size());
386 favicon_base::FaviconRawBitmapResult bitmap_result = 403 favicon_base::FaviconRawBitmapResult bitmap_result =
387 favicon_bitmap_results[0]; 404 favicon_bitmap_results[0];
388 405
389 // If the desired size is 0, SelectFaviconFrames() will return the largest 406 // If the desired size is 0, SelectFaviconFrames() will return the largest
390 // bitmap without doing any resizing. As |favicon_bitmap_results| has bitmap 407 // bitmap without doing any resizing. As |favicon_bitmap_results| has bitmap
391 // data for a single bitmap, return it and avoid an unnecessary decode. 408 // data for a single bitmap, return it and avoid an unnecessary decode.
392 if (desired_size_in_dip == 0) { 409 if (desired_size_in_pixel == 0) {
393 callback.Run(bitmap_result); 410 callback.Run(bitmap_result);
394 return; 411 return;
395 } 412 }
396 413
397 // If history bitmap is already desired pixel size, return early. 414 // If history bitmap is already desired pixel size, return early.
398 float desired_scale = ui::GetScaleForScaleFactor(desired_scale_factor); 415 if (bitmap_result.pixel_size.width() == desired_size_in_pixel &&
399 int desired_edge_width_in_pixel = static_cast<int>( 416 bitmap_result.pixel_size.height() == desired_size_in_pixel) {
400 desired_size_in_dip * desired_scale + 0.5f);
401
402 gfx::Size desired_size_in_pixel(desired_edge_width_in_pixel,
403 desired_edge_width_in_pixel);
404 if (bitmap_result.pixel_size == desired_size_in_pixel) {
405 callback.Run(bitmap_result); 417 callback.Run(bitmap_result);
406 return; 418 return;
407 } 419 }
408 420
409 // Convert raw bytes to SkBitmap, resize via SelectFaviconFrames(), then 421 // Convert raw bytes to SkBitmap, resize via SelectFaviconFrames(), then
410 // convert back. 422 // convert back.
411 std::vector<ui::ScaleFactor> desired_scale_factors; 423 std::vector<ui::ScaleFactor> desired_scale_factors;
412 desired_scale_factors.push_back(desired_scale_factor); 424 desired_scale_factors.push_back(ui::SCALE_FACTOR_100P);
413 gfx::Image resized_image = favicon_base::SelectFaviconFramesFromPNGs( 425 gfx::Image resized_image = favicon_base::SelectFaviconFramesFromPNGs(
414 favicon_bitmap_results, desired_scale_factors, desired_size_in_dip); 426 favicon_bitmap_results, desired_scale_factors, desired_size_in_pixel);
415 427
416 std::vector<unsigned char> resized_bitmap_data; 428 std::vector<unsigned char> resized_bitmap_data;
417 if (!gfx::PNGCodec::EncodeBGRASkBitmap(resized_image.AsBitmap(), false, 429 if (!gfx::PNGCodec::EncodeBGRASkBitmap(resized_image.AsBitmap(), false,
418 &resized_bitmap_data)) { 430 &resized_bitmap_data)) {
419 callback.Run(favicon_base::FaviconRawBitmapResult()); 431 callback.Run(favicon_base::FaviconRawBitmapResult());
420 return; 432 return;
421 } 433 }
422 434
423 bitmap_result.bitmap_data = base::RefCountedBytes::TakeVector( 435 bitmap_result.bitmap_data = base::RefCountedBytes::TakeVector(
424 &resized_bitmap_data); 436 &resized_bitmap_data);
425 callback.Run(bitmap_result); 437 callback.Run(bitmap_result);
426 } 438 }
OLDNEW
« no previous file with comments | « chrome/browser/favicon/favicon_service.h ('k') | chrome/browser/history/history_backend.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698