/*
 * 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);
    }
}
