diff options
Diffstat (limited to 'saa')
-rw-r--r-- | saa/saa.h | 2 | ||||
-rw-r--r-- | saa/saa_render.c | 38 |
2 files changed, 20 insertions, 20 deletions
@@ -74,6 +74,8 @@ struct saa_pixmap { void *addr; void *override; enum saa_pixmap_loc auth_loc; + PictFormatShort src_format; + PictFormatShort dst_format; uint32_t pad[16]; }; diff --git a/saa/saa_render.c b/saa/saa_render.c index 3c441da..c69f2c9 100644 --- a/saa/saa_render.c +++ b/saa/saa_render.c @@ -311,35 +311,29 @@ saa_copy_composite(CARD8 op, ySrc + height > pSrc->pDrawable->height) return FALSE; - if (saa_pixmap(saa_get_drawable_pixmap(pSrc->pDrawable))->auth_loc != - saa_loc_driver) - return FALSE; + if (op == PictOpSrc || + (op == PictOpOver && PICT_FORMAT_A(pSrc->format) == 0 && + pMask == NULL)) { - if ((op == PictOpSrc && - (pSrc->format == pDst->format || - (PICT_FORMAT_COLOR(pDst->format) && - PICT_FORMAT_COLOR(pSrc->format) && - pDst->format == PICT_FORMAT(PICT_FORMAT_BPP(pSrc->format), - PICT_FORMAT_TYPE(pSrc->format), - 0, - PICT_FORMAT_R(pSrc->format), - PICT_FORMAT_G(pSrc->format), - PICT_FORMAT_B(pSrc->format))))) || - (op == PictOpOver && pSrc->format == pDst->format && - !PICT_FORMAT_A(pSrc->format))) { - Bool ret; int xoff, yoff; - PixmapPtr pixmap = saa_get_pixmap(pDst->pDrawable, &xoff, &yoff); - - if (saa_pixmap(pixmap)->auth_loc != saa_loc_driver) + PixmapPtr dst_pix = saa_get_pixmap(pDst->pDrawable, &xoff, &yoff); + struct saa_pixmap *dst_spix = saa_pixmap(dst_pix); + struct saa_pixmap *src_spix = + saa_pixmap(saa_get_drawable_pixmap(pSrc->pDrawable)); + int ret; + + if (src_spix->auth_loc != saa_loc_driver || + dst_spix->auth_loc != saa_loc_driver) return FALSE; + src_spix->src_format = pSrc->format; + dst_spix->dst_format = pDst->format; + xDst += pDst->pDrawable->x; yDst += pDst->pDrawable->y; xSrc += pSrc->pDrawable->x; ySrc += pSrc->pDrawable->y; - /* * Dst region is in backing pixmap space. We need to * translate it. @@ -350,6 +344,10 @@ saa_copy_composite(CARD8 op, REGION_NUM_RECTS(dst_region), xSrc - xDst, ySrc - yDst, FALSE, FALSE); REGION_TRANSLATE(pScreen, dst_region, xoff, yoff); + + src_spix->src_format = 0; + dst_spix->dst_format = 0; + if (ret) return TRUE; } |