}
}
+
+static void
+conv_cairo32_rgbaF_le (const Babl *conversion,
+ unsigned char *src,
+ unsigned char *dst_char,
+ long samples)
+{
+ long n = samples;
+ float *dst = (void*)dst_char;
+ while (n--)
+ {
+ unsigned char blue = *src++;
+ unsigned char green = *src++;
+ unsigned char red = *src++;
+ unsigned char alpha = *src++;
+
+ float reciprocal_alpha = 0.0f;
+
+ if (alpha)
+ reciprocal_alpha = 1.0f/(alpha/255.0f) / 255.0f;
+
+
+ *dst++ = red * reciprocal_alpha;
+ *dst++ = green * reciprocal_alpha;
+ *dst++ = blue * reciprocal_alpha;
+ *dst++ = alpha / 255.0;
+ }
+}
+
+
+static void
+conv_cairo24_rgbF_le (const Babl *conversion,
+ unsigned char *src,
+ unsigned char *dst_char,
+ long samples)
+{
+ long n = samples;
+ float *dst = (void*)dst_char;
+ while (n--)
+ {
+ unsigned char blue = *src++;
+ unsigned char green = *src++;
+ unsigned char red = *src++;
+
+ *dst++ = red / 255.0;
+ *dst++ = green / 255.0;
+ *dst++ = blue / 255.0;
+ src++;
+ }
+}
+
+static void
+conv_cairo24_cairo32_le (const Babl *conversion,
+ unsigned char *src,
+ unsigned char *dst,
+ long samples)
+{
+ long n = samples;
+ while (n--)
+ {
+ unsigned char alpha = src[3];
+
+ *dst++ = (*src++);
+ *dst++ = (*src++);
+ *dst++ = (*src++);
+ *dst++ = 255; src++;
+ }
+}
+
+
static void
conv_rgba8_cairo32_le (const Babl *conversion,
unsigned char *src,
babl_conversion_new (f32, babl_format ("R'aG'aB'aA float"), "linear",
conv_cairo32_rgbAF_le, NULL);
+ babl_conversion_new (f32, babl_format ("R'G'B'A float"), "linear",
+ conv_cairo32_rgbaF_le, NULL);
+
babl_conversion_new (f32, babl_format ("R'aG'aB'aA u8"), "linear",
conv_cairo32_rgbA8_le, NULL);
babl_conversion_new (f32, babl_format ("R'G'B'A u8"), "linear",
conv_cairo32_rgba8_le, NULL);
+ babl_conversion_new (f24, f32, "linear",
+ conv_cairo24_cairo32_le, NULL);
+
+ babl_conversion_new (f24, babl_format ("R'G'B' float"), "linear",
+ conv_cairo24_rgbF_le, NULL);
+
babl_conversion_new (babl_format ("R'aG'aB'aA u8"), f32, "linear",
conv_rgbA8_cairo32_le, NULL);