diff options
author | Hyesoo Yu <hyesoo.yu@samsung.com> | 2019-05-14 14:49:17 +0900 |
---|---|---|
committer | Cho KyongHo <pullip.cho@samsung.com> | 2020-02-24 18:21:34 -0800 |
commit | 9b0097fcc1c647ffd032629bc750ad0bfad5c37c (patch) | |
tree | 4dfcb6106f65a704f0d0142170a0fc91f9fd6827 /libacryl | |
parent | 1fa31cdfadd0a5eb7652f682106f4384b0296f82 (diff) |
libacryl: support blend mode for dim layer
Change-Id: Ia841ac8d5bcebd89c02f2485349156c996cb7dda
Signed-off-by: Hyesoo Yu <hyesoo.yu@samsung.com>
Diffstat (limited to 'libacryl')
-rw-r--r-- | libacryl/acrylic_g2d9810.cpp | 34 | ||||
-rw-r--r-- | libacryl/acrylic_g2d9810.h | 2 |
2 files changed, 29 insertions, 7 deletions
diff --git a/libacryl/acrylic_g2d9810.cpp b/libacryl/acrylic_g2d9810.cpp index 194165a..03ccc17 100644 --- a/libacryl/acrylic_g2d9810.cpp +++ b/libacryl/acrylic_g2d9810.cpp @@ -523,8 +523,6 @@ static void setSolidLayer(struct g2d_layer &image, uint32_t cmd[], hw2d_coord_t cmd[G2DSFR_SRC_YSCALE] = G2D_SCALE_FACTOR(1, 1); cmd[G2DSFR_SRC_XPHASE] = 0; cmd[G2DSFR_SRC_YPHASE] = 0; - cmd[G2DSFR_SRC_ALPHA] = 0; - cmd[G2DSFR_SRC_BLEND] = 0; cmd[G2DSFR_SRC_YCBCRMODE] = 0; cmd[G2DSFR_SRC_HDRMODE] = 0; cmd[G2DSFR_SRC_Y_HEADER_STRIDE] = 0; @@ -537,6 +535,8 @@ bool AcrylicCompositorG2D9810::prepareSolidLayer(AcrylicCanvas &canvas, struct g { hw2d_coord_t xy = canvas.getImageDimension(); + setSolidLayer(image, cmd, xy); + uint16_t a, r, g, b; getBackgroundColor(&r, &g, &b, &a); @@ -555,15 +555,18 @@ bool AcrylicCompositorG2D9810::prepareSolidLayer(AcrylicCanvas &canvas, struct g cmd[G2DSFR_SRC_DSTRIGHT] = xy.hori; cmd[G2DSFR_SRC_DSTBOTTOM] = xy.vert; - setSolidLayer(image, cmd, xy); + cmd[G2DSFR_SRC_ALPHA] = 0; + cmd[G2DSFR_SRC_BLEND] = 0; return true; } -bool AcrylicCompositorG2D9810::prepareSolidLayer(AcrylicLayer &layer, struct g2d_layer &image, uint32_t cmd[], hw2d_coord_t target_size) +bool AcrylicCompositorG2D9810::prepareSolidLayer(AcrylicLayer &layer, struct g2d_layer &image, uint32_t cmd[], hw2d_coord_t target_size, int index) { hw2d_coord_t xy = layer.getImageDimension(); + setSolidLayer(image, cmd, xy); + cmd[G2DSFR_SRC_COLOR] = layer.getSolidColor(); hw2d_rect_t crop = layer.getImageRect(); @@ -580,7 +583,26 @@ bool AcrylicCompositorG2D9810::prepareSolidLayer(AcrylicLayer &layer, struct g2d cmd[G2DSFR_SRC_DSTRIGHT] = window.size.hori + window.pos.hori; cmd[G2DSFR_SRC_DSTBOTTOM] = window.size.vert + window.pos.vert; - setSolidLayer(image, cmd, xy); + uint8_t alpha = layer.getPlaneAlpha(); + cmd[G2DSFR_SRC_ALPHA] = (alpha << 24) | (alpha << 16) | (alpha << 8) | alpha; + if ((layer.getCompositingMode() == HWC_BLENDING_PREMULT) || + (layer.getCompositingMode() == HWC2_BLEND_MODE_PREMULTIPLIED)) { + cmd[G2DSFR_SRC_BLEND] = G2D_BLEND_SRCOVER; + } else if ((layer.getCompositingMode() == HWC_BLENDING_COVERAGE) || + (layer.getCompositingMode() == HWC2_BLEND_MODE_COVERAGE)) { + cmd[G2DSFR_SRC_BLEND] = G2D_BLEND_NONE; + } else { + cmd[G2DSFR_SRC_BLEND] = G2D_BLEND_SRCCOPY; + } + + /* bottom layer always is opaque */ + if (index == 0) { + cmd[G2DSFR_SRC_COMMAND] |= G2D_LAYERCMD_OPAQUE; + if (alpha < 255) + cmd[G2DSFR_SRC_COMMAND] |= G2D_LAYERCMD_PREMULT_GLOBALALPHA; + } else { + cmd[G2DSFR_SRC_COMMAND] |= G2D_LAYERCMD_ALPHABLEND; + } return true; } @@ -589,7 +611,7 @@ bool AcrylicCompositorG2D9810::prepareSource(AcrylicLayer &layer, struct g2d_lay hw2d_coord_t target_size, int index) { if (layer.isSolidColor()) { - prepareSolidLayer(layer, image, cmd, target_size); + prepareSolidLayer(layer, image, cmd, target_size, index); return true; } diff --git a/libacryl/acrylic_g2d9810.h b/libacryl/acrylic_g2d9810.h index 498c1cb..07ae17c 100644 --- a/libacryl/acrylic_g2d9810.h +++ b/libacryl/acrylic_g2d9810.h @@ -128,7 +128,7 @@ private: bool prepareImage(AcrylicCanvas &layer, struct g2d_layer &image, uint32_t cmd[], int index); bool prepareSource(AcrylicLayer &layer, struct g2d_layer &image, uint32_t cmd[], hw2d_coord_t target_size, int index); bool prepareSolidLayer(AcrylicCanvas &canvas, struct g2d_layer &image, uint32_t cmd[]); - bool prepareSolidLayer(AcrylicLayer &layer, struct g2d_layer &image, uint32_t cmd[], hw2d_coord_t target_size); + bool prepareSolidLayer(AcrylicLayer &layer, struct g2d_layer &image, uint32_t cmd[], hw2d_coord_t target_size, int index); bool reallocLayer(unsigned int layercount); AcrylicDevice mDev; |