On 25.09.24 16:34, Sascha Hauer wrote: > gu_set_rgba_pixel() can work in two modes. When the plane does have an > alpha channel then it just sets the RGBA values. When the plane doesn't > have an alpha channel then it does pseudo alpha blending of the previous > pixel value. > > At least this was the intention. The function sets the alpha value > correctly only when it's not fully opaque. Fix this by always setting > the alpha channel when it exists. > > Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> Reviewed-by: Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx> > --- > lib/gui/graphic_utils.c | 26 ++++++++++++-------------- > 1 file changed, 12 insertions(+), 14 deletions(-) > > diff --git a/lib/gui/graphic_utils.c b/lib/gui/graphic_utils.c > index 93ef1214f9..d9f90f3d2e 100644 > --- a/lib/gui/graphic_utils.c > +++ b/lib/gui/graphic_utils.c > @@ -187,24 +187,22 @@ void gu_set_rgba_pixel(struct fb_info *info, void *adr, u8 r, u8 g, u8 b, u8 a) > if (!a) > return; > > - if (a != 0xff) { > - if (info->transp.length) { > - px |= (a >> (8 - info->transp.length)) << info->transp.offset; > - } else { > - u8 sr = 0; > - u8 sg = 0; > - u8 sb = 0; > + if (info->transp.length) { > + px |= (a >> (8 - info->transp.length)) << info->transp.offset; > + } else if (a != 0xff) { > + u8 sr = 0; > + u8 sg = 0; > + u8 sb = 0; > > - get_rgb_pixel(info, adr, &sr, &sg, &sb); > + get_rgb_pixel(info, adr, &sr, &sg, &sb); > > - r = alpha_mux(sr, r, a); > - g = alpha_mux(sg, g, a); > - b = alpha_mux(sb, b, a); > + r = alpha_mux(sr, r, a); > + g = alpha_mux(sg, g, a); > + b = alpha_mux(sb, b, a); > > - gu_set_rgb_pixel(info, adr, r, g, b); > + gu_set_rgb_pixel(info, adr, r, g, b); > > - return; > - } > + return; > } > > px |= (r >> (8 - info->red.length)) << info->red.offset | > -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |