Index: src/images/SkImageDecoder_Factory.cpp |
diff --git a/src/images/SkImageDecoder_Factory.cpp b/src/images/SkImageDecoder_Factory.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9018ff6429101db1cfb748e37ace50cf8c26fa3a |
--- /dev/null |
+++ b/src/images/SkImageDecoder_Factory.cpp |
@@ -0,0 +1,117 @@ |
+/* |
+ * Copyright 2013 The Android Open Source Project |
scroggo
2014/11/12 18:00:12
2014 Google Inc
Kimmo Kinnunen
2014/11/18 08:29:44
Done.
|
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#include "SkErrorInternals.h" |
+#include "SkImageDecoder.h" |
+#include "SkStream.h" |
+ |
+#include "SkImageDecoder_libjpeg.h" |
+#include "SkImageDecoder_libwebp.h" |
+#include "SkImageDecoder_libico.h" |
+#include "SkImageDecoder_libbmp.h" |
+#include "SkImageDecoder_wbmp.h" |
+ |
+#if defined(SK_BUILD_FOR_WIN) |
+#include "SkImageDecoder_WIC.h" |
+#endif |
+#if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS) |
+#include "SkImageDecoder_CG.h" |
+#endif |
+#if !defined(SK_BUILD_FOR_MAC) && !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_WIN) |
+#include "SkImageDecoder_libpng.h" |
+#endif |
+#if !defined(SK_BUILD_FOR_MAC) && !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_WIN) && !defined(SK_BUILD_FOR_NACL) |
scroggo
2014/11/12 18:00:12
line too long.
Kimmo Kinnunen
2014/11/18 08:29:44
Done. Sorry about the whitespace problems, I've fi
|
+#include "SkImageDecoder_libgif.h" |
+#include "SkMovie_gif.h" |
+#endif |
+#if !defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) |
+#include "SkImageDecoder_astc.h" |
+#include "SkImageDecoder_ktx.h" |
+#include "SkImageDecoder_pkm.h" |
+#endif |
+ |
+// This file is used for registration of SkImageDecoders. It also holds a function |
+// for checking all the the registered SkImageDecoders for one that matches an |
+// input SkStreamRewindable. |
+ |
+typedef SkImageDecoder* (*FactoryCreateFunc)(SkStreamRewindable*); |
+typedef SkImageDecoder::Format (*FactoryDetectFormatFunc)(SkStreamRewindable*); |
+static const struct { |
+ FactoryCreateFunc createFunc; |
+ FactoryDetectFormatFunc getFormatFunc; |
+} gDecoderFactoryFuncs[] = { |
scroggo
2014/11/12 18:00:12
Could you add a comment here that the order is mea
Kimmo Kinnunen
2014/11/18 08:29:44
Done.
|
+#if defined(SK_BUILD_FOR_WIN) |
+ { SkCreateImageDecoder_WIC, SkDetectFormatImageDecoder_WIC }, |
+#endif |
+#if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS) |
+ { SkCreateImageDecoder_CG, SkDetectFormatImageDecoder_CG }, |
+#endif |
+#if !defined(SK_BUILD_FOR_MAC) && !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_WIN) |
+ { SkCreatePNGImageDecoder, SkDetectFormatPNGImageDecoder }, |
+#endif |
+ { SkCreateJPEGImageDecoder, SkDetectFormatJPEGImageDecoder }, |
+ { SkCreateWEBPImageDecoder, SkDetectFormatWEBPImageDecoder }, |
+ { SkCreateICOImageDecoder, SkDetectFormatICOImageDecoder }, |
+#if !defined(SK_BUILD_FOR_MAC) && !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_WIN) && !defined(SK_BUILD_FOR_NACL) |
scroggo
2014/11/12 18:00:12
line too long
Kimmo Kinnunen
2014/11/18 08:29:44
Done.
|
+ { SkCreateGIFImageDecoder, SkDetectFormatGIFImageDecoder }, |
+#endif |
+ { SkCreateBMPImageDecoder, SkDetectFormatBMPImageDecoder }, |
+#if !defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) |
+ { SkCreateASTCImageDecoder, SkDetectFormatASTCImageDecoder }, |
+ { SkCreateKTXImageDecoder, SkDetectFormatKTXImageDecoder }, |
+ { SkCreatePKMImageDecoder, SkDetectFormatPKMImageDecoder }, |
+#endif |
+ { SkCreateWBMPImageDecoder, SkDetectFormatWBMPImageDecoder } |
+}; |
+ |
+SkImageDecoder* SkImageDecoder::Factory(SkStreamRewindable* stream) { |
+ SkImageDecoder* codec = NULL; |
+ for (size_t i = 0; i < SK_ARRAY_COUNT(gDecoderFactoryFuncs); ++i) { |
+ FactoryCreateFunc createFunc = gDecoderFactoryFuncs[i].createFunc; |
scroggo
2014/11/12 18:00:12
Here's a thought:
I notice that in every one of t
Kimmo Kinnunen
2014/11/18 08:29:44
...
scroggo
2014/11/18 16:52:23
The issue isn't so much having two three-line func
|
+ codec = createFunc(stream); |
+ // we rewind here, because we promise later when we call "decode", that |
+ // the stream will be at its beginning. |
+ bool rewindSuceeded = stream->rewind(); |
+ |
+ // our image decoder's require that rewind is supported so we fail early |
scroggo
2014/11/12 18:00:12
decoders*
(I know this duplicating an old typo, b
Kimmo Kinnunen
2014/11/18 08:29:44
Done.
|
+ // if we are given a stream that does not support rewinding. |
+ if (!rewindSuceeded) { |
+ SkDEBUGF(("Unable to rewind the image stream.")); |
+ SkDELETE(codec); |
+ return NULL; |
+ } |
+ |
+ if (codec) { |
+ return codec; |
+ } |
+ } |
+ return NULL; |
+} |
+ |
+SkImageDecoder::Format SkImageDecoder::GetStreamFormat(SkStreamRewindable* stream) { |
+ for (size_t i = 0; i < SK_ARRAY_COUNT(gDecoderFactoryFuncs); ++i) { |
+ FactoryDetectFormatFunc detectFormatFunc = gDecoderFactoryFuncs[i].getFormatFunc; |
+ Format format = detectFormatFunc(stream); |
+ if (!stream->rewind()) { |
+ SkErrorInternals::SetError(kInvalidOperation_SkError, |
+ "Unable to rewind the image stream\n"); |
+ return kUnknown_Format; |
+ } |
+ if (format != kUnknown_Format) { |
+ return format; |
+ } |
+ } |
+ return kUnknown_Format; |
+} |
+ |
+SkMovie* SkMovie::DecodeStream(SkStreamRewindable* stream) { |
+ SkMovie* movie = NULL; |
+#if !defined(SK_BUILD_FOR_MAC) && !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_WIN) && !defined(SK_BUILD_FOR_NACL) |
scroggo
2014/11/12 18:00:12
line too long
Kimmo Kinnunen
2014/11/18 08:29:45
Done.
|
+ movie = SkGIFMovieCreate(stream); |
scroggo
2014/11/12 18:00:12
The old code does a rewind if movie is null.
Kimmo Kinnunen
2014/11/18 08:29:45
Done.
|
+#endif |
+ return movie; |
+} |