Fix the order of applying layer alpha and color matrices in GLESRenderEngine
If the system want to do a color inversion,
there is an unexpected result due to applying the layer alpha first.
Solution: RenderEngine should apply
the layer's alpha after multiplying by the color matrix.
For example, given the following color inversion matrix:
| r.r r.g r.b | | -1.0 0.0 0.0 |
| g.r g.g g.b | = | 0.0 -1.0 0.0 |
| b.r b.g b.b | | 0.0 0.0 -1.0 |
| Tr Tg Tb | | 1.0 1.0 1.0 |
We want to get a black layer when applying the color transform to a white layer;
However, the white layer applies layer alpha before color matrix. We can get
the below calculation: When layer alpha is 0, R_out value was always Tr.
Then we do not get a black layer when the system applies color inversion to a
white layer.
R_out = (R_in * layer_alpha) * r.r + Tr
Therefore we apply the color matrix first, so we can get the below calculation.
When the layer alpha is 0, we can get a black layer.
R_out = (R_in * r.r + Tr) * layer_alpha
= (R_in * r.r * layer_alpha) + (Tr * layer_alpha)
adds RenderEngineTest::fillBufferColorTransformZeroLayerAlpha
Bug: 157204341
Test: color inversion when switching pages in the Setting app
Test: RenderEngineTest
Change-Id: I206184aae84042290b00e411709e04e54579780a
Merged-In: I206184aae84042290b00e411709e04e54579780a
2 files changed