Index: src/core/SkCodecImageGenerator.cpp |
diff --git a/src/core/SkCodecImageGenerator.cpp b/src/core/SkCodecImageGenerator.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..531f3b89393100ed3a835ff80019a109dfdb74c6 |
--- /dev/null |
+++ b/src/core/SkCodecImageGenerator.cpp |
@@ -0,0 +1,89 @@ |
+/* |
+ * 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 "SkImageGenerator.h" |
+ |
+class SkCodecImageGenerator : SkImageGenerator { |
+public: |
+ /* |
+ * Takes ownership of codec |
+ */ |
+ static SkImageGenerator* Create(SkCodec* codec); |
+ |
+protected: |
+ |
+ bool onComputeScaledDimensions(SkScalar scale, SupportedSizes*) override; |
+ bool onGenerateScaledPixels(const SkISize&, const SkIPoint&, const SkPixmap&) override; |
+ bool onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, SkPMColor ctable[], |
+ int* ctableCount) override; |
+ |
+private: |
+ SkCodecImageGenerator(SkCodec* codec); |
+ |
+ SkAutoTDelete<SkCodec> fCodec; // Owned |
+ |
+ typedef SkImageGenerator INHERITED; |
+}; |
+ |
+SkImageGenerator* SkCodecImageGenerator::Create(SkCodec* codec) { |
+ if (nullptr == codec) { |
+ return nullptr; |
+ } |
+ |
+ return new SkCodecImageGenerator(codec); |
+} |
+ |
+SkImageGenerator* SkImageGenerator::NewFromEncodedImpl(SkData* data) { |
+ return SkCodecImageGenerator::Create(SkCodec::NewFromData(data)); |
+} |
+ |
+SkCodecImageGenerator::SkCodecImageGenerator(SkCodec* codec) |
+ : INHERITED(codec->getInfo()) |
+ , fCodec(codec) |
+{} |
+ |
+bool SkCodecImageGenerator::onComputeScaledDimensions(SkScalar scale, |
+ SupportedSizes* sizes) { |
+ const SkISize scaledSize = fCodec->getScaledDimensions(scale); |
+ // FIXME: SkCodec should be able to suggest multiple scaled sizes. |
+ sizes->fSizes[0] = scaledSize; |
+ sizes->fSizes[1] = scaledSize; |
+ return true; |
+} |
+ |
+bool SkCodecImageGenerator::onGenerateScaledPixels(const SkISize& scaledSize, |
+ const SkIPoint& scaledOrigin, |
+ const SkPixmap& scaledPixels) { |
+ // FIXME: Subsets are not supported yet. |
+ SkASSERT(scaledOrigin.isZero()); |
+ SkASSERT(scaledSize == scaledPixels.info().dimensions()); |
+ |
+ SkCodec::Result result = fCodec->getPixels(scaledPixels.info(), scaledPixels.writable_addr(), |
+ scaledPixels.rowBytes()); |
+ switch (result) { |
+ case SkCodec::kSuccess: |
+ case SkCodec::kIncompleteInput: |
+ return true; |
+ default: |
+ return false; |
+ } |
+} |
+ |
+bool SkCodecImageGenerator::onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, |
+ SkPMColor ctable[], int* ctableCount) { |
+ |
+ SkCodec::Result result = fCodec->getPixels(info, pixels, rowBytes, nullptr, ctable, |
+ ctableCount); |
+ switch (result) { |
+ case SkCodec::kSuccess: |
+ case SkCodec::kIncompleteInput: |
+ return true; |
+ default: |
+ return false; |
+ } |
+} |