Chromium Code Reviews| Index: components/favicon_base/favicon_util.cc |
| diff --git a/components/favicon_base/favicon_util.cc b/components/favicon_base/favicon_util.cc |
| index e17ebdf97a875cd2ba0ed535a82d3f6c9a6ba5e6..fbd44eec2a733b09ac329f7ab2d3f0e853aefccc 100644 |
| --- a/components/favicon_base/favicon_util.cc |
| +++ b/components/favicon_base/favicon_util.cc |
| @@ -9,6 +9,7 @@ |
| #include <algorithm> |
| #include <cmath> |
| +#include "base/trace_event/trace_event.h" |
| #include "build/build_config.h" |
| #include "components/favicon_base/favicon_types.h" |
| #include "components/favicon_base/select_favicon_frames.h" |
| @@ -36,6 +37,8 @@ std::vector<gfx::ImagePNGRep> SelectFaviconFramesFromPNGsWithoutResizing( |
| const std::vector<favicon_base::FaviconRawBitmapResult>& png_data, |
| const std::vector<float>& favicon_scales, |
| int favicon_size) { |
| + TRACE_EVENT0("browser", |
| + "FaviconUtil::SelectFaviconFramesFromPNGsWithoutResizing"); |
| std::vector<gfx::ImagePNGRep> png_reps; |
| if (png_data.empty()) |
| return png_reps; |
| @@ -166,6 +169,8 @@ gfx::Image SelectFaviconFramesFromPNGs( |
| const std::vector<favicon_base::FaviconRawBitmapResult>& png_data, |
| const std::vector<float>& favicon_scales, |
| int favicon_size) { |
| + TRACE_EVENT0("browser", "FaviconUtil::SelectFaviconFramesFromPNGs"); |
| + |
| // 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 |
| @@ -245,4 +250,49 @@ gfx::Image SelectFaviconFramesFromPNGs( |
| return gfx::Image(png_reps); |
| } |
| +favicon_base::FaviconRawBitmapResult ResizeFaviconResultSlow( |
| + const std::vector<favicon_base::FaviconRawBitmapResult>& |
| + favicon_bitmap_results, |
| + int desired_size_in_pixel) { |
| + TRACE_EVENT0("browser", "FaviconUtil::ResizeFaviconResultSlow"); |
| + |
| + if (favicon_bitmap_results.empty() || !favicon_bitmap_results[0].is_valid()) |
| + return favicon_base::FaviconRawBitmapResult(); |
| + |
| + favicon_base::FaviconRawBitmapResult bitmap_result = |
| + favicon_bitmap_results[0]; |
| + |
| + // 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_pixel == 0) |
| + return bitmap_result; |
| + |
| + // If history bitmap is already desired pixel size, return early. |
| + if (bitmap_result.pixel_size.width() == desired_size_in_pixel && |
| + bitmap_result.pixel_size.height() == desired_size_in_pixel) |
| + return bitmap_result; |
| + |
| + // Convert raw bytes to SkBitmap, resize via SelectFaviconFrames(), then |
| + // convert back. |
| + std::vector<float> desired_favicon_scales; |
| + desired_favicon_scales.push_back(1.0f); |
| + |
| + gfx::Image resized_image = favicon_base::SelectFaviconFramesFromPNGs( |
| + favicon_bitmap_results, desired_favicon_scales, desired_size_in_pixel); |
| + |
| + std::vector<unsigned char> resized_bitmap_data; |
| + if (!gfx::PNGCodec::EncodeBGRASkBitmap(resized_image.AsBitmap(), false, |
|
aelias_OOO_until_Jul13
2016/09/06 20:46:42
OK, if the "Fast" here is the main point of debate
|
| + &resized_bitmap_data)) { |
| + return favicon_base::FaviconRawBitmapResult(); |
| + } |
| + |
| + bitmap_result.bitmap_data = base::RefCountedBytes::TakeVector( |
| + &resized_bitmap_data); |
| + bitmap_result.pixel_size = |
| + gfx::Size(desired_size_in_pixel, desired_size_in_pixel); |
| + |
| + return bitmap_result; |
| +} |
| + |
| } // namespace favicon_base |