Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(513)

Unified Diff: skia/ext/skia_utils_ios.mm

Issue 960873002: Update from https://crrev.com/318214 (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « skia/config/SkUserConfig.h ('k') | skia/ext/skia_utils_ios_unittest.mm » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« no previous file with comments | « skia/config/SkUserConfig.h ('k') | skia/ext/skia_utils_ios_unittest.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698