summaryrefslogtreecommitdiff
path: root/src/cairo-image-source.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cairo-image-source.c')
-rw-r--r--src/cairo-image-source.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/cairo-image-source.c b/src/cairo-image-source.c
index 0b50afcad..c56845ab2 100644
--- a/src/cairo-image-source.c
+++ b/src/cairo-image-source.c
@@ -455,6 +455,7 @@ static pixman_image_t *
_pixel_to_solid (cairo_image_surface_t *image, int x, int y)
{
uint32_t pixel;
+ float *rgba;
pixman_color_t color;
TRACE ((stderr, "%s\n", __FUNCTION__));
@@ -523,6 +524,32 @@ _pixel_to_solid (cairo_image_surface_t *image, int x, int y)
color.green = (pixel >> 8 & 0xff) | (pixel & 0xff00);
color.blue = (pixel & 0xff) | (pixel << 8 & 0xff00);
return pixman_image_create_solid_fill (&color);
+
+ case CAIRO_FORMAT_RGB96F:
+ case CAIRO_FORMAT_RGBA128F:
+ if (image->format == CAIRO_FORMAT_RGBA128F)
+ {
+ rgba = (float *)&image->data[y * image->stride + 16 * x];
+ color.alpha = 65535.f * rgba[3];
+
+ if (color.alpha == 0)
+ return _pixman_transparent_image ();
+ }
+ else
+ {
+ rgba = (float *)&image->data[y * image->stride + 12 * x];
+ color.alpha = 0xffff;
+ }
+
+ if (color.alpha == 0xffff && rgba[0] == 0.f && rgba[1] == 0.f && rgba[2] == 0.f)
+ return _pixman_black_image ();
+ if (color.alpha == 0xffff && rgba[0] == 1.f && rgba[1] == 1.f && rgba[2] == 1.f)
+ return _pixman_white_image ();
+
+ color.red = rgba[0] * 65535.f;
+ color.green = rgba[1] * 65535.f;
+ color.blue = rgba[2] * 65535.f;
+ return pixman_image_create_solid_fill (&color);
}
}