From c6cb70be1ed7cf73bd3411b8d66ec05a9efcfeb9 Mon Sep 17 00:00:00 2001 From: Søren Sandmann Pedersen Date: Mon, 28 Mar 2011 13:30:52 -0400 Subject: Fix trapezoid and triangle rendering to windows For fbAdd{Traps,Triangles}() and fbRasterizeTrapezoid() this is just a matter of adding the image offsets to the trap offsets. For fbShapes, the story is more complicated: The recently added pixman API did not allow offsetting trapezoids. Instead, it would use x_dst and y_dst in such a way that the effect was to only offset the source image. In pixman 0.21.8, this API has changed such that all the traps are conceptually rendered to an infinitely big image, and the source and destination coordinates are then aligned with (0, 0) of that image. This means offsetting dst_x and dst_y will now offset the entire drawing, which is similar to how other composite functions work. This patch then changes fbComposite{Triangles,Traps} such that the source image is aligned with the shapes, and the destination coordinates offset according to drawable->{x, y}. Reviewed-by: Keith Packard Signed-off-by: Soren Sandmann --- fb/fbtrap.c | 56 +++++++++++++++++++++++++++----------------------------- 1 file changed, 27 insertions(+), 29 deletions(-) (limited to 'fb') diff --git a/fb/fbtrap.c b/fb/fbtrap.c index b5c5a61eb..0b5a6382e 100644 --- a/fb/fbtrap.c +++ b/fb/fbtrap.c @@ -38,13 +38,14 @@ fbAddTraps (PicturePtr pPicture, int ntrap, xTrap *traps) { - int image_xoff, image_yoff; - pixman_image_t *image = image_from_pict (pPicture, FALSE, &image_xoff, &image_yoff); + pixman_image_t *image; + int dst_xoff, dst_yoff; - if (!image) + if (!(image = image_from_pict (pPicture, FALSE, &dst_xoff, &dst_yoff))) return; - pixman_add_traps (image, x_off, y_off, ntrap, (pixman_trap_t *)traps); + pixman_add_traps (image, x_off + dst_xoff, y_off + dst_yoff, + ntrap, (pixman_trap_t *)traps); free_pixman_pict (pPicture, image); } @@ -55,13 +56,15 @@ fbRasterizeTrapezoid (PicturePtr pPicture, int x_off, int y_off) { - int mask_xoff, mask_yoff; - pixman_image_t *image = image_from_pict (pPicture, FALSE, &mask_xoff, &mask_yoff); + pixman_image_t *image; + int dst_xoff, dst_yoff; - if (!image) + if (!(image = image_from_pict (pPicture, FALSE, &dst_xoff, &dst_yoff))) return; - pixman_rasterize_trapezoid (image, (pixman_trapezoid_t *)trap, x_off, y_off); + pixman_rasterize_trapezoid (image, (pixman_trapezoid_t *)trap, + x_off + dst_xoff, + y_off + dst_yoff); free_pixman_pict (pPicture, image); } @@ -73,14 +76,15 @@ fbAddTriangles (PicturePtr pPicture, int ntri, xTriangle *tris) { - int image_xoff, image_yoff; - pixman_image_t *image = - image_from_pict (pPicture, FALSE, &image_xoff, &image_yoff); + pixman_image_t *image; + int dst_xoff, dst_yoff; - if (!image) + if (!(image = image_from_pict (pPicture, FALSE, &dst_xoff, &dst_yoff))) return; - pixman_add_triangles (image, x_off, y_off, ntri, (pixman_triangle_t *)tris); + pixman_add_triangles (image, + dst_xoff + x_off, dst_yoff + y_off, + ntri, (pixman_triangle_t *)tris); free_pixman_pict (pPicture, image); } @@ -101,8 +105,6 @@ fbShapes (CompositeShapesFunc composite, PictFormatPtr maskFormat, int16_t xSrc, int16_t ySrc, - int16_t xDst, - int16_t yDst, int nshapes, int shape_size, const uint8_t * shapes) @@ -136,8 +138,8 @@ fbShapes (CompositeShapesFunc composite, composite (op, src, dst, format, xSrc + src_xoff, ySrc + src_yoff, - xDst + dst_xoff, - yDst + dst_yoff, + dst_xoff, + dst_yoff, 1, shapes + i * shape_size); } } @@ -162,8 +164,8 @@ fbShapes (CompositeShapesFunc composite, composite (op, src, dst, format, xSrc + src_xoff, ySrc + src_yoff, - xDst + dst_xoff, - yDst + dst_yoff, + dst_xoff, + dst_yoff, nshapes, shapes); } @@ -184,14 +186,12 @@ fbTrapezoids (CARD8 op, int ntrap, xTrapezoid *traps) { - int xDst, yDst; - - xDst = traps[0].left.p1.x >> 16; - yDst = traps[0].left.p1.y >> 16; + xSrc -= (traps[0].left.p1.x >> 16); + ySrc -= (traps[0].left.p1.y >> 16); fbShapes ((CompositeShapesFunc)pixman_composite_trapezoids, op, pSrc, pDst, maskFormat, - xSrc, ySrc, xDst, yDst, + xSrc, ySrc, ntrap, sizeof (xTrapezoid), (const uint8_t *)traps); } @@ -205,13 +205,11 @@ fbTriangles (CARD8 op, int ntris, xTriangle *tris) { - int xDst, yDst; - - xDst = tris[0].p1.x >> 16; - yDst = tris[0].p1.y >> 16; + xSrc -= (tris[0].p1.x >> 16); + ySrc -= (tris[0].p1.y >> 16); fbShapes ((CompositeShapesFunc)pixman_composite_triangles, op, pSrc, pDst, maskFormat, - xSrc, ySrc, xDst, yDst, + xSrc, ySrc, ntris, sizeof (xTriangle), (const uint8_t *)tris); } -- cgit v1.2.3