| 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;
|
| + }
|
| +}
|
|
|