diff options
author | 2016-02-12 13:07:15 -0800 | |
---|---|---|
committer | 2016-02-12 13:07:15 -0800 | |
commit | c7578b6cdd03b61f076ffc7956efd952d6c301c0 (patch) | |
tree | 8a3618f653636727d677e2057d1c7d93567a27b7 /src | |
parent | dae774eff41b36ae6511450d458060dd3d031689 (diff) |
Fix colorType/alphaType checks in SkCodec
Make getPixels() and startScanlineDecode() behave
consistently.
Require that kGray8 decodes are opaque.
Assert that creating the swizzler succeeds.
BUG=skia:4203
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1695473002
Review URL: https://codereview.chromium.org/1695473002
Diffstat (limited to 'src')
-rw-r--r-- | src/codec/SkBmpMaskCodec.cpp | 21 | ||||
-rw-r--r-- | src/codec/SkBmpMaskCodec.h | 1 | ||||
-rw-r--r-- | src/codec/SkBmpStandardCodec.cpp | 18 | ||||
-rw-r--r-- | src/codec/SkBmpStandardCodec.h | 2 | ||||
-rw-r--r-- | src/codec/SkCodec.cpp | 9 | ||||
-rw-r--r-- | src/codec/SkCodecPriv.h | 7 | ||||
-rw-r--r-- | src/codec/SkGifCodec.cpp | 11 | ||||
-rw-r--r-- | src/codec/SkGifCodec.h | 2 | ||||
-rw-r--r-- | src/codec/SkJpegCodec.cpp | 1 | ||||
-rw-r--r-- | src/codec/SkWbmpCodec.cpp | 37 |
10 files changed, 41 insertions, 68 deletions
diff --git a/src/codec/SkBmpMaskCodec.cpp b/src/codec/SkBmpMaskCodec.cpp index b603de9a03..21d231b15f 100644 --- a/src/codec/SkBmpMaskCodec.cpp +++ b/src/codec/SkBmpMaskCodec.cpp @@ -57,25 +57,12 @@ SkCodec::Result SkBmpMaskCodec::onGetPixels(const SkImageInfo& dstInfo, return kSuccess; } -bool SkBmpMaskCodec::initializeSwizzler(const SkImageInfo& dstInfo, const Options& options) { - // Create the swizzler - fMaskSwizzler.reset(SkMaskSwizzler::CreateMaskSwizzler(dstInfo, this->getInfo(), fMasks, - this->bitsPerPixel(), options)); - - if (nullptr == fMaskSwizzler.get()) { - return false; - } - - return true; -} - SkCodec::Result SkBmpMaskCodec::prepareToDecode(const SkImageInfo& dstInfo, const SkCodec::Options& options, SkPMColor inputColorPtr[], int* inputColorCount) { - // Initialize a the mask swizzler - if (!this->initializeSwizzler(dstInfo, options)) { - SkCodecPrintf("Error: cannot initialize swizzler.\n"); - return SkCodec::kInvalidConversion; - } + // Initialize the mask swizzler + fMaskSwizzler.reset(SkMaskSwizzler::CreateMaskSwizzler(dstInfo, this->getInfo(), fMasks, + this->bitsPerPixel(), options)); + SkASSERT(fMaskSwizzler); return SkCodec::kSuccess; } diff --git a/src/codec/SkBmpMaskCodec.h b/src/codec/SkBmpMaskCodec.h index 73a8b3799d..93b3bca5a0 100644 --- a/src/codec/SkBmpMaskCodec.h +++ b/src/codec/SkBmpMaskCodec.h @@ -44,7 +44,6 @@ protected: private: - bool initializeSwizzler(const SkImageInfo& dstInfo, const Options& options); SkSampler* getSampler(bool createIfNecessary) override { SkASSERT(fMaskSwizzler); return fMaskSwizzler; diff --git a/src/codec/SkBmpStandardCodec.cpp b/src/codec/SkBmpStandardCodec.cpp index 47b10701d3..39d357be8b 100644 --- a/src/codec/SkBmpStandardCodec.cpp +++ b/src/codec/SkBmpStandardCodec.cpp @@ -152,9 +152,9 @@ SkCodec::Result SkBmpStandardCodec::onGetPixels(const SkImageInfo& dstInfo, return true; } -bool SkBmpStandardCodec::initializeSwizzler(const SkImageInfo& dstInfo, const Options& opts) { +void SkBmpStandardCodec::initializeSwizzler(const SkImageInfo& dstInfo, const Options& opts) { // Get swizzler configuration - SkSwizzler::SrcConfig config; + SkSwizzler::SrcConfig config = SkSwizzler::kUnknown; switch (this->bitsPerPixel()) { case 1: config = SkSwizzler::kIndex1; @@ -180,7 +180,6 @@ bool SkBmpStandardCodec::initializeSwizzler(const SkImageInfo& dstInfo, const Op break; default: SkASSERT(false); - return false; } // Get a pointer to the color table if it exists @@ -188,11 +187,7 @@ bool SkBmpStandardCodec::initializeSwizzler(const SkImageInfo& dstInfo, const Op // Create swizzler fSwizzler.reset(SkSwizzler::CreateSwizzler(config, colorPtr, dstInfo, opts)); - - if (nullptr == fSwizzler.get()) { - return false; - } - return true; + SkASSERT(fSwizzler); } SkCodec::Result SkBmpStandardCodec::prepareToDecode(const SkImageInfo& dstInfo, @@ -207,11 +202,8 @@ SkCodec::Result SkBmpStandardCodec::prepareToDecode(const SkImageInfo& dstInfo, // Copy the color table to the client if necessary copy_color_table(dstInfo, this->fColorTable, inputColorPtr, inputColorCount); - // Initialize a swizzler if necessary - if (!this->initializeSwizzler(dstInfo, options)) { - SkCodecPrintf("Error: cannot initialize swizzler.\n"); - return SkCodec::kInvalidConversion; - } + // Initialize a swizzler + this->initializeSwizzler(dstInfo, options); return SkCodec::kSuccess; } diff --git a/src/codec/SkBmpStandardCodec.h b/src/codec/SkBmpStandardCodec.h index d3e2ed3e4f..557f6535c9 100644 --- a/src/codec/SkBmpStandardCodec.h +++ b/src/codec/SkBmpStandardCodec.h @@ -72,7 +72,7 @@ private: */ bool createColorTable(SkAlphaType alphaType, int* colorCount); - bool initializeSwizzler(const SkImageInfo& dstInfo, const Options& opts); + void initializeSwizzler(const SkImageInfo& dstInfo, const Options& opts); int decodeRows(const SkImageInfo& dstInfo, void* dst, size_t dstRowBytes, const Options& opts) override; diff --git a/src/codec/SkCodec.cpp b/src/codec/SkCodec.cpp index 0da36bb171..bb7b26529b 100644 --- a/src/codec/SkCodec.cpp +++ b/src/codec/SkCodec.cpp @@ -162,15 +162,6 @@ SkCodec::Result SkCodec::getPixels(const SkImageInfo& info, void* pixels, size_t ctable = nullptr; } - { - SkAlphaType canonical; - if (!SkColorTypeValidateAlphaType(info.colorType(), info.alphaType(), &canonical) - || canonical != info.alphaType()) - { - return kInvalidConversion; - } - } - if (!this->rewindIfNeeded()) { return kCouldNotRewind; } diff --git a/src/codec/SkCodecPriv.h b/src/codec/SkCodecPriv.h index 235c4e24af..5d66118943 100644 --- a/src/codec/SkCodecPriv.h +++ b/src/codec/SkCodecPriv.h @@ -136,7 +136,12 @@ inline bool conversion_possible(const SkImageInfo& dst, const SkImageInfo& src) case kN32_SkColorType: return true; case kRGB_565_SkColorType: - return src.alphaType() == kOpaque_SkAlphaType; + return kOpaque_SkAlphaType == dst.alphaType(); + case kGray_8_SkColorType: + if (kOpaque_SkAlphaType != dst.alphaType()) { + return false; + } + // Fall through default: return dst.colorType() == src.colorType(); } diff --git a/src/codec/SkGifCodec.cpp b/src/codec/SkGifCodec.cpp index a938f5fc48..785c17e0f1 100644 --- a/src/codec/SkGifCodec.cpp +++ b/src/codec/SkGifCodec.cpp @@ -436,19 +436,16 @@ SkCodec::Result SkGifCodec::prepareToDecode(const SkImageInfo& dstInfo, SkPMColo // Initialize color table and copy to the client if necessary this->initializeColorTable(dstInfo, inputColorPtr, inputColorCount); - return this->initializeSwizzler(dstInfo, opts); + this->initializeSwizzler(dstInfo, opts); + return kSuccess; } -SkCodec::Result SkGifCodec::initializeSwizzler(const SkImageInfo& dstInfo, const Options& opts) { +void SkGifCodec::initializeSwizzler(const SkImageInfo& dstInfo, const Options& opts) { const SkPMColor* colorPtr = get_color_ptr(fColorTable.get()); const SkIRect* frameRect = fFrameIsSubset ? &fFrameRect : nullptr; fSwizzler.reset(SkSwizzler::CreateSwizzler(SkSwizzler::kIndex, colorPtr, dstInfo, opts, frameRect)); - - if (nullptr != fSwizzler.get()) { - return kSuccess; - } - return kUnimplemented; + SkASSERT(fSwizzler); } bool SkGifCodec::readRow() { diff --git a/src/codec/SkGifCodec.h b/src/codec/SkGifCodec.h index 91861b299a..010a344cf5 100644 --- a/src/codec/SkGifCodec.h +++ b/src/codec/SkGifCodec.h @@ -128,7 +128,7 @@ private: * @param options Informs the swizzler if destination memory is zero initialized. * Contains subset information. */ - Result initializeSwizzler(const SkImageInfo& dstInfo, + void initializeSwizzler(const SkImageInfo& dstInfo, const Options& options); SkSampler* getSampler(bool createIfNecessary) override { diff --git a/src/codec/SkJpegCodec.cpp b/src/codec/SkJpegCodec.cpp index f920c98f69..e1440af5c3 100644 --- a/src/codec/SkJpegCodec.cpp +++ b/src/codec/SkJpegCodec.cpp @@ -372,6 +372,7 @@ void SkJpegCodec::initializeSwizzler(const SkImageInfo& dstInfo, const Options& } fSwizzler.reset(SkSwizzler::CreateSwizzler(srcConfig, nullptr, dstInfo, options)); + SkASSERT(fSwizzler); fStorage.reset(get_row_bytes(fDecoderMgr->dinfo())); fSrcRow = fStorage.get(); } diff --git a/src/codec/SkWbmpCodec.cpp b/src/codec/SkWbmpCodec.cpp index af1ab46f73..706d5ddd46 100644 --- a/src/codec/SkWbmpCodec.cpp +++ b/src/codec/SkWbmpCodec.cpp @@ -30,6 +30,19 @@ static inline void setup_color_table(SkColorType colorType, } } +static inline bool valid_color_type(SkColorType colorType, SkAlphaType alphaType) { + switch (colorType) { + case kN32_SkColorType: + case kIndex_8_SkColorType: + return true; + case kGray_8_SkColorType: + case kRGB_565_SkColorType: + return kOpaque_SkAlphaType == alphaType; + default: + return false; + } +} + static bool read_byte(SkStream* stream, uint8_t* data) { return stream->read(data, 1) == 1; @@ -84,16 +97,6 @@ bool SkWbmpCodec::onRewind() { SkSwizzler* SkWbmpCodec::initializeSwizzler(const SkImageInfo& info, const SkPMColor* ctable, const Options& opts) { - // Create the swizzler based on the desired color type - switch (info.colorType()) { - case kIndex_8_SkColorType: - case kN32_SkColorType: - case kRGB_565_SkColorType: - case kGray_8_SkColorType: - break; - default: - return nullptr; - } return SkSwizzler::CreateSwizzler(SkSwizzler::kBit, ctable, info, opts); } @@ -124,7 +127,8 @@ SkCodec::Result SkWbmpCodec::onGetPixels(const SkImageInfo& info, return kUnimplemented; } - if (!valid_alpha(info.alphaType(), this->getInfo().alphaType())) { + if (!valid_color_type(info.colorType(), info.alphaType()) || + !valid_alpha(info.alphaType(), this->getInfo().alphaType())) { return kInvalidConversion; } @@ -133,9 +137,7 @@ SkCodec::Result SkWbmpCodec::onGetPixels(const SkImageInfo& info, // Initialize the swizzler SkAutoTDelete<SkSwizzler> swizzler(this->initializeSwizzler(info, ctable, options)); - if (nullptr == swizzler.get()) { - return kInvalidConversion; - } + SkASSERT(swizzler); // Perform the decode SkISize size = info.dimensions(); @@ -193,7 +195,8 @@ SkCodec::Result SkWbmpCodec::onStartScanlineDecode(const SkImageInfo& dstInfo, return kUnimplemented; } - if (!valid_alpha(dstInfo.alphaType(), this->getInfo().alphaType())) { + if (!valid_color_type(dstInfo.colorType(), dstInfo.alphaType()) || + !valid_alpha(dstInfo.alphaType(), this->getInfo().alphaType())) { return kInvalidConversion; } @@ -207,9 +210,7 @@ SkCodec::Result SkWbmpCodec::onStartScanlineDecode(const SkImageInfo& dstInfo, // Initialize the swizzler fSwizzler.reset(this->initializeSwizzler(dstInfo, get_color_ptr(fColorTable.get()), options)); - if (nullptr == fSwizzler.get()) { - return kInvalidConversion; - } + SkASSERT(fSwizzler); fSrcBuffer.reset(fSrcRowBytes); |