Chromium Code Reviews| Index: skia/ext/skia_utils_ios.mm |
| diff --git a/skia/ext/skia_utils_ios.mm b/skia/ext/skia_utils_ios.mm |
| index 3ae962cd59e55469561b3a1f1670a6096a3efc66..03f1d69920f0eaf3fe161638fcd0a7a0fe08d8d3 100644 |
| --- a/skia/ext/skia_utils_ios.mm |
| +++ b/skia/ext/skia_utils_ios.mm |
| @@ -7,10 +7,26 @@ |
| #import <ImageIO/ImageIO.h> |
| #import <UIKit/UIKit.h> |
| +#include "base/ios/ios_util.h" |
| #include "base/logging.h" |
| #include "base/mac/scoped_cftyperef.h" |
| +#include "base/macros.h" |
| #include "third_party/skia/include/utils/mac/SkCGUtils.h" |
| +namespace { |
| + |
| +const uint8 kICOHeaderMagic[4] = {0x00, 0x00, 0x01, 0x00}; |
| + |
| +// Returns whether the data encodes an ico image. |
| +bool EncodesIcoImage(NSData* image_data) { |
| + if (image_data.length < arraysize(kICOHeaderMagic)) |
| + return false; |
| + return memcmp(kICOHeaderMagic, image_data.bytes, |
| + arraysize(kICOHeaderMagic)) == 0; |
| +} |
| + |
| +} // namespace |
| + |
| namespace gfx { |
| SkBitmap CGImageToSkBitmap(CGImageRef image, CGSize size, bool is_opaque) { |
| @@ -74,6 +90,12 @@ UIImage* SkBitmapToUIImageWithColorSpace(const SkBitmap& skia_bitmap, |
| std::vector<SkBitmap> ImageDataToSkBitmaps(NSData* image_data) { |
| DCHECK(image_data); |
| + |
| + // On iOS 8.1.1 |CGContextDrawImage| crashes when processing images included |
| + // in .ico files that are larger then 88x88 (http://crbug.com/435068). |
|
Justin Novosad
2015/02/19 16:10:44
then -> than
sdefresne
2015/02/19 16:46:02
Done.
|
| + bool skip_images_larger_than_88x88 = |
| + base::ios::IsRunningOnOrLater(8, 1, 1) && EncodesIcoImage(image_data); |
| + |
| base::ScopedCFTypeRef<CFDictionaryRef> empty_dictionary( |
| CFDictionaryCreate(NULL, NULL, NULL, 0, NULL, NULL)); |
| std::vector<SkBitmap> frames; |
| @@ -88,9 +110,12 @@ std::vector<SkBitmap> ImageDataToSkBitmaps(NSData* image_data) { |
| CGSize size = CGSizeMake(CGImageGetWidth(cg_image), |
| CGImageGetHeight(cg_image)); |
| - const SkBitmap bitmap = CGImageToSkBitmap(cg_image, size, false); |
| - if (!bitmap.empty()) |
| - frames.push_back(bitmap); |
| + if (!skip_images_larger_than_88x88 || |
| + (size.width < 88 && size.height < 88)) { |
|
Justin Novosad
2015/02/19 16:10:44
Shouldn't the conditions be '<=' instead of '<'?
sdefresne
2015/02/19 16:46:02
That's correct. Changed to use <=.
|
| + const SkBitmap bitmap = CGImageToSkBitmap(cg_image, size, false); |
| + if (!bitmap.empty()) |
| + frames.push_back(bitmap); |
| + } |
| } |
| DLOG_IF(WARNING, frames.size() != count) << "Only decoded " << frames.size() |