Index: src/images/SkDecodingImageGenerator.cpp |
diff --git a/src/images/SkDecodingImageGenerator.cpp b/src/images/SkDecodingImageGenerator.cpp |
deleted file mode 100644 |
index 8d55bd36c7b07c2aa6cb40bb925f63f1a4af8a1e..0000000000000000000000000000000000000000 |
--- a/src/images/SkDecodingImageGenerator.cpp |
+++ /dev/null |
@@ -1,288 +0,0 @@ |
-/* |
- * Copyright 2013 Google Inc. |
- * |
- * Use of this source code is governed by a BSD-style license that can be |
- * found in the LICENSE file. |
- */ |
- |
-#include "SkData.h" |
-#include "SkDecodingImageGenerator.h" |
-#include "SkImageDecoder.h" |
-#include "SkImageInfo.h" |
-#include "SkImageGenerator.h" |
-#include "SkImagePriv.h" |
-#include "SkStream.h" |
-#include "SkUtils.h" |
- |
-namespace { |
-bool equal_modulo_alpha(const SkImageInfo& a, const SkImageInfo& b) { |
- return a.width() == b.width() && a.height() == b.height() && |
- a.colorType() == b.colorType(); |
-} |
- |
-class DecodingImageGenerator : public SkImageGenerator { |
-public: |
- virtual ~DecodingImageGenerator(); |
- |
- SkData* fData; |
- SkAutoTDelete<SkStreamRewindable> fStream; |
- const SkImageInfo fInfo; |
- const int fSampleSize; |
- const bool fDitherImage; |
- |
- DecodingImageGenerator(SkData* data, |
- SkStreamRewindable* stream, |
- const SkImageInfo& info, |
- int sampleSize, |
- bool ditherImage); |
- |
-protected: |
- SkData* onRefEncodedData(SK_REFENCODEDDATA_CTXPARAM) override; |
- bool onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, |
- SkPMColor ctable[], int* ctableCount) override; |
- bool onGetYUV8Planes(SkISize sizes[3], void* planes[3], size_t rowBytes[3], |
- SkYUVColorSpace* colorSpace) override; |
- |
-private: |
- typedef SkImageGenerator INHERITED; |
-}; |
- |
-/** |
- * Special allocator used by getPixels(). Uses preallocated memory |
- * provided if possible, else fall-back on the default allocator |
- */ |
-class TargetAllocator : public SkBitmap::Allocator { |
-public: |
- TargetAllocator(const SkImageInfo& info, |
- void* target, |
- size_t rowBytes) |
- : fInfo(info) |
- , fTarget(target) |
- , fRowBytes(rowBytes) |
- {} |
- |
- bool isReady() { return (fTarget != nullptr); } |
- |
- virtual bool allocPixelRef(SkBitmap* bm, SkColorTable* ct) { |
- if (nullptr == fTarget || !equal_modulo_alpha(fInfo, bm->info())) { |
- // Call default allocator. |
- return bm->tryAllocPixels(nullptr, ct); |
- } |
- |
- // TODO(halcanary): verify that all callers of this function |
- // will respect new RowBytes. Will be moot once rowbytes belongs |
- // to PixelRef. |
- bm->installPixels(fInfo, fTarget, fRowBytes, ct, nullptr, nullptr); |
- |
- fTarget = nullptr; // never alloc same pixels twice! |
- return true; |
- } |
- |
-private: |
- const SkImageInfo fInfo; |
- void* fTarget; // Block of memory to be supplied as pixel memory |
- // in allocPixelRef. Must be large enough to hold |
- // a bitmap described by fInfo and fRowBytes |
- const size_t fRowBytes; // rowbytes for the destination bitmap |
- |
- typedef SkBitmap::Allocator INHERITED; |
-}; |
- |
-// TODO(halcanary): Give this macro a better name and move it into SkTypes.h |
-#ifdef SK_DEBUG |
- #define SkCheckResult(expr, value) SkASSERT((value) == (expr)) |
-#else |
- #define SkCheckResult(expr, value) (void)(expr) |
-#endif |
- |
-#ifdef SK_DEBUG |
-inline bool check_alpha(SkAlphaType reported, SkAlphaType actual) { |
- return ((reported == actual) |
- || ((reported == kPremul_SkAlphaType) |
- && (actual == kOpaque_SkAlphaType))); |
-} |
-#endif // SK_DEBUG |
- |
-//////////////////////////////////////////////////////////////////////////////// |
- |
-DecodingImageGenerator::DecodingImageGenerator( |
- SkData* data, |
- SkStreamRewindable* stream, |
- const SkImageInfo& info, |
- int sampleSize, |
- bool ditherImage) |
- : INHERITED(info) |
- , fData(data) |
- , fStream(stream) |
- , fInfo(info) |
- , fSampleSize(sampleSize) |
- , fDitherImage(ditherImage) |
-{ |
- SkASSERT(stream != nullptr); |
- SkSafeRef(fData); // may be nullptr. |
-} |
- |
-DecodingImageGenerator::~DecodingImageGenerator() { |
- SkSafeUnref(fData); |
-} |
- |
-SkData* DecodingImageGenerator::onRefEncodedData(SK_REFENCODEDDATA_CTXPARAM) { |
- // This functionality is used in `gm --serialize` |
- // Does not encode options. |
- if (nullptr == fData) { |
- // TODO(halcanary): SkStreamRewindable needs a refData() function |
- // which returns a cheap copy of the underlying data. |
- if (!fStream->rewind()) { |
- return nullptr; |
- } |
- size_t length = fStream->getLength(); |
- if (length) { |
- fData = SkData::NewFromStream(fStream, length); |
- } |
- } |
- return SkSafeRef(fData); |
-} |
- |
-bool DecodingImageGenerator::onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, |
- SkPMColor ctableEntries[], int* ctableCount) { |
- if (fInfo != info) { |
- // The caller has specified a different info. This is an |
- // error for this kind of SkImageGenerator. Use the Options |
- // to change the settings. |
- return false; |
- } |
- |
- SkAssertResult(fStream->rewind()); |
- SkAutoTDelete<SkImageDecoder> decoder(SkImageDecoder::Factory(fStream)); |
- if (nullptr == decoder.get()) { |
- return false; |
- } |
- decoder->setDitherImage(fDitherImage); |
- decoder->setSampleSize(fSampleSize); |
- decoder->setRequireUnpremultipliedColors(info.alphaType() == kUnpremul_SkAlphaType); |
- |
- SkBitmap bitmap; |
- TargetAllocator allocator(fInfo, pixels, rowBytes); |
- decoder->setAllocator(&allocator); |
- const SkImageDecoder::Result decodeResult = decoder->decode(fStream, &bitmap, info.colorType(), |
- SkImageDecoder::kDecodePixels_Mode); |
- decoder->setAllocator(nullptr); |
- if (SkImageDecoder::kFailure == decodeResult) { |
- return false; |
- } |
- if (allocator.isReady()) { // Did not use pixels! |
- SkBitmap bm; |
- SkASSERT(bitmap.canCopyTo(info.colorType())); |
- bool copySuccess = bitmap.copyTo(&bm, info.colorType(), &allocator); |
- if (!copySuccess || allocator.isReady()) { |
- SkDEBUGFAIL("bitmap.copyTo(requestedConfig) failed."); |
- // Earlier we checked canCopyto(); we expect consistency. |
- return false; |
- } |
- SkASSERT(check_alpha(info.alphaType(), bm.alphaType())); |
- } else { |
- SkASSERT(check_alpha(info.alphaType(), bitmap.alphaType())); |
- } |
- |
- if (kIndex_8_SkColorType == info.colorType()) { |
- if (kIndex_8_SkColorType != bitmap.colorType()) { |
- // they asked for Index8, but we didn't receive that from decoder |
- return false; |
- } |
- SkColorTable* ctable = bitmap.getColorTable(); |
- if (nullptr == ctable) { |
- return false; |
- } |
- const int count = ctable->count(); |
- memcpy(ctableEntries, ctable->readColors(), count * sizeof(SkPMColor)); |
- *ctableCount = count; |
- } |
- return true; |
-} |
- |
-bool DecodingImageGenerator::onGetYUV8Planes(SkISize sizes[3], void* planes[3], |
- size_t rowBytes[3], SkYUVColorSpace* colorSpace) { |
- if (!fStream->rewind()) { |
- return false; |
- } |
- |
- SkAutoTDelete<SkImageDecoder> decoder(SkImageDecoder::Factory(fStream)); |
- if (nullptr == decoder.get()) { |
- return false; |
- } |
- |
- return decoder->decodeYUV8Planes(fStream, sizes, planes, rowBytes, colorSpace); |
-} |
- |
-// A contructor-type function that returns nullptr on failure. This |
-// prevents the returned SkImageGenerator from ever being in a bad |
-// state. Called by both Create() functions |
-SkImageGenerator* CreateDecodingImageGenerator( |
- SkData* data, |
- SkStreamRewindable* stream, |
- const SkDecodingImageGenerator::Options& opts) { |
- SkASSERT(stream); |
- SkAutoTDelete<SkStreamRewindable> autoStream(stream); // always delete this |
- SkAssertResult(autoStream->rewind()); |
- SkAutoTDelete<SkImageDecoder> decoder(SkImageDecoder::Factory(autoStream)); |
- if (nullptr == decoder.get()) { |
- return nullptr; |
- } |
- SkBitmap bitmap; |
- decoder->setSampleSize(opts.fSampleSize); |
- decoder->setRequireUnpremultipliedColors(opts.fRequireUnpremul); |
- if (!decoder->decode(stream, &bitmap, SkImageDecoder::kDecodeBounds_Mode)) { |
- return nullptr; |
- } |
- if (kUnknown_SkColorType == bitmap.colorType()) { |
- return nullptr; |
- } |
- |
- SkImageInfo info = bitmap.info(); |
- |
- if (opts.fUseRequestedColorType && (opts.fRequestedColorType != info.colorType())) { |
- if (!bitmap.canCopyTo(opts.fRequestedColorType)) { |
- SkASSERT(bitmap.colorType() != opts.fRequestedColorType); |
- return nullptr; // Can not translate to needed config. |
- } |
- info = info.makeColorType(opts.fRequestedColorType); |
- } |
- |
- if (opts.fRequireUnpremul && info.alphaType() != kOpaque_SkAlphaType) { |
- info = info.makeAlphaType(kUnpremul_SkAlphaType); |
- } |
- |
- SkAlphaType newAlphaType = info.alphaType(); |
- if (!SkColorTypeValidateAlphaType(info.colorType(), info.alphaType(), &newAlphaType)) { |
- return nullptr; |
- } |
- |
- return new DecodingImageGenerator(data, autoStream.detach(), info.makeAlphaType(newAlphaType), |
- opts.fSampleSize, opts.fDitherImage); |
-} |
- |
-} // namespace |
- |
-//////////////////////////////////////////////////////////////////////////////// |
- |
-SkImageGenerator* SkDecodingImageGenerator::Create( |
- SkData* data, |
- const SkDecodingImageGenerator::Options& opts) { |
- SkASSERT(data != nullptr); |
- if (nullptr == data) { |
- return nullptr; |
- } |
- SkStreamRewindable* stream = new SkMemoryStream(data); |
- SkASSERT(stream != nullptr); |
- return CreateDecodingImageGenerator(data, stream, opts); |
-} |
- |
-SkImageGenerator* SkDecodingImageGenerator::Create( |
- SkStreamRewindable* stream, |
- const SkDecodingImageGenerator::Options& opts) { |
- SkASSERT(stream != nullptr); |
- if (stream == nullptr) { |
- return nullptr; |
- } |
- return CreateDecodingImageGenerator(nullptr, stream, opts); |
-} |