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 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 *addr = unpremultiply_pmcolor(*addr); | 119 *addr = unpremultiply_pmcolor(*addr); |
120 } | 120 } |
121 } | 121 } |
122 } | 122 } |
123 bm->unlockPixels(); | 123 bm->unlockPixels(); |
124 return true; | 124 return true; |
125 } | 125 } |
126 | 126 |
127 /////////////////////////////////////////////////////////////////////////////// | 127 /////////////////////////////////////////////////////////////////////////////// |
128 | 128 |
129 extern SkImageDecoder* image_decoder_from_stream(SkStream*); | 129 extern SkImageDecoder* image_decoder_from_stream(SkStreamRewindable*); |
130 | 130 |
131 SkImageDecoder* SkImageDecoder::Factory(SkStream* stream) { | 131 SkImageDecoder* SkImageDecoder::Factory(SkStreamRewindable* stream) { |
132 SkImageDecoder* decoder = image_decoder_from_stream(stream); | 132 SkImageDecoder* decoder = image_decoder_from_stream(stream); |
133 if (NULL == decoder) { | 133 if (NULL == decoder) { |
134 // If no image decoder specific to the stream exists, use SkImageDecoder
_CG. | 134 // If no image decoder specific to the stream exists, use SkImageDecoder
_CG. |
135 return SkNEW(SkImageDecoder_CG); | 135 return SkNEW(SkImageDecoder_CG); |
136 } else { | 136 } else { |
137 return decoder; | 137 return decoder; |
138 } | 138 } |
139 } | 139 } |
140 | 140 |
141 ///////////////////////////////////////////////////////////////////////// | 141 ///////////////////////////////////////////////////////////////////////// |
142 | 142 |
143 SkMovie* SkMovie::DecodeStream(SkStream* stream) { | 143 SkMovie* SkMovie::DecodeStream(SkStreamRewindable* stream) { |
144 return NULL; | 144 return NULL; |
145 } | 145 } |
146 | 146 |
147 ///////////////////////////////////////////////////////////////////////// | 147 ///////////////////////////////////////////////////////////////////////// |
148 | 148 |
149 static size_t consumer_put(void* info, const void* buffer, size_t count) { | 149 static size_t consumer_put(void* info, const void* buffer, size_t count) { |
150 SkWStream* stream = reinterpret_cast<SkWStream*>(info); | 150 SkWStream* stream = reinterpret_cast<SkWStream*>(info); |
151 return stream->write(buffer, count) ? count : 0; | 151 return stream->write(buffer, count) ? count : 0; |
152 } | 152 } |
153 | 153 |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 return false; | 237 return false; |
238 } | 238 } |
239 SkAutoTCallVProc<CGImage, CGImageRelease> agimage(image); | 239 SkAutoTCallVProc<CGImage, CGImageRelease> agimage(image); |
240 | 240 |
241 CGImageDestinationAddImage(dst, image, NULL); | 241 CGImageDestinationAddImage(dst, image, NULL); |
242 return CGImageDestinationFinalize(dst); | 242 return CGImageDestinationFinalize(dst); |
243 } | 243 } |
244 | 244 |
245 /////////////////////////////////////////////////////////////////////////////// | 245 /////////////////////////////////////////////////////////////////////////////// |
246 | 246 |
247 #include "SkTRegistry.h" | |
248 | |
249 static SkImageEncoder* sk_imageencoder_cg_factory(SkImageEncoder::Type t) { | 247 static SkImageEncoder* sk_imageencoder_cg_factory(SkImageEncoder::Type t) { |
250 switch (t) { | 248 switch (t) { |
251 case SkImageEncoder::kICO_Type: | 249 case SkImageEncoder::kICO_Type: |
252 case SkImageEncoder::kBMP_Type: | 250 case SkImageEncoder::kBMP_Type: |
253 case SkImageEncoder::kGIF_Type: | 251 case SkImageEncoder::kGIF_Type: |
254 case SkImageEncoder::kJPEG_Type: | 252 case SkImageEncoder::kJPEG_Type: |
255 case SkImageEncoder::kPNG_Type: | 253 case SkImageEncoder::kPNG_Type: |
256 break; | 254 break; |
257 default: | 255 default: |
258 return NULL; | 256 return NULL; |
259 } | 257 } |
260 return SkNEW_ARGS(SkImageEncoder_CG, (t)); | 258 return SkNEW_ARGS(SkImageEncoder_CG, (t)); |
261 } | 259 } |
262 | 260 |
263 static SkTRegistry<SkImageEncoder*(*)(SkImageEncoder::Type)> gEReg(sk_imageencod
er_cg_factory); | 261 static SkImageEncoder_EncodeReg gEReg(sk_imageencoder_cg_factory); |
264 | 262 |
265 struct FormatConversion { | 263 struct FormatConversion { |
266 CFStringRef fUTType; | 264 CFStringRef fUTType; |
267 SkImageDecoder::Format fFormat; | 265 SkImageDecoder::Format fFormat; |
268 }; | 266 }; |
269 | 267 |
270 // Array of the types supported by the decoder. | 268 // Array of the types supported by the decoder. |
271 static const FormatConversion gFormatConversions[] = { | 269 static const FormatConversion gFormatConversions[] = { |
272 { kUTTypeBMP, SkImageDecoder::kBMP_Format }, | 270 { kUTTypeBMP, SkImageDecoder::kBMP_Format }, |
273 { kUTTypeGIF, SkImageDecoder::kGIF_Format }, | 271 { kUTTypeGIF, SkImageDecoder::kGIF_Format }, |
274 { kUTTypeICO, SkImageDecoder::kICO_Format }, | 272 { kUTTypeICO, SkImageDecoder::kICO_Format }, |
275 { kUTTypeJPEG, SkImageDecoder::kJPEG_Format }, | 273 { kUTTypeJPEG, SkImageDecoder::kJPEG_Format }, |
276 // Also include JPEG2000 | 274 // Also include JPEG2000 |
277 { kUTTypeJPEG2000, SkImageDecoder::kJPEG_Format }, | 275 { kUTTypeJPEG2000, SkImageDecoder::kJPEG_Format }, |
278 { kUTTypePNG, SkImageDecoder::kPNG_Format }, | 276 { kUTTypePNG, SkImageDecoder::kPNG_Format }, |
279 }; | 277 }; |
280 | 278 |
281 static SkImageDecoder::Format UTType_to_Format(const CFStringRef uttype) { | 279 static SkImageDecoder::Format UTType_to_Format(const CFStringRef uttype) { |
282 for (size_t i = 0; i < SK_ARRAY_COUNT(gFormatConversions); i++) { | 280 for (size_t i = 0; i < SK_ARRAY_COUNT(gFormatConversions); i++) { |
283 if (CFStringCompare(uttype, gFormatConversions[i].fUTType, 0) == kCFComp
areEqualTo) { | 281 if (CFStringCompare(uttype, gFormatConversions[i].fUTType, 0) == kCFComp
areEqualTo) { |
284 return gFormatConversions[i].fFormat; | 282 return gFormatConversions[i].fFormat; |
285 } | 283 } |
286 } | 284 } |
287 return SkImageDecoder::kUnknown_Format; | 285 return SkImageDecoder::kUnknown_Format; |
288 } | 286 } |
289 | 287 |
290 static SkImageDecoder::Format get_format_cg(SkStream *stream) { | 288 static SkImageDecoder::Format get_format_cg(SkStreamRewindable* stream) { |
291 CGImageSourceRef imageSrc = SkStreamToCGImageSource(stream); | 289 CGImageSourceRef imageSrc = SkStreamToCGImageSource(stream); |
292 | 290 |
293 if (NULL == imageSrc) { | 291 if (NULL == imageSrc) { |
294 return SkImageDecoder::kUnknown_Format; | 292 return SkImageDecoder::kUnknown_Format; |
295 } | 293 } |
296 | 294 |
297 SkAutoTCallVProc<const void, CFRelease> arsrc(imageSrc); | 295 SkAutoTCallVProc<const void, CFRelease> arsrc(imageSrc); |
298 const CFStringRef name = CGImageSourceGetType(imageSrc); | 296 const CFStringRef name = CGImageSourceGetType(imageSrc); |
299 if (NULL == name) { | 297 if (NULL == name) { |
300 return SkImageDecoder::kUnknown_Format; | 298 return SkImageDecoder::kUnknown_Format; |
301 } | 299 } |
302 return UTType_to_Format(name); | 300 return UTType_to_Format(name); |
303 } | 301 } |
304 | 302 |
305 static SkTRegistry<SkImageDecoder::Format(*)(SkStream*)> gFormatReg(get_format_c
g); | 303 static SkImageDecoder_FormatReg gFormatReg(get_format_cg); |
OLD | NEW |