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

Side by Side Diff: src/ports/SkImageDecoder_CG.cpp

Issue 676883003: flag imageinfo as srgb (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: fix copy/paste error in loop limits Created 6 years, 1 month 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 unified diff | Download patch
« no previous file with comments | « src/core/SkImageInfo.cpp ('k') | tests/ImageIsOpaqueTest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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);
OLDNEW
« no previous file with comments | « src/core/SkImageInfo.cpp ('k') | tests/ImageIsOpaqueTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698