From: Øyvind Kolås Date: Sun, 26 Aug 2018 19:56:14 +0000 (+0200) Subject: babl: model-rgb handle negative alpha in premultiplied X-Git-Tag: archive/raspbian/1%0.1.106-3+rpi1^2~15^2~14^2~43 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=bfaa1ab4cc946235041dab8d534415c16523203d;p=babl.git babl: model-rgb handle negative alpha in premultiplied --- diff --git a/babl/base/model-gray.c b/babl/base/model-gray.c index eea9ebf..b7d80e1 100644 --- a/babl/base/model-gray.c +++ b/babl/base/model-gray.c @@ -432,7 +432,7 @@ gray_alpha_premultiplied_to_rgba (Babl *conversion, else { luminance = luminance / alpha; - if (alpha == BABL_ALPHA_FLOOR) + if (alpha == BABL_ALPHA_FLOOR || alpha == -BABL_ALPHA_FLOOR) alpha = 0.0; } @@ -470,19 +470,23 @@ rgba_to_gray_alpha_premultiplied (Babl *conversion, double green = *(double *) src[1]; double blue = *(double *) src[2]; double luminance; - double alpha, alpha_used; - alpha_used = alpha = *(double *) src[3]; - if (alpha < BABL_ALPHA_FLOOR) - alpha_used = BABL_ALPHA_FLOOR; + double alpha = *(double *) src[3]; + if (alpha <= BABL_ALPHA_FLOOR) + { + if (alpha >= 0.0f) + alpha = BABL_ALPHA_FLOOR; + else if (alpha >= -BABL_ALPHA_FLOOR) + alpha = -BABL_ALPHA_FLOOR; + } luminance = red * RGB_LUMINANCE_RED + green * RGB_LUMINANCE_GREEN + blue * RGB_LUMINANCE_BLUE; - luminance *= alpha_used; + luminance *= alpha; *(double *) dst[0] = luminance; - *(double *) dst[1] = alpha_used; + *(double *) dst[1] = alpha; BABL_PLANAR_STEP } } @@ -502,17 +506,20 @@ non_premultiplied_to_premultiplied (Babl *conversion, while (n--) { int band; - double alpha, alpha_used; - - alpha_used = alpha = *(double *) src[src_bands-1]; + double alpha = *(double *) src[src_bands-1]; if (alpha < BABL_ALPHA_FLOOR) - alpha_used = BABL_ALPHA_FLOOR; + { + if (alpha >= 0.0f) + alpha = BABL_ALPHA_FLOOR; + else if (alpha >= -BABL_ALPHA_FLOOR) + alpha = -BABL_ALPHA_FLOOR; + } for (band = 0; band < src_bands - 1; band++) { - *(double *) dst[band] = *(double *) src[band] * alpha_used; + *(double *) dst[band] = *(double *) src[band] * alpha; } - *(double *) dst[dst_bands - 1] = alpha_used; + *(double *) dst[dst_bands - 1] = alpha; BABL_PLANAR_STEP } @@ -543,7 +550,7 @@ premultiplied_to_non_premultiplied (Babl *conversion, else *(double *) dst[band] = *(double *) src[band] / alpha; } - if (alpha == BABL_ALPHA_FLOOR) + if (alpha == BABL_ALPHA_FLOOR || alpha == -BABL_ALPHA_FLOOR) alpha = 0.0; *(double *) dst[dst_bands - 1] = alpha; @@ -570,18 +577,22 @@ rgba2gray_nonlinear_premultiplied (Babl *conversion, double blue = ((double *) src)[2]; double luminance; double luma; - double alpha, alpha_used; - alpha_used = alpha = ((double *) src)[3]; + double alpha = ((double *) src)[3]; if (alpha < BABL_ALPHA_FLOOR) - alpha_used = BABL_ALPHA_FLOOR; + { + if (alpha >= 0.0f) + alpha = BABL_ALPHA_FLOOR; + else if (alpha >= -BABL_ALPHA_FLOOR) + alpha = -BABL_ALPHA_FLOOR; + } luminance = red * RGB_LUMINANCE_RED + green * RGB_LUMINANCE_GREEN + blue * RGB_LUMINANCE_BLUE; luma = babl_trc_from_linear (trc, luminance); - ((double *) dst)[0] = luma * alpha_used; - ((double *) dst)[1] = alpha_used; + ((double *) dst)[0] = luma * alpha; + ((double *) dst)[1] = alpha; src += 4 * sizeof (double); dst += 2 * sizeof (double); @@ -611,7 +622,7 @@ gray_nonlinear_premultiplied2rgba (Babl *conversion, luminance = babl_trc_to_linear (trc, luma); - if (alpha == BABL_ALPHA_FLOOR) + if (alpha == BABL_ALPHA_FLOOR || alpha == -BABL_ALPHA_FLOOR) alpha = 0.0; ((double *) dst)[0] = luminance;