Round unclipped saveLayers
am: 45e83338e5
Change-Id: I3ecb7fdd2097779cf7f596c0e6a3f7914902ca39
This commit is contained in:
@@ -946,6 +946,7 @@ void FrameBuilder::deferBeginUnclippedLayerOp(const BeginUnclippedLayerOp& op) {
|
|||||||
|
|
||||||
Rect dstRect(op.unmappedBounds);
|
Rect dstRect(op.unmappedBounds);
|
||||||
boundsTransform.mapRect(dstRect);
|
boundsTransform.mapRect(dstRect);
|
||||||
|
dstRect.roundOut();
|
||||||
dstRect.doIntersect(mCanvasState.currentSnapshot()->getRenderTargetClip());
|
dstRect.doIntersect(mCanvasState.currentSnapshot()->getRenderTargetClip());
|
||||||
|
|
||||||
if (dstRect.isEmpty()) {
|
if (dstRect.isEmpty()) {
|
||||||
|
|||||||
@@ -1007,6 +1007,40 @@ RENDERTHREAD_TEST(FrameBuilder, saveLayerUnclipped_simple) {
|
|||||||
EXPECT_EQ(4, renderer.getIndex());
|
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) {
|
RENDERTHREAD_TEST(FrameBuilder, saveLayerUnclipped_mergedClears) {
|
||||||
class SaveLayerUnclippedMergedClearsTestRenderer : public TestRendererBase {
|
class SaveLayerUnclippedMergedClearsTestRenderer : public TestRendererBase {
|
||||||
public:
|
public:
|
||||||
|
|||||||
Reference in New Issue
Block a user