From: Michel Dänzer <[email protected]> We know the mask covers the glyph extents.
Signed-off-by: Michel Dänzer <[email protected]> --- exa/exa_render.c | 74 ++++++++++++++++++++++++++++++----------------------- 1 files changed, 42 insertions(+), 32 deletions(-) diff --git a/exa/exa_render.c b/exa/exa_render.c index 6f2af8a..535f908 100644 --- a/exa/exa_render.c +++ b/exa/exa_render.c @@ -442,7 +442,7 @@ exaTryDriverCompositeRects(CARD8 op, pMaskPix, pDstPix)) return -1; - while (nrect--) + for (; nrect--; rects++) { INT16 xDst = rects->xDst + pDst->pDrawable->x; INT16 yDst = rects->yDst + pDst->pDrawable->y; @@ -464,39 +464,49 @@ exaTryDriverCompositeRects(CARD8 op, ySrc += pSrc->pDrawable->y; } - if (!miComputeCompositeRegion (®ion, pSrc, pMask, pDst, - xSrc, ySrc, xMask, yMask, xDst, yDst, - rects->width, rects->height)) - goto next_rect; + if (pMask) { + if (!miComputeCompositeRegion (®ion, pSrc, pMask, pDst, + xSrc, ySrc, xMask, yMask, xDst, yDst, + rects->width, rects->height)) + continue; - RegionTranslate(®ion, dst_off_x, dst_off_y); + RegionTranslate(®ion, dst_off_x, dst_off_y); - nbox = RegionNumRects(®ion); - pbox = RegionRects(®ion); + nbox = RegionNumRects(®ion); + pbox = RegionRects(®ion); - xMask = xMask + mask_off_x - xDst - dst_off_x; - yMask = yMask + mask_off_y - yDst - dst_off_y; - xSrc = xSrc + src_off_x - xDst - dst_off_x; - ySrc = ySrc + src_off_y - yDst - dst_off_y; + xMask = xMask + mask_off_x - xDst - dst_off_x; + yMask = yMask + mask_off_y - yDst - dst_off_y; - while (nbox--) - { - (*pExaScr->info->Composite) (pDstPix, - pbox->x1 + xSrc, - pbox->y1 + ySrc, - pbox->x1 + xMask, - pbox->y1 + yMask, - pbox->x1, - pbox->y1, - pbox->x2 - pbox->x1, - pbox->y2 - pbox->y1); - pbox++; - } + xSrc = xSrc + src_off_x - xDst - dst_off_x; + ySrc = ySrc + src_off_y - yDst - dst_off_y; - next_rect: - RegionUninit(®ion); + while (nbox--) + { + (*pExaScr->info->Composite) (pDstPix, + pbox->x1 + xSrc, + pbox->y1 + ySrc, + pbox->x1 + xMask, + pbox->y1 + yMask, + pbox->x1, + pbox->y1, + pbox->x2 - pbox->x1, + pbox->y2 - pbox->y1); + pbox++; + } - rects++; + RegionUninit(®ion); + } else { + (*pExaScr->info->Composite) (pDstPix, + xSrc + src_off_x, + ySrc + src_off_y, + xMask, + yMask, + xDst + dst_off_x, + yDst + dst_off_y, + rects->width, + rects->height); + } } (*pExaScr->info->DoneComposite) (pDstPix); -- 1.7.5.1 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
