diff options
author | Søren Sandmann Pedersen <sandmann@redhat.com> | 2007-06-11 09:16:46 -0400 |
---|---|---|
committer | Søren Sandmann Pedersen <sandmann@redhat.com> | 2007-06-11 09:43:15 -0400 |
commit | 54e023cec07aa7e392da36e11d0a4667b8341370 (patch) | |
tree | 02f721162315f7ca9e957c3b04a18b8de9159045 | |
parent | 5cbec267b6426960c90f6bcff1d051af5084538c (diff) |
Don't pass regions to pixman_image_composite() anymore.
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | fb/fbpict.c | 280 | ||||
-rw-r--r-- | render/mipict.c | 56 | ||||
-rw-r--r-- | render/mipict.h | 6 | ||||
-rw-r--r-- | render/picturestr.h | 4 |
5 files changed, 181 insertions, 167 deletions
diff --git a/configure.ac b/configure.ac index 0fd473ad8..f7f2e6e49 100644 --- a/configure.ac +++ b/configure.ac @@ -626,7 +626,7 @@ XEXT_INC='-I$(top_srcdir)/Xext' XEXT_LIB='$(top_builddir)/Xext/libXext.la' XEXTXORG_LIB='$(top_builddir)/Xext/libXextbuiltin.la' -PIXMAN="[pixman >= 0.9.0]" +PIXMAN="[pixman >= 0.9.1]" dnl Core modules for most extensions, et al. REQUIRED_MODULES="[randrproto >= 1.2] renderproto [fixesproto >= 4.0] [damageproto >= 1.1] xcmiscproto xextproto [xproto >= 7.0.9] xtrans [scrnsaverproto >= 1.1] bigreqsproto resourceproto fontsproto [inputproto >= 1.4.2] [kbproto >= 1.0.3]" diff --git a/fb/fbpict.c b/fb/fbpict.c index 68c0e63ad..0a42f12d9 100644 --- a/fb/fbpict.c +++ b/fb/fbpict.c @@ -38,122 +38,6 @@ #include "fbpict.h" #include "fbmmx.h" -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); -} - -static pixman_image_t * -create_linear_gradient_image (PictGradient *gradient) -{ - PictLinearGradient *linear = (PictLinearGradient *)gradient; - 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; - - return pixman_image_create_linear_gradient ( - &p1, &p2, (pixman_gradient_stop_t *)gradient->stops, gradient->nstops); -} - -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, - Bool has_clip) -{ - 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 (image, - (pixman_read_memory_func_t)wfbReadMemory, - (pixman_write_memory_func_t)wfbWriteMemory); - -#else - -#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 - */ - if (has_clip) - pixman_image_set_clip_region (image, pict->pCompositeClip); - - /* Indexed table */ - if (pict->pFormat->index.devPrivate) - pixman_image_set_indexed (image, pict->pFormat->index.devPrivate); - - fbFinishAccess (pict->pDrawable); - - return image; -} - #define mod(a,b) ((b) == 1 ? 0 : (a) >= 0 ? (a) % (b) : (b) - (-a) % (b)) void @@ -274,7 +158,6 @@ fbComposite (CARD8 op, CARD16 width, CARD16 height) { - pixman_region16_t region; pixman_image_t *src, *mask, *dest; xDst += pDst->pDrawable->x; @@ -290,10 +173,10 @@ fbComposite (CARD8 op, yMask += pMask->pDrawable->y; } - if (!miComputeCompositeRegion (®ion, pSrc, pMask, pDst, xSrc, ySrc, - xMask, yMask, xDst, yDst, width, height)) - return; - + miCompositeSourceValidate (pSrc, xSrc, ySrc, width, height); + if (pMask) + miCompositeSourceValidate (pMask, xMask, yMask, width, height); + src = image_from_pict (pSrc, TRUE); mask = image_from_pict (pMask, TRUE); dest = image_from_pict (pDst, TRUE); @@ -302,11 +185,10 @@ fbComposite (CARD8 op, { pixman_image_composite (op, src, mask, dest, xSrc, ySrc, xMask, yMask, xDst, yDst, - width, height, ®ion); + width, height); + } - pixman_region_fini (®ion); - if (src) pixman_image_unref (src); if (mask) @@ -336,27 +218,125 @@ fbCompositeGeneral (CARD8 op, #endif /* RENDER */ -Bool -fbPictureInit (ScreenPtr pScreen, PictFormatPtr formats, int nformats) +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); +} -#ifdef RENDER +static pixman_image_t * +create_linear_gradient_image (PictGradient *gradient) +{ + PictLinearGradient *linear = (PictLinearGradient *)gradient; + 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; + + return pixman_image_create_linear_gradient ( + &p1, &p2, (pixman_gradient_stop_t *)gradient->stops, gradient->nstops); +} - PictureScreenPtr ps; +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); +} - if (!miPictureInit (pScreen, formats, nformats)) - return FALSE; - ps = GetPictureScreen(pScreen); - ps->Composite = fbComposite; - ps->Glyphs = miGlyphs; - ps->CompositeRects = miCompositeRects; - ps->RasterizeTrapezoid = fbRasterizeTrapezoid; - ps->AddTraps = fbAddTraps; - ps->AddTriangles = fbAddTriangles; +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); +} -#endif /* RENDER */ +static pixman_image_t * +create_bits_picture (PicturePtr pict, + Bool has_clip) +{ + 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 (image, + (pixman_read_memory_func_t)wfbReadMemory, + (pixman_write_memory_func_t)wfbWriteMemory); + +#else + +#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 + */ + if (has_clip) + { + if (pict->clientClipType != CT_NONE) + pixman_image_set_has_client_clip (image, TRUE); + + pixman_image_set_clip_region (image, pict->pCompositeClip); + } + + /* Indexed table */ + if (pict->pFormat->index.devPrivate) + pixman_image_set_indexed (image, pict->pFormat->index.devPrivate); + + fbFinishAccess (pict->pDrawable); - return TRUE; + return image; } static void @@ -428,7 +408,7 @@ set_image_properties (pixman_image_t *image, PicturePtr pict) pixman_image_t * image_from_pict (PicturePtr pict, - Bool has_clip) + Bool has_clip) { pixman_image_t *image = NULL; @@ -466,8 +446,28 @@ image_from_pict (PicturePtr pict, return image; } +Bool +fbPictureInit (ScreenPtr pScreen, PictFormatPtr formats, int nformats) +{ +#ifdef RENDER + PictureScreenPtr ps; + + if (!miPictureInit (pScreen, formats, nformats)) + return FALSE; + ps = GetPictureScreen(pScreen); + ps->Composite = fbComposite; + ps->Glyphs = miGlyphs; + ps->CompositeRects = miCompositeRects; + ps->RasterizeTrapezoid = fbRasterizeTrapezoid; + ps->AddTraps = fbAddTraps; + ps->AddTriangles = fbAddTriangles; + +#endif /* RENDER */ + + return TRUE; +} #ifdef USE_MMX /* The CPU detection code needs to be in a file not compiled with diff --git a/render/mipict.c b/render/mipict.c index dff7f5e59..87dccbbda 100644 --- a/render/mipict.c +++ b/render/mipict.c @@ -266,19 +266,19 @@ miChangePictureFilter (PicturePtr pPicture, #define BOUND(v) (INT16) ((v) < MINSHORT ? MINSHORT : (v) > MAXSHORT ? MAXSHORT : (v)) -static __inline Bool -miClipPictureReg (RegionPtr pRegion, - RegionPtr pClip, +static inline pixman_bool_t +miClipPictureReg (pixman_region16_t * pRegion, + pixman_region16_t * pClip, int dx, int dy) { - if (REGION_NUM_RECTS(pRegion) == 1 && - REGION_NUM_RECTS(pClip) == 1) + if (pixman_region_n_rects(pRegion) == 1 && + pixman_region_n_rects(pClip) == 1) { - BoxPtr pRbox = REGION_RECTS(pRegion); - BoxPtr pCbox = REGION_RECTS(pClip); + pixman_box16_t * pRbox = pixman_region_rectangles(pRegion, NULL); + pixman_box16_t * pCbox = pixman_region_rectangles(pClip, NULL); int v; - + if (pRbox->x1 < (v = pCbox->x1 + dx)) pRbox->x1 = BOUND(v); if (pRbox->x2 > (v = pCbox->x2 + dx)) @@ -290,23 +290,23 @@ miClipPictureReg (RegionPtr pRegion, if (pRbox->x1 >= pRbox->x2 || pRbox->y1 >= pRbox->y2) { - REGION_EMPTY(pScreen, pRegion); + pixman_region_init (pRegion); } } - else if (!REGION_NOTEMPTY (pScreen, pClip)) + else if (!pixman_region_not_empty (pClip)) return FALSE; else { if (dx || dy) - REGION_TRANSLATE(pScreen, pRegion, -dx, -dy); - if (!REGION_INTERSECT (pScreen, pRegion, pRegion, pClip)) + pixman_region_translate (pRegion, -dx, -dy); + if (!pixman_region_intersect (pRegion, pRegion, pClip)) return FALSE; if (dx || dy) - REGION_TRANSLATE(pScreen, pRegion, dx, dy); + pixman_region_translate(pRegion, dx, dy); } - return REGION_NOTEMPTY(pScreen, pRegion); + return pixman_region_not_empty(pRegion); } - + static __inline Bool miClipPictureSrc (RegionPtr pRegion, PicturePtr pPicture, @@ -320,13 +320,13 @@ miClipPictureSrc (RegionPtr pRegion, { if (pPicture->clientClipType != CT_NONE) { - REGION_TRANSLATE(pScreen, pRegion, + pixman_region_translate ( pRegion, dx - pPicture->clipOrigin.x, dy - pPicture->clipOrigin.y); if (!REGION_INTERSECT (pScreen, pRegion, pRegion, - (RegionPtr) pPicture->clientClip)) + (RegionPtr) pPicture->pCompositeClip)) // clientClip)) return FALSE; - REGION_TRANSLATE(pScreen, pRegion, + pixman_region_translate ( pRegion, - (dx - pPicture->clipOrigin.x), - (dy - pPicture->clipOrigin.y)); } @@ -341,7 +341,7 @@ miClipPictureSrc (RegionPtr pRegion, } } -static void +void miCompositeSourceValidate (PicturePtr pPicture, INT16 x, INT16 y, @@ -417,6 +417,7 @@ miComputeCompositeRegion (RegionPtr pRegion, CARD16 width, CARD16 height) { + int v; pRegion->extents.x1 = xDst; @@ -430,13 +431,13 @@ miComputeCompositeRegion (RegionPtr pRegion, if (pRegion->extents.x1 >= pRegion->extents.x2 || pRegion->extents.y1 >= pRegion->extents.y2) { - REGION_EMPTY (pDst->pDrawable->pScreen, pRegion); + pixman_region_init (pRegion); return FALSE; } /* clip against dst */ if (!miClipPictureReg (pRegion, pDst->pCompositeClip, 0, 0)) { - REGION_UNINIT (pScreen, pRegion); + pixman_region_fini (pRegion); return FALSE; } if (pDst->alphaMap) @@ -445,14 +446,14 @@ miComputeCompositeRegion (RegionPtr pRegion, -pDst->alphaOrigin.x, -pDst->alphaOrigin.y)) { - REGION_UNINIT (pScreen, pRegion); + pixman_region_fini (pRegion); return FALSE; } } /* clip against src */ if (!miClipPictureSrc (pRegion, pSrc, xDst - xSrc, yDst - ySrc)) { - REGION_UNINIT (pScreen, pRegion); + pixman_region_fini (pRegion); return FALSE; } if (pSrc->alphaMap) @@ -461,7 +462,7 @@ miComputeCompositeRegion (RegionPtr pRegion, xDst - (xSrc + pSrc->alphaOrigin.x), yDst - (ySrc + pSrc->alphaOrigin.y))) { - REGION_UNINIT (pScreen, pRegion); + pixman_region_fini (pRegion); return FALSE; } } @@ -470,7 +471,7 @@ miComputeCompositeRegion (RegionPtr pRegion, { if (!miClipPictureSrc (pRegion, pMask, xDst - xMask, yDst - yMask)) { - REGION_UNINIT (pScreen, pRegion); + pixman_region_fini (pRegion); return FALSE; } if (pMask->alphaMap) @@ -479,14 +480,17 @@ miComputeCompositeRegion (RegionPtr pRegion, xDst - (xMask + pMask->alphaOrigin.x), yDst - (yMask + pMask->alphaOrigin.y))) { - REGION_UNINIT (pScreen, pRegion); + pixman_region_fini (pRegion); return FALSE; } } } + + miCompositeSourceValidate (pSrc, xSrc, ySrc, width, height); if (pMask) miCompositeSourceValidate (pMask, xMask, yMask, width, height); + return TRUE; } diff --git a/render/mipict.h b/render/mipict.h index eef155f7d..bd7c23f4b 100644 --- a/render/mipict.h +++ b/render/mipict.h @@ -88,6 +88,12 @@ miClipPicture (RegionPtr pRegion, INT16 xPict, INT16 yPict); +void +miCompositeSourceValidate (PicturePtr pPicture, + INT16 x, + INT16 y, + CARD16 width, + CARD16 height); Bool miComputeCompositeRegion (RegionPtr pRegion, PicturePtr pSrc, diff --git a/render/picturestr.h b/render/picturestr.h index 9c41fc1f2..06530e260 100644 --- a/render/picturestr.h +++ b/render/picturestr.h @@ -661,6 +661,10 @@ AddTraps (PicturePtr pPicture, int ntraps, xTrap *traps); +pixman_image_t * +PixmanImageFromPicture (PicturePtr pPict, + Bool hasClip); + PicturePtr CreateSolidPicture (Picture pid, xRenderColor *color, |