1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/utility/importer/favicon_reencode.h" 6 7 #include "content/public/child/image_decoder_utils.h" 8 #include "skia/ext/image_operations.h" 9 #include "third_party/skia/include/core/SkBitmap.h" 10 #include "ui/gfx/codec/png_codec.h" 11 #include "ui/gfx/favicon_size.h" 12 13 namespace importer { 14 15 bool ReencodeFavicon(const unsigned char* src_data, 16 size_t src_len, 17 std::vector<unsigned char>* png_data) { 18 // Decode the favicon using WebKit's image decoder. 19 SkBitmap decoded = content::DecodeImage( 20 src_data, 21 gfx::Size(gfx::kFaviconSize, gfx::kFaviconSize), 22 src_len); 23 if (decoded.empty()) 24 return false; // Unable to decode. 25 26 if (decoded.width() != gfx::kFaviconSize || 27 decoded.height() != gfx::kFaviconSize) { 28 // The bitmap is not the correct size, re-sample. 29 int new_width = decoded.width(); 30 int new_height = decoded.height(); 31 gfx::CalculateFaviconTargetSize(&new_width, &new_height); 32 decoded = skia::ImageOperations::Resize( 33 decoded, skia::ImageOperations::RESIZE_LANCZOS3, new_width, new_height); 34 } 35 36 // Encode our bitmap as a PNG. 37 gfx::PNGCodec::EncodeBGRASkBitmap(decoded, false, png_data); 38 return true; 39 } 40 41 } // namespace importer 42