Index: chrome/browser/favicon/favicon_service.cc |
diff --git a/chrome/browser/favicon/favicon_service.cc b/chrome/browser/favicon/favicon_service.cc |
index 5d4763e77e597223cf4709b5f8665bd61a02fdb2..77c5f99b5e7fadf98d4e2dbf80ee5c7e38ea70e8 100644 |
--- a/chrome/browser/favicon/favicon_service.cc |
+++ b/chrome/browser/favicon/favicon_service.cc |
@@ -4,6 +4,8 @@ |
#include "chrome/browser/favicon/favicon_service.h" |
+#include <cmath> |
+ |
#include "base/hash.h" |
#include "base/message_loop/message_loop_proxy.h" |
#include "chrome/browser/history/history_backend.h" |
@@ -49,7 +51,7 @@ base::CancelableTaskTracker::TaskId RunWithEmptyResultAsync( |
base::CancelableTaskTracker::TaskId GetFaviconForChromeURL( |
Profile* profile, |
const GURL& page_url, |
- const std::vector<ui::ScaleFactor>& desired_scale_factors, |
+ const std::vector<int>& desired_sizes_in_pixel, |
const favicon_base::FaviconResultsCallback& callback, |
base::CancelableTaskTracker* tracker) { |
base::CancelableTaskTracker::IsCanceledCallback is_canceled_cb; |
@@ -58,10 +60,28 @@ base::CancelableTaskTracker::TaskId GetFaviconForChromeURL( |
favicon_base::FaviconResultsCallback cancelable_cb = |
Bind(&CancelOrRunFaviconResultsCallback, is_canceled_cb, callback); |
ChromeWebUIControllerFactory::GetInstance()->GetFaviconForURL(profile, |
- page_url, desired_scale_factors, cancelable_cb); |
+ page_url, desired_sizes_in_pixel, cancelable_cb); |
return id; |
} |
+// Returns the size in pixel that a favicon should be based on |size_in_dip| |
+// and |scale_factor|. |
+int GetSizeInPixel(int size_in_dip, ui::ScaleFactor scale_factor) { |
+ return ceil(size_in_dip * ui::GetScaleForScaleFactor(scale_factor)); |
+} |
+ |
+// Returns a vector of pixel edge sizes from |size_in_dip| and |
+// favicon_base::GetFaviconScaleFactors(). |
+std::vector<int> GetPixelSizesForFaviconScales(int size_in_dip) { |
+ std::vector<ui::ScaleFactor> scale_factors = |
+ favicon_base::GetFaviconScaleFactors(); |
+ std::vector<int> sizes_in_pixel; |
+ for (size_t i = 0; i < scale_factors.size(); ++i) { |
+ sizes_in_pixel.push_back(GetSizeInPixel(size_in_dip, scale_factors[i])); |
+ } |
+ return sizes_in_pixel; |
+} |
+ |
} // namespace |
FaviconService::FaviconService(Profile* profile) |
@@ -89,12 +109,12 @@ base::CancelableTaskTracker::TaskId FaviconService::GetFaviconImage( |
if (history_service_) { |
std::vector<GURL> icon_urls; |
icon_urls.push_back(icon_url); |
- return history_service_->GetFavicons(icon_urls, |
- icon_type, |
- desired_size_in_dip, |
- favicon_base::GetFaviconScaleFactors(), |
- callback_runner, |
- tracker); |
+ return history_service_->GetFavicons( |
+ icon_urls, |
+ icon_type, |
+ GetPixelSizesForFaviconScales(desired_size_in_dip), |
+ callback_runner, |
+ tracker); |
} |
return RunWithEmptyResultAsync(callback_runner, tracker); |
} |
@@ -106,22 +126,22 @@ base::CancelableTaskTracker::TaskId FaviconService::GetRawFavicon( |
ui::ScaleFactor desired_scale_factor, |
const favicon_base::FaviconRawBitmapCallback& callback, |
base::CancelableTaskTracker* tracker) { |
+ int desired_size_in_pixel = |
+ GetSizeInPixel(desired_size_in_dip, desired_scale_factor); |
favicon_base::FaviconResultsCallback callback_runner = |
Bind(&FaviconService::RunFaviconRawBitmapCallbackWithBitmapResults, |
base::Unretained(this), |
callback, |
- desired_size_in_dip, |
- desired_scale_factor); |
+ desired_size_in_pixel); |
if (history_service_) { |
std::vector<GURL> icon_urls; |
icon_urls.push_back(icon_url); |
- std::vector<ui::ScaleFactor> desired_scale_factors; |
- desired_scale_factors.push_back(desired_scale_factor); |
+ std::vector<int> desired_sizes_in_pixel; |
+ desired_sizes_in_pixel.push_back(desired_size_in_pixel); |
return history_service_->GetFavicons( |
- icon_urls, icon_type, desired_size_in_dip, desired_scale_factors, |
- callback_runner, tracker); |
+ icon_urls, icon_type, desired_sizes_in_pixel, callback_runner, tracker); |
} |
return RunWithEmptyResultAsync(callback_runner, tracker); |
} |
@@ -135,12 +155,12 @@ base::CancelableTaskTracker::TaskId FaviconService::GetFavicon( |
if (history_service_) { |
std::vector<GURL> icon_urls; |
icon_urls.push_back(icon_url); |
- return history_service_->GetFavicons(icon_urls, |
- icon_type, |
- desired_size_in_dip, |
- favicon_base::GetFaviconScaleFactors(), |
- callback, |
- tracker); |
+ return history_service_->GetFavicons( |
+ icon_urls, |
+ icon_type, |
+ GetPixelSizesForFaviconScales(desired_size_in_dip), |
+ callback, |
+ tracker); |
} |
return RunWithEmptyResultAsync(callback, tracker); |
} |
@@ -158,8 +178,7 @@ FaviconService::UpdateFaviconMappingsAndFetch( |
page_url, |
icon_urls, |
icon_types, |
- desired_size_in_dip, |
- favicon_base::GetFaviconScaleFactors(), |
+ GetPixelSizesForFaviconScales(desired_size_in_dip), |
callback, |
tracker); |
} |
@@ -172,7 +191,7 @@ base::CancelableTaskTracker::TaskId FaviconService::GetFaviconImageForPageURL( |
base::CancelableTaskTracker* tracker) { |
return GetFaviconForPageURLImpl( |
params, |
- favicon_base::GetFaviconScaleFactors(), |
+ GetPixelSizesForFaviconScales(params.desired_size_in_dip), |
Bind(&FaviconService::RunFaviconImageCallbackWithBitmapResults, |
base::Unretained(this), |
callback, |
@@ -185,16 +204,17 @@ base::CancelableTaskTracker::TaskId FaviconService::GetRawFaviconForPageURL( |
ui::ScaleFactor desired_scale_factor, |
const favicon_base::FaviconRawBitmapCallback& callback, |
base::CancelableTaskTracker* tracker) { |
- std::vector<ui::ScaleFactor> desired_scale_factors; |
- desired_scale_factors.push_back(desired_scale_factor); |
+ int desired_size_in_pixel = |
+ GetSizeInPixel(params.desired_size_in_dip, desired_scale_factor); |
+ std::vector<int> desired_sizes_in_pixel; |
+ desired_sizes_in_pixel.push_back(desired_size_in_pixel); |
return GetFaviconForPageURLImpl( |
params, |
- desired_scale_factors, |
+ desired_sizes_in_pixel, |
Bind(&FaviconService::RunFaviconRawBitmapCallbackWithBitmapResults, |
base::Unretained(this), |
callback, |
- params.desired_size_in_dip, |
- desired_scale_factor), |
+ desired_size_in_pixel), |
tracker); |
} |
@@ -210,13 +230,12 @@ FaviconService::GetLargestRawFaviconForPageURL( |
Bind(&FaviconService::RunFaviconRawBitmapCallbackWithBitmapResults, |
base::Unretained(this), |
callback, |
- 0, |
- ui::ScaleFactor()); |
+ 0); |
if (page_url.SchemeIs(content::kChromeUIScheme) || |
page_url.SchemeIs(extensions::kExtensionScheme)) { |
- std::vector<ui::ScaleFactor> scale_factor; |
- scale_factor.push_back(ui::SCALE_FACTOR_100P); |
- return GetFaviconForChromeURL(profile, page_url, scale_factor, |
+ std::vector<int> desired_sizes_in_pixel; |
+ desired_sizes_in_pixel.push_back(0); |
+ return GetFaviconForChromeURL(profile, page_url, desired_sizes_in_pixel, |
favicon_results_callback, tracker); |
} |
if (history_service_) { |
@@ -231,28 +250,28 @@ base::CancelableTaskTracker::TaskId FaviconService::GetFaviconForPageURL( |
const favicon_base::FaviconResultsCallback& callback, |
base::CancelableTaskTracker* tracker) { |
return GetFaviconForPageURLImpl( |
- params, favicon_base::GetFaviconScaleFactors(), callback, tracker); |
+ params, |
+ GetPixelSizesForFaviconScales(params.desired_size_in_dip), |
+ callback, |
+ tracker); |
} |
base::CancelableTaskTracker::TaskId FaviconService::GetLargestRawFaviconForID( |
favicon_base::FaviconID favicon_id, |
const favicon_base::FaviconRawBitmapCallback& callback, |
base::CancelableTaskTracker* tracker) { |
- // Use 0 as |desired_size_in_dip| to get the largest bitmap for |favicon_id| |
- // without any resizing. |
- int desired_size_in_dip = 0; |
- ui::ScaleFactor desired_scale_factor = ui::SCALE_FACTOR_100P; |
+ // Use 0 as |desired_size| to get the largest bitmap for |favicon_id| without |
+ // any resizing. |
+ int desired_size = 0; |
favicon_base::FaviconResultsCallback callback_runner = |
Bind(&FaviconService::RunFaviconRawBitmapCallbackWithBitmapResults, |
base::Unretained(this), |
callback, |
- desired_size_in_dip, |
- desired_scale_factor); |
+ desired_size); |
if (history_service_) { |
return history_service_->GetFaviconForID( |
- favicon_id, desired_size_in_dip, desired_scale_factor, |
- callback_runner, tracker); |
+ favicon_id, desired_size, callback_runner, tracker); |
} |
return RunWithEmptyResultAsync(callback_runner, tracker); |
} |
@@ -335,19 +354,18 @@ FaviconService::~FaviconService() {} |
base::CancelableTaskTracker::TaskId FaviconService::GetFaviconForPageURLImpl( |
const FaviconForPageURLParams& params, |
- const std::vector<ui::ScaleFactor>& desired_scale_factors, |
+ const std::vector<int>& desired_sizes_in_pixel, |
const favicon_base::FaviconResultsCallback& callback, |
base::CancelableTaskTracker* tracker) { |
if (params.page_url.SchemeIs(content::kChromeUIScheme) || |
params.page_url.SchemeIs(extensions::kExtensionScheme)) { |
return GetFaviconForChromeURL(profile_, params.page_url, |
- desired_scale_factors, callback, tracker); |
+ desired_sizes_in_pixel, callback, tracker); |
} |
if (history_service_) { |
return history_service_->GetFaviconsForURL(params.page_url, |
params.icon_types, |
- params.desired_size_in_dip, |
- desired_scale_factors, |
+ desired_sizes_in_pixel, |
callback, |
tracker); |
} |
@@ -373,8 +391,7 @@ void FaviconService::RunFaviconImageCallbackWithBitmapResults( |
void FaviconService::RunFaviconRawBitmapCallbackWithBitmapResults( |
const favicon_base::FaviconRawBitmapCallback& callback, |
- int desired_size_in_dip, |
- ui::ScaleFactor desired_scale_factor, |
+ int desired_size_in_pixel, |
const std::vector<favicon_base::FaviconRawBitmapResult>& |
favicon_bitmap_results) { |
if (favicon_bitmap_results.empty() || !favicon_bitmap_results[0].is_valid()) { |
@@ -389,19 +406,14 @@ void FaviconService::RunFaviconRawBitmapCallbackWithBitmapResults( |
// If the desired size is 0, SelectFaviconFrames() will return the largest |
// bitmap without doing any resizing. As |favicon_bitmap_results| has bitmap |
// data for a single bitmap, return it and avoid an unnecessary decode. |
- if (desired_size_in_dip == 0) { |
+ if (desired_size_in_pixel == 0) { |
callback.Run(bitmap_result); |
return; |
} |
// If history bitmap is already desired pixel size, return early. |
- float desired_scale = ui::GetScaleForScaleFactor(desired_scale_factor); |
- int desired_edge_width_in_pixel = static_cast<int>( |
- desired_size_in_dip * desired_scale + 0.5f); |
- |
- gfx::Size desired_size_in_pixel(desired_edge_width_in_pixel, |
- desired_edge_width_in_pixel); |
- if (bitmap_result.pixel_size == desired_size_in_pixel) { |
+ if (bitmap_result.pixel_size.width() == desired_size_in_pixel && |
+ bitmap_result.pixel_size.height() == desired_size_in_pixel) { |
callback.Run(bitmap_result); |
return; |
} |
@@ -409,9 +421,9 @@ void FaviconService::RunFaviconRawBitmapCallbackWithBitmapResults( |
// Convert raw bytes to SkBitmap, resize via SelectFaviconFrames(), then |
// convert back. |
std::vector<ui::ScaleFactor> desired_scale_factors; |
- desired_scale_factors.push_back(desired_scale_factor); |
+ desired_scale_factors.push_back(ui::SCALE_FACTOR_100P); |
gfx::Image resized_image = favicon_base::SelectFaviconFramesFromPNGs( |
- favicon_bitmap_results, desired_scale_factors, desired_size_in_dip); |
+ favicon_bitmap_results, desired_scale_factors, desired_size_in_pixel); |
std::vector<unsigned char> resized_bitmap_data; |
if (!gfx::PNGCodec::EncodeBGRASkBitmap(resized_image.AsBitmap(), false, |