ScreenDecorHwcLayer: better debugging for the transparent region
When DEBUG_COLOR is set, the ScreenDecorHwcLayer becomes a full color buffer (instead of A8) and draws green for the cutouts and transparent green for the transparent region. But the old method calculated the transparent region during every draw call, which doesn't match how it happens when we actually set the transparent region. Instead, do the following: Always call requestTransparentRegion in onAttachedToWindow. This means that gatherTransparentRegion will be called to calculate the transparent region. Do *not* call calculateTransparentRect in onDraw, which would update the rect. The final result is that onDraw will draw using the rect computed for passing to native. When DEBUG_COLOR is set, still compute the rect in gatherTransparentRegion, but set the region to empty. The method is supposed to remove parts of the Region that are not transparent, and with the debug drawing, it essentially draws everywhere. Only call setDisplayDecoration when !DEBUG_COLOR. With DEBUG_COLOR set, we cannot take advantage of DISPLAY_DECORATION layers anyway. Bug: 225212638 Test: debug.screenshot_rounded_corners Change-Id: Ic91d3b22e5c5d768cc1c6f1f8baefe1546ac2006
This commit is contained in:
@@ -101,10 +101,10 @@ class ScreenDecorHwcLayer(context: Context, displayDecorationSupport: DisplayDec
|
||||
|
||||
override fun onAttachedToWindow() {
|
||||
super.onAttachedToWindow()
|
||||
parent.requestTransparentRegion(this)
|
||||
if (!DEBUG_COLOR) {
|
||||
parent.requestTransparentRegion(this)
|
||||
viewRootImpl.setDisplayDecoration(true)
|
||||
}
|
||||
viewRootImpl.setDisplayDecoration(true)
|
||||
|
||||
if (useInvertedAlphaColor) {
|
||||
paint.set(clearPaint)
|
||||
@@ -128,7 +128,6 @@ class ScreenDecorHwcLayer(context: Context, displayDecorationSupport: DisplayDec
|
||||
super.onDraw(canvas)
|
||||
|
||||
debugTransparentRegionPaint?.let {
|
||||
calculateTransparentRect()
|
||||
canvas.drawRect(transparentRect, it)
|
||||
}
|
||||
}
|
||||
@@ -136,7 +135,16 @@ class ScreenDecorHwcLayer(context: Context, displayDecorationSupport: DisplayDec
|
||||
override fun gatherTransparentRegion(region: Region?): Boolean {
|
||||
region?.let {
|
||||
calculateTransparentRect()
|
||||
region.op(transparentRect, Region.Op.INTERSECT)
|
||||
if (DEBUG_COLOR) {
|
||||
// Since we're going to draw a rectangle where the layer would
|
||||
// normally be transparent, treat the transparent region as
|
||||
// empty. We still want this method to be called, though, so
|
||||
// that it calculates the transparent rect at the right time
|
||||
// to match !DEBUG_COLOR.
|
||||
region.setEmpty()
|
||||
} else {
|
||||
region.op(transparentRect, Region.Op.INTERSECT)
|
||||
}
|
||||
}
|
||||
// Always return false - views underneath this should always be visible.
|
||||
return false
|
||||
|
||||
Reference in New Issue
Block a user