| Index: components/favicon_base/favicon_util.cc
|
| diff --git a/components/favicon_base/favicon_util.cc b/components/favicon_base/favicon_util.cc
|
| index 0a3f0a21be78a74a4625eb2daa258857c59c34d7..bf3d31a3dba4ce15a5339d0ae5938b18704f57d5 100644
|
| --- a/components/favicon_base/favicon_util.cc
|
| +++ b/components/favicon_base/favicon_util.cc
|
| @@ -4,11 +4,14 @@
|
|
|
| #include "components/favicon_base/favicon_util.h"
|
|
|
| +#include <cmath>
|
| +
|
| #include "components/favicon_base/favicon_types.h"
|
| #include "components/favicon_base/select_favicon_frames.h"
|
| #include "skia/ext/image_operations.h"
|
| #include "third_party/skia/include/core/SkBitmap.h"
|
| #include "third_party/skia/include/core/SkCanvas.h"
|
| +#include "ui/base/layout.h"
|
| #include "ui/gfx/codec/png_codec.h"
|
| #include "ui/gfx/favicon_size.h"
|
| #include "ui/gfx/image/image_png_rep.h"
|
| @@ -23,11 +26,11 @@ namespace favicon_base {
|
| namespace {
|
|
|
| // Creates image reps of DIP size |favicon_size| for the subset of
|
| -// |scale_factors| for which the image reps can be created without resizing
|
| +// |favicon_scales| for which the image reps can be created without resizing
|
| // or decoding the bitmap data.
|
| std::vector<gfx::ImagePNGRep> SelectFaviconFramesFromPNGsWithoutResizing(
|
| const std::vector<favicon_base::FaviconRawBitmapResult>& png_data,
|
| - const std::vector<ui::ScaleFactor>& scale_factors,
|
| + const std::vector<float>& favicon_scales,
|
| int favicon_size) {
|
| std::vector<gfx::ImagePNGRep> png_reps;
|
| if (png_data.empty())
|
| @@ -48,14 +51,12 @@ std::vector<gfx::ImagePNGRep> SelectFaviconFramesFromPNGsWithoutResizing(
|
| return png_reps;
|
| }
|
|
|
| - // Cache the scale factor for each pixel size as |scale_factors| may contain
|
| - // any of GetFaviconScaleFactors() which may include scale factors not
|
| - // supported by the platform. (ui::GetSupportedScaleFactor() cannot be used.)
|
| - std::map<int, ui::ScaleFactor> desired_pixel_sizes;
|
| - for (size_t i = 0; i < scale_factors.size(); ++i) {
|
| - int pixel_size =
|
| - floor(favicon_size * ui::GetScaleForScaleFactor(scale_factors[i]));
|
| - desired_pixel_sizes[pixel_size] = scale_factors[i];
|
| + // Build a map which will be used to determine the scale used to
|
| + // create a bitmap with given pixel size.
|
| + std::map<int, float> desired_pixel_sizes;
|
| + for (size_t i = 0; i < favicon_scales.size(); ++i) {
|
| + int pixel_size = std::ceil(favicon_size * favicon_scales[i]);
|
| + desired_pixel_sizes[pixel_size] = favicon_scales[i];
|
| }
|
|
|
| for (size_t i = 0; i < png_data.size(); ++i) {
|
| @@ -66,13 +67,12 @@ std::vector<gfx::ImagePNGRep> SelectFaviconFramesFromPNGsWithoutResizing(
|
| if (pixel_size.width() != pixel_size.height())
|
| continue;
|
|
|
| - std::map<int, ui::ScaleFactor>::iterator it =
|
| + std::map<int, float>::iterator it =
|
| desired_pixel_sizes.find(pixel_size.width());
|
| if (it == desired_pixel_sizes.end())
|
| continue;
|
|
|
| - png_reps.push_back(gfx::ImagePNGRep(
|
| - png_data[i].bitmap_data, ui::GetScaleForScaleFactor(it->second)));
|
| + png_reps.push_back(gfx::ImagePNGRep(png_data[i].bitmap_data, it->second));
|
| }
|
|
|
| return png_reps;
|
| @@ -136,31 +136,22 @@ SkBitmap ResizeBitmapByDownsamplingIfPossible(
|
|
|
| } // namespace
|
|
|
| -std::vector<ui::ScaleFactor> GetFaviconScaleFactors() {
|
| +std::vector<float> GetFaviconScales() {
|
| const float kScale1x = 1.0f;
|
| - std::vector<ui::ScaleFactor> favicon_scale_factors =
|
| + std::vector<ui::ScaleFactor> resource_scale_factors =
|
| ui::GetSupportedScaleFactors();
|
|
|
| - // The scale factors returned from ui::GetSupportedScaleFactors() are sorted.
|
| - // Insert the 1x scale factor such that GetFaviconScaleFactors() is sorted as
|
| - // well.
|
| - size_t insert_index = favicon_scale_factors.size();
|
| - for (size_t i = 0; i < favicon_scale_factors.size(); ++i) {
|
| - float scale = ui::GetScaleForScaleFactor(favicon_scale_factors[i]);
|
| - if (scale == kScale1x) {
|
| - return favicon_scale_factors;
|
| - } else if (scale > kScale1x) {
|
| - insert_index = i;
|
| - break;
|
| - }
|
| - }
|
| - // TODO(ios): 100p should not be necessary on iOS retina devices. However
|
| + // TODO(ios): 1.0f should not be necessary on iOS retina devices. However
|
| // the sync service only supports syncing 100p favicons. Until sync supports
|
| - // other scales 100p is needed in the list of scale factors to retrieve and
|
| + // other scales 100p is needed in the list of scales to retrieve and
|
| // store the favicons in both 100p for sync and 200p for display. cr/160503.
|
| - favicon_scale_factors.insert(favicon_scale_factors.begin() + insert_index,
|
| - ui::SCALE_FACTOR_100P);
|
| - return favicon_scale_factors;
|
| + std::vector<float> favicon_scales(1, kScale1x);
|
| + for (size_t i = 0; i < resource_scale_factors.size(); ++i) {
|
| + if (resource_scale_factors[i] != ui::SCALE_FACTOR_100P)
|
| + favicon_scales.push_back(
|
| + ui::GetScaleForScaleFactor(resource_scale_factors[i]));
|
| + }
|
| + return favicon_scales;
|
| }
|
|
|
| void SetFaviconColorSpace(gfx::Image* image) {
|
| @@ -171,9 +162,9 @@ void SetFaviconColorSpace(gfx::Image* image) {
|
|
|
| gfx::Image SelectFaviconFramesFromPNGs(
|
| const std::vector<favicon_base::FaviconRawBitmapResult>& png_data,
|
| - const std::vector<ui::ScaleFactor>& scale_factors,
|
| + const std::vector<float>& favicon_scales,
|
| int favicon_size) {
|
| - // Create image reps for as many scale factors as possible without resizing
|
| + // Create image reps for as many scales as possible without resizing
|
| // the bitmap data or decoding it. FaviconHandler stores already resized
|
| // favicons into history so no additional resizing should be needed in the
|
| // common case.
|
| @@ -187,25 +178,26 @@ gfx::Image SelectFaviconFramesFromPNGs(
|
| // TODO(pkotwicz): Move the decoding off the UI thread.
|
| std::vector<gfx::ImagePNGRep> png_reps =
|
| SelectFaviconFramesFromPNGsWithoutResizing(
|
| - png_data, scale_factors, favicon_size);
|
| + png_data, favicon_scales, favicon_size);
|
|
|
| // SelectFaviconFramesFromPNGsWithoutResizing() should have selected the
|
| // largest favicon if |favicon_size| == 0.
|
| if (favicon_size == 0)
|
| return gfx::Image(png_reps);
|
|
|
| - std::vector<ui::ScaleFactor> scale_factors_to_generate = scale_factors;
|
| + std::vector<float> favicon_scales_to_generate = favicon_scales;
|
| for (size_t i = 0; i < png_reps.size(); ++i) {
|
| - for (int j = static_cast<int>(scale_factors_to_generate.size()) - 1; j >= 0;
|
| + for (int j = static_cast<int>(favicon_scales_to_generate.size()) - 1;
|
| + j >= 0;
|
| --j) {
|
| - if (png_reps[i].scale ==
|
| - ui::GetScaleForScaleFactor(scale_factors_to_generate[j])) {
|
| - scale_factors_to_generate.erase(scale_factors_to_generate.begin() + j);
|
| + if (png_reps[i].scale == favicon_scales_to_generate[j]) {
|
| + favicon_scales_to_generate.erase(favicon_scales_to_generate.begin() +
|
| + j);
|
| }
|
| }
|
| }
|
|
|
| - if (scale_factors_to_generate.empty())
|
| + if (favicon_scales_to_generate.empty())
|
| return gfx::Image(png_reps);
|
|
|
| std::vector<SkBitmap> bitmaps;
|
| @@ -225,9 +217,9 @@ gfx::Image SelectFaviconFramesFromPNGs(
|
| return gfx::Image();
|
|
|
| gfx::ImageSkia resized_image_skia;
|
| - for (size_t i = 0; i < scale_factors_to_generate.size(); ++i) {
|
| - float scale = ui::GetScaleForScaleFactor(scale_factors_to_generate[i]);
|
| - int desired_size_in_pixel = ceil(favicon_size * scale);
|
| + for (size_t i = 0; i < favicon_scales_to_generate.size(); ++i) {
|
| + float scale = favicon_scales_to_generate[i];
|
| + int desired_size_in_pixel = std::ceil(favicon_size * scale);
|
| SkBitmap bitmap =
|
| ResizeBitmapByDownsamplingIfPossible(bitmaps, desired_size_in_pixel);
|
| resized_image_skia.AddRepresentation(gfx::ImageSkiaRep(bitmap, scale));
|
|
|