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

Commit 5219a06d authored by Mathias Agopian's avatar Mathias Agopian
Browse files

set correct crop rectangle in LayerBase::setCrop

The crop always had left=top=0, because the crop position
and the layer's transform were merged together in
computeBounds() (which really used to compute the
bounds in screen space, which we usually call the
"frame" elsewhere in the code)

Note: in practice this crop value is not used by
hwc, because it's overridden in Layer::setGeometry(), which
is why this bug was never apparent.

Change-Id: I1ec6400a8fc8314408e4252708f43ea98c2fe64e
parent eb0d1296
Loading
Loading
Loading
Loading
+10 −7
Original line number Diff line number Diff line
@@ -259,7 +259,7 @@ Rect LayerBase::computeBounds() const {
    if (!s.active.crop.isEmpty()) {
        win.intersect(s.active.crop, &win);
    }
    return s.transform.transform(win);
    return win;
}

Region LayerBase::latchBuffer(bool& recomputeVisibleRegions) {
@@ -289,13 +289,16 @@ void LayerBase::setGeometry(
                HWC_BLENDING_COVERAGE);
    }

    const Transform& tr = hw->getTransform();
    Rect transformedBounds(computeBounds());
    transformedBounds = tr.transform(transformedBounds);

    // scaling is already applied in transformedBounds
    layer.setFrame(transformedBounds);
    layer.setCrop(transformedBounds.getBounds());
    Rect bounds(computeBounds());

    // apply the layer's transform, followed by the display's global transform
    // here we're guaranteed that the layer's transform preserves rects

    const Transform& tr = hw->getTransform();
    Rect frame(tr.transform(s.transform.transform(bounds)));
    layer.setFrame(frame);
    layer.setCrop(bounds);
}

void LayerBase::setPerFrameData(const sp<const DisplayDevice>& hw,
+1 −1
Original line number Diff line number Diff line
@@ -1384,7 +1384,7 @@ void SurfaceFlinger::computeVisibleRegions(
        // handle hidden surfaces by setting the visible region to empty
        if (CC_LIKELY(layer->isVisible())) {
            const bool translucent = !layer->isOpaque();
            Rect bounds(layer->computeBounds());
            Rect bounds(s.transform.transform(layer->computeBounds()));
            visibleRegion.set(bounds);
            if (!visibleRegion.isEmpty()) {
                // Remove the transparent area from the visible region