From 2802950123c808246d0e9c40b1b7cc45043f9335 Mon Sep 17 00:00:00 2001 From: David Reveman Date: Tue, 29 Nov 2005 15:48:34 +0000 Subject: [PATCH] Track changes to glitz --- ChangeLog | 5 +++ src/cairo-glitz-surface.c | 66 ++++++++++++++------------------------- 2 files changed, 28 insertions(+), 43 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2d4cf734f..798eb2afc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2005-11-30 David Reveman + + * src/cairo-glitz-surface.c (_cairo_glitz_pattern_acquire_surface): + Track changes to glitz. + 2005-11-21 Carl Worth * src/pixman-remap.h: Remove duplicate definitions of diff --git a/src/cairo-glitz-surface.c b/src/cairo-glitz-surface.c index 1f8763c19..e252e85c9 100644 --- a/src/cairo-glitz-surface.c +++ b/src/cairo-glitz-surface.c @@ -153,7 +153,7 @@ _cairo_glitz_surface_get_image (cairo_glitz_surface_t *surface, rect_out->height = height; } - if (surface->format->type == GLITZ_FORMAT_TYPE_COLOR) { + if (surface->format->color.fourcc == GLITZ_FOURCC_RGB) { if (surface->format->color.red_size > 0) { format.bpp = 32; @@ -475,7 +475,7 @@ _glitz_ensure_target (glitz_surface_t *surface) width = glitz_surface_get_width (surface); height = glitz_surface_get_height (surface); - if (format->type != GLITZ_FORMAT_TYPE_COLOR) + if (format->color.fourcc != GLITZ_FOURCC_RGB) return CAIRO_INT_STATUS_UNSUPPORTED; templ.color = format->color; @@ -545,10 +545,10 @@ _cairo_glitz_pattern_acquire_surface (cairo_pattern_t *pattern, glitz_fixed16_16_t *params; int n_params; unsigned int *pixels; - int i; - unsigned char alpha; + int i, n_base_params; glitz_buffer_t *buffer; static glitz_pixel_format_t format = { + GLITZ_FOURCC_RGB, { 32, 0xff000000, @@ -570,41 +570,15 @@ _cairo_glitz_pattern_acquire_surface (cairo_pattern_t *pattern, if (gradient->n_stops < 2) break; - /* glitz doesn't support inner and outer circle with different - center points. */ - if (pattern->type == CAIRO_PATTERN_RADIAL) - { - cairo_radial_pattern_t *grad = (cairo_radial_pattern_t *) pattern; - - if (grad->center0.x != grad->center1.x || - grad->center0.y != grad->center1.y) - break; - } - if (!CAIRO_GLITZ_FEATURE_OK (dst->surface, FRAGMENT_PROGRAM)) break; - if (pattern->filter != CAIRO_FILTER_BILINEAR && - pattern->filter != CAIRO_FILTER_GOOD && - pattern->filter != CAIRO_FILTER_BEST) - break; + if (pattern->type == CAIRO_PATTERN_RADIAL) + n_base_params = 6; + else + n_base_params = 4; - alpha = gradient->stops[0].color.alpha * 0xff; - for (i = 1; i < gradient->n_stops; i++) - { - unsigned char a; - - a = gradient->stops[i].color.alpha * 0xff; - if (a != alpha) - break; - } - - /* we can't have color stops with different alpha as gradient color - interpolation should be done to unpremultiplied colors. */ - if (i < gradient->n_stops) - break; - - n_params = gradient->n_stops * 3 + 4; + n_params = gradient->n_stops * 3 + n_base_params; data = malloc (sizeof (glitz_fixed16_16_t) * n_params + sizeof (unsigned int) * gradient->n_stops); @@ -636,14 +610,14 @@ _cairo_glitz_pattern_acquire_surface (cairo_pattern_t *pattern, for (i = 0; i < gradient->n_stops; i++) { pixels[i] = - (((int) alpha) << 24) | - (((int) gradient->stops[i].color.red * alpha) << 16) | - (((int) gradient->stops[i].color.green * alpha) << 8) | - (((int) gradient->stops[i].color.blue * alpha)); + (((int) (gradient->stops[i].color.alpha * 0xff)) << 24) | + (((int) (gradient->stops[i].color.red * 0xff)) << 16) | + (((int) (gradient->stops[i].color.green * 0xff)) << 8) | + (((int) (gradient->stops[i].color.blue * 0xff))); - params[4 + 3 * i] = gradient->stops[i].offset; - params[5 + 3 * i] = i << 16; - params[6 + 3 * i] = 0; + params[n_base_params + 3 * i] = gradient->stops[i].offset; + params[n_base_params + 3 * i] = i << 16; + params[n_base_params + 3 * i] = 0; } glitz_set_pixels (src->surface, 0, 0, gradient->n_stops, 1, @@ -668,7 +642,9 @@ _cairo_glitz_pattern_acquire_surface (cairo_pattern_t *pattern, params[0] = _cairo_fixed_from_double (grad->center0.x); params[1] = _cairo_fixed_from_double (grad->center0.y); params[2] = _cairo_fixed_from_double (grad->radius0); - params[3] = _cairo_fixed_from_double (grad->radius1); + params[3] = _cairo_fixed_from_double (grad->center1.x); + params[4] = _cairo_fixed_from_double (grad->center1.y); + params[5] = _cairo_fixed_from_double (grad->radius1); attr->filter = GLITZ_FILTER_RADIAL_GRADIENT; } @@ -720,6 +696,10 @@ _cairo_glitz_pattern_acquire_surface (cairo_pattern_t *pattern, case CAIRO_EXTEND_REFLECT: attr->fill = GLITZ_FILL_REFLECT; break; + case CAIRO_EXTEND_PAD: + default: + attr->fill = GLITZ_FILL_NEAREST; + break; } switch (attr->base.filter) {