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