summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Chris Craik <ccraik@google.com> 2016-06-24 23:06:38 +0000
committer android-build-merger <android-build-merger@google.com> 2016-06-24 23:06:38 +0000
commit366f7476eaf550c1e9cb08e12e766e9568115b98 (patch)
tree956a7b100a324e9067b5003e7465c06aecaf2d24
parent8bd0506261815b1be9e2a0d87a66fb71835c4397 (diff)
parentfdef509c93fd21795ac63fea6080c1ec01de6781 (diff)
Merge \"Round unclipped saveLayers\" into nyc-mr1-dev
am: fdef509c93 Change-Id: I815b90f2d26a9043db3c76b69c64a3b42d3369ca
-rw-r--r--libs/hwui/FrameBuilder.cpp1
-rw-r--r--libs/hwui/tests/unit/FrameBuilderTests.cpp34
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: