| Index: src/codec/SkBmpCodec.cpp
 | 
| diff --git a/src/codec/SkBmpCodec.cpp b/src/codec/SkBmpCodec.cpp
 | 
| index a55cb8cf55beee13493c75538e807811e1a9a2e7..4e801f0be198e95c9f587b42ebb1e4fe03194ecc 100644
 | 
| --- a/src/codec/SkBmpCodec.cpp
 | 
| +++ b/src/codec/SkBmpCodec.cpp
 | 
| @@ -262,10 +262,10 @@ bool SkBmpCodec::ReadHeader(SkStream* stream, bool inIco, SkCodec** codecOut) {
 | 
|      }
 | 
|  
 | 
|      // Check for valid dimensions from header
 | 
| -    SkScanlineDecoder::SkScanlineOrder rowOrder = SkScanlineDecoder::kBottomUp_SkScanlineOrder;
 | 
| +    SkCodec::SkScanlineOrder rowOrder = SkCodec::kBottomUp_SkScanlineOrder;
 | 
|      if (height < 0) {
 | 
|          height = -height;
 | 
| -        rowOrder = SkScanlineDecoder::kTopDown_SkScanlineOrder;
 | 
| +        rowOrder = SkCodec::kTopDown_SkScanlineOrder;
 | 
|      }
 | 
|      // The height field for bmp in ico is double the actual height because they
 | 
|      // contain an XOR mask followed by an AND mask
 | 
| @@ -531,7 +531,7 @@ SkCodec* SkBmpCodec::NewFromStream(SkStream* stream, bool inIco) {
 | 
|  }
 | 
|  
 | 
|  SkBmpCodec::SkBmpCodec(const SkImageInfo& info, SkStream* stream,
 | 
| -        uint16_t bitsPerPixel, SkScanlineDecoder::SkScanlineOrder rowOrder)
 | 
| +        uint16_t bitsPerPixel, SkCodec::SkScanlineOrder rowOrder)
 | 
|      : INHERITED(info, stream)
 | 
|      , fBitsPerPixel(bitsPerPixel)
 | 
|      , fRowOrder(rowOrder)
 | 
| @@ -541,11 +541,11 @@ bool SkBmpCodec::onRewind() {
 | 
|      return SkBmpCodec::ReadHeader(this->stream(), this->inIco(), nullptr);
 | 
|  }
 | 
|  
 | 
