| Index: src/core/SkPictureRangePlayback.cpp | 
| diff --git a/src/core/SkPictureRangePlayback.cpp b/src/core/SkPictureRangePlayback.cpp | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..16473dbfcc16af22e48962e232fee67f11490561 | 
| --- /dev/null | 
| +++ b/src/core/SkPictureRangePlayback.cpp | 
| @@ -0,0 +1,57 @@ | 
| +/* | 
| + * Copyright 2014 Google Inc. | 
| + * | 
| + * Use of this source code is governed by a BSD-style license that can be | 
| + * found in the LICENSE file. | 
| + */ | 
| + | 
| +#include "SkCanvas.h" | 
| +#include "SkPictureData.h" | 
| +#include "SkPictureRangePlayback.h" | 
| + | 
| +void SkPictureRangePlayback::draw(SkCanvas* canvas, SkDrawPictureCallback* callback) { | 
| +    AutoResetOpID aroi(this); | 
| +    SkASSERT(0 == fCurOffset); | 
| + | 
| +    SkReader32 reader(fPictureData->opData()->bytes(), fPictureData->opData()->size()); | 
| + | 
| +    if (0 != fStart || 0 != fStop) { | 
| +        reader.setOffset(fStart); | 
| +        uint32_t size; | 
| +        SkDEBUGCODE(DrawType op = ) ReadOpAndSize(&reader, &size); | 
| +        SkASSERT(SAVE_LAYER == op); | 
| +        reader.setOffset(fStart + size); | 
| +    } | 
| + | 
| +    // Record this, so we can concat w/ it if we encounter a setMatrix() | 
| +    SkMatrix initialMatrix = canvas->getTotalMatrix(); | 
| + | 
| +    SkAutoCanvasRestore acr(canvas, false); | 
| + | 
| +    while (!reader.eof()) { | 
| +        if (callback && callback->abortDrawing()) { | 
| +            return; | 
| +        } | 
| + | 
| +        if (0 != fStart || 0 != fStop) { | 
| +            size_t offset = reader.offset(); | 
| +            if (offset >= fStop) { | 
| +                SkDEBUGCODE(uint32_t size;) | 
| +                SkDEBUGCODE(DrawType op = ReadOpAndSize(&reader, &size);) | 
| +                SkASSERT(RESTORE == op); | 
| +                return; | 
| +            } | 
| +        } | 
| + | 
| +        fCurOffset = reader.offset(); | 
| +        uint32_t size; | 
| +        DrawType op = ReadOpAndSize(&reader, &size); | 
| +        if (NOOP == op) { | 
| +            // NOOPs are to be ignored - do not propagate them any further | 
| +            reader.setOffset(fCurOffset + size); | 
| +            continue; | 
| +        } | 
| + | 
| +        this->handleOp(&reader, op, size, canvas, initialMatrix); | 
| +    } | 
| +} | 
|  |