OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2008 The Android Open Source Project | 2 * Copyright 2008 The Android Open Source Project |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkCGUtils.h" | 8 #include "SkCGUtils.h" |
9 #include "SkColorPriv.h" | 9 #include "SkColorPriv.h" |
10 #include "SkImageDecoder.h" | 10 #include "SkImageDecoder.h" |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 char* row = (char*)bm->getPixels(); | 98 char* row = (char*)bm->getPixels(); |
99 for (int y = 0; y < bm->height(); ++y) { | 99 for (int y = 0; y < bm->height(); ++y) { |
100 proc(row, bm->width()); | 100 proc(row, bm->width()); |
101 row += bm->rowBytes(); | 101 row += bm->rowBytes(); |
102 } | 102 } |
103 bm->setAlphaType(kOpaque_SkAlphaType); | 103 bm->setAlphaType(kOpaque_SkAlphaType); |
104 } | 104 } |
105 | 105 |
106 #define BITMAP_INFO (kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast) | 106 #define BITMAP_INFO (kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast) |
107 | 107 |
| 108 static bool icc_profile_is_sRGB(const void* data, size_t length) { |
| 109 // found by inspection -- need a cleaner way to sniff a profile |
| 110 const size_t ICC_PROFILE_OFFSET_TO_SRGB_TAG = 52; |
| 111 |
| 112 if (length >= ICC_PROFILE_OFFSET_TO_SRGB_TAG + 4) { |
| 113 return !memcmp((const char*)data + ICC_PROFILE_OFFSET_TO_SRGB_TAG, "sRGB
", 4); |
| 114 } |
| 115 return false; |
| 116 } |
| 117 |
108 SkImageDecoder::Result SkImageDecoder_CG::onDecode(SkStream* stream, SkBitmap* b
m, Mode mode) { | 118 SkImageDecoder::Result SkImageDecoder_CG::onDecode(SkStream* stream, SkBitmap* b
m, Mode mode) { |
109 CGImageSourceRef imageSrc = SkStreamToCGImageSource(stream); | 119 CGImageSourceRef imageSrc = SkStreamToCGImageSource(stream); |
110 | 120 |
111 if (NULL == imageSrc) { | 121 if (NULL == imageSrc) { |
112 return kFailure; | 122 return kFailure; |
113 } | 123 } |
114 SkAutoTCallVProc<const void, CFRelease> arsrc(imageSrc); | 124 SkAutoTCallVProc<const void, CFRelease> arsrc(imageSrc); |
115 | 125 |
116 CGImageRef image = CGImageSourceCreateImageAtIndex(imageSrc, 0, NULL); | 126 CGImageRef image = CGImageSourceCreateImageAtIndex(imageSrc, 0, NULL); |
117 if (NULL == image) { | 127 if (NULL == image) { |
118 return kFailure; | 128 return kFailure; |
119 } | 129 } |
120 SkAutoTCallVProc<CGImage, CGImageRelease> arimage(image); | 130 SkAutoTCallVProc<CGImage, CGImageRelease> arimage(image); |
121 | 131 |
122 const int width = SkToInt(CGImageGetWidth(image)); | 132 const int width = SkToInt(CGImageGetWidth(image)); |
123 const int height = SkToInt(CGImageGetHeight(image)); | 133 const int height = SkToInt(CGImageGetHeight(image)); |
| 134 SkColorProfileType cpType = kLinear_SkColorProfileType; |
124 | 135 |
125 bm->setInfo(SkImageInfo::MakeN32Premul(width, height)); | 136 CGColorSpaceRef cs = CGImageGetColorSpace(image); |
| 137 if (cs) { |
| 138 CGColorSpaceModel m = CGColorSpaceGetModel(cs); |
| 139 if (kCGColorSpaceModelRGB == m) { |
| 140 CFDataRef data = CGColorSpaceCopyICCProfile(cs); |
| 141 if (data && icc_profile_is_sRGB(CFDataGetBytePtr(data), CFDataGetLen
gth(data))) { |
| 142 cpType = kSRGB_SkColorProfileType; |
| 143 CFRelease(data); |
| 144 } |
| 145 } |
| 146 } |
| 147 |
| 148 bm->setInfo(SkImageInfo::MakeN32Premul(width, height, cpType)); |
126 if (SkImageDecoder::kDecodeBounds_Mode == mode) { | 149 if (SkImageDecoder::kDecodeBounds_Mode == mode) { |
127 return kSuccess; | 150 return kSuccess; |
128 } | 151 } |
129 | 152 |
130 if (!this->allocPixelRef(bm, NULL)) { | 153 if (!this->allocPixelRef(bm, NULL)) { |
131 return kFailure; | 154 return kFailure; |
132 } | 155 } |
133 | 156 |
134 SkAutoLockPixels alp(*bm); | 157 SkAutoLockPixels alp(*bm); |
135 | 158 |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
348 | 371 |
349 SkAutoTCallVProc<const void, CFRelease> arsrc(imageSrc); | 372 SkAutoTCallVProc<const void, CFRelease> arsrc(imageSrc); |
350 const CFStringRef name = CGImageSourceGetType(imageSrc); | 373 const CFStringRef name = CGImageSourceGetType(imageSrc); |
351 if (NULL == name) { | 374 if (NULL == name) { |
352 return SkImageDecoder::kUnknown_Format; | 375 return SkImageDecoder::kUnknown_Format; |
353 } | 376 } |
354 return UTType_to_Format(name); | 377 return UTType_to_Format(name); |
355 } | 378 } |
356 | 379 |
357 static SkImageDecoder_FormatReg gFormatReg(get_format_cg); | 380 static SkImageDecoder_FormatReg gFormatReg(get_format_cg); |
OLD | NEW |