2424#include < compositionengine/impl/OutputLayerCompositionState.h>
2525#include < cstdint>
2626#include " system/graphics-base-v1.0.h"
27+ #include " ui/FloatRect.h"
2728
2829#include < ui/HdrRenderTypeUtils.h>
2930
@@ -185,35 +186,35 @@ Rect OutputLayer::calculateOutputDisplayFrame() const {
185186 const auto & layerState = *getLayerFE ().getCompositionState ();
186187 const auto & outputState = getOutput ().getState ();
187188
189+ // Convert from layer space to layerStackSpace
188190 // apply the layer's transform, followed by the display's global transform
189191 // here we're guaranteed that the layer's transform preserves rects
190- Region activeTransparentRegion = layerState.transparentRegionHint ;
191192 const ui::Transform& layerTransform = layerState.geomLayerTransform ;
192- const ui::Transform& inverseLayerTransform = layerState.geomInverseLayerTransform ;
193- const Rect& bufferSize = layerState.geomBufferSize ;
194- Rect activeCrop = layerState.geomCrop ;
195- if (!activeCrop.isEmpty () && bufferSize.isValid ()) {
196- activeCrop = layerTransform.transform (activeCrop);
197- if (!activeCrop.intersect (outputState.layerStackSpace .getContent (), &activeCrop)) {
198- activeCrop.clear ();
199- }
200- activeCrop = inverseLayerTransform.transform (activeCrop, true );
201- // This needs to be here as transform.transform(Rect) computes the
202- // transformed rect and then takes the bounding box of the result before
203- // returning. This means
204- // transform.inverse().transform(transform.transform(Rect)) != Rect
205- // in which case we need to make sure the final rect is clipped to the
206- // display bounds.
207- if (!activeCrop.intersect (bufferSize, &activeCrop)) {
208- activeCrop.clear ();
209- }
193+ Region activeTransparentRegion = layerTransform.transform (layerState.transparentRegionHint );
194+ if (!layerState.geomCrop .isEmpty () && layerState.geomBufferSize .isValid ()) {
195+ FloatRect activeCrop = layerTransform.transform (layerState.geomCrop );
196+ activeCrop = activeCrop.intersect (outputState.layerStackSpace .getContent ().toFloatRect ());
197+ const FloatRect& bufferSize =
198+ layerTransform.transform (layerState.geomBufferSize .toFloatRect ());
199+ activeCrop = activeCrop.intersect (bufferSize);
200+
210201 // mark regions outside the crop as transparent
211- activeTransparentRegion.orSelf (Rect (0 , 0 , bufferSize.getWidth (), activeCrop.top ));
212- activeTransparentRegion.orSelf (
213- Rect (0 , activeCrop.bottom , bufferSize.getWidth (), bufferSize.getHeight ()));
214- activeTransparentRegion.orSelf (Rect (0 , activeCrop.top , activeCrop.left , activeCrop.bottom ));
215- activeTransparentRegion.orSelf (
216- Rect (activeCrop.right , activeCrop.top , bufferSize.getWidth (), activeCrop.bottom ));
202+ Rect topRegion = Rect (layerTransform.transform (
203+ FloatRect (0 , 0 , layerState.geomBufferSize .getWidth (), layerState.geomCrop .top )));
204+ Rect bottomRegion = Rect (layerTransform.transform (
205+ FloatRect (0 , layerState.geomCrop .bottom , layerState.geomBufferSize .getWidth (),
206+ layerState.geomBufferSize .getHeight ())));
207+ Rect leftRegion = Rect (layerTransform.transform (FloatRect (0 , layerState.geomCrop .top ,
208+ layerState.geomCrop .left ,
209+ layerState.geomCrop .bottom )));
210+ Rect rightRegion = Rect (layerTransform.transform (
211+ FloatRect (layerState.geomCrop .right , layerState.geomCrop .top ,
212+ layerState.geomBufferSize .getWidth (), layerState.geomCrop .bottom )));
213+
214+ activeTransparentRegion.orSelf (topRegion);
215+ activeTransparentRegion.orSelf (bottomRegion);
216+ activeTransparentRegion.orSelf (leftRegion);
217+ activeTransparentRegion.orSelf (rightRegion);
217218 }
218219
219220 // reduce uses a FloatRect to provide more accuracy during the
@@ -231,13 +232,14 @@ Rect OutputLayer::calculateOutputDisplayFrame() const {
231232 geomLayerBounds.right += outset;
232233 geomLayerBounds.bottom += outset;
233234 }
234- Rect frame{layerTransform.transform (reduce (geomLayerBounds, activeTransparentRegion))};
235- if (!frame.intersect (outputState.layerStackSpace .getContent (), &frame)) {
236- frame.clear ();
237- }
238- const ui::Transform displayTransform{outputState.transform };
239235
240- return displayTransform.transform (frame);
236+ geomLayerBounds = layerTransform.transform (geomLayerBounds);
237+ FloatRect frame = reduce (geomLayerBounds, activeTransparentRegion);
238+ frame = frame.intersect (outputState.layerStackSpace .getContent ().toFloatRect ());
239+
240+ // convert from layerStackSpace to displaySpace
241+ const ui::Transform displayTransform{outputState.transform };
242+ return Rect (displayTransform.transform (frame));
241243}
242244
243245uint32_t OutputLayer::calculateOutputRelativeBufferTransform (
0 commit comments