[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 ---