[PATCH] Fix trapezoid and triangle rendering to windows

Søren Sandmann Pedersen sandmann at cs.au.dk
Tue Apr 5 10:53:54 PDT 2011


From: Søren Sandmann Pedersen <ssp at redhat.com>

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.

A companion patch to this one changes pixman_composite_trapezoids()
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}.

Signed-off-by: Soren Sandmann <ssp at redhat.com>
---
 configure.ac |    2 +-
 fb/fbtrap.c  |   58 ++++++++++++++++++++++++++++------------------------------
 2 files changed, 29 insertions(+), 31 deletions(-)

diff --git a/configure.ac b/configure.ac
index 9e04ff0..02b3858 100644
--- a/configure.ac
+++ b/configure.ac
@@ -795,7 +795,7 @@ LIBGLIB="glib-2.0 >= 2.16"
 LIBUDEV="libudev >= 143"
 LIBSELINUX="libselinux >= 2.0.86"
 LIBDBUS="dbus-1 >= 1.0"
-LIBPIXMAN="pixman-1 >= 0.21.6"
+LIBPIXMAN="pixman-1 >= 0.21.7"
 
 dnl Pixman is always required, but we separate it out so we can link
 dnl specific modules against it
diff --git a/fb/fbtrap.c b/fb/fbtrap.c
index b5c5a61..e004f75 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)
@@ -115,7 +117,7 @@ fbShapes (CompositeShapesFunc	composite,
 
     src = image_from_pict (pSrc, FALSE, &src_xoff, &src_yoff);
     dst = image_from_pict (pDst, TRUE, &dst_xoff, &dst_yoff);
-
+    
     if (src && dst)
     {
 	pixman_format_code_t format;
@@ -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);
 }
-- 
1.7.4



More information about the xorg-devel mailing list