| 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;
|
| + }
|
| +}
|
|
|