| -int32_t SkBmpCodec::getDstRow(int32_t y, int32_t height) {
 | 
| -    if (SkScanlineDecoder::kTopDown_SkScanlineOrder == fRowOrder) {
 | 
| +int32_t SkBmpCodec::getDstRow(int32_t y, int32_t height) const {
 | 
| +    if (SkCodec::kTopDown_SkScanlineOrder == fRowOrder) {
 | 
|          return y;
 | 
|      }
 | 
| -    SkASSERT(SkScanlineDecoder::kBottomUp_SkScanlineOrder == fRowOrder);
 | 
| +    SkASSERT(SkCodec::kBottomUp_SkScanlineOrder == fRowOrder);
 | 
|      return height - y - 1;
 | 
|  }
 | 
|  
 | 
| @@ -557,7 +557,7 @@ int32_t SkBmpCodec::getDstRow(int32_t y, int32_t height) {
 | 
|   * filling at the top of the image.
 | 
|   */
 | 
|  void* SkBmpCodec::getDstStartRow(void* dst, size_t dstRowBytes, int32_t y) const {
 | 
| -    return (SkScanlineDecoder::kTopDown_SkScanlineOrder == fRowOrder) ?
 | 
| +    return (SkCodec::kTopDown_SkScanlineOrder == fRowOrder) ?
 | 
|              SkTAddOffset<void*>(dst, y * dstRowBytes) : dst;
 | 
|  }
 | 
|  
 | 
| @@ -574,71 +574,36 @@ uint32_t SkBmpCodec::computeNumColors(uint32_t numColors) {
 | 
|      return numColors;
 | 
|  }
 | 
|  
 | 
| -/*
 | 
| - * Scanline decoder for bmps
 | 
| - */
 | 
| -class SkBmpScanlineDecoder : public SkScanlineDecoder {
 | 
| -public:
 | 
| -    SkBmpScanlineDecoder(SkBmpCodec* codec)
 | 
| -        : INHERITED(codec->getInfo())
 | 
| -        , fCodec(codec)
 | 
| -    {}
 | 
| -
 | 
| -    SkEncodedFormat onGetEncodedFormat() const override {
 | 
| -        return kBMP_SkEncodedFormat;
 | 
| -    }
 | 
| -
 | 
| -    SkCodec::Result onStart(const SkImageInfo& dstInfo, const SkCodec::Options& options,
 | 
| -                            SkPMColor inputColorPtr[], int* inputColorCount) override {
 | 
| -        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 (!conversion_possible(dstInfo, this->getInfo())) {
 | 
| -            SkCodecPrintf("Error: cannot convert input type to output type.\n");
 | 
| -            return SkCodec::kInvalidConversion;
 | 
| -        }
 | 
| -
 | 
| -        return fCodec->prepareToDecode(dstInfo, options, inputColorPtr, inputColorCount);
 | 
| +SkCodec::Result SkBmpCodec::onStartScanlineDecode(const SkImageInfo& dstInfo,
 | 
| +        const SkCodec::Options& options, SkPMColor inputColorPtr[], int* inputColorCount) {
 | 
| +    if (!this->rewindIfNeeded()) {
 | 
| +        return kCouldNotRewind;
 | 
|      }
 | 
| -
 | 
| -    SkCodec::Result onGetScanlines(void* dst, int count, size_t rowBytes) override {
 | 
| -        // Create a new image info representing the portion of the image to decode
 | 
| -        SkImageInfo rowInfo = this->dstInfo().makeWH(this->dstInfo().width(), count);
 | 
| -
 | 
| -        // Decode the requested rows
 | 
| -        return fCodec->decodeRows(rowInfo, dst, rowBytes, this->options());
 | 
| +    if (options.fSubset) {
 | 
| +        // Subsets are not supported.
 | 
| +        return kUnimplemented;
 | 
|      }
 | 
| -
 | 
| -    SkScanlineOrder onGetScanlineOrder() const override {
 | 
| -        return fCodec->fRowOrder;
 | 
| +    if (dstInfo.dimensions() != this->getInfo().dimensions()) {
 | 
| +        if (!SkScaledCodec::DimensionsSupportedForSampling(this->getInfo(), dstInfo)) {
 | 
| +            return SkCodec::kInvalidScale;
 | 
| +        }
 | 
|      }
 | 
| -
 | 
| -    int onGetY() const override {
 | 
| -        return fCodec->getDstRow(this->INHERITED::onGetY(), this->dstInfo().height());
 | 
| +    if (!conversion_possible(dstInfo, this->getInfo())) {
 | 
| +        SkCodecPrintf("Error: cannot convert input type to output type.\n");
 | 
| +        return kInvalidConversion;
 | 
|      }
 | 
|  
 | 
| -    // TODO(msarett): Override default skipping with something more clever.
 | 
| -
 | 
| -private:
 | 
| -    SkAutoTDelete<SkBmpCodec> fCodec;
 | 
| +    return prepareToDecode(dstInfo, options, inputColorPtr, inputColorCount);
 | 
| +}
 | 
|  
 | 
| -    typedef SkScanlineDecoder INHERITED;
 | 
| -};
 | 
| +SkCodec::Result SkBmpCodec::onGetScanlines(void* dst, int count, size_t rowBytes) {
 | 
| +    // Create a new image info representing the portion of the image to decode
 | 
| +    SkImageInfo rowInfo = this->dstInfo().makeWH(this->dstInfo().width(), count);
 | 
|  
 | 
| -SkScanlineDecoder* SkBmpCodec::NewSDFromStream(SkStream* stream) {
 | 
| -    SkAutoTDelete<SkBmpCodec> codec(static_cast<SkBmpCodec*>(SkBmpCodec::NewFromStream(stream)));
 | 
| -    if (!codec) {
 | 
| -        return NULL;
 | 
| -    }
 | 
| +    // Decode the requested rows
 | 
| +    return this->decodeRows(rowInfo, dst, rowBytes, this->options());
 | 
| +}
 | 
|  
 | 
| -    return new SkBmpScanlineDecoder(codec.detach());
 | 
| +int SkBmpCodec::onNextScanline() const {
 | 
| +    return this->getDstRow(this->INHERITED::onNextScanline(), this->dstInfo().height());
 | 
|  }
 | 
| 
 |