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

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: Remove fake support for GIF on Windows and remove a printf. 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 SkImageDecoder_CG()
76 : fFormat(kUnknown_Format) {}
77
78 virtual Format getFormat() const SK_OVERRIDE { return fFormat; }
79
49 protected: 80 protected:
50 virtual bool onDecode(SkStream* stream, SkBitmap* bm, Mode); 81 virtual bool onDecode(SkStream* stream, SkBitmap* bm, Mode);
82
83 private:
84 Format fFormat;
51 }; 85 };
52 86
53 #define BITMAP_INFO (kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast) 87 #define BITMAP_INFO (kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast)
54 88
55 bool SkImageDecoder_CG::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { 89 bool SkImageDecoder_CG::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) {
56 CGImageSourceRef imageSrc = SkStreamToCGImageSource(stream); 90 CGImageSourceRef imageSrc = SkStreamToCGImageSource(stream);
57 91
58 if (NULL == imageSrc) { 92 if (NULL == imageSrc) {
59 return false; 93 return false;
60 } 94 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 case kCGImageAlphaNoneSkipLast: 132 case kCGImageAlphaNoneSkipLast:
99 case kCGImageAlphaNoneSkipFirst: 133 case kCGImageAlphaNoneSkipFirst:
100 SkASSERT(SkBitmap::ComputeIsOpaque(*bm)); 134 SkASSERT(SkBitmap::ComputeIsOpaque(*bm));
101 bm->setIsOpaque(true); 135 bm->setIsOpaque(true);
102 break; 136 break;
103 default: 137 default:
104 // we don't know if we're opaque or not, so compute it. 138 // we don't know if we're opaque or not, so compute it.
105 bm->computeAndSetOpaquePredicate(); 139 bm->computeAndSetOpaquePredicate();
106 } 140 }
107 bm->unlockPixels(); 141 bm->unlockPixels();
142
143 const CFStringRef name = CGImageSourceGetType(imageSrc);
144 fFormat = UTType_to_Format(name);
145
108 return true; 146 return true;
109 } 147 }
110 148
111 /////////////////////////////////////////////////////////////////////////////// 149 ///////////////////////////////////////////////////////////////////////////////
112 150
113 extern SkImageDecoder* image_decoder_from_stream(SkStream*); 151 extern SkImageDecoder* image_decoder_from_stream(SkStream*);
114 152
115 SkImageDecoder* SkImageDecoder::Factory(SkStream* stream) { 153 SkImageDecoder* SkImageDecoder::Factory(SkStream* stream) {
116 SkImageDecoder* decoder = image_decoder_from_stream(stream); 154 SkImageDecoder* decoder = image_decoder_from_stream(stream);
117 if (NULL == decoder) { 155 if (NULL == decoder) {
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 case SkImageEncoder::kJPEG_Type: 276 case SkImageEncoder::kJPEG_Type:
239 case SkImageEncoder::kPNG_Type: 277 case SkImageEncoder::kPNG_Type:
240 break; 278 break;
241 default: 279 default:
242 return NULL; 280 return NULL;
243 } 281 }
244 return SkNEW_ARGS(SkImageEncoder_CG, (t)); 282 return SkNEW_ARGS(SkImageEncoder_CG, (t));
245 } 283 }
246 284
247 static SkTRegistry<SkImageEncoder*, SkImageEncoder::Type> gEReg(sk_imageencoder_ cg_factory); 285 static SkTRegistry<SkImageEncoder*, SkImageEncoder::Type> gEReg(sk_imageencoder_ cg_factory);
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698