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
This commit is contained in:
parent
eb0d12963d
commit
5219a06d61
@ -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,
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user