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

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

Issue 23477009: Change SkImageDecoders to take an SkStreamRewindable. (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Remove accidental whitespace change Created 7 years, 3 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 2011 Google Inc. 3 * Copyright 2011 Google Inc.
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 9
10 #define WIN32_LEAN_AND_MEAN 10 #define WIN32_LEAN_AND_MEAN
(...skipping 21 matching lines...) Expand all
32 public: 32 public:
33 // Decoding modes corresponding to SkImageDecoder::Mode, plus an extra mode for decoding 33 // Decoding modes corresponding to SkImageDecoder::Mode, plus an extra mode for decoding
34 // only the format. 34 // only the format.
35 enum WICModes { 35 enum WICModes {
36 kDecodeFormat_WICMode, 36 kDecodeFormat_WICMode,
37 kDecodeBounds_WICMode, 37 kDecodeBounds_WICMode,
38 kDecodePixels_WICMode, 38 kDecodePixels_WICMode,
39 }; 39 };
40 40
41 /** 41 /**
42 * Helper function to decode an SkStream. 42 * Helper function to decode an SkStreamRewindable.
43 * @param stream SkStream to decode. Must be at the beginning. 43 * @param stream SkStreamRewindable to decode. Must be at the beginning.
44 * @param bm SkBitmap to decode into. Only used if wicMode is kDecodeBoun ds_WICMode or 44 * @param bm SkBitmap to decode into. Only used if wicMode is kDecodeBoun ds_WICMode or
45 * kDecodePixels_WICMode, in which case it must not be NULL. 45 * kDecodePixels_WICMode, in which case it must not be NULL.
46 * @param format Out parameter for the SkImageDecoder::Format of the SkStre am. Only used if 46 * @param format Out parameter for the SkImageDecoder::Format of the SkStre amRewindable.
47 * wicMode is kDecodeFormat_WICMode. 47 * Only used if wicMode is kDecodeFormat_WICMode.
48 */ 48 */
49 bool decodeStream(SkStream* stream, SkBitmap* bm, WICModes wicMode, Format* format) const; 49 bool decodeStream(SkStreamRewindable* stream, SkBitmap* bm, WICModes wicMode ,
50 Format* format) const;
50 51
51 protected: 52 protected:
52 virtual bool onDecode(SkStream* stream, SkBitmap* bm, Mode mode) SK_OVERRIDE ; 53 virtual bool onDecode(SkStreamRewindable* stream, SkBitmap* bm, Mode mode) S K_OVERRIDE;
53 }; 54 };
54 55
55 struct FormatConversion { 56 struct FormatConversion {
56 GUID fGuidFormat; 57 GUID fGuidFormat;
57 SkImageDecoder::Format fFormat; 58 SkImageDecoder::Format fFormat;
58 }; 59 };
59 60
60 static const FormatConversion gFormatConversions[] = { 61 static const FormatConversion gFormatConversions[] = {
61 { GUID_ContainerFormatBmp, SkImageDecoder::kBMP_Format }, 62 { GUID_ContainerFormatBmp, SkImageDecoder::kBMP_Format },
62 { GUID_ContainerFormatGif, SkImageDecoder::kGIF_Format }, 63 { GUID_ContainerFormatGif, SkImageDecoder::kGIF_Format },
63 { GUID_ContainerFormatIco, SkImageDecoder::kICO_Format }, 64 { GUID_ContainerFormatIco, SkImageDecoder::kICO_Format },
64 { GUID_ContainerFormatJpeg, SkImageDecoder::kJPEG_Format }, 65 { GUID_ContainerFormatJpeg, SkImageDecoder::kJPEG_Format },
65 { GUID_ContainerFormatPng, SkImageDecoder::kPNG_Format }, 66 { GUID_ContainerFormatPng, SkImageDecoder::kPNG_Format },
66 }; 67 };
67 68
68 static SkImageDecoder::Format GuidContainerFormat_to_Format(REFGUID guid) { 69 static SkImageDecoder::Format GuidContainerFormat_to_Format(REFGUID guid) {
69 for (size_t i = 0; i < SK_ARRAY_COUNT(gFormatConversions); i++) { 70 for (size_t i = 0; i < SK_ARRAY_COUNT(gFormatConversions); i++) {
70 if (IsEqualGUID(guid, gFormatConversions[i].fGuidFormat)) { 71 if (IsEqualGUID(guid, gFormatConversions[i].fGuidFormat)) {
71 return gFormatConversions[i].fFormat; 72 return gFormatConversions[i].fFormat;
72 } 73 }
73 } 74 }
74 return SkImageDecoder::kUnknown_Format; 75 return SkImageDecoder::kUnknown_Format;
75 } 76 }
76 77
77 bool SkImageDecoder_WIC::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { 78 bool SkImageDecoder_WIC::onDecode(SkStreamRewindable* stream, SkBitmap* bm, Mode mode) {
78 WICModes wicMode; 79 WICModes wicMode;
79 switch (mode) { 80 switch (mode) {
80 case SkImageDecoder::kDecodeBounds_Mode: 81 case SkImageDecoder::kDecodeBounds_Mode:
81 wicMode = kDecodeBounds_WICMode; 82 wicMode = kDecodeBounds_WICMode;
82 break; 83 break;
83 case SkImageDecoder::kDecodePixels_Mode: 84 case SkImageDecoder::kDecodePixels_Mode:
84 wicMode = kDecodePixels_WICMode; 85 wicMode = kDecodePixels_WICMode;
85 break; 86 break;
86 } 87 }
87 return this->decodeStream(stream, bm, wicMode, NULL); 88 return this->decodeStream(stream, bm, wicMode, NULL);
88 } 89 }
89 90
90 bool SkImageDecoder_WIC::decodeStream(SkStream* stream, SkBitmap* bm, WICModes w icMode, 91 bool SkImageDecoder_WIC::decodeStream(SkStreamRewindable* stream, SkBitmap* bm, WICModes wicMode,
91 Format* format) const { 92 Format* format) const {
92 //Initialize COM. 93 //Initialize COM.
93 SkAutoCoInitialize scopedCo; 94 SkAutoCoInitialize scopedCo;
94 if (!scopedCo.succeeded()) { 95 if (!scopedCo.succeeded()) {
95 return false; 96 return false;
96 } 97 }
97 98
98 HRESULT hr = S_OK; 99 HRESULT hr = S_OK;
99 100
100 //Create Windows Imaging Component ImagingFactory. 101 //Create Windows Imaging Component ImagingFactory.
101 SkTScopedComPtr<IWICImagingFactory> piImagingFactory; 102 SkTScopedComPtr<IWICImagingFactory> piImagingFactory;
102 if (SUCCEEDED(hr)) { 103 if (SUCCEEDED(hr)) {
103 hr = CoCreateInstance( 104 hr = CoCreateInstance(
104 CLSID_WICImagingFactory 105 CLSID_WICImagingFactory
105 , NULL 106 , NULL
106 , CLSCTX_INPROC_SERVER 107 , CLSCTX_INPROC_SERVER
107 , IID_PPV_ARGS(&piImagingFactory) 108 , IID_PPV_ARGS(&piImagingFactory)
108 ); 109 );
109 } 110 }
110 111
111 //Convert SkStream to IStream. 112 //Convert SkStreamRewindable to IStream.
112 SkTScopedComPtr<IStream> piStream; 113 SkTScopedComPtr<IStream> piStream;
113 if (SUCCEEDED(hr)) { 114 if (SUCCEEDED(hr)) {
114 hr = SkIStream::CreateFromSkStream(stream, false, &piStream); 115 hr = SkIStream::CreateFromSkStream(stream, false, &piStream);
115 } 116 }
116 117
117 //Make sure we're at the beginning of the stream. 118 //Make sure we're at the beginning of the stream.
118 if (SUCCEEDED(hr)) { 119 if (SUCCEEDED(hr)) {
119 LARGE_INTEGER liBeginning = { 0 }; 120 LARGE_INTEGER liBeginning = { 0 };
120 hr = piStream->Seek(liBeginning, STREAM_SEEK_SET, NULL); 121 hr = piStream->Seek(liBeginning, STREAM_SEEK_SET, NULL);
121 } 122 }
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
223 224
224 // Note: we don't need to premultiply here since we specified PBGRA 225 // Note: we don't need to premultiply here since we specified PBGRA
225 bm->computeAndSetOpaquePredicate(); 226 bm->computeAndSetOpaquePredicate();
226 } 227 }
227 228
228 return SUCCEEDED(hr); 229 return SUCCEEDED(hr);
229 } 230 }
230 231
231 ///////////////////////////////////////////////////////////////////////// 232 /////////////////////////////////////////////////////////////////////////
232 233
233 extern SkImageDecoder* image_decoder_from_stream(SkStream*); 234 extern SkImageDecoder* image_decoder_from_stream(SkStreamRewindable*);
234 235
235 SkImageDecoder* SkImageDecoder::Factory(SkStream* stream) { 236 SkImageDecoder* SkImageDecoder::Factory(SkStreamRewindable* stream) {
236 SkImageDecoder* decoder = image_decoder_from_stream(stream); 237 SkImageDecoder* decoder = image_decoder_from_stream(stream);
237 if (NULL == decoder) { 238 if (NULL == decoder) {
238 // If no image decoder specific to the stream exists, use SkImageDecoder _WIC. 239 // If no image decoder specific to the stream exists, use SkImageDecoder _WIC.
239 return SkNEW(SkImageDecoder_WIC); 240 return SkNEW(SkImageDecoder_WIC);
240 } else { 241 } else {
241 return decoder; 242 return decoder;
242 } 243 }
243 } 244 }
244 245
245 ///////////////////////////////////////////////////////////////////////// 246 /////////////////////////////////////////////////////////////////////////
246 247
247 SkMovie* SkMovie::DecodeStream(SkStream* stream) { 248 SkMovie* SkMovie::DecodeStream(SkStreamRewindable* stream) {
248 return NULL; 249 return NULL;
249 } 250 }
250 251
251 ///////////////////////////////////////////////////////////////////////// 252 /////////////////////////////////////////////////////////////////////////
252 253
253 class SkImageEncoder_WIC : public SkImageEncoder { 254 class SkImageEncoder_WIC : public SkImageEncoder {
254 public: 255 public:
255 SkImageEncoder_WIC(Type t) : fType(t) {} 256 SkImageEncoder_WIC(Type t) : fType(t) {}
256 257
257 protected: 258 protected:
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
427 case SkImageEncoder::kPNG_Type: 428 case SkImageEncoder::kPNG_Type:
428 break; 429 break;
429 default: 430 default:
430 return NULL; 431 return NULL;
431 } 432 }
432 return SkNEW_ARGS(SkImageEncoder_WIC, (t)); 433 return SkNEW_ARGS(SkImageEncoder_WIC, (t));
433 } 434 }
434 435
435 static SkTRegistry<SkImageEncoder*, SkImageEncoder::Type> gEReg(sk_imageencoder_ wic_factory); 436 static SkTRegistry<SkImageEncoder*, SkImageEncoder::Type> gEReg(sk_imageencoder_ wic_factory);
436 437
437 static SkImageDecoder::Format get_format_wic(SkStream* stream) { 438 static SkImageDecoder::Format get_format_wic(SkStreamRewindable* stream) {
438 SkImageDecoder::Format format; 439 SkImageDecoder::Format format;
439 SkImageDecoder_WIC codec; 440 SkImageDecoder_WIC codec;
440 if (!codec.decodeStream(stream, NULL, SkImageDecoder_WIC::kDecodeFormat_WICM ode, &format)) { 441 if (!codec.decodeStream(stream, NULL, SkImageDecoder_WIC::kDecodeFormat_WICM ode, &format)) {
441 format = SkImageDecoder::kUnknown_Format; 442 format = SkImageDecoder::kUnknown_Format;
442 } 443 }
443 return format; 444 return format;
444 } 445 }
445 446
446 static SkTRegistry<SkImageDecoder::Format, SkStream*> gFormatReg(get_format_wic) ; 447 static SkTRegistry<SkImageDecoder::Format, SkStreamRewindable*> gFormatReg(get_f ormat_wic);
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698