From 154b717f261a37af95f09e6645db0ceeb6b22d6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Sandmann=20Pedersen?= Date: Wed, 28 Oct 2009 02:54:03 -0400 Subject: [PATCH] fix Render with window sources --- fb/fbpict.c | 74 +++++++++++++++++++++++++--------------------------------- 1 files changed, 32 insertions(+), 42 deletions(-) diff --git a/fb/fbpict.c b/fb/fbpict.c index 2fbef15..08bb537 100644 --- a/fb/fbpict.c +++ b/fb/fbpict.c @@ -268,54 +268,41 @@ create_conical_gradient_image (PictGradient *gradient) gradient->nstops); } -static DrawablePtr -copy_drawable (DrawablePtr pDraw) +static pixman_image_t * +image_from_window (pixman_format_code_t format, DrawablePtr pDraw) { ScreenPtr pScreen = pDraw->pScreen; - PixmapPtr pPixmap; - GCPtr pGC; + pixman_image_t *image; int width, height; - ChangeGCVal gcv[2]; - + uint32_t *bits; + 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); + image = pixman_image_create_bits (format, width, height, NULL, -1); + + if (!image) 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); + bits = pixman_image_get_data (image); - FreeScratchGC (pGC); - - return &pPixmap->drawable; + (*pScreen->GetImage) (pDraw, + 0, 0, width, height, ZPixmap, + ~0L, + (pointer) bits); + + return image; } static void destroy_drawable (pixman_image_t *image, void *data) { DrawablePtr pDrawable = data; - ScreenPtr pScreen = pDrawable->pScreen; - pScreen->DestroyPixmap ((PixmapPtr)pDrawable); + if (!pDrawable) + return; + + pDrawable->pScreen->DestroyPixmap ((PixmapPtr)pDrawable); } static pixman_image_t * @@ -330,20 +317,23 @@ create_bits_picture (PicturePtr pict, DrawablePtr drawable; if (is_src && pict->pDrawable->type == DRAWABLE_WINDOW) - drawable = copy_drawable (pict->pDrawable); + { + image = image_from_window (pict->format, pict->pDrawable); + } else + { drawable = pict->pDrawable; - - fbGetDrawable (drawable, bits, stride, bpp, xoff, yoff); - bits = (FbBits*)((CARD8*)bits + - (drawable->y + yoff) * stride * sizeof(FbBits) + - (drawable->x + xoff) * (bpp / 8)); + fbGetDrawable (drawable, bits, stride, bpp, xoff, yoff); - image = pixman_image_create_bits ( - pict->format, drawable->width, drawable->height, - (uint32_t *)bits, stride * sizeof (FbStride)); - + bits = (FbBits*)((CARD8*)bits + + (drawable->y + yoff) * stride * sizeof(FbBits) + + (drawable->x + xoff) * (bpp / 8)); + + image = pixman_image_create_bits ( + pict->format, drawable->width, drawable->height, + (uint32_t *)bits, stride * sizeof (FbStride)); + } #ifdef FB_ACCESS_WRAPPER #if FB_SHIFT==5 -- 1.6.4.4