[Commit] Xr/src xrmatrix.c,NONE,1.1 Makefile.am,1.4,1.5 Xr.h,1.24,1.25 xr.c,1.22,1.23 xrfont.c,1.5,1.6 xrgstate.c,1.32,1.33 xrint.h,1.38,1.39 xrpathstroke.c,1.1,1.2 xrpen.c,1.19,1.20 xrsurface.c,1.14,1.15 xrtransform.c,1.12,NONE

Carl Worth commit@keithp.com
Wed, 14 May 2003 18:31:00 -0700


Committed by: cworth

Update of /local/src/CVS/Xr/src
In directory home.keithp.com:/tmp/cvs-serv9230/src

Modified Files:
	Makefile.am Xr.h xr.c xrfont.c xrgstate.c xrint.h 
	xrpathstroke.c xrpen.c xrsurface.c 
Added Files:
	xrmatrix.c 
Removed Files:
	xrtransform.c 
Log Message:
Added toplevel functions for setting surface matrix, filter.
Introduced new XrMatrix object.
Fixed to properly hint scaled fonts.

--- NEW FILE: xrmatrix.c ---
(This appears to be a binary file; contents omitted.)

Index: Makefile.am
===================================================================
RCS file: /local/src/CVS/Xr/src/Makefile.am,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- Makefile.am	12 May 2003 16:24:17 -0000	1.4
+++ Makefile.am	15 May 2003 01:30:57 -0000	1.5
@@ -8,6 +8,7 @@
 	xrcolor.c \
 	xrfont.c \
 	xrgstate.c \
+	xrmatrix.c \
 	xrmisc.c \
 	xrpath.c \
 	xrpathbounds.c \
@@ -18,11 +19,10 @@
 	xrspline.c \
 	xrstate.c \
 	xrsurface.c \
-	xrtransform.c \
 	xrtraps.c
 
 libXr_la_LDFLAGS = -version-info @VERSION_INFO@
 
 INCLUDES = $(XR_CFLAGS) $(X_CFLAGS)
 
-libXr_la_LIBADD = $(XR_LIBS)
+libXr_la_LIBADD = $(XR_LIBS) -lm

Index: Xr.h
===================================================================
RCS file: /local/src/CVS/Xr/src/Xr.h,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -d -r1.24 -r1.25
--- Xr.h	12 May 2003 16:46:57 -0000	1.24
+++ Xr.h	15 May 2003 01:30:57 -0000	1.25
@@ -30,6 +30,7 @@
 
 typedef struct _XrState XrState;
 typedef struct _XrSurface XrSurface;
+typedef struct _XrMatrix XrMatrix;
 
 _XFUNCPROTOBEGIN
 
@@ -166,18 +167,11 @@
 
 void
 XrConcatMatrix(XrState *xrs,
-	       double a, double b,
-	       double c, double d,
-	       double tx, double ty);
-
-/* XXX: Probably want to expose an XrMatrix object here, with XrMatrixTransformPoint, etc.
-   That might make it easier to expand to projective transforms later */
+	       XrMatrix *matrix);
 
 void
 XrSetMatrix(XrState *xrs,
-	    double a, double b,
-	    double c, double d,
-	    double tx, double ty);
+	    XrMatrix *matrix);
 
 /* XXX: Postscript has both a defaultmatrix and an identmatrix. But
    there, they do different things. Here, where they perform the same
@@ -189,6 +183,18 @@
 void
 XrIdentityMatrix(XrState *xrs);
 
+void
+XrTransformPoint (XrState *xrs, double *x, double *y);
+
+void
+XrTransformDistance (XrState *xrs, double *dx, double *dy);
+
+void
+XrInverseTransformPoint (XrState *xrs, double *x, double *y);
+
+void
+XrInverseTransformDistance (XrState *xrs, double *dx, double *dy);
+
 /* Path creation functions */
 void
 XrNewPath(XrState *xrs);
@@ -218,6 +224,11 @@
 	     double dx3, double dy3);
 
 void
+XrRectangle (XrState *xrs,
+	     double x, double y,
+	     double width, double height);
+
+void
 XrClosePath(XrState *xrs);
 
 /* Painting functions */
@@ -232,12 +243,18 @@
 XrClip(XrState *xrs);
 
 /* Font/Text functions */
+
+/* XXX: The font support should probably expose an XrFont object with
+   several functions, (XrFontTransform, etc.) in a parallel manner as
+   XrMatrix and (eventually) XrColor */
 void
 XrSelectFont(XrState *xrs, const char *key);
 
 void
 XrScaleFont(XrState *xrs, double scale);
 
