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

Unified Diff: components/favicon_base/select_favicon_frames.cc

Issue 2739173002: Always select best favicon bitmap (Closed)
Patch Set: WIP. Created 3 years, 9 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 side-by-side diff with in-line comments
Download patch
Index: components/favicon_base/select_favicon_frames.cc
diff --git a/components/favicon_base/select_favicon_frames.cc b/components/favicon_base/select_favicon_frames.cc
index 82b44baa6f607c6d641784d9a8fc91d6759ad438..2272f1c5ca77c1da32a2d1461384a2a769d8e369 100644
--- a/components/favicon_base/select_favicon_frames.cc
+++ b/components/favicon_base/select_favicon_frames.cc
@@ -55,40 +55,11 @@ size_t GetCandidateIndexWithBestScore(
float* score) {
DCHECK_NE(desired_size, 0);
- // Try to find an exact match.
- for (size_t i = 0; i < candidate_sizes.size(); ++i) {
- if (candidate_sizes[i].width() == desired_size &&
- candidate_sizes[i].height() == desired_size) {
- *score = 1;
- return i;
- }
- }
-
- // Huge favicon bitmaps often have a completely different visual style from
- // smaller favicon bitmaps. Avoid them.
- const int kHugeEdgeSize = desired_size * 8;
-
- // Order of preference:
- // 1) Bitmaps with width and height smaller than |kHugeEdgeSize|.
- // 2) Bitmaps which need to be scaled down instead of up.
- // 3) Bitmaps which do not need to be scaled as much.
size_t candidate_index = std::numeric_limits<size_t>::max();
float candidate_score = 0;
- for (size_t i = 0; i < candidate_sizes.size(); ++i) {
- float average_edge =
- (candidate_sizes[i].width() + candidate_sizes[i].height()) / 2.0f;
-
- float score = 0;
- if (candidate_sizes[i].width() >= kHugeEdgeSize ||
- candidate_sizes[i].height() >= kHugeEdgeSize) {
- score = std::min(1.0f, desired_size / average_edge) * 0.01f;
- } else if (candidate_sizes[i].width() >= desired_size &&
- candidate_sizes[i].height() >= desired_size) {
- score = desired_size / average_edge * 0.01f + 0.15f;
- } else {
- score = std::min(1.0f, average_edge / desired_size) * 0.01f + 0.1f;
- }
-
+ for (size_t i = 0; i < candidate_sizes.size() && candidate_score != 1.0f;
+ ++i) {
+ float score = GetFaviconCandidateScore(candidate_sizes[i], desired_size);
if (candidate_index == std::numeric_limits<size_t>::max() ||
score > candidate_score) {
candidate_index = i;
@@ -257,6 +228,45 @@ gfx::ImageSkia CreateFaviconImageSkia(
gfx::Size(desired_size_in_dip, desired_size_in_dip));
}
+gfx::ImageSkia CreateFaviconImageSkiaWithScaleFactors(
+ const std::vector<SkBitmap>& bitmaps,
+ const std::vector<gfx::Size>& original_sizes,
+ const std::vector<float>& desired_scale_factors,
+ int desired_size_in_dip) {
+ std::vector<int> desired_sizes;
+ std::vector<float> scale_factors = desired_scale_factors;
+
+ for (size_t i = 0; i < desired_scale_factors.size(); ++i) {
+ if (desired_scale_factors[i] == 0) {
+ desired_sizes.push_back(original_sizes[i].width());
+ scale_factors[i] = 1.0f * desired_sizes.back() / desired_size_in_dip;
+ } else {
+ desired_sizes.push_back(static_cast<int>(
+ ceil(desired_size_in_dip * desired_scale_factors[i])));
+ }
+ }
+
+ std::vector<SelectionResult> results;
+ // TODO(mastiz) / DONOTSUBMIT: Why is this actually needed? FaviconHandler
+ // should have selected the correct bitmaps.
+ GetCandidateIndicesWithBestScores(original_sizes, desired_sizes,
+ /*score=*/nullptr, &results);
+ if (results.size() == 0)
+ return gfx::ImageSkia();
+
+ FaviconImageSource* image_source = new FaviconImageSource;
+
+ for (size_t i = 0; i < results.size(); ++i) {
+ size_t index = results[i].index;
+ image_source->AddImageSkiaRep(gfx::ImageSkiaRep(
+ GetResizedBitmap(bitmaps[index], original_sizes[index],
+ desired_sizes[i]),
+ scale_factors[i]));
+ }
+ return gfx::ImageSkia(image_source,
+ gfx::Size(desired_size_in_dip, desired_size_in_dip));
+}
+
void SelectFaviconFrameIndices(const std::vector<gfx::Size>& frame_pixel_sizes,
const std::vector<int>& desired_sizes,
std::vector<size_t>* best_indices,
@@ -278,3 +288,25 @@ void SelectFaviconFrameIndices(const std::vector<gfx::Size>& frame_pixel_sizes,
}
}
}
+
+float GetFaviconCandidateScore(const gfx::Size& candidate_size,
+ int desired_size) {
+ // Huge favicon bitmaps often have a completely different visual style from
+ // smaller favicon bitmaps. Avoid them.
+ const int kHugeEdgeSize = desired_size * 8;
+
+ float average_edge =
+ (candidate_size.width() + candidate_size.height()) / 2.0f;
+ if (candidate_size.width() == desired_size &&
+ candidate_size.height() == desired_size) {
+ return 1.0f;
+ } else if (candidate_size.width() >= kHugeEdgeSize ||
+ candidate_size.height() >= kHugeEdgeSize) {
+ return std::min(1.0f, desired_size / average_edge) * 0.01f;
+ } else if (candidate_size.width() >= desired_size &&
+ candidate_size.height() >= desired_size) {
+ return desired_size / average_edge * 0.01f + 0.15f;
+ } else {
+ return std::min(1.0f, average_edge / desired_size) * 0.01f + 0.1f;
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698