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

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

Issue 10802066: Adds support for saving favicon size into history database. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Changes as requested Created 8 years, 3 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
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/select_favicon_frames.h" 5 #include "chrome/browser/favicon/select_favicon_frames.h"
6 6
7 #include "skia/ext/image_operations.h" 7 #include "skia/ext/image_operations.h"
8 #include "third_party/skia/include/core/SkCanvas.h" 8 #include "third_party/skia/include/core/SkCanvas.h"
9 #include "ui/gfx/image/image.h" 9 #include "ui/gfx/image/image.h"
10 #include "ui/gfx/image/image_skia.h" 10 #include "ui/gfx/image/image_skia.h"
11 #include "ui/gfx/size.h" 11 #include "ui/gfx/size.h"
12 12
13 namespace { 13 namespace {
14 14
15 void SizesFromBitmaps(const std::vector<SkBitmap>& bitmaps, 15 void SizesFromBitmaps(const std::vector<SkBitmap>& bitmaps,
16 std::vector<gfx::Size>* sizes) { 16 std::vector<gfx::Size>* sizes) {
17 for (size_t i = 0; i < bitmaps.size(); ++i) 17 for (size_t i = 0; i < bitmaps.size(); ++i)
18 sizes->push_back(gfx::Size(bitmaps[i].width(), bitmaps[i].height())); 18 sizes->push_back(gfx::Size(bitmaps[i].width(), bitmaps[i].height()));
19 } 19 }
20 20
21 void SizesFromFaviconBitmapIDSizes(
22 const std::vector<history::FaviconBitmapIDSize>& bitmap_id_sizes,
23 std::vector<gfx::Size>* sizes) {
24 for (size_t i = 0; i < bitmap_id_sizes.size(); ++i)
25 sizes->push_back(bitmap_id_sizes[i].pixel_size);
26 }
27
21 size_t BiggestCandidate(const std::vector<gfx::Size>& candidate_sizes) { 28 size_t BiggestCandidate(const std::vector<gfx::Size>& candidate_sizes) {
22 size_t max_index = 0; 29 size_t max_index = 0;
23 int max_area = candidate_sizes[0].GetArea(); 30 int max_area = candidate_sizes[0].GetArea();
24 for (size_t i = 1; i < candidate_sizes.size(); ++i) { 31 for (size_t i = 1; i < candidate_sizes.size(); ++i) {
25 int area = candidate_sizes[i].GetArea(); 32 int area = candidate_sizes[i].GetArea();
26 if (area > max_area) { 33 if (area > max_area) {
27 max_area = area; 34 max_area = area;
28 max_index = i; 35 max_index = i;
29 } 36 }
30 } 37 }
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
132 } 139 }
133 } 140 }
134 *score = 0.1f; 141 *score = 0.1f;
135 // c) Else, from the biggest smaller variant. 142 // c) Else, from the biggest smaller variant.
136 if (candidate_index == -1) { 143 if (candidate_index == -1) {
137 *score = 0; 144 *score = 0;
138 candidate_index = BiggestCandidate(candidate_sizes); 145 candidate_index = BiggestCandidate(candidate_sizes);
139 } 146 }
140 147
141 const gfx::Size& candidate_size = candidate_sizes[candidate_index]; 148 const gfx::Size& candidate_size = candidate_sizes[candidate_index];
142 bool is_integer_multiple = desired_size % candidate_size.width() == 0 && 149 if (candidate_size.IsEmpty()) {
143 desired_size % candidate_size.height() == 0; 150 *resize_method = NONE;
144 *resize_method = is_integer_multiple ? SAMPLE_NEAREST_NEIGHBOUR : LANCZOS; 151 } else if (desired_size % candidate_size.width() == 0 &&
152 desired_size % candidate_size.height() == 0) {
153 *resize_method = SAMPLE_NEAREST_NEIGHBOUR;
154 } else {
155 *resize_method = LANCZOS;
156 }
145 return candidate_index; 157 return candidate_index;
146 } 158 }
147 159
148 // Represents the index of the best candidate for a |scale_factor| from the 160 // Represents the index of the best candidate for a |scale_factor| from the
149 // |candidate_sizes| passed into GetCandidateIndicesWithBestScores(). 161 // |candidate_sizes| passed into GetCandidateIndicesWithBestScores().
150 struct SelectionResult { 162 struct SelectionResult {
151 // index in |candidate_sizes| of the best candidate. 163 // index in |candidate_sizes| of the best candidate.
152 size_t index; 164 size_t index;
153 165
154 // The ScaleFactor for which |index| is the best candidate. 166 // The ScaleFactor for which |index| is the best candidate.
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
239 gfx::ImageSkia multi_image; 251 gfx::ImageSkia multi_image;
240 for (size_t i = 0; i < results.size(); ++i) { 252 for (size_t i = 0; i < results.size(); ++i) {
241 const SelectionResult& result = results[i]; 253 const SelectionResult& result = results[i];
242 SkBitmap resized_bitmap = GetResizedBitmap(bitmaps[result.index], 254 SkBitmap resized_bitmap = GetResizedBitmap(bitmaps[result.index],
243 desired_size, result.scale_factor, result.resize_method); 255 desired_size, result.scale_factor, result.resize_method);
244 multi_image.AddRepresentation( 256 multi_image.AddRepresentation(
245 gfx::ImageSkiaRep(resized_bitmap, result.scale_factor)); 257 gfx::ImageSkiaRep(resized_bitmap, result.scale_factor));
246 } 258 }
247 return multi_image; 259 return multi_image;
248 } 260 }
261
262 void SelectFaviconBitmapIDs(
263 const std::vector<history::FaviconBitmapIDSize>& bitmap_id_sizes,
264 const std::vector<ui::ScaleFactor>& scale_factors,
265 int desired_size,
266 std::vector<history::FaviconBitmapID>* filtered_favicon_bitmap_ids,
267 float* match_score) {
268 std::vector<gfx::Size> candidate_sizes;
269 SizesFromFaviconBitmapIDSizes(bitmap_id_sizes, &candidate_sizes);
270
271 std::vector<SelectionResult> results;
272 GetCandidateIndicesWithBestScores(candidate_sizes, scale_factors,
273 desired_size, match_score, &results);
274
275 std::set<history::FaviconBitmapID> already_added;
276 for (size_t i = 0; i < results.size(); ++i) {
277 const SelectionResult& result = results[i];
278 history::FaviconBitmapID bitmap_id =
279 bitmap_id_sizes[result.index].bitmap_id;
280 if (already_added.find(bitmap_id) == already_added.end()) {
281 already_added.insert(bitmap_id);
282 filtered_favicon_bitmap_ids->push_back(bitmap_id);
283 }
284 }
285 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698