+/* XXX: Probably want to use an XrMatrix here, (to fix as part of the
+   big text support rewrite) */
 void
 XrTransformFont(XrState *xrs,
 		double a, double b,
@@ -255,38 +272,9 @@
 
 /* Image functions */
 
-/* XXX: Is "Show" the right term here? With operators such as
-   OutReverse we may not actually be showing any part of the
-   surface. */
-void
-XrShowImage(XrState		*xrs,
-	    char		*data,
-	    XrFormat		format,
-	    unsigned int	width,
-	    unsigned int	height,
-	    unsigned int	stride);
-
-void
-XrShowImageTransform(XrState		*xrs,
-		     char		*data,
-		     XrFormat		format,
-		     unsigned int	width,
-		     unsigned int	height,
-		     unsigned int	stride,
-		     double a, double b,
-		     double c, double d,
-		     double tx, double ty);
-
-/* XXX: The ShowImage/ShowSurface APIs definitely need some work. If
-   we want both then one should be a convenience function for the
-   other and the interfaces should be consistent in some sense. One
-   trick is to resolve the interaction with XrSurfaceSetTransform (if
-   it is to be exposed) */
 void
 XrShowSurface (XrState		*xrs,
 	       XrSurface	*surface,
-	       int		x,
-	       int		y,
 	       int		width,
 	       int		height);
 
@@ -393,11 +381,68 @@
 XrSurfaceSetClipRegion (XrSurface *surface, Region region);
 */
 
+/* XXX: Note: The current Render/Ic implementations don't do the right
+   thing with repeat when the surface has a non-identity matrix. */
 XrStatus
 XrSurfaceSetRepeat (XrSurface *surface, int repeat);
 
-/* XXX: Need some of the following to make pattern support useful:
-   XrSurfaceSetTransform, XrSurfaceSetMatrix, XrSurfaceScale, XrSurfaceTranslate */
+XrStatus
+XrSurfaceSetMatrix(XrSurface *surface, XrMatrix *matrix);
+
+XrStatus
+XrSurfaceGetMatrix (XrSurface *surface, XrMatrix *matrix);
+
+typedef enum {
+    XrFilterFast = XcFilterFast,
+    XrFilterGood = XcFilterGood,
+    XrFilterBest = XcFilterBest,
+    XrFilterNearest = XcFilterNearest,
+    XrFilterBilinear = XcFilterBilinear
+} XrFilter;
+
+XrStatus
+XrSurfaceSetFilter(XrSurface *surface, XrFilter filter);
+
+/* Matrix functions */
+
+XrMatrix *
+XrMatrixCreate (void);
+
+void
+XrMatrixDestroy (XrMatrix *matrix);
+
+XrStatus
+XrMatrixCopy(XrMatrix *matrix, const XrMatrix *other);
+
+XrStatus
+XrMatrixSetIdentity (XrMatrix *matrix);
+
+XrStatus
+XrMatrixSetAffine (XrMatrix *xrs,
+		   double a, double b,
+		   double c, double d,
+		   double tx, double ty);
+
+XrStatus
+XrMatrixTranslate (XrMatrix *matrix, double tx, double ty);
+
+XrStatus
+XrMatrixScale (XrMatrix *matrix, double sx, double sy);
+
+XrStatus
+XrMatrixRotate (XrMatrix *matrix, double radians);
+
+XrStatus
+XrMatrixInvert(XrMatrix *matrix);
+
+XrStatus
+XrMatrixMultiply (XrMatrix *result, const XrMatrix *a, const XrMatrix *b);
+
+XrStatus
+XrMatrixTransformDistance (XrMatrix *xr, double *dx, double *dy);
+
+XrStatus
+XrMatrixTransformPoint (XrMatrix *xr, double *x, double *y);
 
 _XFUNCPROTOEND
 

Index: xr.c
===================================================================
RCS file: /local/src/CVS/Xr/src/xr.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -d -r1.22 -r1.23
--- xr.c	12 May 2003 16:46:57 -0000	1.22
+++ xr.c	15 May 2003 01:30:57 -0000	1.23
@@ -291,26 +291,22 @@
 
 void
 XrConcatMatrix(XrState *xrs,
-	       double a, double b,
-	       double c, double d,
-	       double tx, double ty)
+	       XrMatrix *matrix)
 {
     if (xrs->status)
 	return;
 
-    xrs->status = _XrGStateConcatMatrix(_XR_CURRENT_GSTATE(xrs), a, b, c, d, tx, ty);
+    xrs->status = _XrGStateConcatMatrix(_XR_CURRENT_GSTATE(xrs), matrix);
 }
 
 void
 XrSetMatrix(XrState *xrs,
-	       double a, double b,
-	       double c, double d,
-	       double tx, double ty)
+	    XrMatrix *matrix)
 {
     if (xrs->status)
 	return;
 
-    xrs->status = _XrGStateSetMatrix(_XR_CURRENT_GSTATE(xrs), a, b, c, d, tx, ty);
+    xrs->status = _XrGStateSetMatrix(_XR_CURRENT_GSTATE(xrs), matrix);
 }
 
 void
@@ -332,6 +328,42 @@
 }
 
 void
+XrTransformPoint (XrState *xrs, double *x, double *y)
+{
+    if (xrs->status)
+	return;
+
+    xrs->status = _XrGStateTransformPoint (_XR_CURRENT_GSTATE (xrs), x, y);
+}
+
+void
+XrTransformDistance (XrState *xrs, double *dx, double *dy)
+{
+    if (xrs->status)
+	return;
+
+    xrs->status = _XrGStateTransformDistance (_XR_CURRENT_GSTATE (xrs), dx, dy);
+}
+
+void
+XrInverseTransformPoint (XrState *xrs, double *x, double *y)
+{
+    if (xrs->status)
+	return;
+
+    xrs->status = _XrGStateInverseTransformPoint (_XR_CURRENT_GSTATE (xrs), x, y);
+}
+
+void
+XrInverseTransformDistance (XrState *xrs, double *dx, double *dy)
+{
+    if (xrs->status)
+	return;
+
+    xrs->status = _XrGStateInverseTransformDistance (_XR_CURRENT_GSTATE (xrs), dx, dy);
+}
+
+void
 XrNewPath(XrState *xrs)
 {
     if (xrs->status)
@@ -407,6 +439,21 @@
 }
 
 void
+XrRectangle (XrState *xrs,
+	     double x, double y,
+	     double width, double height)
+{
+    if (xrs->status)
+	return;
+
+    XrMoveTo (xrs, x, y);
+    XrRelLineTo (xrs, width, 0);
+    XrRelLineTo (xrs, 0, height);
+    XrRelLineTo (xrs, -width, 0);
+    XrClosePath (xrs);
+}
+
+void
 XrClosePath(XrState *xrs)
 {
     if (xrs->status)
@@ -506,48 +553,8 @@
 }
 
 void
