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..9e66071c831573b0a1ba5886ff82feec3d9c7e39 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; |
@@ -278,3 +249,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; |
+ } |
+} |