diff options
author | 2017-03-06 13:51:43 -0800 | |
---|---|---|
committer | 2017-03-06 13:51:44 -0800 | |
commit | 49b403dc9c47ada51c8e5b883347682a868515f8 (patch) | |
tree | 1bc4b9b604b1e7f0ff468b2e67958bc07d916f9f /libs/hwui/FrameBuilder.cpp | |
parent | 1e92e7fbfc128a3103e98f12d579ae01d027e2a4 (diff) |
Workaround arc textures drawing outside of bounds
Fixes: 34077513
Test: hwui unit tests passing
This fixes an issue where drawArc operations would cause artifacts by
drawing outside of the clip / screen damage area. We now more
conservatively clip drawArc operations specifically, as they tend to
draw into the outer parts of their path textures more than other
operations.
A more long term fix would involve alignment between draw operation
sizing (in terms of what's resolved in a BakedOpState), and
PathTexture sizing (which currently conservatively expands beyond
stroked op bounds).
Change-Id: I5aff39cc04382323b457b159974032f5f371251a
Diffstat (limited to 'libs/hwui/FrameBuilder.cpp')
-rw-r--r-- | libs/hwui/FrameBuilder.cpp | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/libs/hwui/FrameBuilder.cpp b/libs/hwui/FrameBuilder.cpp index 1b57e290c198..86f9a5d73fd1 100644 --- a/libs/hwui/FrameBuilder.cpp +++ b/libs/hwui/FrameBuilder.cpp @@ -562,10 +562,11 @@ void FrameBuilder::deferRenderNodeOp(const RenderNodeOp& op) { * for paint's style on the bounds being computed. */ BakedOpState* FrameBuilder::deferStrokeableOp(const RecordedOp& op, batchid_t batchId, - BakedOpState::StrokeBehavior strokeBehavior) { + BakedOpState::StrokeBehavior strokeBehavior, bool expandForPathTexture) { // Note: here we account for stroke when baking the op BakedOpState* bakedState = BakedOpState::tryStrokeableOpConstruct( - mAllocator, *mCanvasState.writableSnapshot(), op, strokeBehavior); + mAllocator, *mCanvasState.writableSnapshot(), op, + strokeBehavior, expandForPathTexture); if (!bakedState) return nullptr; // quick rejected if (op.opId == RecordedOpId::RectOp && op.paint->getStyle() != SkPaint::kStroke_Style) { @@ -590,7 +591,10 @@ static batchid_t tessBatchId(const RecordedOp& op) { } void FrameBuilder::deferArcOp(const ArcOp& op) { - deferStrokeableOp(op, tessBatchId(op)); + // Pass true below since arcs have a tendency to draw outside their expected bounds within + // their path textures. Passing true makes it more likely that we'll scissor, instead of + // corrupting the frame by drawing outside of clip bounds. + deferStrokeableOp(op, tessBatchId(op), BakedOpState::StrokeBehavior::StyleDefined, true); } static bool hasMergeableClip(const BakedOpState& state) { @@ -748,7 +752,7 @@ static batchid_t textBatchId(const SkPaint& paint) { void FrameBuilder::deferTextOp(const TextOp& op) { BakedOpState* bakedState = BakedOpState::tryStrokeableOpConstruct( mAllocator, *mCanvasState.writableSnapshot(), op, - BakedOpState::StrokeBehavior::StyleDefined); + BakedOpState::StrokeBehavior::StyleDefined, false); if (!bakedState) return; // quick rejected batchid_t batchId = textBatchId(*(op.paint)); |