| Index: src/codec/SkCodec.cpp
|
| diff --git a/src/codec/SkCodec.cpp b/src/codec/SkCodec.cpp
|
| index 3c485c8beb9575c9d594b50a35e9a114f844e63c..3da7f5fb07bd9f6381417ea904fb67c77a5d69a0 100644
|
| --- a/src/codec/SkCodec.cpp
|
| +++ b/src/codec/SkCodec.cpp
|
| @@ -154,20 +154,6 @@
|
| return this->onRewind();
|
| }
|
|
|
| -#define CHECK_COLOR_TABLE \
|
| - if (kIndex_8_SkColorType == info.colorType()) { \
|
| - if (nullptr == ctable || nullptr == ctableCount) { \
|
| - return SkCodec::kInvalidParameters; \
|
| - } \
|
| - } else { \
|
| - if (ctableCount) { \
|
| - *ctableCount = 0; \
|
| - } \
|
| - ctableCount = nullptr; \
|
| - ctable = nullptr; \
|
| - }
|
| -
|
| -
|
| SkCodec::Result SkCodec::getPixels(const SkImageInfo& info, void* pixels, size_t rowBytes,
|
| const Options* options, SkPMColor ctable[], int* ctableCount) {
|
| if (kUnknown_SkColorType == info.colorType()) {
|
| @@ -180,7 +166,17 @@
|
| return kInvalidParameters;
|
| }
|
|
|
| - CHECK_COLOR_TABLE;
|
| + if (kIndex_8_SkColorType == info.colorType()) {
|
| + if (nullptr == ctable || nullptr == ctableCount) {
|
| + return kInvalidParameters;
|
| + }
|
| + } else {
|
| + if (ctableCount) {
|
| + *ctableCount = 0;
|
| + }
|
| + ctableCount = nullptr;
|
| + ctable = nullptr;
|
| + }
|
|
|
| if (!this->rewindIfNeeded()) {
|
| return kCouldNotRewind;
|
| @@ -232,25 +228,23 @@
|
| return this->getPixels(info, pixels, rowBytes, nullptr, nullptr, nullptr);
|
| }
|
|
|
| -SkCodec::Result SkCodec::startIncrementalDecode(const SkImageInfo& info, void* pixels,
|
| - size_t rowBytes, const SkCodec::Options* options, SkPMColor* ctable, int* ctableCount) {
|
| - fStartedIncrementalDecode = false;
|
| -
|
| - if (kUnknown_SkColorType == info.colorType()) {
|
| - return kInvalidConversion;
|
| - }
|
| - if (nullptr == pixels) {
|
| - return kInvalidParameters;
|
| - }
|
| -
|
| +SkCodec::Result SkCodec::startScanlineDecode(const SkImageInfo& dstInfo,
|
| + const SkCodec::Options* options, SkPMColor ctable[], int* ctableCount) {
|
| + // Reset fCurrScanline in case of failure.
|
| + fCurrScanline = -1;
|
| // Ensure that valid color ptrs are passed in for kIndex8 color type
|
| - CHECK_COLOR_TABLE;
|
| -
|
| - // FIXME: If the rows come after the rows of a previous incremental decode,
|
| - // we might be able to skip the rewind, but only the implementation knows
|
| - // that. (e.g. PNG will always need to rewind, since we called longjmp, but
|
| - // a bottom-up BMP could skip rewinding if the new rows are above the old
|
| - // rows.)
|
| + if (kIndex_8_SkColorType == dstInfo.colorType()) {
|
| + if (nullptr == ctable || nullptr == ctableCount) {
|
| + return SkCodec::kInvalidParameters;
|
| + }
|
| + } else {
|
| + if (ctableCount) {
|
| + *ctableCount = 0;
|
| + }
|
| + ctableCount = nullptr;
|
| + ctable = nullptr;
|
| + }
|
| +
|
| if (!this->rewindIfNeeded()) {
|
| return kCouldNotRewind;
|
| }
|
| @@ -260,91 +254,36 @@
|
| if (nullptr == options) {
|
| options = &optsStorage;
|
| } else if (options->fSubset) {
|
| - SkIRect size = SkIRect::MakeSize(info.dimensions());
|
| - if (!size.contains(*options->fSubset)) {
|
| - return kInvalidParameters;
|
| - }
|
| -
|
| - const int top = options->fSubset->top();
|
| - const int bottom = options->fSubset->bottom();
|
| - if (top < 0 || top >= info.height() || top >= bottom || bottom > info.height()) {
|
| - return kInvalidParameters;
|
| - }
|
| - }
|
| -
|
| - if (!this->dimensionsSupported(info.dimensions())) {
|
| - return kInvalidScale;
|
| - }
|
| -
|
| - fDstInfo = info;
|
| - fOptions = *options;
|
| -
|
| - const Result result = this->onStartIncrementalDecode(info, pixels, rowBytes,
|
| - fOptions, ctable, ctableCount);
|
| - if (kSuccess == result) {
|
| - fStartedIncrementalDecode = true;
|
| - } else if (kUnimplemented == result) {
|
| - // FIXME: This is temporarily necessary, until we transition SkCodec
|
| - // implementations from scanline decoding to incremental decoding.
|
| - // SkAndroidCodec will first attempt to use incremental decoding, but
|
| - // will fall back to scanline decoding if incremental returns
|
| - // kUnimplemented. rewindIfNeeded(), above, set fNeedsRewind to true
|
| - // (after potentially rewinding), but we do not want the next call to
|
| - // startScanlineDecode() to do a rewind.
|
| - fNeedsRewind = false;
|
| - }
|
| - return result;
|
| -}
|
| -
|
| -
|
| -SkCodec::Result SkCodec::startScanlineDecode(const SkImageInfo& info,
|
| - const SkCodec::Options* options, SkPMColor ctable[], int* ctableCount) {
|
| - // Reset fCurrScanline in case of failure.
|
| - fCurrScanline = -1;
|
| - // Ensure that valid color ptrs are passed in for kIndex8 color type
|
| - CHECK_COLOR_TABLE;
|
| -
|
| - if (!this->rewindIfNeeded()) {
|
| - return kCouldNotRewind;
|
| - }
|
| -
|
| - // Set options.
|
| - Options optsStorage;
|
| - if (nullptr == options) {
|
| - options = &optsStorage;
|
| - } else if (options->fSubset) {
|
| - SkIRect size = SkIRect::MakeSize(info.dimensions());
|
| + SkIRect size = SkIRect::MakeSize(dstInfo.dimensions());
|
| if (!size.contains(*options->fSubset)) {
|
| return kInvalidInput;
|
| }
|
|
|
| // We only support subsetting in the x-dimension for scanline decoder.
|
| // Subsetting in the y-dimension can be accomplished using skipScanlines().
|
| - if (options->fSubset->top() != 0 || options->fSubset->height() != info.height()) {
|
| + if (options->fSubset->top() != 0 || options->fSubset->height() != dstInfo.height()) {
|
| return kInvalidInput;
|
| }
|
| }
|
|
|
| // FIXME: Support subsets somehow?
|
| - if (!this->dimensionsSupported(info.dimensions())) {
|
| + if (!this->dimensionsSupported(dstInfo.dimensions())) {
|
| return kInvalidScale;
|
| }
|
|
|
| - const Result result = this->onStartScanlineDecode(info, *options, ctable, ctableCount);
|
| + const Result result = this->onStartScanlineDecode(dstInfo, *options, ctable, ctableCount);
|
| if (result != SkCodec::kSuccess) {
|
| return result;
|
| }
|
|
|
| fCurrScanline = 0;
|
| - fDstInfo = info;
|
| + fDstInfo = dstInfo;
|
| fOptions = *options;
|
| return kSuccess;
|
| }
|
|
|
| -#undef CHECK_COLOR_TABLE
|
| -
|
| -SkCodec::Result SkCodec::startScanlineDecode(const SkImageInfo& info) {
|
| - return this->startScanlineDecode(info, nullptr, nullptr, nullptr);
|
| +SkCodec::Result SkCodec::startScanlineDecode(const SkImageInfo& dstInfo) {
|
| + return this->startScanlineDecode(dstInfo, nullptr, nullptr, nullptr);
|
| }
|
|
|
| int SkCodec::getScanlines(void* dst, int countLines, size_t rowBytes) {
|
| @@ -392,6 +331,7 @@
|
| int SkCodec::onOutputScanline(int inputScanline) const {
|
| switch (this->getScanlineOrder()) {
|
| case kTopDown_SkScanlineOrder:
|
| + case kNone_SkScanlineOrder:
|
| return inputScanline;
|
| case kBottomUp_SkScanlineOrder:
|
| return this->getInfo().height() - inputScanline - 1;
|
| @@ -425,7 +365,8 @@
|
| }
|
|
|
| switch (this->getScanlineOrder()) {
|
| - case kTopDown_SkScanlineOrder: {
|
| + case kTopDown_SkScanlineOrder:
|
| + case kNone_SkScanlineOrder: {
|
| const SkImageInfo fillInfo = info.makeWH(fillWidth, linesRemaining);
|
| fillDst = SkTAddOffset<void>(dst, linesDecoded * rowBytes);
|
| fill_proc(fillInfo, fillDst, rowBytes, fillValue, zeroInit, sampler);
|
|
|