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

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

Issue 14363003: Updates to skimage tool to use it for testing. (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Implement onGetFormat for other decoders. Created 7 years, 8 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2008 The Android Open Source Project 3 * Copyright 2008 The Android Open Source Project
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 #include "SkColorPriv.h" 9 #include "SkColorPriv.h"
10 10
11 #include "SkImageDecoder.h" 11 #include "SkImageDecoder.h"
12 #include "SkImageEncoder.h" 12 #include "SkImageEncoder.h"
13 #include "SkMovie.h" 13 #include "SkMovie.h"
14 #include "SkStream.h" 14 #include "SkStream.h"
15 #include "SkTemplates.h" 15 #include "SkTemplates.h"
16 #include "SkCGUtils.h" 16 #include "SkCGUtils.h"
17 17
18 #ifdef SK_BUILD_FOR_MAC 18 #ifdef SK_BUILD_FOR_MAC
19 #include <ApplicationServices/ApplicationServices.h> 19 #include <ApplicationServices/ApplicationServices.h>
20 #endif 20 #endif
21 21
22 #ifdef SK_BUILD_FOR_IOS 22 #ifdef SK_BUILD_FOR_IOS
23 #include <CoreGraphics/CoreGraphics.h> 23 #include <CoreGraphics/CoreGraphics.h>
24 #include <ImageIO/ImageIO.h> 24 #include <ImageIO/ImageIO.h>
25 #include <MobileCoreServices/MobileCoreServices.h> 25 #include <MobileCoreServices/MobileCoreServices.h>
26 #endif 26 #endif
27 27
28 struct FormatConversion {
29 CFStringRef fUTType;
30 SkImageDecoder::Format fFormat;
31 };
32
33 // Array of the types supported by the decoder.
34 static const FormatConversion gFormatConversions[] = {
35 { kUTTypeBMP, SkImageDecoder::kBMP_Format },
36 { kUTTypeGIF, SkImageDecoder::kGIF_Format },
37 { kUTTypeICO, SkImageDecoder::kICO_Format },
38 { kUTTypeJPEG, SkImageDecoder::kJPEG_Format },
39 // Also include JPEG2000
40 { kUTTypeJPEG2000, SkImageDecoder::kJPEG_Format },
41 { kUTTypePNG, SkImageDecoder::kPNG_Format },
42 };
43
44 static SkImageDecoder::Format UTType_to_Format(const CFStringRef uttype) {
45 for (size_t i = 0; i < SK_ARRAY_COUNT(gFormatConversions); i++) {
46 if (CFStringCompare(uttype, gFormatConversions[i].fUTType, 0) == kCFComp areEqualTo) {
47 return gFormatConversions[i].fFormat;
48 }
49 }
50 return SkImageDecoder::kUnknown_Format;
51 }
52
28 static void malloc_release_proc(void* info, const void* data, size_t size) { 53 static void malloc_release_proc(void* info, const void* data, size_t size) {
29 sk_free(info); 54 sk_free(info);
30 } 55 }
31 56
32 static CGDataProviderRef SkStreamToDataProvider(SkStream* stream) { 57 static CGDataProviderRef SkStreamToDataProvider(SkStream* stream) {
33 // TODO: use callbacks, so we don't have to load all the data into RAM 58 // TODO: use callbacks, so we don't have to load all the data into RAM
34 size_t len = stream->getLength(); 59 size_t len = stream->getLength();
35 void* data = sk_malloc_throw(len); 60 void* data = sk_malloc_throw(len);
36 stream->read(data, len); 61 stream->read(data, len);
37 62
38 return CGDataProviderCreateWithData(data, data, len, malloc_release_proc); 63 return CGDataProviderCreateWithData(data, data, len, malloc_release_proc);
39 } 64 }
40 65
41 static CGImageSourceRef SkStreamToCGImageSource(SkStream* stream) { 66 static CGImageSourceRef SkStreamToCGImageSource(SkStream* stream) {
42 CGDataProviderRef data = SkStreamToDataProvider(stream); 67 CGDataProviderRef data = SkStreamToDataProvider(stream);
43 CGImageSourceRef imageSrc = CGImageSourceCreateWithDataProvider(data, 0); 68 CGImageSourceRef imageSrc = CGImageSourceCreateWithDataProvider(data, 0);
44 CGDataProviderRelease(data); 69 CGDataProviderRelease(data);
45 return imageSrc; 70 return imageSrc;
46 } 71 }
47 72
48 class SkImageDecoder_CG : public SkImageDecoder { 73 class SkImageDecoder_CG : public SkImageDecoder {
74 public:
75 virtual Format getFormat() const SK_OVERRIDE { return kMultiple_Formats; }
76 Format onGetFormat(SkStream* stream) const SK_OVERRIDE;
77
49 protected: 78 protected:
50 virtual bool onDecode(SkStream* stream, SkBitmap* bm, Mode); 79 virtual bool onDecode(SkStream* stream, SkBitmap* bm, Mode);
51 }; 80 };
52 81
82 SkImageDecoder::Format SkImageDecoder_CG::onGetFormat(SkStream *stream) const {
83 CGImageSourceRef imageSrc = SkStreamToCGImageSource(stream);
84
85 if (NULL == imageSrc) {
86 return kUnknown_Format;
87 }
88
89 SkAutoTCallVProc<const void, CFRelease> arsrc(imageSrc);
90 const CFStringRef name = CGImageSourceGetType(imageSrc);
91 return UTType_to_Format(name);
epoger 2013/04/23 16:03:41 Oh. I guess this is why the SkImageDecoder subcla
scroggo 2013/04/23 20:55:18 In general, you are correct. The typical client wi
92 }
93
53 #define BITMAP_INFO (kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast) 94 #define BITMAP_INFO (kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast)
54 95
55 bool SkImageDecoder_CG::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { 96 bool SkImageDecoder_CG::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) {
56 CGImageSourceRef imageSrc = SkStreamToCGImageSource(stream); 97 CGImageSourceRef imageSrc = SkStreamToCGImageSource(stream);
57 98
58 if (NULL == imageSrc) { 99 if (NULL == imageSrc) {
59 return false; 100 return false;
60 } 101 }
61 SkAutoTCallVProc<const void, CFRelease> arsrc(imageSrc); 102 SkAutoTCallVProc<const void, CFRelease> arsrc(imageSrc);
62 103
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 case SkImageEncoder::kJPEG_Type: 279 case SkImageEncoder::kJPEG_Type:
239 case SkImageEncoder::kPNG_Type: 280 case SkImageEncoder::kPNG_Type:
240 break; 281 break;
241 default: 282 default:
242 return NULL; 283 return NULL;
243 } 284 }
244 return SkNEW_ARGS(SkImageEncoder_CG, (t)); 285 return SkNEW_ARGS(SkImageEncoder_CG, (t));
245 } 286 }
246 287
247 static SkTRegistry<SkImageEncoder*, SkImageEncoder::Type> gEReg(sk_imageencoder_ cg_factory); 288 static SkTRegistry<SkImageEncoder*, SkImageEncoder::Type> gEReg(sk_imageencoder_ cg_factory);
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698