summaryrefslogtreecommitdiff
path: root/libacryl
diff options
context:
space:
mode:
authorHyesoo Yu <hyesoo.yu@samsung.com>2019-05-14 14:49:17 +0900
committerCho KyongHo <pullip.cho@samsung.com>2020-02-24 18:21:34 -0800
commit9b0097fcc1c647ffd032629bc750ad0bfad5c37c (patch)
tree4dfcb6106f65a704f0d0142170a0fc91f9fd6827 /libacryl
parent1fa31cdfadd0a5eb7652f682106f4384b0296f82 (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.cpp34
-rw-r--r--libacryl/acrylic_g2d9810.h2
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;