commit 312fbd6ea95b5638719c40d3c663db9bec0a77ac Author: Emmanuel Pacaud Date: Thu Dec 13 11:09:59 2007 +0100 2007-12-13 Emmanuel Pacaud Fix pattern with semi-transparent colors. * goffice/utils/go-pattern (go_pattern_create_cairo_pattern): cairo uses premultiplied color components. diff --git a/ChangeLog b/ChangeLog index 08cb5c4..ccbe2cb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2007-12-13 Emmanuel Pacaud + + Fix pattern with semi-transparent colors. + + * goffice/utils/go-pattern (go_pattern_create_cairo_pattern): cairo uses + premultiplied color components. + 2007-12-06 Emmanuel Pacaud Fix selection rectangle style. diff --git a/goffice/utils/go-pattern.c b/goffice/utils/go-pattern.c index b5ba019..a1b5927 100644 --- a/goffice/utils/go-pattern.c +++ b/goffice/utils/go-pattern.c @@ -252,7 +252,7 @@ go_pattern_create_cairo_pattern (GOPattern const *pattern, cairo_t *cr) cairo_surface_destroy (cr_surface); #endif } else { - unsigned int stride, i, j; + unsigned int stride, i, j, t; unsigned char *iter; guint8 const *pattern_data; @@ -262,14 +262,16 @@ go_pattern_create_cairo_pattern (GOPattern const *pattern, cairo_t *cr) stride = cairo_image_surface_get_stride (cr_surface); iter = cairo_image_surface_get_data (cr_surface); +#define MULT(d,c,a,t) G_STMT_START { t = c * a + 0x7f; d = ((t >> 8) + t) >> 8; } G_STMT_END + if (iter != NULL) { for (i = 0; i < 8; i++) { for (j = 0; j < 8; j++) { color = pattern_data[i] & (1 << j) ? pattern->fore : pattern->back; - iter[0] = UINT_RGBA_B (color); - iter[1] = UINT_RGBA_G (color); - iter[2] = UINT_RGBA_R (color); iter[3] = UINT_RGBA_A (color); + MULT (iter[0], UINT_RGBA_B (color), iter[3], t); + MULT (iter[1], UINT_RGBA_G (color), iter[3], t); + MULT (iter[2], UINT_RGBA_R (color), iter[3], t); iter += 4; } iter += stride - 32;