-XrShowImage(XrState		*xrs,
-	    char		*data,
-	    XrFormat		format,
-	    unsigned int	width,
-	    unsigned int	height,
-	    unsigned int	stride)
-{
-    if (xrs->status)
-	return;
-
-    xrs->status = _XrGStateShowImage(_XR_CURRENT_GSTATE(xrs),
-				     data, format,
-				     width, height, stride);
-}
-
-void
-XrShowImageTransform(XrState		*xrs,
-		     char		*data,
-		     XrFormat		format,
-		     unsigned int	width,
-		     unsigned int	height,
-		     unsigned int	stride,
-		     double a, double b,
-		     double c, double d,
-		     double tx, double ty)
-{
-    if (xrs->status)
-	return;
-
-    xrs->status = _XrGStateShowImageTransform(_XR_CURRENT_GSTATE(xrs),
-					      data, format,
-					      width, height, stride,
-					      a, b,
-					      c, d,
-					      tx, ty);
-}
-
-void
 XrShowSurface (XrState		*xrs,
 	       XrSurface	*surface,
-	       int		x,
-	       int		y,
 	       int		width,
 	       int		height)
 {
@@ -555,9 +562,7 @@
 	return;
 
     xrs->status = _XrGStateShowSurface (_XR_CURRENT_GSTATE (xrs),
-					surface,
-					x, y,
-					width, height);
+					surface, width, height);
 }
 
 XrStatus

Index: xrfont.c
===================================================================
RCS file: /local/src/CVS/Xr/src/xrfont.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- xrfont.c	17 Apr 2003 20:24:29 -0000	1.5
+++ xrfont.c	15 May 2003 01:30:57 -0000	1.6
@@ -32,11 +32,10 @@
 {
     font->key = (unsigned char *) strdup(XR_FONT_KEY_DEFAULT);
 
-    font->scale = 1.0;
-    font->has_transform = 0;
-
     font->dpy = NULL;
     font->xft_font = NULL;
+
+    XrMatrixSetIdentity(&font->matrix);
 }
 
 XrStatus
@@ -66,7 +65,7 @@
 	free(font->key);
     font->key = NULL;
 
-    _XrTransformDeinit(&font->transform);
+    _XrMatrixFini(&font->matrix);
 
     if (font->xft_font)
 	XftFontClose(font->dpy, font->xft_font);
@@ -93,14 +92,7 @@
 XrStatus
 _XrFontScale(XrFont *font, double scale)
 {
-    if (font->has_transform) {
-	XrTransform tmp;
-
-	_XrTransformInitScale(&tmp, scale, scale);
-	_XrTransformMultiplyIntoRight(&tmp, &font->transform);
-    } else {
-	font->scale *= scale;
-    }
+    XrMatrixScale(&font->matrix, scale, scale);
 
     return XrStatusSuccess;
 }
@@ -110,16 +102,10 @@
 		 double a, double b,
 		 double c, double d)
 {
-    XrTransform tmp;
-
-    if (! font->has_transform) {
-	_XrTransformInitScale(&tmp, font->scale, font->scale);
-    }
-
-    _XrTransformInitMatrix(&tmp, a, b, c, d, 0, 0);
-    _XrTransformMultiplyIntoRight(&tmp, &font->transform);
+    XrMatrix m;
 
-    font->has_transform = 1;
+    XrMatrixSetAffine(&m, a, b, c, d, 0, 0);
+    _XrMatrixMultiplyIntoRight(&m, &font->matrix);
 
     return XrStatusSuccess;
 }
@@ -130,8 +116,10 @@
     FcPattern	*pattern;
     FcPattern	*match;
     FcResult	result;
-    XrTransform	matrix;
+    XrMatrix	matrix;
     FcMatrix	fc_matrix;
+    double	expansion;
+    double	font_size;
     
     if (font->xft_font) {
 	*xft_font = font->xft_font;
@@ -142,11 +130,20 @@
 
     matrix = gstate->ctm;
 
-    if (!font->has_transform) {
-	FcPatternAddDouble(pattern, "pixelsize", font->scale);
-    } else {
-	_XrTransformMultiplyIntoRight(&font->transform, &matrix);
-    }
+    _XrMatrixMultiplyIntoRight(&font->matrix, &matrix);
+
+    /* Pull the scale factor out of the final matrix and use it to set
+       the direct pixelsize of the font. This enables freetype to
+       perform proper hinting at any size. */
+
+    /* XXX: The determinant gives an area expansion factor, so the
+       math below should be correct for the (common) case of uniform
+       X/Y scaling. Is there anything different we would want to do
+       for non-uniform X/Y scaling? */
+    _XrMatrixComputeDeterminant (&matrix, &expansion);
+    font_size = sqrt (expansion);
+    FcPatternAddDouble (pattern, "pixelsize", font_size);
+    XrMatrixScale (&matrix, 1.0 / font_size, 1.0 / font_size);
 
     fc_matrix.xx = matrix.m[0][0];
     fc_matrix.xy = matrix.m[0][1];

Index: xrgstate.c
===================================================================
RCS file: /local/src/CVS/Xr/src/xrgstate.c,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -d -r1.32 -r1.33
--- xrgstate.c	12 May 2003 16:46:57 -0000	1.32
+++ xrgstate.c	15 May 2003 01:30:57 -0000	1.33
@@ -74,14 +74,16 @@
     gstate->surface = NULL;
     gstate->solid = NULL;
     gstate->pattern = NULL;
+    gstate->pattern_offset.x = 0.0;
+    gstate->pattern_offset.y = 0.0;
 
     gstate->clip.surface = NULL;
 
     gstate->alpha = 1.0;
     _XrColorInit(&gstate->color);
 
-    _XrTransformInitIdentity(&gstate->ctm);
-    _XrTransformInitIdentity(&gstate->ctm_inverse);
+    XrMatrixSetIdentity(&gstate->ctm);
+    XrMatrixSetIdentity(&gstate->ctm_inverse);
 
     _XrPathInit(&gstate->path);
 
@@ -154,8 +156,8 @@
 
     _XrColorDeinit(&gstate->color);
 
-    _XrTransformDeinit(&gstate->ctm);
-    _XrTransformDeinit(&gstate->ctm_inverse);
+    _XrMatrixFini(&gstate->ctm);
+    _XrMatrixFini(&gstate->ctm_inverse);
 
     _XrPathDeinit(&gstate->path);
 
@@ -331,6 +333,12 @@
     gstate->pattern = pattern;
     _XrSurfaceReference (gstate->pattern);
 
+    gstate->pattern_offset.x = 0;
+    gstate->pattern_offset.y = 0;
+    XrMatrixTransformPoint (&gstate->ctm,
+			    &gstate->pattern_offset.x,
+			    &gstate->pattern_offset.y);
+
     return XrStatusSuccess;
 }
 
