| Index: src/codec/SkCodec_wbmp.cpp
|
| diff --git a/src/codec/SkCodec_wbmp.cpp b/src/codec/SkCodec_wbmp.cpp
|
| index 22f2bacce0d22f4fb4246a7f8c06338c1f09be17..0c85eada7c83c33458558f47b08b7a3dca55d819 100644
|
| --- a/src/codec/SkCodec_wbmp.cpp
|
| +++ b/src/codec/SkCodec_wbmp.cpp
|
| @@ -96,6 +96,8 @@ SkCodec::Result SkWbmpCodec::readRow(uint8_t* row) {
|
| SkWbmpCodec::SkWbmpCodec(const SkImageInfo& info, SkStream* stream)
|
| : INHERITED(info, stream)
|
| , fSrcRowBytes(get_src_row_bytes(this->getInfo().width()))
|
| + , fColorTable(nullptr)
|
| + , fSwizzler(nullptr)
|
| {}
|
|
|
| SkEncodedFormat SkWbmpCodec::onGetEncodedFormat() const {
|
| @@ -120,7 +122,7 @@ SkCodec::Result SkWbmpCodec::onGetPixels(const SkImageInfo& info,
|
| }
|
|
|
| if (!valid_alpha(info.alphaType(), this->getInfo().alphaType())) {
|
| - return SkCodec::kInvalidConversion;
|
| + return kInvalidConversion;
|
| }
|
|
|
| // Prepare a color table if necessary
|
| @@ -163,90 +165,55 @@ SkCodec* SkWbmpCodec::NewFromStream(SkStream* stream) {
|
| return new SkWbmpCodec(info, streamDeleter.detach());
|
| }
|
|
|
| -class SkWbmpScanlineDecoder : public SkScanlineDecoder {
|
| -public:
|
| - /*
|
| - * Takes ownership of all pointer paramters.
|
| - */
|
| - SkWbmpScanlineDecoder(SkWbmpCodec* codec)
|
| - : INHERITED(codec->getInfo())
|
| - , fCodec(codec)
|
| - , fColorTable(nullptr)
|
| - , fSwizzler(nullptr)
|
| - , fSrcBuffer(codec->fSrcRowBytes)
|
| - {}
|
| -
|
| - SkCodec::Result onGetScanlines(void* dst, int count, size_t dstRowBytes) override {
|
| - void* dstRow = dst;
|
| - for (int y = 0; y < count; ++y) {
|
| - SkCodec::Result rowResult = fCodec->readRow(fSrcBuffer.get());
|
| - if (SkCodec::kSuccess != rowResult) {
|
| - return rowResult;
|
| - }
|
| - fSwizzler->swizzle(dstRow, fSrcBuffer.get());
|
| - dstRow = SkTAddOffset<void>(dstRow, dstRowBytes);
|
| +SkCodec::Result SkWbmpCodec::onGetScanlines(void* dst, int count, size_t dstRowBytes) {
|
| + void* dstRow = dst;
|
| + for (int y = 0; y < count; ++y) {
|
| + Result rowResult = this->readRow(fSrcBuffer.get());
|
| + if (kSuccess != rowResult) {
|
| + return rowResult;
|
| }
|
| - return SkCodec::kSuccess;
|
| + fSwizzler->swizzle(dstRow, fSrcBuffer.get());
|
| + dstRow = SkTAddOffset<void>(dstRow, dstRowBytes);
|
| }
|
| + return kSuccess;
|
| +}
|
|
|
| - SkCodec::Result onStart(const SkImageInfo& dstInfo,
|
| - const SkCodec::Options& options, SkPMColor inputColorTable[],
|
| - int* inputColorCount) {
|
| - if (!fCodec->rewindIfNeeded()) {
|
| - return SkCodec::kCouldNotRewind;
|
| - }
|
| - if (options.fSubset) {
|
| - // Subsets are not supported.
|
| - return SkCodec::kUnimplemented;
|
| - }
|
| - if (dstInfo.dimensions() != this->getInfo().dimensions()) {
|
| - if (!SkScaledCodec::DimensionsSupportedForSampling(this->getInfo(), dstInfo)) {
|
| - return SkCodec::kInvalidScale;
|
| - }
|
| - }
|
| -
|
| - if (!valid_alpha(dstInfo.alphaType(), this->getInfo().alphaType())) {
|
| - return SkCodec::kInvalidConversion;
|
| - }
|
| -
|
| - // Fill in the color table
|
| - setup_color_table(dstInfo.colorType(), inputColorTable, inputColorCount);
|
| -
|
| - // Copy the color table to a pointer that can be owned by the scanline decoder
|
| - if (kIndex_8_SkColorType == dstInfo.colorType()) {
|
| - fColorTable.reset(new SkColorTable(inputColorTable, 2));
|
| - }
|
| -
|
| - // Initialize the swizzler
|
| - fSwizzler.reset(fCodec->initializeSwizzler(dstInfo,
|
| - get_color_ptr(fColorTable.get()), options));
|
| - if (nullptr == fSwizzler.get()) {
|
| - return SkCodec::kInvalidConversion;
|
| +SkCodec::Result SkWbmpCodec::onStartScanlineDecode(const SkImageInfo& dstInfo,
|
| + const Options& options, SkPMColor inputColorTable[], int* inputColorCount) {
|
| + if (!this->rewindIfNeeded()) {
|
| + return kCouldNotRewind;
|
| + }
|
| + if (options.fSubset) {
|
| + // Subsets are not supported.
|
| + return kUnimplemented;
|
| + }
|
| + if (dstInfo.dimensions() != this->getInfo().dimensions()) {
|
| + if (!SkScaledCodec::DimensionsSupportedForSampling(this->getInfo(), dstInfo)) {
|
| + return kInvalidScale;
|
| }
|
| -
|
| - return SkCodec::kSuccess;
|
| }
|
|
|
| - SkEncodedFormat onGetEncodedFormat() const {
|
| - return kWBMP_SkEncodedFormat;
|
| + if (!valid_alpha(dstInfo.alphaType(), this->getInfo().alphaType())) {
|
| + return kInvalidConversion;
|
| }
|
|
|
| -private:
|
| - SkAutoTDelete<SkWbmpCodec> fCodec;
|
| - SkAutoTUnref<SkColorTable> fColorTable;
|
| - SkAutoTDelete<SkSwizzler> fSwizzler;
|
| - SkAutoTMalloc<uint8_t> fSrcBuffer;
|
| + // Fill in the color table
|
| + setup_color_table(dstInfo.colorType(), inputColorTable, inputColorCount);
|
|
|
| - typedef SkScanlineDecoder INHERITED;
|
| -};
|
| + // Copy the color table to a pointer that can be owned by the scanline decoder
|
| + if (kIndex_8_SkColorType == dstInfo.colorType()) {
|
| + fColorTable.reset(new SkColorTable(inputColorTable, 2));
|
| + }
|
|
|
| -SkScanlineDecoder* SkWbmpCodec::NewSDFromStream(SkStream* stream) {
|
| - SkAutoTDelete<SkWbmpCodec> codec(static_cast<SkWbmpCodec*>(
|
| - SkWbmpCodec::NewFromStream(stream)));
|
| - if (!codec) {
|
| - return nullptr;
|
| + // Initialize the swizzler
|
| + fSwizzler.reset(this->initializeSwizzler(dstInfo,
|
| + get_color_ptr(fColorTable.get()), options));
|
| + if (nullptr == fSwizzler.get()) {
|
| + return kInvalidConversion;
|
| }
|
|
|
| - // Return the new scanline decoder
|
| - return new SkWbmpScanlineDecoder(codec.detach());
|
| + fSrcBuffer.reset(fSrcRowBytes);
|
| +
|
| + return kSuccess;
|
| }
|
| +
|
|
|