aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar msarett <msarett@google.com>2016-02-12 13:07:15 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2016-02-12 13:07:15 -0800
commitc7578b6cdd03b61f076ffc7956efd952d6c301c0 (patch)
tree8a3618f653636727d677e2057d1c7d93567a27b7 /src
parentdae774eff41b36ae6511450d458060dd3d031689 (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.cpp21
-rw-r--r--src/codec/SkBmpMaskCodec.h1
-rw-r--r--src/codec/SkBmpStandardCodec.cpp18
-rw-r--r--src/codec/SkBmpStandardCodec.h2
-rw-r--r--src/codec/SkCodec.cpp9
-rw-r--r--src/codec/SkCodecPriv.h7
-rw-r--r--src/codec/SkGifCodec.cpp11
-rw-r--r--src/codec/SkGifCodec.h2
-rw-r--r--src/codec/SkJpegCodec.cpp1
-rw-r--r--src/codec/SkWbmpCodec.cpp37
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);