| Index: src/ports/SkImageDecoder_CG.cpp
|
| diff --git a/src/ports/SkImageDecoder_CG.cpp b/src/ports/SkImageDecoder_CG.cpp
|
| index 9fc49a445f264ffab1f2431dbb9bc6ca43a6af37..2c45ee886b869d15cce2c0f7d4feddaaba51f181 100644
|
| --- a/src/ports/SkImageDecoder_CG.cpp
|
| +++ b/src/ports/SkImageDecoder_CG.cpp
|
| @@ -25,6 +25,31 @@
|
| #include <MobileCoreServices/MobileCoreServices.h>
|
| #endif
|
|
|
| +struct FormatConversion {
|
| + CFStringRef fUTType;
|
| + SkImageDecoder::Format fFormat;
|
| +};
|
| +
|
| +// Array of the types supported by the decoder.
|
| +static const FormatConversion gFormatConversions[] = {
|
| + { kUTTypeBMP, SkImageDecoder::kBMP_Format },
|
| + { kUTTypeGIF, SkImageDecoder::kGIF_Format },
|
| + { kUTTypeICO, SkImageDecoder::kICO_Format },
|
| + { kUTTypeJPEG, SkImageDecoder::kJPEG_Format },
|
| + // Also include JPEG2000
|
| + { kUTTypeJPEG2000, SkImageDecoder::kJPEG_Format },
|
| + { kUTTypePNG, SkImageDecoder::kPNG_Format },
|
| +};
|
| +
|
| +static SkImageDecoder::Format UTType_to_Format(const CFStringRef uttype) {
|
| + for (size_t i = 0; i < SK_ARRAY_COUNT(gFormatConversions); i++) {
|
| + if (CFStringCompare(uttype, gFormatConversions[i].fUTType, 0) == kCFCompareEqualTo) {
|
| + return gFormatConversions[i].fFormat;
|
| + }
|
| + }
|
| + return SkImageDecoder::kUnknown_Format;
|
| +}
|
| +
|
| static void malloc_release_proc(void* info, const void* data, size_t size) {
|
| sk_free(info);
|
| }
|
| @@ -46,8 +71,17 @@ static CGImageSourceRef SkStreamToCGImageSource(SkStream* stream) {
|
| }
|
|
|
| class SkImageDecoder_CG : public SkImageDecoder {
|
| +public:
|
| + SkImageDecoder_CG()
|
| + : fFormat(kUnknown_Format) {}
|
| +
|
| + virtual Format getFormat() const SK_OVERRIDE { return fFormat; }
|
| +
|
| protected:
|
| virtual bool onDecode(SkStream* stream, SkBitmap* bm, Mode);
|
| +
|
| +private:
|
| + Format fFormat;
|
| };
|
|
|
| #define BITMAP_INFO (kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast)
|
| @@ -105,6 +139,10 @@ bool SkImageDecoder_CG::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) {
|
| bm->computeAndSetOpaquePredicate();
|
| }
|
| bm->unlockPixels();
|
| +
|
| + const CFStringRef name = CGImageSourceGetType(imageSrc);
|
| + fFormat = UTType_to_Format(name);
|
| +
|
| return true;
|
| }
|
|
|
|
|