| Index: dm/DMSrcSink.cpp
 | 
| diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp
 | 
| index 06e1fe746e148b035eb5bbcaba59e39646d49823..74258083cec3603e64ab81b0e2bc23d6b874ee1e 100644
 | 
| --- a/dm/DMSrcSink.cpp
 | 
| +++ b/dm/DMSrcSink.cpp
 | 
| @@ -17,6 +17,7 @@
 | 
|  #include "SkPictureData.h"
 | 
|  #include "SkPictureRecorder.h"
 | 
|  #include "SkRandom.h"
 | 
| +#include "SkScanlineDecoder.h"
 | 
|  #include "SkSVGCanvas.h"
 | 
|  #include "SkStream.h"
 | 
|  #include "SkXMLWriter.h"
 | 
| @@ -44,7 +45,7 @@ Name GMSrc::name() const {
 | 
|  
 | 
|  /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 | 
|  
 | 
| -CodecSrc::CodecSrc(Path path) : fPath(path) {}
 | 
| +CodecSrc::CodecSrc(Path path, Mode mode) : fPath(path), fMode(mode) {}
 | 
|  
 | 
|  Error CodecSrc::draw(SkCanvas* canvas) const {
 | 
|      SkImageInfo canvasInfo;
 | 
| @@ -76,20 +77,43 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
 | 
|                                decodeInfo.width(), decodeInfo.height());
 | 
|      }
 | 
|  
 | 
| -    SkAutoLockPixels alp(bitmap);
 | 
| -    switch (codec->getPixels(decodeInfo, bitmap.getPixels(), bitmap.rowBytes())) {
 | 
| -        case SkImageGenerator::kSuccess:
 | 
| -        // We consider incomplete to be valid, since we should still decode what is
 | 
| -        // available.
 | 
| -        case SkImageGenerator::kIncompleteInput:
 | 
| -            canvas->drawBitmap(bitmap, 0, 0);
 | 
| -            return "";
 | 
| -        case SkImageGenerator::kInvalidConversion:
 | 
| -            return Error::Nonfatal("Incompatible colortype conversion");
 | 
| -        default:
 | 
| -            // Everything else is considered a failure.
 | 
| -            return SkStringPrintf("Couldn't getPixels %s.", fPath.c_str());
 | 
| +    switch (fMode) {
 | 
| +        case kNormal_Mode:
 | 
| +            switch (codec->getPixels(decodeInfo, bitmap.getPixels(), bitmap.rowBytes())) {
 | 
| +                case SkImageGenerator::kSuccess:
 | 
| +                    // We consider incomplete to be valid, since we should still decode what is
 | 
| +                    // available.
 | 
| +                case SkImageGenerator::kIncompleteInput:
 | 
| +                    break;
 | 
| +                case SkImageGenerator::kInvalidConversion:
 | 
| +                    return Error::Nonfatal("Incompatible colortype conversion");
 | 
| +                default:
 | 
| +                    // Everything else is considered a failure.
 | 
| +                    return SkStringPrintf("Couldn't getPixels %s.", fPath.c_str());
 | 
| +            }
 | 
| +            break;
 | 
| +        case kScanline_Mode: {
 | 
| +            SkScanlineDecoder* scanlineDecoder = codec->getScanlineDecoder(decodeInfo);
 | 
| +            if (NULL == scanlineDecoder) {
 | 
| +                return Error::Nonfatal("Cannot use scanline decoder for all images");
 | 
| +            }
 | 
| +            for (int y = 0; y < decodeInfo.height(); ++y) {
 | 
| +                const SkImageGenerator::Result result = scanlineDecoder->getScanlines(
 | 
| +                        bitmap.getAddr(0, y), 1, 0);
 | 
| +                switch (result) {
 | 
| +                    case SkImageGenerator::kSuccess:
 | 
| +                    case SkImageGenerator::kIncompleteInput:
 | 
| +                        break;
 | 
| +                    default:
 | 
| +                        return SkStringPrintf("%s failed after %d scanlines with error message %d",
 | 
| +                                              fPath.c_str(), y-1, (int) result);
 | 
| +                }
 | 
| +            }
 | 
| +            break;
 | 
| +        }
 | 
|      }
 | 
| +    canvas->drawBitmap(bitmap, 0, 0);
 | 
| +    return "";
 | 
|  }
 | 
|  
 | 
|  SkISize CodecSrc::size() const {
 | 
| 
 |