summaryrefslogtreecommitdiff
path: root/fb/fbpict.c
diff options
context:
space:
mode:
authorAaron Plattner <aplattner@nvidia.com>2009-11-24 10:21:28 -0800
committerPeter Hutterer <peter.hutterer@who-t.net>2009-11-26 15:41:46 +1000
commit196aff9b18381d700fb28027186cce6e68ad587c (patch)
tree27c6589851a81279cfa40ccd59a5d058b46a9754 /fb/fbpict.c
parent8eca8eaef56526b9649b48aa5f83c3d7914cfdc4 (diff)
Bug #25136: Revert "Fix clipping when windows are used as sources"
That change causes lib(w)fb to make accelerated driver calls after the driver has entered a software fallback. Most drivers don't expect this, which leads to corruption or crashes. A change to make this code do the copy in software is unacceptably slow. This reverts commit e9aa61e9f0d663d5b34a397b943b4d1df44e873d. Conflicts: configure.ac fb/fbpict.c Signed-off-by: Aaron Plattner <aplattner@nvidia.com> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Diffstat (limited to 'fb/fbpict.c')
-rw-r--r--fb/fbpict.c118
1 files changed, 20 insertions, 98 deletions
diff --git a/fb/fbpict.c b/fb/fbpict.c
index 2fbef15c3..8057e900a 100644
--- a/fb/fbpict.c
+++ b/fb/fbpict.c
@@ -163,9 +163,9 @@ fbComposite (CARD8 op,
if (pMask)
miCompositeSourceValidate (pMask, xMask, yMask, width, height);
- src = image_from_pict (pSrc, TRUE, TRUE);
- mask = image_from_pict (pMask, TRUE, TRUE);
- dest = image_from_pict (pDst, TRUE, FALSE);
+ src = image_from_pict (pSrc, TRUE);
+ mask = image_from_pict (pMask, TRUE);
+ dest = image_from_pict (pDst, TRUE);
if (src && dest && !(pMask && !mask))
{
@@ -268,80 +268,24 @@ create_conical_gradient_image (PictGradient *gradient)
gradient->nstops);
}
-static DrawablePtr
-copy_drawable (DrawablePtr pDraw)
-{
- ScreenPtr pScreen = pDraw->pScreen;
- PixmapPtr pPixmap;
- GCPtr pGC;
- int width, height;
- ChangeGCVal gcv[2];
-
- width = pDraw->width;
- height = pDraw->height;
-
- pPixmap = (*pScreen->CreatePixmap) (pScreen, width, height, pDraw->depth, 0);
-
- if (!pPixmap)
- return NULL;
-
- pGC = GetScratchGC (pDraw->depth, pScreen);
-
- if (!pGC)
- {
- (*pScreen->DestroyPixmap) (pPixmap);
- return NULL;
- }
-
- /* First fill the pixmap with zeros */
- gcv[0].val = 0x00000000;
- gcv[1].val = IncludeInferiors;
- dixChangeGC (NullClient, pGC, GCBackground | GCSubwindowMode, NULL, gcv);
- ValidateGC ((DrawablePtr)pPixmap, pGC);
- miClearDrawable ((DrawablePtr)pPixmap, pGC);
-
- /* Then copy the window there */
- ValidateGC(&pPixmap->drawable, pGC);
- (* pGC->ops->CopyArea) (pDraw, &pPixmap->drawable, pGC, 0, 0, width, height, 0, 0);
-
- FreeScratchGC (pGC);
-
- return &pPixmap->drawable;
-}
-
-static void
-destroy_drawable (pixman_image_t *image, void *data)
-{
- DrawablePtr pDrawable = data;
- ScreenPtr pScreen = pDrawable->pScreen;
-
- pScreen->DestroyPixmap ((PixmapPtr)pDrawable);
-}
-
static pixman_image_t *
create_bits_picture (PicturePtr pict,
- Bool has_clip,
- Bool is_src)
+ Bool has_clip)
{
FbBits *bits;
FbStride stride;
int bpp, xoff, yoff;
pixman_image_t *image;
- DrawablePtr drawable;
-
- if (is_src && pict->pDrawable->type == DRAWABLE_WINDOW)
- drawable = copy_drawable (pict->pDrawable);
- else
- drawable = pict->pDrawable;
- fbGetDrawable (drawable, bits, stride, bpp, xoff, yoff);
+ fbGetDrawable (pict->pDrawable, bits, stride, bpp, xoff, yoff);
bits = (FbBits*)((CARD8*)bits +
- (drawable->y + yoff) * stride * sizeof(FbBits) +
- (drawable->x + xoff) * (bpp / 8));
+ (pict->pDrawable->y + yoff) * stride * sizeof(FbBits) +
+ (pict->pDrawable->x + xoff) * (bpp / 8));
image = pixman_image_create_bits (
- pict->format, drawable->width, drawable->height,
+ pict->format,
+ pict->pDrawable->width, pict->pDrawable->height,
(uint32_t *)bits, stride * sizeof (FbStride));
@@ -359,46 +303,25 @@ create_bits_picture (PicturePtr pict,
#endif
#endif
+ /* pCompositeClip is undefined for source pictures, so
+ * only set the clip region for pictures with drawables
+ */
if (has_clip)
{
- if (is_src)
- {
- if (pict->clientClipType != CT_NONE)
- {
- pixman_image_set_has_client_clip (image, TRUE);
+ if (pict->clientClipType != CT_NONE)
+ pixman_image_set_has_client_clip (image, TRUE);
- pixman_region_translate (pict->clientClip,
- pict->clipOrigin.x,
- pict->clipOrigin.y);
-
- pixman_image_set_clip_region (image, pict->clientClip);
+ pixman_region_translate (pict->pCompositeClip, - pict->pDrawable->x, - pict->pDrawable->y);
- pixman_region_translate (pict->clientClip,
- - pict->clipOrigin.x,
- - pict->clipOrigin.y);
- }
- }
- else
- {
- pixman_region_translate (pict->pCompositeClip,
- - pict->pDrawable->x,
- - pict->pDrawable->y);
+ pixman_image_set_clip_region (image, pict->pCompositeClip);
- pixman_image_set_clip_region (image, pict->pCompositeClip);
-
- pixman_region_translate (pict->pCompositeClip,
- pict->pDrawable->x,
- pict->pDrawable->y);
- }
+ pixman_region_translate (pict->pCompositeClip, pict->pDrawable->x, pict->pDrawable->y);
}
/* Indexed table */
if (pict->pFormat->index.devPrivate)
pixman_image_set_indexed (image, pict->pFormat->index.devPrivate);
- if (drawable != pict->pDrawable)
- pixman_image_set_destroy_function (image, destroy_drawable, drawable);
-
return image;
}
@@ -438,7 +361,7 @@ set_image_properties (pixman_image_t *image, PicturePtr pict)
if (pict->alphaMap)
{
- pixman_image_t *alpha_map = image_from_pict (pict->alphaMap, TRUE, TRUE);
+ pixman_image_t *alpha_map = image_from_pict (pict->alphaMap, TRUE);
pixman_image_set_alpha_map (
image, alpha_map, pict->alphaOrigin.x, pict->alphaOrigin.y);
@@ -472,8 +395,7 @@ set_image_properties (pixman_image_t *image, PicturePtr pict)
pixman_image_t *
image_from_pict (PicturePtr pict,
- Bool has_clip,
- Bool is_src)
+ Bool has_clip)
{
pixman_image_t *image = NULL;
@@ -482,7 +404,7 @@ image_from_pict (PicturePtr pict,
if (pict->pDrawable)
{
- image = create_bits_picture (pict, has_clip, is_src);
+ image = create_bits_picture (pict, has_clip);
}
else if (pict->pSourcePict)
{