@@ -353,6 +361,9 @@
 {
     _XrColorSetRGB(&gstate->color, red, green, blue);
 
+    XrSurfaceDestroy(gstate->pattern);
+    gstate->pattern = NULL;
+
     XrSurfaceDestroy(gstate->solid);
     gstate->solid = XrSurfaceCreateNextToSolid (gstate->surface, XrFormatARGB32,
 						1, 1,
@@ -487,13 +498,13 @@
 XrStatus
 _XrGStateTranslate(XrGState *gstate, double tx, double ty)
 {
-    XrTransform tmp;
+    XrMatrix tmp;
 
-    _XrTransformInitTranslate(&tmp, tx, ty);
-    _XrTransformMultiplyIntoRight(&tmp, &gstate->ctm);
+    _XrMatrixSetTranslate(&tmp, tx, ty);
+    _XrMatrixMultiplyIntoRight(&tmp, &gstate->ctm);
 
-    _XrTransformInitTranslate(&tmp, -tx, -ty);
-    _XrTransformMultiplyIntoLeft(&gstate->ctm_inverse, &tmp);
+    _XrMatrixSetTranslate(&tmp, -tx, -ty);
+    _XrMatrixMultiplyIntoLeft(&gstate->ctm_inverse, &tmp);
 
     return XrStatusSuccess;
 }
@@ -501,13 +512,13 @@
 XrStatus
 _XrGStateScale(XrGState *gstate, double sx, double sy)
 {
-    XrTransform tmp;
+    XrMatrix tmp;
 
-    _XrTransformInitScale(&tmp, sx, sy);
-    _XrTransformMultiplyIntoRight(&tmp, &gstate->ctm);
+    _XrMatrixSetScale(&tmp, sx, sy);
+    _XrMatrixMultiplyIntoRight(&tmp, &gstate->ctm);
 
-    _XrTransformInitScale(&tmp, 1/sx, 1/sy);
-    _XrTransformMultiplyIntoLeft(&gstate->ctm_inverse, &tmp);
+    _XrMatrixSetScale(&tmp, 1/sx, 1/sy);
+    _XrMatrixMultiplyIntoLeft(&gstate->ctm_inverse, &tmp);
 
     return XrStatusSuccess;
 }
@@ -515,46 +526,42 @@
 XrStatus
 _XrGStateRotate(XrGState *gstate, double angle)
 {
-    XrTransform tmp;
+    XrMatrix tmp;
 
-    _XrTransformInitRotate(&tmp, angle);
-    _XrTransformMultiplyIntoRight(&tmp, &gstate->ctm);
+    _XrMatrixSetRotate(&tmp, angle);
+    _XrMatrixMultiplyIntoRight(&tmp, &gstate->ctm);
 
-    _XrTransformInitRotate(&tmp, -angle);
-    _XrTransformMultiplyIntoLeft(&gstate->ctm_inverse, &tmp);
+    _XrMatrixSetRotate(&tmp, -angle);
+    _XrMatrixMultiplyIntoLeft(&gstate->ctm_inverse, &tmp);
 
     return XrStatusSuccess;
 }
 
 XrStatus
 _XrGStateConcatMatrix(XrGState *gstate,
-		      double a, double b,
-		      double c, double d,
-		      double tx, double ty)
+		      XrMatrix *matrix)
 {
-    XrTransform tmp;
+    XrMatrix tmp;
 
-    _XrTransformInitMatrix(&tmp, a, b, c, d, tx, ty);
-    _XrTransformMultiplyIntoRight(&tmp, &gstate->ctm);
+    XrMatrixCopy(&tmp, matrix);
+    _XrMatrixMultiplyIntoRight(&tmp, &gstate->ctm);
 
-    _XrTransformInvert(&tmp);
-    _XrTransformMultiplyIntoLeft(&gstate->ctm_inverse, &tmp);
+    XrMatrixInvert(&tmp);
+    _XrMatrixMultiplyIntoLeft(&gstate->ctm_inverse, &tmp);
 
     return XrStatusSuccess;
 }
 
 XrStatus
 _XrGStateSetMatrix(XrGState *gstate,
-		   double a, double b,
-		   double c, double d,
-		   double tx, double ty)
+		   XrMatrix *matrix)
 {
     XrStatus status;
 
-    _XrTransformInitMatrix(&gstate->ctm, a, b, c, d, tx, ty);
+    XrMatrixCopy(&gstate->ctm, matrix);
 
-    gstate->ctm_inverse = gstate->ctm;
-    status = _XrTransformInvert (&gstate->ctm_inverse);
+    XrMatrixCopy(&gstate->ctm_inverse, matrix);
+    status = XrMatrixInvert (&gstate->ctm_inverse);
     if (status)
 	return status;
 
@@ -564,8 +571,40 @@
 XrStatus
 _XrGStateIdentityMatrix(XrGState *gstate)
 {
-    _XrTransformInitIdentity(&gstate->ctm);
-    _XrTransformInitIdentity(&gstate->ctm_inverse);
+    XrMatrixSetIdentity(&gstate->ctm);
+    XrMatrixSetIdentity(&gstate->ctm_inverse);
+
+    return XrStatusSuccess;
+}
+
+XrStatus
+_XrGStateTransformPoint (XrGState *gstate, double *x, double *y)
+{
+    XrMatrixTransformPoint (&gstate->ctm, x, y);
+
+    return XrStatusSuccess;
+}
+
+XrStatus
+_XrGStateTransformDistance (XrGState *gstate, double *dx, double *dy)
+{
+    XrMatrixTransformDistance (&gstate->ctm, dx, dy);
+
+    return XrStatusSuccess;
+}
+
+XrStatus
+_XrGStateInverseTransformPoint (XrGState *gstate, double *x, double *y)
+{
+    XrMatrixTransformPoint (&gstate->ctm_inverse, x, y);
+
+    return XrStatusSuccess;
+}
+
+XrStatus
+_XrGStateInverseTransformDistance (XrGState *gstate, double *dx, double *dy)
+{
+    XrMatrixTransformDistance (&gstate->ctm_inverse, dx, dy);
 
     return XrStatusSuccess;
 }
@@ -593,7 +632,7 @@
 {
     XrStatus status;
 
-    _XrTransformPoint(&gstate->ctm, &x, &y);
+    XrMatrixTransformPoint(&gstate->ctm, &x, &y);
 
     status = _XrPathMoveTo(&gstate->path, x, y);
 
@@ -609,7 +648,7 @@
 {
     XrStatus status;
 
-    _XrTransformPoint(&gstate->ctm, &x, &y);
+    XrMatrixTransformPoint(&gstate->ctm, &x, &y);
 
     status = _XrPathLineTo(&gstate->path, x, y);
 
@@ -626,9 +665,9 @@
 {
     XrStatus status;
 
-    _XrTransformPoint(&gstate->ctm, &x1, &y1);
-    _XrTransformPoint(&gstate->ctm, &x2, &y2);
-    _XrTransformPoint(&gstate->ctm, &x3, &y3);
+    XrMatrixTransformPoint(&gstate->ctm, &x1, &y1);
+    XrMatrixTransformPoint(&gstate->ctm, &x2, &y2);
+    XrMatrixTransformPoint(&gstate->ctm, &x3, &y3);
 
     status = _XrPathCurveTo(&gstate->path,
 			    x1, y1,
@@ -646,7 +685,7 @@
     XrStatus status;
     double x, y;
 
-    _XrTransformDistance(&gstate->ctm, &dx, &dy);
+    XrMatrixTransformDistance(&gstate->ctm, &dx, &dy);
 
     x = gstate->current_pt.x + dx;
     y = gstate->current_pt.y + dy;
@@ -666,7 +705,7 @@
     XrStatus status;
     double x, y;
 
-    _XrTransformDistance(&gstate->ctm, &dx, &dy);
+    XrMatrixTransformDistance(&gstate->ctm, &dx, &dy);
 
     x = gstate->current_pt.x + dx;
     y = gstate->current_pt.y + dy;
@@ -686,9 +725,9 @@
 {
     XrStatus status;
 
-    _XrTransformDistance(&gstate->ctm, &dx1, &dy1);
-    _XrTransformDistance(&gstate->ctm, &dx2, &dy2);
-    _XrTransformDistance(&gstate->ctm, &dx3, &dy3);
+    XrMatrixTransformDistance(&gstate->ctm, &dx1, &dy1);
+    XrMatrixTransformDistance(&gstate->ctm, &dx2, &dy2);
+    XrMatrixTransformDistance(&gstate->ctm, &dx3, &dy3);
 
     status = _XrPathCurveTo(&gstate->path,
 			    gstate->current_pt.x + dx1, gstate->current_pt.y + dy1,
@@ -722,7 +761,7 @@
     *x = gstate->current_pt.x;
     *y = gstate->current_pt.y;
 
-    _XrTransformPoint(&gstate->ctm_inverse, x, y);
+    XrMatrixTransformPoint(&gstate->ctm_inverse, x, y);
 
     return XrStatusSuccess;
 }
@@ -764,6 +803,9 @@
 				    XrSurface *dst,
 				    XrTraps *traps)
 {
+    if (traps->num_xtraps == 0)
+	return XrStatusSuccess;
+
     if (gstate->clip.surface) {
 	XrSurface *intermediate, *white;
 
@@ -801,10 +843,21 @@
 	XrSurfaceDestroy (white);
 
     } else {
+	double xoff, yoff;
+
+	if (traps->xtraps[0].left.p1.y < traps->xtraps[0].left.p2.y) {
+	    xoff = traps->xtraps[0].left.p1.x;
+	    yoff = traps->xtraps[0].left.p1.y;
+	} else {
+	    xoff = traps->xtraps[0].left.p2.x;
+	    yoff = traps->xtraps[0].left.p2.y;
+	}
+
 	XcCompositeTrapezoids(gstate->operator,
 			      src->xc_surface,
 			      dst->xc_surface,
-			      0, 0,
+			      XFixedToDouble(xoff) - gstate->pattern_offset.x,
+			      XFixedToDouble(yoff) - gstate->pattern_offset.y,
 			      traps->xtraps,
 			      traps->num_xtraps);
     }
@@ -967,36 +1020,16 @@
 }
 
 XrStatus
-_XrGStateShowImage(XrGState	*gstate,
-		   char		*data,
-		   XrFormat	format,
-		   unsigned int	width,
-		   unsigned int	height,
-		   unsigned int	stride)
-{
-    return _XrGStateShowImageTransform(gstate,
-				       data, format, width, height, stride,
-				       width, 0,
-				       0,     height,
-				       0,     0);
-}
-
-XrStatus
-_XrGStateShowImageTransform(XrGState		*gstate,
-			    char		*data,
-			    XrFormat		format,
-			    unsigned int	width,
-			    unsigned int	height,
-			    unsigned int	stride,
-			    double a, double b,
-			    double c, double d,
-			    double tx, double ty)
+_XrGStateShowSurface(XrGState	*gstate,
+		     XrSurface	*surface,
+		     int	width,
+		     int	height)
 {
-    XrSurface *image_surface, *mask;
-    XrTransform user_to_image, image_to_user;
-    XrTransform image_to_device, device_to_image;
-    double dst_x, dst_y;
-    double dst_width, dst_height;
+    XrSurface *mask;
+    XrMatrix user_to_image, image_to_user;
+    XrMatrix image_to_device, device_to_image;
+    double device_x, device_y;
+    double device_width, device_height;
 
     mask = XrSurfaceCreateNextToSolid (gstate->surface,
 				       XrFormatA8,
@@ -1005,81 +1038,40 @@
 				       gstate->alpha);
     if (mask == NULL)
 	return XrStatusNoMemory;
-    XrSurfaceSetRepeat (mask, 1);
-
-    image_surface = XrSurfaceCreateNextTo (gstate->surface, format, width, height);
-    if (image_surface == NULL) {
-	XrSurfaceDestroy (mask);
-	return XrStatusNoMemory;
-    }
 
-    /* XXX: Need a way to transfer bits to an XcSurface
-    XcPutImage (image_surface->xc_surface, data, width, height, stride);
-    */
+    XrSurfaceSetRepeat (mask, 1);
 
-    _XrTransformInitMatrix(&user_to_image, a, b, c, d, tx, ty);
-    _XrTransformMultiply(&gstate->ctm_inverse, &user_to_image, &device_to_image);
-    _XrSurfaceSetTransform(image_surface, &device_to_image);
+    XrSurfaceGetMatrix (surface, &user_to_image);
+    XrMatrixMultiply (&device_to_image, &gstate->ctm_inverse, &user_to_image);
+    XrSurfaceSetMatrix (surface, &device_to_image);
 
     image_to_user = user_to_image;
-    _XrTransformInvert (&image_to_user);
-    _XrTransformMultiply (&image_to_user, &gstate->ctm, &image_to_device);
-
-    dst_x = 0;
-    dst_y = 0;
-    dst_width = width;
-    dst_height = height;
-    _XrTransformBoundingBox(&image_to_device,
-			    &dst_x, &dst_y,
-			    &dst_width, &dst_height);
+    XrMatrixInvert (&image_to_user);
+    XrMatrixMultiply (&image_to_device, &image_to_user, &gstate->ctm);
 
+    device_x = 0;
+    device_y = 0;
+    device_width = width;
+    device_height = height;
+    _XrMatrixTransformBoundingBox(&image_to_device,
+				  &device_x, &device_y,
+				  &device_width, &device_height);
+    
+    /* XXX: The +2 here looks bogus to me */
     XcComposite(gstate->operator,
-		image_surface->xc_surface,
+		surface->xc_surface,
 		mask->xc_surface,
 		gstate->surface->xc_surface,
-		dst_x, dst_y,
+		device_x, device_y,
 		0, 0,
-		dst_x, dst_y,
-		dst_width + 2,
-		dst_height + 2);
+		device_x, device_y,
+		device_width + 2,
+		device_height + 2);
 
-    XrSurfaceDestroy (image_surface);
     XrSurfaceDestroy (mask);
 
-    return XrStatusSuccess;
-}
-
-XrStatus
-_XrGStateShowSurface(XrGState	*gstate,
-		     XrSurface	*surface,
-		     int	x,
-		     int	y,
-		     int	width,
-		     int	height)
-{
-    XrSurface *mask;
-
-    mask = XrSurfaceCreateNextToSolid (gstate->surface,
-				       XrFormatARGB32,
-				       1, 1,
-				       1.0, 1.0, 1.0,
-				       gstate->alpha);
-    if (mask == NULL)
-	return XrStatusNoMemory;
-
-    XrSurfaceSetRepeat (mask, 1);
-
-    XcComposite (gstate->operator,
-		 surface->xc_surface,
-		 mask->xc_surface,
-		 gstate->surface->xc_surface,
-		 x, y,
-		 0, 0,
-		 x, y,
-		 width,
-		 height);
-
-    XrSurfaceDestroy (mask);
+    /* restore the matrix originally in the surface */
+    XrSurfaceSetMatrix (surface, &user_to_image);
 
     return XrStatusSuccess;
 }

Index: xrint.h
===================================================================
RCS file: /local/src/CVS/Xr/src/xrint.h,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -d -r1.38 -r1.39
--- xrint.h	12 May 2003 16:46:57 -0000	1.38
+++ xrint.h	15 May 2003 01:30:57 -0000	1.39
@@ -177,9 +177,9 @@
     XcColor xc_color;
 } XrColor;
 
-typedef struct _XrTransform {
+struct _XrMatrix {
     double m[3][2];
-} XrTransform;
+};
 
 typedef struct _XrTraps {
     int num_xtraps;
@@ -187,15 +187,13 @@
     XTrapezoid *xtraps;
 } XrTraps;
 
-/* XXX: What should this really be? */
-#define XR_FONT_KEY_DEFAULT		"mono"
+#define XR_FONT_KEY_DEFAULT		"serif"
 
 typedef struct _XrFont {
     unsigned char *key;
 
     double scale;
-    int has_transform;
-    XrTransform transform;
+    XrMatrix matrix;
 
     Display *dpy;
     XftFont *xft_font;
@@ -241,14 +239,15 @@
     XrSurface *surface;
     XrSurface *solid;
     XrSurface *pattern;
+    XPointDouble pattern_offset;
 
     XrClipRec clip;
 
     double alpha;
     XrColor color;
 
-    XrTransform ctm;
-    XrTransform ctm_inverse;
+    XrMatrix ctm;
+    XrMatrix ctm_inverse;
 
     XrPath path;
 
@@ -403,20 +402,28 @@
 
 XrStatus
 _XrGStateConcatMatrix(XrGState *gstate,
-		      double a, double b,
-		      double c, double d,
-		      double tx, double ty);
+		      XrMatrix *matrix);
 
 XrStatus
 _XrGStateSetMatrix(XrGState *gstate,
-		   double a, double b,
-		   double c, double d,
-		   double tx, double ty);
+		   XrMatrix *matrix);
 
 XrStatus
 _XrGStateIdentityMatrix(XrGState *xrs);
 
 XrStatus
+_XrGStateTransformPoint (XrGState *gstate, double *x, double *y);
+
+XrStatus
+_XrGStateTransformDistance (XrGState *gstate, double *dx, double *dy);
+
+XrStatus
+_XrGStateInverseTransformPoint (XrGState *gstate, double *x, double *y);
+
+XrStatus
+_XrGStateInverseTransformDistance (XrGState *gstate, double *dx, double *dy);
+
+XrStatus
 _XrGStateNewPath(XrGState *gstate);
 
 XrStatus
@@ -480,29 +487,8 @@
 _XrGStateShowText(XrGState *gstate, const unsigned char *utf8);
 
 XrStatus
-_XrGStateShowImage(XrGState	*gstate,
-		   char		*data,
-		   XrFormat	format,
-		   unsigned int	width,
-		   unsigned int	height,
-		   unsigned int	stride);
-
-XrStatus
-_XrGStateShowImageTransform(XrGState		*gstate,
-			    char		*data,
-			    XrFormat		format,
-			    unsigned int	width,
-			    unsigned int	height,
-			    unsigned int	stride,
-			    double a, double b,
-			    double c, double d,
-			    double tx, double ty);
-
-XrStatus
 _XrGStateShowSurface(XrGState	*gstate,
 		     XrSurface	*surface,
-		     int	x,
-		     int	y,
 		     int	width,
 		     int	height);
 
@@ -590,9 +576,6 @@
 void
 _XrSurfaceReference(XrSurface *surface);
 
-XrStatus
-_XrSurfaceSetTransform(XrSurface *surface, XrTransform *transform);
-
 XcSurface *
 _XrSurfaceGetXcSurface(XrSurface *surface);
 
@@ -663,59 +646,42 @@
 void
 _XrSplineDeinit(XrSpline *spline);
 
-/* xrtransform.c */
-void
-_XrTransformInitIdentity(XrTransform *transform);
-
-void
-_XrTransformDeinit(XrTransform *transform);
-
-void
-_XrTransformInitMatrix(XrTransform *transform,
-		       double a, double b,
-		       double c, double d,
-		       double tx, double ty);
-
-void
-_XrTransformInitTranslate(XrTransform *transform,
-			  double tx, double ty);
-
+/* xrmatrix.c */
 void
-_XrTransformInitScale(XrTransform *transform,
-		      double sx, double sy);
+_XrMatrixInit(XrMatrix *matrix);
 
 void
-_XrTransformInitRotate(XrTransform *transform,
-		       double angle);
+_XrMatrixFini(XrMatrix *matrix);
 
-void
-_XrTransformMultiplyIntoLeft(XrTransform *t1, const XrTransform *t2);
+XrStatus
+_XrMatrixSetTranslate(XrMatrix *matrix,
+		      double tx, double ty);
 
-void
-_XrTransformMultiplyIntoRight(const XrTransform *t1, XrTransform *t2);
+XrStatus
+_XrMatrixSetScale(XrMatrix *matrix,
+		  double sx, double sy);
 
-void
-_XrTransformMultiply(const XrTransform *t1, const XrTransform *t2, XrTransform *new);
+XrStatus
+_XrMatrixSetRotate(XrMatrix *matrix,
+		   double angle);
 
-void
-_XrTransformDistance(XrTransform *transform, double *dx, double *dy);
+XrStatus
+_XrMatrixMultiplyIntoLeft(XrMatrix *t1, const XrMatrix *t2);
 
-void
-_XrTransformPoint(XrTransform *transform, double *x, double *y);
+XrStatus
+_XrMatrixMultiplyIntoRight(const XrMatrix *t1, XrMatrix *t2);
 
-void
-_XrTransformBoundingBox(XrTransform *transform,
-			double *x, double *y,
-			double *width, double *height);
 
 XrStatus
-_XrTransformInvert(XrTransform *transform);
+_XrMatrixTransformBoundingBox(XrMatrix *matrix,
+			      double *x, double *y,
+			      double *width, double *height);
 
-void
-_XrTransformComputeDeterminant(XrTransform *transform, double *det);
+XrStatus
+_XrMatrixComputeDeterminant(XrMatrix *matrix, double *det);
 
-void
-_XrTransformComputeEigenValues(XrTransform *transform, double *lambda1, double *lambda2);
+XrStatus
+_XrMatrixComputeEigenValues(XrMatrix *matrix, double *lambda1, double *lambda2);
 
 /* xrtraps.c */
 void

Index: xrpathstroke.c
===================================================================
RCS file: /local/src/CVS/Xr/src/xrpathstroke.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- xrpathstroke.c	12 May 2003 16:24:18 -0000	1.1
+++ xrpathstroke.c	15 May 2003 01:30:57 -0000	1.2
@@ -223,13 +223,13 @@
 	    y1 = XFixedToDouble(inpt->y);
 	    dx1 = in->usr_vector.x;
 	    dy1 = in->usr_vector.y;
-	    _XrTransformDistance(&gstate->ctm, &dx1, &dy1);
+	    XrMatrixTransformDistance(&gstate->ctm, &dx1, &dy1);
 	    
 	    x2 = XFixedToDouble(outpt->x);
 	    y2 = XFixedToDouble(outpt->y);
 	    dx2 = out->usr_vector.x;
 	    dy2 = out->usr_vector.y;
-	    _XrTransformDistance(&gstate->ctm, &dx2, &dy2);
+	    XrMatrixTransformDistance(&gstate->ctm, &dx2, &dy2);
 	    
 	    my = (((x2 - x1) * dy1 * dy2 - y2 * dx2 * dy1 + y1 * dx1 * dy2) /
 		  (dx1 * dy2 - dx2 * dy1));
@@ -311,7 +311,7 @@
 	dy = f->usr_vector.y;
 	dx *= gstate->line_width / 2.0;
 	dy *= gstate->line_width / 2.0;
-	_XrTransformDistance(&gstate->ctm, &dx, &dy);
+	XrMatrixTransformDistance(&gstate->ctm, &dx, &dy);
 	fvector.dx = XDoubleToFixed(dx);
 	fvector.dy = XDoubleToFixed(dy);
 	occw.x = f->ccw.x + fvector.dx;
@@ -346,7 +346,7 @@
     dx = XFixedToDouble(slope->dx);
     dy = XFixedToDouble(slope->dy);
 
-    _XrTransformDistance(&gstate->ctm_inverse, &dx, &dy);
+    XrMatrixTransformDistance(&gstate->ctm_inverse, &dx, &dy);
 
     mag = sqrt(dx * dx + dy * dy);
     if (mag == 0) {
@@ -364,7 +364,7 @@
     dx = - dy * (gstate->line_width / 2.0);
     dy = tmp * (gstate->line_width / 2.0);
 
-    _XrTransformDistance(&gstate->ctm, &dx, &dy);
+    XrMatrixTransformDistance(&gstate->ctm, &dx, &dy);
 
     offset_ccw.x = XDoubleToFixed(dx);
     offset_ccw.y = XDoubleToFixed(dy);
@@ -471,7 +471,7 @@
     dx = XFixedToDouble(p2->x - p1->x);
     dy = XFixedToDouble(p2->y - p1->y);
 
-    _XrTransformDistance(&gstate->ctm_inverse, &dx, &dy);
+    XrMatrixTransformDistance(&gstate->ctm_inverse, &dx, &dy);
 
     mag = sqrt(dx *dx + dy * dy);
     remain = mag;
@@ -483,7 +483,7 @@
 	remain -= tmp;
         dx2 = dx * (mag - remain)/mag;
 	dy2 = dy * (mag - remain)/mag;
-	_XrTransformDistance (&gstate->ctm, &dx2, &dy2);
+	XrMatrixTransformDistance (&gstate->ctm, &dx2, &dy2);
 	fd2.x = XDoubleToFixed (dx2);
 	fd2.y = XDoubleToFixed (dy2);
 	fd2.x += p1->x;

Index: xrpen.c
===================================================================
RCS file: /local/src/CVS/Xr/src/xrpen.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -d -r1.19 -r1.20
--- xrpen.c	6 Feb 2003 16:06:28 -0000	1.19
+++ xrpen.c	15 May 2003 01:30:57 -0000	1.20
@@ -26,7 +26,7 @@
 #include "xrint.h"
 
 static int
-_XrPenVerticesNeeded(double radius, double tolerance, XrTransform *matrix);
+_XrPenVerticesNeeded(double radius, double tolerance, XrMatrix *matrix);
 
 static void
 _XrPenComputeSlopes(XrPen *pen);
@@ -89,7 +89,7 @@
 	v->theta = 2 * M_PI * i / (double) pen->num_vertices;
 	dx = radius * cos(v->theta);
 	dy = radius * sin(v->theta);
-	_XrTransformDistance(&gstate->ctm, &dx, &dy);
+	XrMatrixTransformDistance(&gstate->ctm, &dx, &dy);
 	v->pt.x = XDoubleToFixed(dx);
 	v->pt.y = XDoubleToFixed(dy);
 	/* Recompute theta in device space */
@@ -186,7 +186,7 @@
 }
 
 static int
-_XrPenVerticesNeeded(double radius, double tolerance, XrTransform *matrix)
+_XrPenVerticesNeeded(double radius, double tolerance, XrMatrix *matrix)
 {
     double expansion, theta;
 
@@ -194,7 +194,7 @@
        transform. In the worst case, this is entirely in one
        dimension, which is what we assume here. */
 
-    _XrTransformComputeDeterminant(matrix, &expansion);
+    _XrMatrixComputeDeterminant(matrix, &expansion);
 
     if (tolerance > expansion*radius) {
 	return 4;

Index: xrsurface.c
===================================================================
RCS file: /local/src/CVS/Xr/src/xrsurface.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- xrsurface.c	2 May 2003 21:07:42 -0000	1.14
+++ xrsurface.c	15 May 2003 01:30:57 -0000	1.15
@@ -271,17 +271,17 @@
    nothing else, that would eliminate the two different transform data
    structures we have here. */
 XrStatus
-_XrSurfaceSetTransform(XrSurface *surface, XrTransform *transform)
+XrSurfaceSetMatrix(XrSurface *surface, XrMatrix *matrix)
 {
     XTransform xtransform;
 
-    xtransform.matrix[0][0] = XDoubleToFixed(transform->m[0][0]);
-    xtransform.matrix[0][1] = XDoubleToFixed(transform->m[1][0]);
-    xtransform.matrix[0][2] = XDoubleToFixed(transform->m[2][0]);
+    xtransform.matrix[0][0] = XDoubleToFixed(matrix->m[0][0]);
+    xtransform.matrix[0][1] = XDoubleToFixed(matrix->m[1][0]);
+    xtransform.matrix[0][2] = XDoubleToFixed(matrix->m[2][0]);
 
-    xtransform.matrix[1][0] = XDoubleToFixed(transform->m[0][1]);
-    xtransform.matrix[1][1] = XDoubleToFixed(transform->m[1][1]);
-    xtransform.matrix[1][2] = XDoubleToFixed(transform->m[2][1]);
+    xtransform.matrix[1][0] = XDoubleToFixed(matrix->m[0][1]);
+    xtransform.matrix[1][1] = XDoubleToFixed(matrix->m[1][1]);
+    xtransform.matrix[1][2] = XDoubleToFixed(matrix->m[2][1]);
 
     xtransform.matrix[2][0] = 0;
     xtransform.matrix[2][1] = 0;
@@ -290,6 +290,31 @@
     XcSurfaceSetTransform(surface->xc_surface,
 			  &xtransform);
 
+    return XrStatusSuccess;
+}
+
+XrStatus
+XrSurfaceGetMatrix (XrSurface *surface, XrMatrix *matrix)
+{
+    XTransform xtransform;
+
+    XcSurfaceGetTransform (surface->xc_surface, &xtransform);
+
+    matrix->m[0][0] = XFixedToDouble (xtransform.matrix[0][0]);
+    matrix->m[1][0] = XFixedToDouble (xtransform.matrix[0][1]);
+    matrix->m[2][0] = XFixedToDouble (xtransform.matrix[0][2]);
+
+    matrix->m[0][1] = XFixedToDouble (xtransform.matrix[1][0]);
+    matrix->m[1][1] = XFixedToDouble (xtransform.matrix[1][1]);
+    matrix->m[2][1] = XFixedToDouble (xtransform.matrix[1][2]);
+
+    return XrStatusSuccess;
+}
+
+XrStatus
+XrSurfaceSetFilter(XrSurface *surface, XrFilter filter)
+{
+    XcSurfaceSetFilter(surface->xc_surface, filter);
     return XrStatusSuccess;
 }
 

--- xrtransform.c DELETED ---