Index: src/codec/SkCodec.cpp |
diff --git a/src/codec/SkCodec.cpp b/src/codec/SkCodec.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ec36bc75e94e00edd22b857b179a9033a95fe5c1 |
--- /dev/null |
+++ b/src/codec/SkCodec.cpp |
@@ -0,0 +1,50 @@ |
+/* |
+ * Copyright 2015 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#include "SkCodec.h" |
+#include "SkData.h" |
+#include "SkCodec_libpng.h" |
+#include "SkStream.h" |
+ |
+SkCodec* SkCodec::NewFromStream(SkStream* stream) { |
+ if (!stream) { |
+ return NULL; |
+ } |
+ SkAutoTDelete<SkStream> streamDeleter(stream); |
+ const bool isPng = SkPngCodec::IsPng(stream); |
+ // TODO: Avoid rewinding. |
+ if (!stream->rewind()) { |
+ return NULL; |
+ } |
+ if (isPng) { |
+ streamDeleter.detach(); |
+ return SkPngCodec::NewFromStream(stream); |
+ } |
+ // TODO: Check other image types. |
+ return NULL; |
+} |
+ |
+SkCodec* SkCodec::NewFromData(SkData* data) { |
+ if (!data) { |
+ return NULL; |
+ } |
+ return NewFromStream(SkNEW_ARGS(SkMemoryStream, (data))); |
+} |
+ |
+SkCodec::SkCodec(const SkImageInfo& info, SkStream* stream) |
+ : fInfo(info) |
+ , fStream(stream) |
+ , fNeedsRewind(false) |
+{} |
+ |
+bool SkCodec::rewindIfNeeded() { |
+ // Store the value of fNeedsRewind so we can update it. Next read will |
+ // require a rewind. |
+ const bool neededRewind = fNeedsRewind; |
+ fNeedsRewind = true; |
+ return !neededRewind || fStream->rewind(); |
+} |