Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d394d3c0 authored by Leon Scroggins III's avatar Leon Scroggins III
Browse files

Expand the displayFrame for shadows

Bug: 185799825
Test: manual
Test: libcompositionengine_test

Some HWCs crop to the displayFrame. A shadow layer uses its
geometry.boundaries (possibly cropped by geometry.cropRect) as the
size of the object casting a shadow, so the shadow may not be contained
by the displayFrame. For a shadow, expand the displayFrame out by the
shadowRadius to prevent cropping of the shadow.

Change-Id: I8b6c7953d05718a89bdbc59d57775e52195a8131
parent 4aa92815
Loading
Loading
Loading
Loading
+12 −2
Original line number Original line Diff line number Diff line
@@ -216,8 +216,18 @@ Rect OutputLayer::calculateOutputDisplayFrame() const {


    // reduce uses a FloatRect to provide more accuracy during the
    // reduce uses a FloatRect to provide more accuracy during the
    // transformation. We then round upon constructing 'frame'.
    // transformation. We then round upon constructing 'frame'.
    Rect frame{
    FloatRect geomLayerBounds = layerState.geomLayerBounds;
            layerTransform.transform(reduce(layerState.geomLayerBounds, activeTransparentRegion))};

    // Some HWCs may clip client composited input to its displayFrame. Make sure
    // that this does not cut off the shadow.
    if (layerState.forceClientComposition && layerState.shadowRadius > 0.0f) {
        const auto outset = layerState.shadowRadius;
        geomLayerBounds.left -= outset;
        geomLayerBounds.top -= outset;
        geomLayerBounds.right += outset;
        geomLayerBounds.bottom += outset;
    }
    Rect frame{layerTransform.transform(reduce(geomLayerBounds, activeTransparentRegion))};
    if (!frame.intersect(outputState.layerStackSpace.content, &frame)) {
    if (!frame.intersect(outputState.layerStackSpace.content, &frame)) {
        frame.clear();
        frame.clear();
    }
    }
+21 −0
Original line number Original line Diff line number Diff line
@@ -324,6 +324,27 @@ TEST_F(OutputLayerDisplayFrameTest, outputTransformAffectsDisplayFrame) {
    EXPECT_THAT(calculateOutputDisplayFrame(), expected);
    EXPECT_THAT(calculateOutputDisplayFrame(), expected);
}
}


TEST_F(OutputLayerDisplayFrameTest, shadowExpandsDisplayFrame) {
    const int kShadowRadius = 5;
    mLayerFEState.shadowRadius = kShadowRadius;
    mLayerFEState.forceClientComposition = true;

    mLayerFEState.geomLayerBounds = FloatRect{100.f, 100.f, 200.f, 200.f};
    Rect expected{mLayerFEState.geomLayerBounds};
    expected.inset(-kShadowRadius, -kShadowRadius, -kShadowRadius, -kShadowRadius);
    EXPECT_THAT(calculateOutputDisplayFrame(), expected);
}

TEST_F(OutputLayerDisplayFrameTest, shadowExpandsDisplayFrame_onlyIfForcingClientComposition) {
    const int kShadowRadius = 5;
    mLayerFEState.shadowRadius = kShadowRadius;
    mLayerFEState.forceClientComposition = false;

    mLayerFEState.geomLayerBounds = FloatRect{100.f, 100.f, 200.f, 200.f};
    Rect expected{mLayerFEState.geomLayerBounds};
    EXPECT_THAT(calculateOutputDisplayFrame(), expected);
}

/*
/*
 * OutputLayer::calculateOutputRelativeBufferTransform()
 * OutputLayer::calculateOutputRelativeBufferTransform()
 */
 */