Chromium Code Reviews| Index: src/core/SkPictureRecord.cpp |
| =================================================================== |
| --- src/core/SkPictureRecord.cpp (revision 13304) |
| +++ 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->saveImpl(flags); |
| + return this->INHERITED::save(flags); |
| +} |
| +void SkPictureRecord::saveImpl(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->saveLayerImpl(bounds, paint, flags); |
| + if (kNoSavedLayerIndex == fFirstSavedLayerIndex) { |
| + fFirstSavedLayerIndex = fRestoreOffsetStack.count(); |
| + } |
| + /* Don't actually call saveLayer, because that will try to allocate an |
|
mtklein
2014/02/04 16:33:58
While we're at it, can't hurt to make it clear by
robertphillips
2014/02/04 19:08:01
Done.
|
| + 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::saveLayerImpl(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->restoreImpl(); |
| } |
| fRestoreOffsetStack.pop(); |
| - this->validate(initialOffset, size); |
| return this->INHERITED::restore(); |
| } |
| +void SkPictureRecord::restoreImpl() { |
| + 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->concatImpl(matrix); |
| + return this->INHERITED::concat(matrix); |
| +} |
| + |
| +void SkPictureRecord::concatImpl(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->clipRectImpl(rect, op, doAA); |
| + return this->INHERITED::clipRect(rect, op, doAA); |
| +} |
| + |
| +int SkPictureRecord::clipRectImpl(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->clipRRectImpl(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::clipRRectImpl(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->clipPathImpl(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::clipPathImpl(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->clipRegionImpl(region, op); |
| + return this->INHERITED::clipRegion(region, op); |
| } |
| -bool SkPictureRecord::clipRegion(const SkRegion& region, SkRegion::Op op) { |
| +int SkPictureRecord::clipRegionImpl(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 |