diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/images/SkDecodingImageGenerator.cpp | 73 | ||||
-rw-r--r-- | src/images/SkImageGenerator.cpp | 79 | ||||
-rw-r--r-- | src/lazy/SkDiscardablePixelRef.cpp | 19 | ||||
-rw-r--r-- | src/lazy/SkDiscardablePixelRef.h | 5 |
4 files changed, 46 insertions, 130 deletions
diff --git a/src/images/SkDecodingImageGenerator.cpp b/src/images/SkDecodingImageGenerator.cpp index 1f0f706ede..b3924a7daa 100644 --- a/src/images/SkDecodingImageGenerator.cpp +++ b/src/images/SkDecodingImageGenerator.cpp @@ -23,6 +23,12 @@ bool equal_modulo_alpha(const SkImageInfo& a, const SkImageInfo& b) { class DecodingImageGenerator : public SkImageGenerator { public: virtual ~DecodingImageGenerator(); + virtual SkData* refEncodedData() SK_OVERRIDE; + // This implementaion of getInfo() always returns true. + virtual bool getInfo(SkImageInfo* info) SK_OVERRIDE; + virtual bool getPixels(const SkImageInfo& info, + void* pixels, + size_t rowBytes) SK_OVERRIDE; SkData* fData; SkStreamRewindable* fStream; @@ -35,18 +41,6 @@ public: const SkImageInfo& info, int sampleSize, bool ditherImage); - -protected: - virtual SkData* onRefEncodedData() SK_OVERRIDE; - virtual bool onGetInfo(SkImageInfo* info) SK_OVERRIDE { - *info = fInfo; - return true; - } - virtual bool onGetPixels(const SkImageInfo& info, - void* pixels, size_t rowBytes, - SkPMColor ctable[], int* ctableCount) SK_OVERRIDE; - -private: typedef SkImageGenerator INHERITED; }; @@ -129,7 +123,14 @@ DecodingImageGenerator::~DecodingImageGenerator() { fStream->unref(); } -SkData* DecodingImageGenerator::onRefEncodedData() { +bool DecodingImageGenerator::getInfo(SkImageInfo* info) { + if (info != NULL) { + *info = fInfo; + } + return true; +} + +SkData* DecodingImageGenerator::refEncodedData() { // This functionality is used in `gm --serialize` // Does not encode options. if (fData != NULL) { @@ -150,15 +151,22 @@ SkData* DecodingImageGenerator::onRefEncodedData() { return SkSafeRef(fData); } -bool DecodingImageGenerator::onGetPixels(const SkImageInfo& info, - void* pixels, size_t rowBytes, - SkPMColor ctableEntries[], int* ctableCount) { +bool DecodingImageGenerator::getPixels(const SkImageInfo& info, + void* pixels, + size_t rowBytes) { + if (NULL == pixels) { + return false; + } 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; } + if (info.minRowBytes() > rowBytes) { + // The caller has specified a bad rowBytes. + return false; + } SkAssertResult(fStream->rewind()); SkAutoTDelete<SkImageDecoder> decoder(SkImageDecoder::Factory(fStream)); @@ -194,20 +202,6 @@ bool DecodingImageGenerator::onGetPixels(const SkImageInfo& info, } else { SkASSERT(check_alpha(info.alphaType(), bitmap.alphaType())); } - - if (kIndex_8_SkColorType == info.colorType()) { - if (kIndex_8_SkColorType != bitmap.colorType()) { - return false; // they asked for Index8, but we didn't receive that from decoder - } - SkColorTable* ctable = bitmap.getColorTable(); - if (NULL == ctable) { - return false; - } - const int count = ctable->count(); - memcpy(ctableEntries, ctable->lockColors(), count * sizeof(SkPMColor)); - ctable->unlockColors(); - *ctableCount = count; - } return true; } @@ -220,6 +214,11 @@ SkImageGenerator* CreateDecodingImageGenerator( const SkDecodingImageGenerator::Options& opts) { SkASSERT(stream); SkAutoTUnref<SkStreamRewindable> autoStream(stream); // always unref this. + if (opts.fUseRequestedColorType && + (kIndex_8_SkColorType == opts.fRequestedColorType)) { + // We do not support indexed color with SkImageGenerators, + return NULL; + } SkAssertResult(autoStream->rewind()); SkAutoTDelete<SkImageDecoder> decoder(SkImageDecoder::Factory(autoStream)); if (NULL == decoder.get()) { @@ -228,16 +227,24 @@ SkImageGenerator* CreateDecodingImageGenerator( SkBitmap bitmap; decoder->setSampleSize(opts.fSampleSize); decoder->setRequireUnpremultipliedColors(opts.fRequireUnpremul); - if (!decoder->decode(stream, &bitmap, SkImageDecoder::kDecodeBounds_Mode)) { + if (!decoder->decode(stream, &bitmap, + SkImageDecoder::kDecodeBounds_Mode)) { return NULL; } - if (kUnknown_SkColorType == bitmap.colorType()) { + if (bitmap.config() == SkBitmap::kNo_Config) { return NULL; } SkImageInfo info = bitmap.info(); - if (opts.fUseRequestedColorType && (opts.fRequestedColorType != info.colorType())) { + if (!opts.fUseRequestedColorType) { + // Use default + if (kIndex_8_SkColorType == bitmap.colorType()) { + // We don't support kIndex8 because we don't support + // colortables in this workflow. + info.fColorType = kN32_SkColorType; + } + } else { if (!bitmap.canCopyTo(opts.fRequestedColorType)) { SkASSERT(bitmap.colorType() != opts.fRequestedColorType); return NULL; // Can not translate to needed config. diff --git a/src/images/SkImageGenerator.cpp b/src/images/SkImageGenerator.cpp deleted file mode 100644 index b898764f0c..0000000000 --- a/src/images/SkImageGenerator.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2014 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -#include "SkImageGenerator.h" - -#ifndef SK_SUPPORT_LEGACY_IMAGEGENERATORAPI -bool SkImageGenerator::getInfo(SkImageInfo* info) { - SkImageInfo dummy; - if (NULL == info) { - info = &dummy; - } - return this->onGetInfo(info); -} - -bool SkImageGenerator::getPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, - SkPMColor ctable[], int* ctableCount) { - // Dummy (out-of-range) value to catch subclasses that forgot to respect ctable params. - int localCTableCount = -1; - int* localCTableCountPtr = NULL; - - if (kIndex_8_SkColorType == info.colorType()) { - if (NULL == ctable || NULL == ctableCount) { - return false; - } - } else { - if (ctableCount) { - *ctableCount = 0; - } - ctableCount = NULL; - ctable = NULL; - } - - if (kUnknown_SkColorType == info.colorType()) { - return false; - } - if (NULL == pixels) { - return false; - } - if (rowBytes < info.minRowBytes()) { - return false; - } - - bool success = this->onGetPixels(info, pixels, rowBytes, ctable, localCTableCountPtr); - - if (success && localCTableCountPtr) { - SkASSERT(localCTableCount >= 0 && localCTableCount <= 256); - if (ctableCount) { - *ctableCount = localCTableCount; - } - } - return success; -} - -bool SkImageGenerator::getPixels(const SkImageInfo& info, void* pixels, size_t rowBytes) { - SkASSERT(kIndex_8_SkColorType != info.colorType()); - if (kIndex_8_SkColorType == info.colorType()) { - return false; - } - return this->getPixels(info, pixels, rowBytes, NULL, NULL); -} -#endif - -///////////////////////////////////////////////////////////////////////////////////////////// - -SkData* SkImageGenerator::onRefEncodedData() { - return NULL; -} - -bool SkImageGenerator::onGetInfo(SkImageInfo*) { - return false; -} - -bool SkImageGenerator::onGetPixels(const SkImageInfo&, void*, size_t, SkPMColor*, int*) { - return false; -} diff --git a/src/lazy/SkDiscardablePixelRef.cpp b/src/lazy/SkDiscardablePixelRef.cpp index b0bbd27e3a..ccf812ce6f 100644 --- a/src/lazy/SkDiscardablePixelRef.cpp +++ b/src/lazy/SkDiscardablePixelRef.cpp @@ -60,30 +60,15 @@ bool SkDiscardablePixelRef::onNewLockPixels(LockRec* rec) { } void* pixels = fDiscardableMemory->data(); - const SkImageInfo& info = this->info(); - SkPMColor colors[256]; - int colorCount = 0; - - if (!fGenerator->getPixels(info, pixels, fRowBytes, colors, &colorCount)) { + if (!fGenerator->getPixels(this->info(), pixels, fRowBytes)) { fDiscardableMemory->unlock(); SkDELETE(fDiscardableMemory); fDiscardableMemory = NULL; return false; } - // Note: our ctable is not purgable, as it is not stored in the discardablememory block. - // This is because SkColorTable is refcntable, and therefore our caller could hold onto it - // beyond the scope of a lock/unlock. If we change the API/lifecycle for SkColorTable, we - // could move it into the block, but then again perhaps it is small enough that this doesn't - // really matter. - if (colorCount > 0) { - fCTable.reset(SkNEW_ARGS(SkColorTable, (colors, colorCount))); - } else { - fCTable.reset(NULL); - } - rec->fPixels = pixels; - rec->fColorTable = fCTable.get(); + rec->fColorTable = NULL; rec->fRowBytes = fRowBytes; return true; } diff --git a/src/lazy/SkDiscardablePixelRef.h b/src/lazy/SkDiscardablePixelRef.h index 52a1d6ce37..e5e1c9f0e1 100644 --- a/src/lazy/SkDiscardablePixelRef.h +++ b/src/lazy/SkDiscardablePixelRef.h @@ -17,6 +17,10 @@ * A PixelRef backed by SkDiscardableMemory, with the ability to * re-generate the pixels (via a SkImageGenerator) if the DM is * purged. + * + * Since SkColorTable is reference-counted, we do not support indexed + * color with this class; there would be no way for the discardable + * memory system to unref the color table. */ class SkDiscardablePixelRef : public SkPixelRef { public: @@ -42,7 +46,6 @@ private: // PixelRef, since the SkBitmap doesn't expect them to change. SkDiscardableMemory* fDiscardableMemory; - SkAutoTUnref<SkColorTable> fCTable; /* Takes ownership of SkImageGenerator. */ SkDiscardablePixelRef(const SkImageInfo&, SkImageGenerator*, |