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