/* * 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 (NULL != 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); } }