diff options
author | Soren Sandmann Pedersen <sandmann@redhat.com> | 2007-05-18 11:33:11 -0400 |
---|---|---|
committer | Soren Sandmann Pedersen <sandmann@redhat.com> | 2007-05-18 14:06:21 -0400 |
commit | a2e3614eb8f0fa198615df492b03ff36bc9c1121 (patch) | |
tree | ef569ed139e66c01e26024110d7c4bfc4ffa76a0 /fb | |
parent | c5ef84c325440af5fbdf9f44c3781d99a0392df9 (diff) |
Break image_from_pict() into a few subfunctions.
Diffstat (limited to 'fb')
-rw-r--r-- | fb/fbpict.c | 372 |
1 files changed, 189 insertions, 183 deletions
diff --git a/fb/fbpict.c b/fb/fbpict.c index 4034a16a0..fc335ed38 100644 --- a/fb/fbpict.c +++ b/fb/fbpict.c @@ -931,218 +931,222 @@ fbCompositeSrcSrc_nxn (CARD8 op, fbFinishAccess(pDst->pDrawable); } -/* - * Solid fill -void -fbCompositeSolidSrc_nxn (CARD8 op, - PicturePtr pSrc, - PicturePtr pMask, - PicturePtr pDst, - INT16 xSrc, - INT16 ySrc, - INT16 xMask, - INT16 yMask, - INT16 xDst, - INT16 yDst, - CARD16 width, - CARD16 height) +static pixman_image_t * +create_solid_fill_image (PicturePtr pict) { + PictSolidFill *solid = &pict->pSourcePict->solidFill; + pixman_color_t color; + CARD32 a, r, g, b; + + a = (solid->color & 0xff000000) >> 24; + r = (solid->color & 0x00ff0000) >> 16; + g = (solid->color & 0x0000ff00) >> 8; + b = (solid->color & 0x000000ff) >> 0; + + color.alpha = (a << 8) | a; + color.red = (r << 8) | r; + color.green = (g << 8) | g; + color.blue = (b << 8) | b; + return pixman_image_create_solid_fill (&color); } - */ - -#define SCANLINE_BUFFER_LENGTH 2048 static pixman_image_t * -image_from_pict (PicturePtr pict) +create_linear_gradient_image (PictGradient *gradient) { - pixman_image_t *result = NULL; - - if (!pict) - return NULL; + PictLinearGradient *linear = (PictLinearGradient *)gradient; + pixman_point_fixed_t p1; + pixman_point_fixed_t p2; - if (pict->pSourcePict) - { - SourcePictPtr sp = pict->pSourcePict; - - if (sp->type == SourcePictTypeSolidFill) - { - PictSolidFill *solid = &pict->pSourcePict->solidFill; - pixman_color_t color; - CARD32 a, r, g, b; - - a = (solid->color & 0xff000000) >> 24; - r = (solid->color & 0x00ff0000) >> 16; - g = (solid->color & 0x0000ff00) >> 8; - b = (solid->color & 0x000000ff) >> 0; - - color.alpha = (a << 8) | a; - color.red = (r << 8) | r; - color.green = (g << 8) | g; - color.blue = (b << 8) | b; - - result = pixman_image_create_solid_fill (&color); - } - else - { - PictGradient *gradient = &pict->pSourcePict->gradient; - - if (sp->type == SourcePictTypeLinear) - { - PictLinearGradient *linear = &pict->pSourcePict->linear; - pixman_point_fixed_t p1; - pixman_point_fixed_t p2; - - p1.x = linear->p1.x; - p1.y = linear->p1.y; - p2.x = linear->p2.x; - p2.y = linear->p2.y; - - result = pixman_image_create_linear_gradient ( - &p1, &p2, (pixman_gradient_stop_t *)gradient->stops, gradient->nstops); - } - else if (sp->type == SourcePictTypeRadial) - { - PictRadialGradient *radial = &pict->pSourcePict->radial; - - pixman_point_fixed_t c1; - pixman_point_fixed_t c2; - - c1.x = radial->c1.x; - c1.y = radial->c1.y; - c2.x = radial->c2.x; - c2.y = radial->c2.y; - - result = pixman_image_create_radial_gradient ( - &c1, &c2, radial->c1.radius, - radial->c2.radius, - (pixman_gradient_stop_t *)gradient->stops, gradient->nstops); - } - else if (sp->type == SourcePictTypeConical) - { - PictConicalGradient *conical = &pict->pSourcePict->conical; - pixman_point_fixed_t center; - - center.x = conical->center.x; - center.y = conical->center.y; - - result = pixman_image_create_conical_gradient ( - ¢er, conical->angle, (pixman_gradient_stop_t *)gradient->stops, - gradient->nstops); - } - else - { - /* Shouldn't happen */ - result = NULL; - } - } - } - else if (pict->pDrawable) - { - FbBits *bits; - FbStride stride; - int bpp, xoff, yoff; - - fbGetDrawable (pict->pDrawable, bits, stride, bpp, xoff, yoff); + p1.x = linear->p1.x; + p1.y = linear->p1.y; + p2.x = linear->p2.x; + p2.y = linear->p2.y; + + return pixman_image_create_linear_gradient ( + &p1, &p2, (pixman_gradient_stop_t *)gradient->stops, gradient->nstops); +} - bits += yoff * stride + xoff; - - result = pixman_image_create_bits ( - pict->format, - pict->pDrawable->width, pict->pDrawable->height, - (uint32_t *)bits, stride * sizeof (FbStride)); +static pixman_image_t * +create_radial_gradient_image (PictGradient *gradient) +{ + PictRadialGradient *radial = (PictRadialGradient *)gradient; + pixman_point_fixed_t c1; + pixman_point_fixed_t c2; + + c1.x = radial->c1.x; + c1.y = radial->c1.y; + c2.x = radial->c2.x; + c2.y = radial->c2.y; + + return pixman_image_create_radial_gradient ( + &c1, &c2, radial->c1.radius, + radial->c2.radius, + (pixman_gradient_stop_t *)gradient->stops, gradient->nstops); +} +static pixman_image_t * +create_conical_gradient_image (PictGradient *gradient) +{ + PictConicalGradient *conical = (PictConicalGradient *)gradient; + pixman_point_fixed_t center; + + center.x = conical->center.x; + center.y = conical->center.y; + + return pixman_image_create_conical_gradient ( + ¢er, conical->angle, (pixman_gradient_stop_t *)gradient->stops, + gradient->nstops); +} +static pixman_image_t * +create_bits_picture (PicturePtr pict) +{ + FbBits *bits; + FbStride stride; + int bpp, xoff, yoff; + pixman_image_t *image; + + fbGetDrawable (pict->pDrawable, bits, stride, bpp, xoff, yoff); + + bits += yoff * stride + xoff; + + image = pixman_image_create_bits ( + pict->format, + pict->pDrawable->width, pict->pDrawable->height, + (uint32_t *)bits, stride * sizeof (FbStride)); + + #ifdef FB_ACCESS_WRAPPER #if FB_SHIFT==5 - - pixman_image_set_accessors ( - result, - (pixman_read_memory_func_t)wfbReadMemory, - (pixman_write_memory_func_t)wfbWriteMemory); + + pixman_image_set_accessors (image, + (pixman_read_memory_func_t)wfbReadMemory, + (pixman_write_memory_func_t)wfbWriteMemory); + #else - -#error The pixman library only works with sizeof (FbBits) == 5 - + +#error The pixman library only works when FbBits is 32 bits wide + #endif #endif - - /* pCompositeClip is undefined for source pictures, so - * only set the clip region for pictures with drawables - */ - pixman_image_set_clip_region ( - result, pict->pCompositeClip); + + /* pCompositeClip is undefined for source pictures, so + * only set the clip region for pictures with drawables + */ + pixman_image_set_clip_region (image, pict->pCompositeClip); + + fbFinishAccess (pict->pDrawable); + + return image; +} + +static pixman_image_t *image_from_pict (PicturePtr pict); - fbFinishAccess (pict->pDrawable); +static void +set_image_properties (pixman_image_t *image, PicturePtr pict) +{ + pixman_repeat_t repeat; + pixman_filter_t filter; + + if (pict->transform) + { + pixman_image_set_transform ( + image, (pixman_transform_t *)pict->transform); + } + + switch (pict->repeatType) + { + default: + case RepeatNone: + repeat = PIXMAN_REPEAT_NONE; + break; + + case RepeatPad: + repeat = PIXMAN_REPEAT_PAD; + break; + + case RepeatNormal: + repeat = PIXMAN_REPEAT_NORMAL; + break; + + case RepeatReflect: + repeat = PIXMAN_REPEAT_REFLECT; + break; + } + + pixman_image_set_repeat (image, repeat); + + if (pict->alphaMap) + { + pixman_image_t *alpha_map = image_from_pict (pict->alphaMap); + + pixman_image_set_alpha_map ( + image, alpha_map, pict->alphaOrigin.x, pict->alphaOrigin.y); + + pixman_image_unref (alpha_map); } + + pixman_image_set_component_alpha (image, pict->componentAlpha); - if (result) + switch (pict->filter) { - pixman_repeat_t repeat; - pixman_filter_t filter; + default: + case PictFilterNearest: + case PictFilterFast: + filter = PIXMAN_FILTER_NEAREST; + break; - if (pict->transform) - { - pixman_image_set_transform ( - result, (pixman_transform_t *)pict->transform); - } + case PictFilterBilinear: + case PictFilterGood: + filter = PIXMAN_FILTER_BILINEAR; + break; + + case PictFilterConvolution: + filter = PIXMAN_FILTER_CONVOLUTION; + break; + } + + pixman_image_set_filter (image, filter, (pixman_fixed_t *)pict->filter_params, pict->filter_nparams); +} - switch (pict->repeatType) - { - default: - case RepeatNone: - repeat = PIXMAN_REPEAT_NONE; - break; - - case RepeatPad: - repeat = PIXMAN_REPEAT_PAD; - break; - - case RepeatNormal: - repeat = PIXMAN_REPEAT_NORMAL; - break; - - case RepeatReflect: - repeat = PIXMAN_REPEAT_REFLECT; - break; - } +static pixman_image_t * +image_from_pict (PicturePtr pict) +{ + pixman_image_t *image = NULL; - pixman_image_set_repeat (result, repeat); + if (!pict) + return NULL; - if (pict->alphaMap) + if (pict->pDrawable) + { + image = create_bits_picture (pict); + } + else if (pict->pSourcePict) + { + SourcePict *sp = pict->pSourcePict; + + if (sp->type == SourcePictTypeSolidFill) { - pixman_image_t *alpha_map = image_from_pict (pict->alphaMap); - - pixman_image_set_alpha_map ( - result, alpha_map, pict->alphaOrigin.x, pict->alphaOrigin.y); - - pixman_image_unref (alpha_map); + image = create_solid_fill_image (pict); } - - pixman_image_set_component_alpha (result, pict->componentAlpha); - - switch (pict->filter) + else { - default: - case PictFilterNearest: - case PictFilterFast: - filter = PIXMAN_FILTER_NEAREST; - break; - - case PictFilterBilinear: - case PictFilterGood: - filter = PIXMAN_FILTER_BILINEAR; - break; - - case PictFilterConvolution: - filter = PIXMAN_FILTER_CONVOLUTION; - break; + PictGradient *gradient = &pict->pSourcePict->gradient; + + if (sp->type == SourcePictTypeLinear) + image = create_linear_gradient_image (gradient); + else if (sp->type == SourcePictTypeRadial) + image = create_radial_gradient_image (gradient); + else if (sp->type == SourcePictTypeConical) + image = create_conical_gradient_image (gradient); } - - pixman_image_set_filter (result, filter, (pixman_fixed_t *)pict->filter_params, pict->filter_nparams); } - return result; + if (image) + set_image_properties (image, pict); + + return image; } static void @@ -1180,6 +1184,8 @@ out: } #if 0 +#define SCANLINE_BUFFER_LENGTH 2048 + static void oldfbCompositeRectWrapper (CARD8 op, PicturePtr pSrc, |