Index: src/ports/SkImageDecoder_WIC.cpp |
diff --git a/src/ports/SkImageDecoder_WIC.cpp b/src/ports/SkImageDecoder_WIC.cpp |
index 17d75ccaca93d972437f1b7397370698b3ca3f16..cea7de21879842c3a9c9207823070cc3f106074e 100644 |
--- a/src/ports/SkImageDecoder_WIC.cpp |
+++ b/src/ports/SkImageDecoder_WIC.cpp |
@@ -29,10 +29,39 @@ |
#endif |
class SkImageDecoder_WIC : public SkImageDecoder { |
+public: |
+ SkImageDecoder_WIC() |
+ : fFormat(kUnknown_Format) {} |
+ |
protected: |
virtual bool onDecode(SkStream* stream, SkBitmap* bm, Mode mode); |
+ |
+private: |
+ Format fFormat; |
}; |
+struct FormatConversion { |
+ GUID fGuidFormat; |
+ SkImageDecoder::Format fFormat; |
+}; |
+ |
+static const FormatConversion gFormatConversions[] = { |
+ { GUID_ContainerFormatBmp, SkImageDecoder::kBMP_Format }, |
+ { GUID_ContainerFormatGif, SkImageDecoder::kGIF_Format }, |
+ { GUID_ContainerFormatIco, SkImageDecoder::kICO_Format }, |
+ { GUID_ContainerFormatJpeg, SkImageDecoder::kJPEG_Format }, |
+ { GUID_ContainerFormatPng, SkImageDecoder::kPNG_Format }, |
+}; |
+ |
+static SkImageDecoder::Format GuidContainerFormat_to_Format(REFGUID guid) { |
+ for (size_t i = 0; i < SK_ARRAY_COUNT(gFormatConversions); i++) { |
+ if (IsEqualGUID(guid, gFormatConversions[i].fGuidFormat)) { |
+ return gFormatConversions[i].fFormat; |
+ } |
+ } |
+ return SkImageDecoder::kUnknown_Format; |
+} |
+ |
bool SkImageDecoder_WIC::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { |
//Initialize COM. |
SkAutoCoInitialize scopedCo; |
@@ -149,6 +178,17 @@ bool SkImageDecoder_WIC::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { |
bm->computeAndSetOpaquePredicate(); |
} |
+ //Get the format |
+ if (SUCCEEDED(hr)) { |
+ GUID format; |
+ HRESULT result = piBitmapDecoder->GetContainerFormat(&format); |
+ if (SUCCEEDED(result)) { |
+ fFormat = GuidContainerFormat_to_Format(format); |
+ } else { |
+ fFormat = kUnknown_Format; |
+ } |
+ } |
+ |
return SUCCEEDED(hr); |
} |
@@ -194,9 +234,6 @@ bool SkImageEncoder_WIC::onEncode(SkWStream* stream |
case kBMP_Type: |
type = GUID_ContainerFormatBmp; |
break; |
- case kGIF_Type: |
- type = GUID_ContainerFormatGif; |
- break; |
case kICO_Type: |
type = GUID_ContainerFormatIco; |
break; |
@@ -348,7 +385,6 @@ bool SkImageEncoder_WIC::onEncode(SkWStream* stream |
static SkImageEncoder* sk_imageencoder_wic_factory(SkImageEncoder::Type t) { |
switch (t) { |
case SkImageEncoder::kBMP_Type: |
- case SkImageEncoder::kGIF_Type: |
case SkImageEncoder::kICO_Type: |
case SkImageEncoder::kJPEG_Type: |
case SkImageEncoder::kPNG_Type: |