float: add conversions to/from associated alpha for grayscale
authorØyvind Kolås <pippin@gimp.org>
Mon, 19 Aug 2019 23:46:08 +0000 (01:46 +0200)
committerØyvind Kolås <pippin@gimp.org>
Mon, 19 Aug 2019 23:46:16 +0000 (01:46 +0200)
Further speeds up rotations/scales etc in all grayscale precisions.

extensions/float.c

index 4d28409374aee2466b8554835f4a171aaa5dc8e6..cd3442156927405acd052cdd79b87abbc1492c71 100644 (file)
@@ -50,6 +50,27 @@ conv_yaF_linear_yAF_linear (const Babl    *conversion,
 }
 
 
+static void
+conv_yAF_linear_yaF_linear (const Babl    *conversion,
+                            unsigned char *src,
+                            unsigned char *dst,
+                            long           samples)
+{
+   float *fsrc = (float *) src;
+   float *fdst = (float *) dst;
+   int n = samples;
+
+   while (n--)
+     {
+       float alpha = fsrc[1];
+       float alpha_reciprocal = 1.0f/babl_epsilon_for_zero_float (alpha);
+       *fdst++ = (*fsrc++) * alpha_reciprocal;
+       *fdst++ = alpha;
+       fsrc++;
+     }
+}
+
+
 static void
 conv_yaF_linear_yAF_nonlinear (const Babl    *conversion,
                                unsigned char *src,
@@ -585,10 +606,11 @@ init (void)
   o (rgbF_nonlinear,  rgbF_linear);
 
 
+  o (yaF_linear, yAF_linear);
+  o (yAF_linear, yaF_linear);
   o (yAF_linear, yAF_nonlinear);
   o (yaF_linear, yAF_nonlinear);
   o (yaF_linear, yaF_nonlinear);
-  o (yaF_linear, yAF_linear);
   o (yaF_nonlinear,  yaF_linear);
   o (yF_linear, yF_nonlinear);
   o (yF_nonlinear,  yF_linear);