Index: src/codec/SkCodec_libgif.cpp |
diff --git a/src/codec/SkCodec_libgif.cpp b/src/codec/SkCodec_libgif.cpp |
index 03107aba2ee80d824676b8e92f8f80720575ba6f..65503558aaab8635899f62a280ead32d96ad5605 100644 |
--- a/src/codec/SkCodec_libgif.cpp |
+++ b/src/codec/SkCodec_libgif.cpp |
@@ -436,12 +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 kSuccess; |
+ |
+ return this->initializeSwizzler(dstInfo, opts); |
} |
SkCodec::Result SkGifCodec::initializeSwizzler(const SkImageInfo& dstInfo, const Options& opts) { |
const SkPMColor* colorPtr = get_color_ptr(fColorTable.get()); |
- fSwizzler.reset(SkSwizzler::CreateSwizzler(SkSwizzler::kIndex, colorPtr, dstInfo, opts)); |
+ const SkIRect* frameRect = fFrameIsSubset ? &fFrameRect : nullptr; |
+ fSwizzler.reset(SkSwizzler::CreateSwizzler(SkSwizzler::kIndex, colorPtr, dstInfo, opts, |
+ frameRect)); |
+ |
if (nullptr != fSwizzler.get()) { |
return kSuccess; |
} |
@@ -472,29 +476,14 @@ SkCodec::Result SkGifCodec::onGetPixels(const SkImageInfo& dstInfo, |
// Initialize the swizzler |
if (fFrameIsSubset) { |
- const SkImageInfo subsetDstInfo = dstInfo.makeWH(fFrameRect.width(), fFrameRect.height()); |
- if (kSuccess != this->initializeSwizzler(subsetDstInfo, opts)) { |
- return gif_error("Could not initialize swizzler.\n", kUnimplemented); |
- } |
- |
// Fill the background |
SkSampler::Fill(dstInfo, dst, dstRowBytes, |
this->getFillValue(dstInfo.colorType(), dstInfo.alphaType()), |
opts.fZeroInitialized); |
- |
- // Modify the dst pointer |
- const int32_t dstBytesPerPixel = SkColorTypeBytesPerPixel(dstInfo.colorType()); |
- dst = SkTAddOffset<void*>(dst, dstRowBytes * fFrameRect.top() + |
- dstBytesPerPixel * fFrameRect.left()); |
- } else { |
- if (kSuccess != this->initializeSwizzler(dstInfo, opts)) { |
- return gif_error("Could not initialize swizzler.\n", kUnimplemented); |
- } |
} |
// Iterate over rows of the input |
- uint32_t height = fFrameRect.height(); |
- for (uint32_t y = 0; y < height; y++) { |
+ for (int y = fFrameRect.top(); y < fFrameRect.bottom(); y++) { |
if (!this->readRow()) { |
*rowsDecoded = y; |
return gif_error("Could not decode line.\n", kIncompleteInput); |
@@ -514,25 +503,7 @@ uint32_t SkGifCodec::onGetFillValue(SkColorType colorType, SkAlphaType alphaType |
SkCodec::Result SkGifCodec::onStartScanlineDecode(const SkImageInfo& dstInfo, |
const SkCodec::Options& opts, SkPMColor inputColorPtr[], int* inputColorCount) { |
- |
- Result result = this->prepareToDecode(dstInfo, inputColorPtr, inputColorCount, this->options()); |
- if (kSuccess != result) { |
- return result; |
- } |
- |
- // Initialize the swizzler |
- if (fFrameIsSubset) { |
- const SkImageInfo subsetDstInfo = dstInfo.makeWH(fFrameRect.width(), fFrameRect.height()); |
- if (kSuccess != this->initializeSwizzler(subsetDstInfo, opts)) { |
- return gif_error("Could not initialize swizzler.\n", kUnimplemented); |
- } |
- } else { |
- if (kSuccess != this->initializeSwizzler(dstInfo, opts)) { |
- return gif_error("Could not initialize swizzler.\n", kUnimplemented); |
- } |
- } |
- |
- return kSuccess; |
+ return this->prepareToDecode(dstInfo, inputColorPtr, inputColorCount, this->options()); |
} |
int SkGifCodec::onGetScanlines(void* dst, int count, size_t rowBytes) { |
@@ -544,7 +515,7 @@ int SkGifCodec::onGetScanlines(void* dst, int count, size_t rowBytes) { |
SkImageInfo fillInfo = this->dstInfo().makeWH(this->dstInfo().width(), count); |
uint32_t fillValue = this->onGetFillValue(this->dstInfo().colorType(), |
this->dstInfo().alphaType()); |
- SkSampler::Fill(fillInfo, dst, rowBytes, fillValue, this->options().fZeroInitialized); |
+ fSwizzler->fill(fillInfo, dst, rowBytes, fillValue, this->options().fZeroInitialized); |
// Do nothing for rows before the image frame |
rowsBeforeFrame = SkTMax(0, fFrameRect.top() - this->INHERITED::nextScanline()); |
@@ -555,10 +526,6 @@ int SkGifCodec::onGetScanlines(void* dst, int count, size_t rowBytes) { |
rowsAfterFrame = SkTMax(0, |
this->INHERITED::nextScanline() + rowsInFrame - fFrameRect.bottom()); |
rowsInFrame = SkTMax(0, rowsInFrame - rowsAfterFrame); |
- |
- // Adjust dst pointer for left offset |
- int offset = SkColorTypeBytesPerPixel(this->dstInfo().colorType()) * fFrameRect.left(); |
- dst = SkTAddOffset<void>(dst, offset); |
} |
for (int i = 0; i < rowsInFrame; i++) { |
@@ -584,7 +551,8 @@ int SkGifCodec::onOutputScanline(int inputScanline) const { |
if (inputScanline < fFrameRect.top() || inputScanline >= fFrameRect.bottom()) { |
return inputScanline; |
} |
- return get_output_row_interlaced(inputScanline - fFrameRect.top(), fFrameRect.height()); |
+ return get_output_row_interlaced(inputScanline - fFrameRect.top(), fFrameRect.height()) + |
+ fFrameRect.top(); |
} |
return inputScanline; |
} |