| 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..5655d22a5627ef98a19b4d07739d2fa86447346d 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 88x88 pixels or larger (http://crbug.com/435068).
|
| + bool skip_images_88x88_or_larger =
|
| + 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,6 +110,9 @@ std::vector<SkBitmap> ImageDataToSkBitmaps(NSData* image_data) {
|
|
|
| CGSize size = CGSizeMake(CGImageGetWidth(cg_image),
|
| CGImageGetHeight(cg_image));
|
| + if (size.width >= 88 && size.height >= 88 && skip_images_88x88_or_larger)
|
| + continue;
|
| +
|
| const SkBitmap bitmap = CGImageToSkBitmap(cg_image, size, false);
|
| if (!bitmap.empty())
|
| frames.push_back(bitmap);
|
|
|