michael@0: michael@0: /* michael@0: * Copyright 2012 Google Inc. michael@0: * michael@0: * Use of this source code is governed by a BSD-style license that can be michael@0: * found in the LICENSE file. michael@0: */ michael@0: michael@0: #include "SkBBoxHierarchyRecord.h" michael@0: #include "SkPictureStateTree.h" michael@0: michael@0: SkBBoxHierarchyRecord::SkBBoxHierarchyRecord(const SkISize& size, michael@0: uint32_t recordFlags, michael@0: SkBBoxHierarchy* h) michael@0: : INHERITED(size, recordFlags) { michael@0: fStateTree = SkNEW(SkPictureStateTree); michael@0: fBoundingHierarchy = h; michael@0: fBoundingHierarchy->ref(); michael@0: fBoundingHierarchy->setClient(this); michael@0: } michael@0: michael@0: void SkBBoxHierarchyRecord::handleBBox(const SkRect& bounds) { michael@0: SkIRect r; michael@0: bounds.roundOut(&r); michael@0: SkPictureStateTree::Draw* draw = fStateTree->appendDraw(this->writeStream().bytesWritten()); michael@0: fBoundingHierarchy->insert(draw, r, true); michael@0: } michael@0: michael@0: void SkBBoxHierarchyRecord::willSave(SaveFlags flags) { michael@0: fStateTree->appendSave(); michael@0: this->INHERITED::willSave(flags); michael@0: } michael@0: michael@0: SkCanvas::SaveLayerStrategy SkBBoxHierarchyRecord::willSaveLayer(const SkRect* bounds, michael@0: const SkPaint* paint, michael@0: SaveFlags flags) { michael@0: fStateTree->appendSaveLayer(this->writeStream().bytesWritten()); michael@0: return this->INHERITED::willSaveLayer(bounds, paint, flags); michael@0: } michael@0: michael@0: void SkBBoxHierarchyRecord::willRestore() { michael@0: fStateTree->appendRestore(); michael@0: this->INHERITED::willRestore(); michael@0: } michael@0: michael@0: void SkBBoxHierarchyRecord::didTranslate(SkScalar dx, SkScalar dy) { michael@0: fStateTree->appendTransform(getTotalMatrix()); michael@0: INHERITED::didTranslate(dx, dy); michael@0: } michael@0: michael@0: void SkBBoxHierarchyRecord::didScale(SkScalar sx, SkScalar sy) { michael@0: fStateTree->appendTransform(getTotalMatrix()); michael@0: INHERITED::didScale(sx, sy); michael@0: } michael@0: michael@0: void SkBBoxHierarchyRecord::didRotate(SkScalar degrees) { michael@0: fStateTree->appendTransform(getTotalMatrix()); michael@0: INHERITED::didRotate(degrees); michael@0: } michael@0: michael@0: void SkBBoxHierarchyRecord::didSkew(SkScalar sx, SkScalar sy) { michael@0: fStateTree->appendTransform(getTotalMatrix()); michael@0: INHERITED::didSkew(sx, sy); michael@0: } michael@0: michael@0: void SkBBoxHierarchyRecord::didConcat(const SkMatrix& matrix) { michael@0: fStateTree->appendTransform(getTotalMatrix()); michael@0: INHERITED::didConcat(matrix); michael@0: } michael@0: michael@0: void SkBBoxHierarchyRecord::didSetMatrix(const SkMatrix& matrix) { michael@0: fStateTree->appendTransform(getTotalMatrix()); michael@0: INHERITED::didSetMatrix(matrix); michael@0: } michael@0: michael@0: void SkBBoxHierarchyRecord::onClipRect(const SkRect& rect, michael@0: SkRegion::Op op, michael@0: ClipEdgeStyle edgeStyle) { michael@0: fStateTree->appendClip(this->writeStream().bytesWritten()); michael@0: this->INHERITED::onClipRect(rect, op, edgeStyle); michael@0: } michael@0: michael@0: void SkBBoxHierarchyRecord::onClipRegion(const SkRegion& region, michael@0: SkRegion::Op op) { michael@0: fStateTree->appendClip(this->writeStream().bytesWritten()); michael@0: this->INHERITED::onClipRegion(region, op); michael@0: } michael@0: michael@0: void SkBBoxHierarchyRecord::onClipPath(const SkPath& path, michael@0: SkRegion::Op op, michael@0: ClipEdgeStyle edgeStyle) { michael@0: fStateTree->appendClip(this->writeStream().bytesWritten()); michael@0: this->INHERITED::onClipPath(path, op, edgeStyle); michael@0: } michael@0: michael@0: void SkBBoxHierarchyRecord::onClipRRect(const SkRRect& rrect, michael@0: SkRegion::Op op, michael@0: ClipEdgeStyle edgeStyle) { michael@0: fStateTree->appendClip(this->writeStream().bytesWritten()); michael@0: this->INHERITED::onClipRRect(rrect, op, edgeStyle); michael@0: } michael@0: michael@0: bool SkBBoxHierarchyRecord::shouldRewind(void* data) { michael@0: // SkBBoxHierarchy::rewindInserts is called by SkPicture after the michael@0: // SkPicture has rewound its command stream. To match that rewind in the michael@0: // BBH, we rewind all draws that reference commands that were recorded michael@0: // past the point to which the SkPicture has rewound, which is given by michael@0: // writeStream().bytesWritten(). michael@0: SkPictureStateTree::Draw* draw = static_cast(data); michael@0: return draw->fOffset >= writeStream().bytesWritten(); michael@0: }