| Index: src/ports/SkImageDecoder_CG.cpp
|
| diff --git a/src/ports/SkImageDecoder_CG.cpp b/src/ports/SkImageDecoder_CG.cpp
|
| index 8d8d0c8b17a32d31a8763b66d460378bf224b06c..eb2b46a080f72455100d6b16162e78cff8c22004 100644
|
| --- a/src/ports/SkImageDecoder_CG.cpp
|
| +++ b/src/ports/SkImageDecoder_CG.cpp
|
| @@ -105,14 +105,30 @@ static void force_opaque(SkBitmap* bm) {
|
|
|
| #define BITMAP_INFO (kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast)
|
|
|
| -static bool icc_profile_is_sRGB(const void* data, size_t length) {
|
| - // found by inspection -- need a cleaner way to sniff a profile
|
| - const size_t ICC_PROFILE_OFFSET_TO_SRGB_TAG = 52;
|
| +class AutoCFDataRelease {
|
| + CFDataRef fDR;
|
| +public:
|
| + AutoCFDataRelease(CFDataRef dr) : fDR(dr) {}
|
| + ~AutoCFDataRelease() { if (fDR) { CFRelease(fDR); } }
|
| +
|
| + operator CFDataRef () { return fDR; }
|
| +};
|
|
|
| - if (length >= ICC_PROFILE_OFFSET_TO_SRGB_TAG + 4) {
|
| - return !memcmp((const char*)data + ICC_PROFILE_OFFSET_TO_SRGB_TAG, "sRGB", 4);
|
| +static bool colorspace_is_sRGB(CGColorSpaceRef cs) {
|
| +#ifdef SK_BUILD_FOR_IOS
|
| + return true; // iOS seems to define itself to always return sRGB <reed>
|
| +#else
|
| + AutoCFDataRelease data(CGColorSpaceCopyICCProfile(cs));
|
| + if (data) {
|
| + // found by inspection -- need a cleaner way to sniff a profile
|
| + const CFIndex ICC_PROFILE_OFFSET_TO_SRGB_TAG = 52;
|
| +
|
| + if (CFDataGetLength(data) >= ICC_PROFILE_OFFSET_TO_SRGB_TAG + 4) {
|
| + return !memcmp(CFDataGetBytePtr(data) + ICC_PROFILE_OFFSET_TO_SRGB_TAG, "sRGB", 4);
|
| + }
|
| }
|
| return false;
|
| +#endif
|
| }
|
|
|
| SkImageDecoder::Result SkImageDecoder_CG::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) {
|
| @@ -136,12 +152,8 @@ SkImageDecoder::Result SkImageDecoder_CG::onDecode(SkStream* stream, SkBitmap* b
|
| CGColorSpaceRef cs = CGImageGetColorSpace(image);
|
| if (cs) {
|
| CGColorSpaceModel m = CGColorSpaceGetModel(cs);
|
| - if (kCGColorSpaceModelRGB == m) {
|
| - CFDataRef data = CGColorSpaceCopyICCProfile(cs);
|
| - if (data && icc_profile_is_sRGB(CFDataGetBytePtr(data), CFDataGetLength(data))) {
|
| - cpType = kSRGB_SkColorProfileType;
|
| - CFRelease(data);
|
| - }
|
| + if (kCGColorSpaceModelRGB == m && colorspace_is_sRGB(cs)) {
|
| + cpType = kSRGB_SkColorProfileType;
|
| }
|
| }
|
|
|
|
|