| Index: src/core/SkPictureRecord.cpp
|
| ===================================================================
|
| --- src/core/SkPictureRecord.cpp (revision 13305)
|
| +++ src/core/SkPictureRecord.cpp (working copy)
|
| @@ -27,13 +27,13 @@
|
| static const uint32_t kSaveLayerNoBoundsSize = 4 * kUInt32Size;
|
| static const uint32_t kSaveLayerWithBoundsSize = 4 * kUInt32Size + sizeof(SkRect);
|
|
|
| -SkPictureRecord::SkPictureRecord(uint32_t flags, SkBaseDevice* device) :
|
| - INHERITED(device),
|
| - fBoundingHierarchy(NULL),
|
| - fStateTree(NULL),
|
| - fFlattenableHeap(HEAP_BLOCK_SIZE),
|
| - fPaints(&fFlattenableHeap),
|
| - fRecordFlags(flags) {
|
| +SkPictureRecord::SkPictureRecord(uint32_t flags, SkBaseDevice* device)
|
| + : INHERITED(device)
|
| + , fBoundingHierarchy(NULL)
|
| + , fStateTree(NULL)
|
| + , fFlattenableHeap(HEAP_BLOCK_SIZE)
|
| + , fPaints(&fFlattenableHeap)
|
| + , fRecordFlags(flags) {
|
| #ifdef SK_DEBUG_SIZE
|
| fPointBytes = fRectBytes = fTextBytes = 0;
|
| fPointWrites = fRectWrites = fTextWrites = 0;
|
| @@ -141,14 +141,17 @@
|
| // record the offset to us, making it non-positive to distinguish a save
|
| // from a clip entry.
|
| fRestoreOffsetStack.push(-(int32_t)fWriter.bytesWritten());
|
| + this->recordSave(flags);
|
| + return this->INHERITED::save(flags);
|
| +}
|
|
|
| +void SkPictureRecord::recordSave(SaveFlags flags) {
|
| // op + flags
|
| uint32_t size = kSaveSize;
|
| size_t initialOffset = this->addDraw(SAVE, &size);
|
| addInt(flags);
|
|
|
| this->validate(initialOffset, size);
|
| - return this->INHERITED::save(flags);
|
| }
|
|
|
| int SkPictureRecord::saveLayer(const SkRect* bounds, const SkPaint* paint,
|
| @@ -156,7 +159,24 @@
|
| // record the offset to us, making it non-positive to distinguish a save
|
| // from a clip entry.
|
| fRestoreOffsetStack.push(-(int32_t)fWriter.bytesWritten());
|
| + this->recordSaveLayer(bounds, paint, flags);
|
| + if (kNoSavedLayerIndex == fFirstSavedLayerIndex) {
|
| + fFirstSavedLayerIndex = fRestoreOffsetStack.count();
|
| + }
|
|
|
| + /* Don't actually call INHERITED::saveLayer, because that will try to allocate
|
| + an offscreen device (potentially very big) which we don't actually need
|
| + at this time (and may not be able to afford since during record our
|
| + clip starts out the size of the picture, which is often much larger
|
| + than the size of the actual device we'll use during playback).
|
| + */
|
| + int count = this->INHERITED::save(flags);
|
| + this->clipRectBounds(bounds, flags, NULL);
|
| + return count;
|
| +}
|
| +
|
| +void SkPictureRecord::recordSaveLayer(const SkRect* bounds, const SkPaint* paint,
|
| + SaveFlags flags) {
|
| // op + bool for 'bounds'
|
| uint32_t size = 2 * kUInt32Size;
|
| if (NULL != bounds) {
|
| @@ -173,20 +193,7 @@
|
| addPaintPtr(paint);
|
| addInt(flags);
|
|
|
| - if (kNoSavedLayerIndex == fFirstSavedLayerIndex) {
|
| - fFirstSavedLayerIndex = fRestoreOffsetStack.count();
|
| - }
|
| -
|
| this->validate(initialOffset, size);
|
| - /* Don't actually call saveLayer, because that will try to allocate an
|
| - offscreen device (potentially very big) which we don't actually need
|
| - at this time (and may not be able to afford since during record our
|
| - clip starts out the size of the picture, which is often much larger
|
| - than the size of the actual device we'll use during playback).
|
| - */
|
| - int count = this->INHERITED::save(flags);
|
| - this->clipRectBounds(bounds, flags, NULL);
|
| - return count;
|
| }
|
|
|
| bool SkPictureRecord::isDrawingToLayer() const {
|
| @@ -321,7 +328,6 @@
|
| return false;
|
| }
|
|
|
| -
|
| return merge_savelayer_paint_into_drawbitmp(writer, paintDict,
|
| result[0], result[1]);
|
| }
|
| @@ -601,17 +607,22 @@
|
| if ((fRecordFlags & SkPicture::kDisableRecordOptimizations_RecordingFlag) ||
|
| SK_ARRAY_COUNT(gPictureRecordOpts) == opt) {
|
| // No optimization fired so add the RESTORE
|
| - fillRestoreOffsetPlaceholdersForCurrentStackLevel((uint32_t)fWriter.bytesWritten());
|
| - size = 1 * kUInt32Size; // RESTORE consists solely of 1 op code
|
| - initialOffset = this->addDraw(RESTORE, &size);
|
| + this->recordRestore();
|
| }
|
|
|
| fRestoreOffsetStack.pop();
|
|
|
| - this->validate(initialOffset, size);
|
| return this->INHERITED::restore();
|
| }
|
|
|
| +void SkPictureRecord::recordRestore() {
|
| + uint32_t initialOffset, size;
|
| + fillRestoreOffsetPlaceholdersForCurrentStackLevel((uint32_t)fWriter.bytesWritten());
|
| + size = 1 * kUInt32Size; // RESTORE consists solely of 1 op code
|
| + initialOffset = this->addDraw(RESTORE, &size);
|
| + this->validate(initialOffset, size);
|
| +}
|
| +
|
| bool SkPictureRecord::translate(SkScalar dx, SkScalar dy) {
|
| // op + dx + dy
|
| uint32_t size = 1 * kUInt32Size + 2 * sizeof(SkScalar);
|
| @@ -652,13 +663,17 @@
|
| }
|
|
|
| bool SkPictureRecord::concat(const SkMatrix& matrix) {
|
| + this->recordConcat(matrix);
|
| + return this->INHERITED::concat(matrix);
|
| +}
|
| +
|
| +void SkPictureRecord::recordConcat(const SkMatrix& matrix) {
|
| this->validate(fWriter.bytesWritten(), 0);
|
| // op + matrix
|
| uint32_t size = kUInt32Size + matrix.writeToMemory(NULL);
|
| size_t initialOffset = this->addDraw(CONCAT, &size);
|
| addMatrix(matrix);
|
| this->validate(initialOffset, size);
|
| - return this->INHERITED::concat(matrix);
|
| }
|
|
|
| void SkPictureRecord::setMatrix(const SkMatrix& matrix) {
|
| @@ -715,9 +730,9 @@
|
| this->restoreToCount(fInitialSaveCount);
|
| }
|
|
|
| -void SkPictureRecord::recordRestoreOffsetPlaceholder(SkRegion::Op op) {
|
| +int SkPictureRecord::recordRestoreOffsetPlaceholder(SkRegion::Op op) {
|
| if (fRestoreOffsetStack.isEmpty()) {
|
| - return;
|
| + return -1;
|
| }
|
|
|
| // The RestoreOffset field is initially filled with a placeholder
|
| @@ -742,9 +757,16 @@
|
| size_t offset = fWriter.bytesWritten();
|
| addInt(prevOffset);
|
| fRestoreOffsetStack.top() = offset;
|
| + return offset;
|
| }
|
|
|
| bool SkPictureRecord::clipRect(const SkRect& rect, SkRegion::Op op, bool doAA) {
|
| + this->recordClipRect(rect, op, doAA);
|
| + return this->INHERITED::clipRect(rect, op, doAA);
|
| +}
|
| +
|
| +int SkPictureRecord::recordClipRect(const SkRect& rect, SkRegion::Op op, bool doAA) {
|
| +
|
| // id + rect + clip params
|
| uint32_t size = 1 * kUInt32Size + sizeof(rect) + 1 * kUInt32Size;
|
| // recordRestoreOffsetPlaceholder doesn't always write an offset
|
| @@ -752,13 +774,14 @@
|
| // + restore offset
|
| size += kUInt32Size;
|
| }
|
| +
|
| size_t initialOffset = this->addDraw(CLIP_RECT, &size);
|
| addRect(rect);
|
| addInt(ClipParams_pack(op, doAA));
|
| - recordRestoreOffsetPlaceholder(op);
|
| + int offset = this->recordRestoreOffsetPlaceholder(op);
|
|
|
| this->validate(initialOffset, size);
|
| - return this->INHERITED::clipRect(rect, op, doAA);
|
| + return offset;
|
| }
|
|
|
| bool SkPictureRecord::clipRRect(const SkRRect& rrect, SkRegion::Op op, bool doAA) {
|
| @@ -766,6 +789,16 @@
|
| return this->SkPictureRecord::clipRect(rrect.getBounds(), op, doAA);
|
| }
|
|
|
| + this->recordClipRRect(rrect, op, doAA);
|
| + if (fRecordFlags & SkPicture::kUsePathBoundsForClip_RecordingFlag) {
|
| + return this->updateClipConservativelyUsingBounds(rrect.getBounds(), op, false);
|
| + } else {
|
| + return this->INHERITED::clipRRect(rrect, op, doAA);
|
| + }
|
| +}
|
| +
|
| +int SkPictureRecord::recordClipRRect(const SkRRect& rrect, SkRegion::Op op, bool doAA) {
|
| +
|
| // op + rrect + clip params
|
| uint32_t size = 1 * kUInt32Size + SkRRect::kSizeInMemory + 1 * kUInt32Size;
|
| // recordRestoreOffsetPlaceholder doesn't always write an offset
|
| @@ -776,15 +809,10 @@
|
| size_t initialOffset = this->addDraw(CLIP_RRECT, &size);
|
| addRRect(rrect);
|
| addInt(ClipParams_pack(op, doAA));
|
| - recordRestoreOffsetPlaceholder(op);
|
| + int offset = recordRestoreOffsetPlaceholder(op);
|
|
|
| this->validate(initialOffset, size);
|
| -
|
| - if (fRecordFlags & SkPicture::kUsePathBoundsForClip_RecordingFlag) {
|
| - return this->updateClipConservativelyUsingBounds(rrect.getBounds(), op, false);
|
| - } else {
|
| - return this->INHERITED::clipRRect(rrect, op, doAA);
|
| - }
|
| + return offset;
|
| }
|
|
|
| bool SkPictureRecord::clipPath(const SkPath& path, SkRegion::Op op, bool doAA) {
|
| @@ -794,6 +822,19 @@
|
| return this->clipRect(r, op, doAA);
|
| }
|
|
|
| + int pathID = this->addPathToHeap(path);
|
| + this->recordClipPath(pathID, op, doAA);
|
| +
|
| + if (fRecordFlags & SkPicture::kUsePathBoundsForClip_RecordingFlag) {
|
| + return this->updateClipConservativelyUsingBounds(path.getBounds(), op,
|
| + path.isInverseFillType());
|
| + } else {
|
| + return this->INHERITED::clipPath(path, op, doAA);
|
| + }
|
| +}
|
| +
|
| +int SkPictureRecord::recordClipPath(int pathID, SkRegion::Op op, bool doAA) {
|
| +
|
| // op + path index + clip params
|
| uint32_t size = 3 * kUInt32Size;
|
| // recordRestoreOffsetPlaceholder doesn't always write an offset
|
| @@ -802,21 +843,20 @@
|
| size += kUInt32Size;
|
| }
|
| size_t initialOffset = this->addDraw(CLIP_PATH, &size);
|
| - addPath(path);
|
| + addInt(pathID);
|
| addInt(ClipParams_pack(op, doAA));
|
| - recordRestoreOffsetPlaceholder(op);
|
| + int offset = recordRestoreOffsetPlaceholder(op);
|
|
|
| this->validate(initialOffset, size);
|
| + return offset;
|
| +}
|
|
|
| - if (fRecordFlags & SkPicture::kUsePathBoundsForClip_RecordingFlag) {
|
| - return this->updateClipConservativelyUsingBounds(path.getBounds(), op,
|
| - path.isInverseFillType());
|
| - } else {
|
| - return this->INHERITED::clipPath(path, op, doAA);
|
| - }
|
| +bool SkPictureRecord::clipRegion(const SkRegion& region, SkRegion::Op op) {
|
| + this->recordClipRegion(region, op);
|
| + return this->INHERITED::clipRegion(region, op);
|
| }
|
|
|
| -bool SkPictureRecord::clipRegion(const SkRegion& region, SkRegion::Op op) {
|
| +int SkPictureRecord::recordClipRegion(const SkRegion& region, SkRegion::Op op) {
|
| // op + clip params + region
|
| uint32_t size = 2 * kUInt32Size + region.writeToMemory(NULL);
|
| // recordRestoreOffsetPlaceholder doesn't always write an offset
|
| @@ -827,10 +867,10 @@
|
| size_t initialOffset = this->addDraw(CLIP_REGION, &size);
|
| addRegion(region);
|
| addInt(ClipParams_pack(op, false));
|
| - recordRestoreOffsetPlaceholder(op);
|
| + int offset = recordRestoreOffsetPlaceholder(op);
|
|
|
| this->validate(initialOffset, size);
|
| - return this->INHERITED::clipRegion(region, op);
|
| + return offset;
|
| }
|
|
|
| void SkPictureRecord::clear(SkColor color) {
|
| @@ -1307,13 +1347,17 @@
|
| this->addInt(index);
|
| }
|
|
|
| -void SkPictureRecord::addPath(const SkPath& path) {
|
| +int SkPictureRecord::addPathToHeap(const SkPath& path) {
|
| if (NULL == fPathHeap) {
|
| fPathHeap = SkNEW(SkPathHeap);
|
| }
|
| - addInt(fPathHeap->append(path));
|
| + return fPathHeap->append(path);
|
| }
|
|
|
| +void SkPictureRecord::addPath(const SkPath& path) {
|
| + addInt(this->addPathToHeap(path));
|
| +}
|
| +
|
| void SkPictureRecord::addPicture(SkPicture& picture) {
|
| int index = fPictureRefs.find(&picture);
|
| if (index < 0) { // not found
|
|
|