diff options
| author | 2016-06-24 23:06:38 +0000 | |
|---|---|---|
| committer | 2016-06-24 23:06:38 +0000 | |
| commit | 366f7476eaf550c1e9cb08e12e766e9568115b98 (patch) | |
| tree | 956a7b100a324e9067b5003e7465c06aecaf2d24 | |
| parent | 8bd0506261815b1be9e2a0d87a66fb71835c4397 (diff) | |
| parent | fdef509c93fd21795ac63fea6080c1ec01de6781 (diff) | |
Merge \"Round unclipped saveLayers\" into nyc-mr1-dev
am: fdef509c93
Change-Id: I815b90f2d26a9043db3c76b69c64a3b42d3369ca
| -rw-r--r-- | libs/hwui/FrameBuilder.cpp | 1 | ||||
| -rw-r--r-- | libs/hwui/tests/unit/FrameBuilderTests.cpp | 34 |
2 files changed, 35 insertions, 0 deletions
diff --git a/libs/hwui/FrameBuilder.cpp b/libs/hwui/FrameBuilder.cpp index b8a5ce6686b4..37d9d0e749e6 100644 --- a/libs/hwui/FrameBuilder.cpp +++ b/libs/hwui/FrameBuilder.cpp @@ -946,6 +946,7 @@ void FrameBuilder::deferBeginUnclippedLayerOp(const BeginUnclippedLayerOp& op) { Rect dstRect(op.unmappedBounds); boundsTransform.mapRect(dstRect); + dstRect.roundOut(); dstRect.doIntersect(mCanvasState.currentSnapshot()->getRenderTargetClip()); if (dstRect.isEmpty()) { diff --git a/libs/hwui/tests/unit/FrameBuilderTests.cpp b/libs/hwui/tests/unit/FrameBuilderTests.cpp index af1fbd8254f9..af54e079daab 100644 --- a/libs/hwui/tests/unit/FrameBuilderTests.cpp +++ b/libs/hwui/tests/unit/FrameBuilderTests.cpp @@ -1007,6 +1007,40 @@ RENDERTHREAD_TEST(FrameBuilder, saveLayerUnclipped_simple) { EXPECT_EQ(4, renderer.getIndex()); } +RENDERTHREAD_TEST(FrameBuilder, saveLayerUnclipped_round) { + class SaveLayerUnclippedRoundTestRenderer : public TestRendererBase { + public: + void onCopyToLayerOp(const CopyToLayerOp& op, const BakedOpState& state) override { + EXPECT_EQ(0, mIndex++); + EXPECT_EQ(Rect(10, 10, 190, 190), state.computedState.clippedBounds) + << "Bounds rect should round out"; + } + void onSimpleRectsOp(const SimpleRectsOp& op, const BakedOpState& state) override {} + void onRectOp(const RectOp& op, const BakedOpState& state) override {} + void onCopyFromLayerOp(const CopyFromLayerOp& op, const BakedOpState& state) override { + EXPECT_EQ(1, mIndex++); + EXPECT_EQ(Rect(10, 10, 190, 190), state.computedState.clippedBounds) + << "Bounds rect should round out"; + } + }; + + auto node = TestUtils::createNode(0, 0, 200, 200, + [](RenderProperties& props, RecordingCanvas& canvas) { + canvas.saveLayerAlpha(10.95f, 10.5f, 189.75f, 189.25f, // values should all round out + 128, (SaveFlags::Flags)(0)); + canvas.drawRect(0, 0, 200, 200, SkPaint()); + canvas.restore(); + }); + + FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, + sLightGeometry, Caches::getInstance()); + frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node)); + + SaveLayerUnclippedRoundTestRenderer renderer; + frameBuilder.replayBakedOps<TestDispatcher>(renderer); + EXPECT_EQ(2, renderer.getIndex()); +} + RENDERTHREAD_TEST(FrameBuilder, saveLayerUnclipped_mergedClears) { class SaveLayerUnclippedMergedClearsTestRenderer : public TestRendererBase { public: |