[Commit] cairo/src cairo_slope.c, NONE, 1.1 Makefile.am, 1.6,
1.7 cairo.c, 1.2, 1.3 cairo.h, 1.2, 1.3 cairo_color.c, 1.1,
1.2 cairo_font.c, 1.1, 1.2 cairo_gstate.c, 1.2,
1.3 cairo_path.c, 1.2, 1.3 cairo_path_bounds.c, 1.2,
1.3 cairo_path_fill.c, 1.2, 1.3 cairo_path_stroke.c, 1.2,
1.3 cairo_pen.c, 1.3, 1.4 cairo_polygon.c, 1.1,
1.2 cairo_spline.c, 1.2, 1.3 cairo_surface.c, 1.1,
1.2 cairo_traps.c, 1.6, 1.7 cairoint.h, 1.5, 1.6 cairo_misc.c,
1.1, NONE
Carl Worth
commit at keithp.com
Wed Jul 30 09:30:54 PDT 2003
- Previous message: [Commit] cairo ChangeLog, 1.36, 1.37 cairo.pc.in, 1.1,
1.2 configure.in, 1.6, 1.7
- Next message: [Commit] slim ChangeLog,1.1,1.2 configure.in,1.1,1.2
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
Committed by: cworth
Update of /local/src/CVS/cairo/src
In directory home.keithp.com:/tmp/cvs-serv21417/src
Modified Files:
Makefile.am cairo.c cairo.h cairo_color.c cairo_font.c
cairo_gstate.c cairo_path.c cairo_path_bounds.c
cairo_path_fill.c cairo_path_stroke.c cairo_pen.c
cairo_polygon.c cairo_spline.c cairo_surface.c cairo_traps.c
cairoint.h
Added Files:
cairo_slope.c
Removed Files:
cairo_misc.c
Log Message:
Made all changes necessary to abandon the Xc library,
(sucking the functionality up into cairo_surface_t instead).
Eliminated most of the remaining X datatypes (XFixed, XPointFixed, XLineFixed, XTrapezoid).
Fixed some numerical problems relating to pen initialization and intersection calculation.
--- NEW FILE: cairo_slope.c ---
(This appears to be a binary file; contents omitted.)
Index: Makefile.am
===================================================================
RCS file: /local/src/CVS/cairo/src/Makefile.am,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- Makefile.am 18 Jul 2003 18:34:19 -0000 1.6
+++ Makefile.am 30 Jul 2003 15:30:51 -0000 1.7
@@ -2,23 +2,23 @@
include_HEADERS = cairo.h
libcairo_la_SOURCES = \
- cairo.h \
cairo.c \
- cairoint.h \
+ cairo.h \
cairo_color.c \
cairo_font.c \
cairo_gstate.c \
cairo_matrix.c \
- cairo_misc.c \
cairo_path.c \
cairo_path_bounds.c \
cairo_path_fill.c \
cairo_path_stroke.c \
cairo_pen.c \
cairo_polygon.c \
+ cairo_slope.c \
cairo_spline.c \
cairo_surface.c \
- cairo_traps.c
+ cairo_traps.c \
+ cairoint.h
libcairo_la_LDFLAGS = -version-info @VERSION_INFO@
Index: cairo.c
===================================================================
RCS file: /local/src/CVS/cairo/src/cairo.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- cairo.c 24 Jul 2003 04:20:25 -0000 1.2
+++ cairo.c 30 Jul 2003 15:30:51 -0000 1.3
@@ -160,12 +160,6 @@
cr->status = _cairo_gstate_set_target_surface (cr->gstate, surface);
}
-cairo_surface_t *
-cairo_get_target_surface (cairo_t *cr)
-{
- return _cairo_gstate_get_target_surface (cr->gstate);
-}
-
void
cairo_set_target_drawable (cairo_t *cr,
Display *dpy,
@@ -225,12 +219,6 @@
cr->status = _cairo_gstate_set_operator (cr->gstate, op);
}
-cairo_operator_t
-cairo_get_operator (cairo_t *cr)
-{
- return _cairo_gstate_get_operator (cr->gstate);
-}
-
void
cairo_set_rgb_color (cairo_t *cr, double red, double green, double blue)
{
@@ -245,16 +233,6 @@
}
void
-cairo_get_rgb_color (cairo_t *cr, double *red, double *green, double *blue)
-{
- /* XXX: Should we do anything with the return values in the error case? */
- if (cr->status)
- return;
-
- cr->status = _cairo_gstate_get_rgb_color (cr->gstate, red, green, blue);
-}
-
-void
cairo_set_pattern (cairo_t *cr, cairo_surface_t *pattern)
{
if (cr->status)
@@ -274,12 +252,6 @@
cr->status = _cairo_gstate_set_tolerance (cr->gstate, tolerance);
}
-double
-cairo_get_tolerance (cairo_t *cr)
-{
- return _cairo_gstate_get_tolerance (cr->gstate);
-}
-
void
cairo_set_alpha (cairo_t *cr, double alpha)
{
@@ -291,12 +263,6 @@
cr->status = _cairo_gstate_set_alpha (cr->gstate, alpha);
}
-double
-cairo_get_alpha (cairo_t *cr)
-{
- return _cairo_gstate_get_alpha (cr->gstate);
-}
-
void
cairo_set_fill_rule (cairo_t *cr, cairo_fill_rule_t fill_rule)
{
@@ -315,12 +281,6 @@
cr->status = _cairo_gstate_set_line_width (cr->gstate, width);
}
-double
-cairo_get_line_width (cairo_t *cr)
-{
- return _cairo_gstate_get_line_width (cr->gstate);
-}
-
void
cairo_set_line_cap (cairo_t *cr, cairo_line_cap_t line_cap)
{
@@ -330,12 +290,6 @@
cr->status = _cairo_gstate_set_line_cap (cr->gstate, line_cap);
}
-cairo_line_cap_t
-cairo_get_line_cap (cairo_t *cr)
-{
- return _cairo_gstate_get_line_cap (cr->gstate);
-}
-
void
cairo_set_line_join (cairo_t *cr, cairo_line_join_t line_join)
{
@@ -345,12 +299,6 @@
cr->status = _cairo_gstate_set_line_join (cr->gstate, line_join);
}
-cairo_line_join_t
-cairo_get_line_join (cairo_t *cr)
-{
- return _cairo_gstate_get_line_join (cr->gstate);
-}
-
void
cairo_set_dash (cairo_t *cr, double *dashes, int ndash, double offset)
{
@@ -369,12 +317,6 @@
cr->status = _cairo_gstate_set_miter_limit (cr->gstate, limit);
}
-double
-cairo_get_miter_limit (cairo_t *cr)
-{
- return _cairo_gstate_get_miter_limit (cr->gstate);
-}
-
void
cairo_translate (cairo_t *cr, double tx, double ty)
{
@@ -446,7 +388,7 @@
if (cr->status)
return;
- cr->status = cairo_gstateransform_point (cr->gstate, x, y);
+ cr->status = cairo_gstate_transform_point (cr->gstate, x, y);
}
void
@@ -455,7 +397,7 @@
if (cr->status)
return;
- cr->status = cairo_gstateransform_distance (cr->gstate, dx, dy);
+ cr->status = cairo_gstate_transform_distance (cr->gstate, dx, dy);
}
void
@@ -513,9 +455,9 @@
return;
cr->status = _cairo_gstate_curve_to (cr->gstate,
- x1, y1,
- x2, y2,
- x3, y3);
+ x1, y1,
+ x2, y2,
+ x3, y3);
}
void
@@ -546,9 +488,9 @@
return;
cr->status = _cairo_gstate_rel_curve_to (cr->gstate,
- dx1, dy1,
- dx2, dy2,
- dx3, dy3);
+ dx1, dy1,
+ dx2, dy2,
+ dx3, dy3);
}
void
@@ -566,23 +508,24 @@
cairo_close_path (cr);
}
+/* XXX: NYI
void
-cairo_close_path (cairo_t *cr)
+cairo_stroke_path (cairo_t *cr)
{
if (cr->status)
return;
- cr->status = _cairo_gstate_close_path (cr->gstate);
+ cr->status = _cairo_gstate_stroke_path (cr->gstate);
}
+*/
void
-cairo_get_current_point (cairo_t *cr, double *x, double *y)
+cairo_close_path (cairo_t *cr)
{
- /* XXX: Should we do anything with the return values in the error case? */
if (cr->status)
return;
- cr->status = _cairo_gstate_get_current_point (cr->gstate, x, y);
+ cr->status = _cairo_gstate_close_path (cr->gstate);
}
void
@@ -638,8 +581,8 @@
if (cr->status)
return;
- cr->status = cairo_gstateransform_font (cr->gstate,
- a, b, c, d);
+ cr->status = cairo_gstate_transform_font (cr->gstate,
+ a, b, c, d);
}
void
@@ -652,8 +595,8 @@
if (cr->status)
return;
- cr->status = cairo_gstateext_extents (cr->gstate, utf8,
- x, y, width, height, dx, dy);
+ cr->status = cairo_gstate_text_extents (cr->gstate, utf8,
+ x, y, width, height, dx, dy);
}
void
@@ -676,6 +619,73 @@
cr->status = _cairo_gstate_show_surface (cr->gstate,
surface, width, height);
+}
+
+cairo_operator_t
+cairo_get_operator (cairo_t *cr)
+{
+ return _cairo_gstate_get_operator (cr->gstate);
+}
+
+void
+cairo_get_rgb_color (cairo_t *cr, double *red, double *green, double *blue)
+{
+ _cairo_gstate_get_rgb_color (cr->gstate, red, green, blue);
+}
+
+double
+cairo_get_alpha (cairo_t *cr)
+{
+ return _cairo_gstate_get_alpha (cr->gstate);
+}
+
+
+double
+cairo_get_tolerance (cairo_t *cr)
+{
+ return _cairo_gstate_get_tolerance (cr->gstate);
+}
+
+void
+cairo_get_current_point (cairo_t *cr, double *x, double *y)
+{
+ _cairo_gstate_get_current_point (cr->gstate, x, y);
+}
+
+cairo_fill_rule_t
+cairo_get_fill_rule (cairo_t *cr)
+{
+ return _cairo_gstate_get_fill_rule (cr->gstate);
+}
+
+double
+cairo_get_line_width (cairo_t *cr)
+{
+ return _cairo_gstate_get_line_width (cr->gstate);
+}
+
+cairo_line_cap_t
+cairo_get_line_cap (cairo_t *cr)
+{
+ return _cairo_gstate_get_line_cap (cr->gstate);
+}
+
+cairo_line_join_t
+cairo_get_line_join (cairo_t *cr)
+{
+ return _cairo_gstate_get_line_join (cr->gstate);
+}
+
+double
+cairo_get_miter_limit (cairo_t *cr)
+{
+ return _cairo_gstate_get_miter_limit (cr->gstate);
+}
+
+cairo_surface_t *
+cairo_get_target_surface (cairo_t *cr)
+{
+ return _cairo_gstate_get_target_surface (cr->gstate);
}
cairo_status_t
Index: cairo.h
===================================================================
RCS file: /local/src/CVS/cairo/src/cairo.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- cairo.h 18 Jul 2003 19:42:49 -0000 1.2
+++ cairo.h 30 Jul 2003 15:30:51 -0000 1.3
@@ -28,7 +28,9 @@
#ifndef _CAIRO_H_
#define _CAIRO_H_
-#include <Xc.h>
+#include <X11/extensions/Xrender.h>
+#include <fontconfig/fontconfig.h>
+#include <ic.h>
typedef struct cairo cairo_t;
typedef struct cairo_surface cairo_surface_t;
@@ -131,17 +133,32 @@
/* XXX: Probably want to bite the bullet and expose a cairo_color_t object */
+/* XXX: I've been trying to come up with a sane way to specify:
+
+ cairo_set_color (cairo_t *cr, cairo_color_t *color);
+
+ Keith wants to be able to support super-luminescent colors,
+ (premultiplied colors with R/G/B greater than alpha). The current
+ API does not allow that. Adding a premulitplied RGBA cairo_color_t
+ would do the trick.
+
+ One problem though is that alpha is currently orthogonal to
+ color. For example, show_surface uses gstate->alpha but ignores the
+ color. So, it doesn't seem be right to have cairo_set_color modify
+ the behavior of cairo_show_surface.
+*/
+
void
cairo_set_rgb_color (cairo_t *cr, double red, double green, double blue);
void
-cairo_set_pattern (cairo_t *cr, cairo_surface_t *pattern);
+cairo_set_alpha (cairo_t *cr, double alpha);
void
-cairo_set_tolerance (cairo_t *cr, double tolerance);
+cairo_set_pattern (cairo_t *cr, cairo_surface_t *pattern);
void
-cairo_set_alpha (cairo_t *cr, double alpha);
+cairo_set_tolerance (cairo_t *cr, double tolerance);
typedef enum cairo_fill_rule {
CAIRO_FILL_RULE_WINDING,
@@ -239,14 +256,26 @@
void
cairo_rel_curve_to (cairo_t *cr,
- double dx1, double dy1,
- double dx2, double dy2,
- double dx3, double dy3);
+ double dx1, double dy1,
+ double dx2, double dy2,
+ double dx3, double dy3);
void
cairo_rectangle (cairo_t *cr,
- double x, double y,
- double width, double height);
+ double x, double y,
+ double width, double height);
+
+/* XXX: This is the same name that PostScript uses, but to me the name
+ suggests an actual drawing operation ala cairo_stroke --- especially
+ since I want to add a cairo_path_t and with that it would be
+ natural to have "cairo_stroke_path (cairo_t *, cairo_path_t *)"
+
+ Maybe we could use something like "cairo_outline_path (cairo_t *)"?
+*/
+/* XXX: NYI
+void
+cairo_stroke_path (cairo_t *cr);
+*/
void
cairo_close_path (cairo_t *cr);
@@ -306,14 +335,14 @@
void
cairo_get_rgb_color (cairo_t *cr, double *red, double *green, double *blue);
+double
+cairo_get_alpha (cairo_t *cr);
+
/* XXX: Do we want cairo_get_pattern as well? */
double
cairo_get_tolerance (cairo_t *cr);
-double
-cairo_get_alpha (cairo_t *cr);
-
void
cairo_get_current_point (cairo_t *cr, double *x, double *y);
@@ -369,23 +398,23 @@
*/
cairo_surface_t *
cairo_surface_create_for_drawable (Display *dpy,
- Drawable drawable,
- Visual *visual,
- cairo_format_t format,
- Colormap colormap);
+ Drawable drawable,
+ Visual *visual,
+ cairo_format_t format,
+ Colormap colormap);
cairo_surface_t *
cairo_surface_create_for_image (char *data,
- cairo_format_t format,
- int width,
- int height,
- int stride);
+ cairo_format_t format,
+ int width,
+ int height,
+ int stride);
cairo_surface_t *
cairo_surface_create_similar (cairo_surface_t *other,
- cairo_format_t format,
- int width,
- int height);
+ cairo_format_t format,
+ int width,
+ int height);
/* XXX: One problem with having RGB and A here in one function is that
it introduces the question of pre-multiplied vs. non-pre-multiplied
@@ -393,28 +422,31 @@
other public functions need it. */
cairo_surface_t *
cairo_surface_create_similar_solid (cairo_surface_t *other,
- cairo_format_t format,
- int width,
- int height,
- double red,
- double green,
- double blue,
- double alpha);
+ cairo_format_t format,
+ int width,
+ int height,
+ double red,
+ double green,
+ double blue,
+ double alpha);
void
cairo_surface_destroy (cairo_surface_t *surface);
-/* XXX: Should this take an X/Y offset as well? (Probably) */
cairo_status_t
cairo_surface_put_image (cairo_surface_t *surface,
- char *data,
- int width,
- int height,
- int stride);
+ char *data,
+ int width,
+ int height,
+ int stride);
-/* XXX: The Xc version of this function isn't quite working yet
+/* XXX: NYI
cairo_status_t
-cairo_surface_set_clip_region (cairo_surface_t *surface, Region region);
+cairo_surface_clip_restore (cairo_surface_t *surface);
+cairo_status_t
+cairo_surface_clip_rectangle (cairo_surface_t *surface,
+ int x, int y,
+ int width, int height);
*/
/* XXX: Note: The current Render/Ic implementations don't do the right
@@ -429,11 +461,11 @@
cairo_surface_get_matrix (cairo_surface_t *surface, cairo_matrix_t *matrix);
typedef enum cairo_filter {
- CAIRO_FILTER_FAST = XcFilterFast,
- CAIRO_FILTER_GOOD = XcFilterGood,
- CAIRO_FILTER_BEST = XcFilterBest,
- CAIRO_FILTER_NEAREST = XcFilterNearest,
- CAIRO_FILTER_BILINEAR = XcFilterBilinear
+ CAIRO_FILTER_FAST = IcFilterFast,
+ CAIRO_FILTER_GOOD = IcFilterGood,
+ CAIRO_FILTER_BEST = IcFilterBest,
+ CAIRO_FILTER_NEAREST = IcFilterNearest,
+ CAIRO_FILTER_BILINEAR = IcFilterBilinear
} cairo_filter_t;
cairo_status_t
Index: cairo_color.c
===================================================================
RCS file: /local/src/CVS/cairo/src/cairo_color.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- cairo_color.c 18 Jul 2003 18:34:19 -0000 1.1
+++ cairo_color.c 30 Jul 2003 15:30:51 -0000 1.2
@@ -27,10 +27,13 @@
#include "cairoint.h"
-static cairo_color_t CAIRO_COLOR_DEFAULT = { 1.0, 1.0, 1.0, 1.0, {0xffff, 0xffff, 0xffff, 0xffff}};
+static cairo_color_t CAIRO_COLOR_DEFAULT = {
+ 1.0, 1.0, 1.0, 1.0,
+ 0xffff, 0xffff, 0xffff, 0xffff
+};
static void
-_cairo_color_compute_xc_color (cairo_color_t *color);
+_cairo_color_compute_shorts (cairo_color_t *color);
void
_cairo_color_init (cairo_color_t *color)
@@ -44,31 +47,22 @@
/* Nothing to do here */
}
-static void
-_cairo_color_compute_xc_color (cairo_color_t *color)
-{
- color->xc_color.red = color->red * color->alpha * 0xffff;
- color->xc_color.green = color->green * color->alpha * 0xffff;
- color->xc_color.blue = color->blue * color->alpha * 0xffff;
- color->xc_color.alpha = color->alpha * 0xffff;
-}
-
void
_cairo_color_set_rgb (cairo_color_t *color, double red, double green, double blue)
{
- color->red = red;
+ color->red = red;
color->green = green;
- color->blue = blue;
+ color->blue = blue;
- _cairo_color_compute_xc_color (color);
+ _cairo_color_compute_shorts (color);
}
void
_cairo_color_get_rgb (cairo_color_t *color, double *red, double *green, double *blue)
{
- *red = color->red;
+ *red = color->red;
*green = color->green;
- *blue = color->blue;
+ *blue = color->blue;
}
void
@@ -76,5 +70,15 @@
{
color->alpha = alpha;
- _cairo_color_compute_xc_color (color);
+ _cairo_color_compute_shorts (color);
}
+
+static void
+_cairo_color_compute_shorts (cairo_color_t *color)
+{
+ color->red_short = (color->red * color->alpha) * 0xffff;
+ color->green_short = (color->green * color->alpha) * 0xffff;
+ color->blue_short = (color->blue * color->alpha) * 0xffff;
+ color->alpha_short = color->alpha * 0xffff;
+}
+
Index: cairo_font.c
===================================================================
RCS file: /local/src/CVS/cairo/src/cairo_font.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- cairo_font.c 18 Jul 2003 18:34:19 -0000 1.1
+++ cairo_font.c 30 Jul 2003 15:30:51 -0000 1.2
@@ -154,7 +154,7 @@
FcPatternAddMatrix (pattern, "matrix", &fc_matrix);
- /* XXX: Need to abandon Xft and use Xc instead */
+ /* XXX: Need to make a generic (non-Xft) backend for text. */
/* When I do that I can throw away these Display pointers */
font->dpy = gstate->surface->dpy;
match = XftFontMatch (font->dpy, DefaultScreen (font->dpy), pattern, &result);
Index: cairo_gstate.c
===================================================================
RCS file: /local/src/CVS/cairo/src/cairo_gstate.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- cairo_gstate.c 26 Jul 2003 06:16:31 -0000 1.2
+++ cairo_gstate.c 30 Jul 2003 15:30:51 -0000 1.3
@@ -227,12 +227,12 @@
_cairo_color_init (&clear);
_cairo_color_set_alpha (&clear, 0);
- XcFillRectangle (CAIRO_OPERATOR_SRC,
- _cairo_surface_get_xc_surface (gstate->surface),
- &clear.xc_color,
- 0, 0,
- _cairo_surface_get_width (gstate->surface),
- _cairo_surface_get_height (gstate->surface));
+ _cairo_surface_fill_rectangle (gstate->surface,
+ CAIRO_OPERATOR_SRC,
+ &clear,
+ 0, 0,
+ _cairo_surface_get_width (gstate->surface),
+ _cairo_surface_get_height (gstate->surface));
return CAIRO_STATUS_SUCCESS;
}
@@ -259,15 +259,15 @@
* XXX: This could be made much more efficient by using
_cairo_surface_get_damaged_width/Height if cairo_surface_t actually kept
track of such informaton. *
- XcComposite (gstate->operator,
- _cairo_surface_get_xc_surface (gstate->surface),
- _cairo_surface_get_xc_surface (&mask),
- _cairo_surface_get_xc_surface (gstate->parent_surface),
- 0, 0,
- 0, 0,
- 0, 0,
- _cairo_surface_get_width (gstate->surface),
- _cairo_surface_get_height (gstate->surface));
+ _cairo_surface_composite (gstate->operator,
+ gstate->surface,
+ mask,
+ gstate->parent_surface,
+ 0, 0,
+ 0, 0,
+ 0, 0,
+ _cairo_surface_get_width (gstate->surface),
+ _cairo_surface_get_height (gstate->surface));
_cairo_surface_fini (&mask);
@@ -416,6 +416,12 @@
}
cairo_status_t
+_cairo_gstate_get_fill_rule (cairo_gstate_t *gstate)
+{
+ return gstate->fill_rule;
+}
+
+cairo_status_t
_cairo_gstate_set_line_width (cairo_gstate_t *gstate, double width)
{
gstate->line_width = width;
@@ -495,7 +501,7 @@
}
cairo_status_t
-cairo_gstate_translate (cairo_gstate_t *gstate, double tx, double ty)
+_cairo_gstate_translate (cairo_gstate_t *gstate, double tx, double ty)
{
cairo_matrix_t tmp;
@@ -597,7 +603,7 @@
}
cairo_status_t
-cairo_gstateransform_point (cairo_gstate_t *gstate, double *x, double *y)
+_cairo_gstate_transform_point (cairo_gstate_t *gstate, double *x, double *y)
{
cairo_matrix_transform_point (&gstate->ctm, x, y);
@@ -605,7 +611,7 @@
}
cairo_status_t
-cairo_gstateransform_distance (cairo_gstate_t *gstate, double *dx, double *dy)
+_cairo_gstate_transform_distance (cairo_gstate_t *gstate, double *dx, double *dy)
{
cairo_matrix_transform_distance (&gstate->ctm, dx, dy);
@@ -760,6 +766,17 @@
return status;
}
+/* XXX: NYI
+cairo_status_t
+_cairo_gstate_stroke_path (cairo_gstate_t *gstate)
+{
+ cairo_status_t status;
+
+ _cairo_pen_init (&gstate
+ return CAIRO_STATUS_SUCCESS;
+}
+*/
+
cairo_status_t
_cairo_gstate_close_path (cairo_gstate_t *gstate)
{
@@ -823,12 +840,12 @@
cairo_surface_t *dst,
cairo_traps_t *traps)
{
- if (traps->num_xtraps == 0)
+ if (traps->num_traps == 0)
return CAIRO_STATUS_SUCCESS;
if (gstate->clip.surface) {
- XFixed xoff, yoff;
- XTrapezoid *t;
+ cairo_fixed_t xoff, yoff;
+ cairo_trapezoid_t *t;
int i;
cairo_surface_t *intermediate, *white;
@@ -844,12 +861,13 @@
gstate->clip.height,
0.0, 0.0, 0.0, 0.0);
- /* Ugh. The Xc/ (Render) interface doesn't allow an offset for
- the trapezoids. Need to manually shift all the coordinates
- to align with the offset origin of the clip surface. */
+ /* Ugh. The cairo_composite/(Render) interface doesn't allow
+ an offset for the trapezoids. Need to manually shift all
+ the coordinates to align with the offset origin of the clip
+ surface. */
xoff = XDoubleToFixed (gstate->clip.x);
yoff = XDoubleToFixed (gstate->clip.y);
- for (i=0, t=traps->xtraps; i < traps->num_xtraps; i++, t++) {
+ for (i=0, t=traps->traps; i < traps->num_traps; i++, t++) {
t->top -= yoff;
t->bottom -= yoff;
t->left.p1.x -= xoff;
@@ -862,49 +880,45 @@
t->right.p2.y -= yoff;
}
- XcCompositeTrapezoids (CAIRO_OPERATOR_ADD,
- white->xc_surface,
- intermediate->xc_surface,
- 0, 0,
- traps->xtraps,
- traps->num_xtraps);
- XcComposite (CAIRO_OPERATOR_IN,
- gstate->clip.surface->xc_surface,
- NULL,
- intermediate->xc_surface,
- 0, 0, 0, 0, 0, 0,
- gstate->clip.width, gstate->clip.height);
- XcComposite (operator,
- src->xc_surface,
- intermediate->xc_surface,
- dst->xc_surface,
- 0, 0,
- 0, 0,
- gstate->clip.x,
- gstate->clip.y,
- gstate->clip.width,
- gstate->clip.height);
+ _cairo_surface_composite_trapezoids (CAIRO_OPERATOR_ADD,
+ white, intermediate,
+ 0, 0,
+ traps->traps,
+ traps->num_traps);
+ _cairo_surface_composite (CAIRO_OPERATOR_IN,
+ gstate->clip.surface,
+ NULL,
+ intermediate,
+ 0, 0, 0, 0, 0, 0,
+ gstate->clip.width, gstate->clip.height);
+ _cairo_surface_composite (operator,
+ src, intermediate, dst,
+ 0, 0,
+ 0, 0,
+ gstate->clip.x,
+ gstate->clip.y,
+ gstate->clip.width,
+ gstate->clip.height);
cairo_surface_destroy (intermediate);
cairo_surface_destroy (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;
+ if (traps->traps[0].left.p1.y < traps->traps[0].left.p2.y) {
+ xoff = traps->traps[0].left.p1.x;
+ yoff = traps->traps[0].left.p1.y;
} else {
- xoff = traps->xtraps[0].left.p2.x;
- yoff = traps->xtraps[0].left.p2.y;
+ xoff = traps->traps[0].left.p2.x;
+ yoff = traps->traps[0].left.p2.y;
}
- XcCompositeTrapezoids (gstate->operator,
- src->xc_surface,
- dst->xc_surface,
- XFixedToDouble (xoff) - gstate->pattern_offset.x,
- XFixedToDouble (yoff) - gstate->pattern_offset.y,
- traps->xtraps,
- traps->num_xtraps);
+ _cairo_surface_composite_trapezoids (gstate->operator,
+ src, dst,
+ XFixedToDouble (xoff) - gstate->pattern_offset.x,
+ XFixedToDouble (yoff) - gstate->pattern_offset.y,
+ traps->traps,
+ traps->num_traps);
}
return CAIRO_STATUS_SUCCESS;
@@ -996,28 +1010,30 @@
}
cairo_status_t
-cairo_gstateransform_font (cairo_gstate_t *gstate,
- double a, double b,
- double c, double d)
+_cairo_gstate_transform_font (cairo_gstate_t *gstate,
+ double a, double b,
+ double c, double d)
{
return cairo_font_transform (&gstate->font,
a, b, c, d);
}
cairo_status_t
-cairo_gstateext_extents (cairo_gstate_t *gstate,
- const unsigned char *utf8,
- double *x, double *y,
- double *width, double *height,
- double *dx, double *dy)
+_cairo_gstate_text_extents (cairo_gstate_t *gstate,
+ const unsigned char *utf8,
+ double *x, double *y,
+ double *width, double *height,
+ double *dx, double *dy)
{
XftFont *xft_font;
XGlyphInfo extents;
+ if (gstate->surface->dpy == 0)
+ return CAIRO_STATUS_SUCCESS;
+
_cairo_font_resolve_xft_font (&gstate->font, gstate, &xft_font);
- /* XXX: Need to abandon Xft and use Xc instead */
- /* (until I do, this call will croak on IcImage cairo_surface_ts */
+ /* XXX: Need to make a generic (non-Xft) backend for text. */
XftTextExtentsUtf8 (gstate->surface->dpy,
xft_font,
utf8,
@@ -1050,14 +1066,12 @@
_cairo_font_resolve_xft_font (&gstate->font, gstate, &xft_font);
- /* XXX: Need to abandon Xft and use Xc instead */
- /* (until I do, this call will croak on IcImage cairo_surface_ts */
- /* (also, this means text clipping isn't working. Basically text is broken.) */
+ /* XXX: Need to make a generic (non-Xft) backend for text. */
XftTextRenderUtf8 (gstate->surface->dpy,
gstate->operator,
- _cairo_surface_get_picture (gstate->solid),
+ gstate->solid->picture,
xft_font,
- _cairo_surface_get_picture (gstate->surface),
+ gstate->surface->picture,
0, 0,
gstate->current_pt.x,
gstate->current_pt.y,
@@ -1107,15 +1121,13 @@
/* XXX: The rendered size is sometimes 1 or 2 pixels short from
what I expect. Need to fix this. */
- XcComposite (gstate->operator,
- surface->xc_surface,
- mask->xc_surface,
- gstate->surface->xc_surface,
- device_x, device_y,
- 0, 0,
- device_x, device_y,
- device_width,
- device_height);
+ _cairo_surface_composite (gstate->operator,
+ surface, mask, gstate->surface,
+ device_x, device_y,
+ 0, 0,
+ device_x, device_y,
+ device_width,
+ device_height);
cairo_surface_destroy (mask);
Index: cairo_path.c
===================================================================
RCS file: /local/src/CVS/cairo/src/cairo_path.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- cairo_path.c 18 Jul 2003 19:42:49 -0000 1.2
+++ cairo_path.c 30 Jul 2003 15:30:51 -0000 1.3
@@ -30,7 +30,7 @@
/* private functions */
static cairo_status_t
-_cairo_path_add (cairo_path_t *path, cairo_path_op_t op, XPointFixed *pts, int num_pts);
+_cairo_path_add (cairo_path_t *path, cairo_path_op_t op, cairo_point_t *pts, int num_pts);
static void
_cairo_path_add_op_buf (cairo_path_t *path, cairo_path_op_buf_t *op);
@@ -60,7 +60,7 @@
_cairo_path_arg_buf_destroy (cairo_path_arg_buf_t *buf);
static void
-_cairo_path_arg_buf_add (cairo_path_arg_buf_t *arg, XPointFixed *pts, int num_pts);
+_cairo_path_arg_buf_add (cairo_path_arg_buf_t *arg, cairo_point_t *pts, int num_pts);
void
_cairo_path_init (cairo_path_t *path)
@@ -125,7 +125,7 @@
cairo_status_t
_cairo_path_move_to (cairo_path_t *path, double x, double y)
{
- XPointFixed pt;
+ cairo_point_t pt;
pt.x = XDoubleToFixed (x);
pt.y = XDoubleToFixed (y);
@@ -136,7 +136,7 @@
cairo_status_t
_cairo_path_line_to (cairo_path_t *path, double x, double y)
{
- XPointFixed pt;
+ cairo_point_t pt;
pt.x = XDoubleToFixed (x);
pt.y = XDoubleToFixed (y);
@@ -150,7 +150,7 @@
double x2, double y2,
double x3, double y3)
{
- XPointFixed pt[3];
+ cairo_point_t pt[3];
pt[0].x = XDoubleToFixed (x1);
pt[0].y = XDoubleToFixed (y1);
@@ -171,7 +171,7 @@
}
static cairo_status_t
-_cairo_path_add (cairo_path_t *path, cairo_path_op_t op, XPointFixed *pts, int num_pts)
+_cairo_path_add (cairo_path_t *path, cairo_path_op_t op, cairo_point_t *pts, int num_pts)
{
cairo_status_t status;
@@ -300,7 +300,7 @@
}
static void
-_cairo_path_arg_buf_add (cairo_path_arg_buf_t *arg, XPointFixed *pts, int num_pts)
+_cairo_path_arg_buf_add (cairo_path_arg_buf_t *arg, cairo_point_t *pts, int num_pts)
{
int i;
@@ -328,9 +328,9 @@
cairo_path_op_t op;
cairo_path_arg_buf_t *arg_buf = path->arg_head;
int buf_i = 0;
- XPointFixed pt[CAIRO_PATH_OP_MAX_ARGS];
- XPointFixed current = {0, 0};
- XPointFixed first = {0, 0};
+ cairo_point_t pt[CAIRO_PATH_OP_MAX_ARGS];
+ cairo_point_t current = {0, 0};
+ cairo_point_t first = {0, 0};
int has_current = 0;
int has_edge = 0;
int step = (dir == cairo_path_direction_forward) ? 1 : -1;
@@ -375,7 +375,7 @@
switch (op) {
case cairo_path_op_move_to:
if (has_edge) {
- status = (*cb->DoneSubPath) (closure, cairo_sub_path_done_cap);
+ status = (*cb->done_sub_path) (closure, cairo_sub_path_done_cap);
if (status)
return status;
}
@@ -386,7 +386,7 @@
break;
case cairo_path_op_line_to:
if (has_current) {
- status = (*cb->AddEdge) (closure, ¤t, &pt[0]);
+ status = (*cb->add_edge) (closure, ¤t, &pt[0]);
if (status)
return status;
current = pt[0];
@@ -400,7 +400,7 @@
break;
case cairo_path_op_curve_to:
if (has_current) {
- status = (*cb->AddSpline) (closure, ¤t, &pt[0], &pt[1], &pt[2]);
+ status = (*cb->add_spline) (closure, ¤t, &pt[0], &pt[1], &pt[2]);
if (status)
return status;
current = pt[2];
@@ -414,8 +414,8 @@
break;
case cairo_path_op_close_path:
if (has_edge) {
- (*cb->AddEdge) (closure, ¤t, &first);
- (*cb->DoneSubPath) (closure, cairo_sub_path_done_join);
+ (*cb->add_edge) (closure, ¤t, &first);
+ (*cb->done_sub_path) (closure, cairo_sub_path_done_join);
}
current.x = 0;
current.y = 0;
@@ -428,9 +428,9 @@
}
}
if (has_edge)
- (*cb->DoneSubPath) (closure, cairo_sub_path_done_cap);
+ (*cb->done_sub_path) (closure, cairo_sub_path_done_cap);
- return (*cb->DonePath) (closure);
+ return (*cb->done_path) (closure);
}
Index: cairo_path_bounds.c
===================================================================
RCS file: /local/src/CVS/cairo/src/cairo_path_bounds.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- cairo_path_bounds.c 18 Jul 2003 19:42:49 -0000 1.2
+++ cairo_path_bounds.c 30 Jul 2003 15:30:51 -0000 1.3
@@ -30,10 +30,10 @@
typedef struct cairo_path_bounder {
int has_pt;
- XFixed min_x;
- XFixed min_y;
- XFixed max_x;
- XFixed max_y;
+ cairo_fixed_t min_x;
+ cairo_fixed_t min_y;
+ cairo_fixed_t max_x;
+ cairo_fixed_t max_y;
} cairo_path_bounder_t;
static void
@@ -43,14 +43,15 @@
_cairo_path_bounder_fini (cairo_path_bounder_t *bounder);
static cairo_status_t
-_cairo_path_bounder_add_point (cairo_path_bounder_t *bounder, XPointFixed *pt);
+_cairo_path_bounder_add_point (cairo_path_bounder_t *bounder, cairo_point_t *pt);
static cairo_status_t
-_cairo_path_bounder_add_edge (void *closure, XPointFixed *p1, XPointFixed *p2);
+_cairo_path_bounder_add_edge (void *closure, cairo_point_t *p1, cairo_point_t *p2);
static cairo_status_t
_cairo_path_bounder_add_spline (void *closure,
- XPointFixed *a, XPointFixed *b, XPointFixed *c, XPointFixed *d);
+ cairo_point_t *a, cairo_point_t *b,
+ cairo_point_t *c, cairo_point_t *d);
static cairo_status_t
_cairo_path_bounder_done_sub_path (void *closure, cairo_sub_path_done_t done);
@@ -71,7 +72,7 @@
}
static cairo_status_t
-_cairo_path_bounder_add_point (cairo_path_bounder_t *bounder, XPointFixed *pt)
+_cairo_path_bounder_add_point (cairo_path_bounder_t *bounder, cairo_point_t *pt)
{
if (bounder->has_pt) {
if (pt->x < bounder->min_x)
@@ -98,7 +99,7 @@
}
static cairo_status_t
-_cairo_path_bounder_add_edge (void *closure, XPointFixed *p1, XPointFixed *p2)
+_cairo_path_bounder_add_edge (void *closure, cairo_point_t *p1, cairo_point_t *p2)
{
cairo_path_bounder_t *bounder = closure;
@@ -110,7 +111,8 @@
static cairo_status_t
_cairo_path_bounder_add_spline (void *closure,
- XPointFixed *a, XPointFixed *b, XPointFixed *c, XPointFixed *d)
+ cairo_point_t *a, cairo_point_t *b,
+ cairo_point_t *c, cairo_point_t *d)
{
cairo_path_bounder_t *bounder = closure;
Index: cairo_path_fill.c
===================================================================
RCS file: /local/src/CVS/cairo/src/cairo_path_fill.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- cairo_path_fill.c 18 Jul 2003 19:42:49 -0000 1.2
+++ cairo_path_fill.c 30 Jul 2003 15:30:51 -0000 1.3
@@ -41,10 +41,12 @@
_cairo_filler_fini (cairo_filler_t *filler);
static cairo_status_t
-_cairo_filler_add_edge (void *closure, XPointFixed *p1, XPointFixed *p2);
+_cairo_filler_add_edge (void *closure, cairo_point_t *p1, cairo_point_t *p2);
static cairo_status_t
-_cairo_filler_add_spline (void *closure, XPointFixed *a, XPointFixed *b, XPointFixed *c, XPointFixed *d);
+_cairo_filler_add_spline (void *closure,
+ cairo_point_t *a, cairo_point_t *b,
+ cairo_point_t *c, cairo_point_t *d);
static cairo_status_t
_cairo_filler_done_sub_path (void *closure, cairo_sub_path_done_t done);
@@ -68,7 +70,7 @@
}
static cairo_status_t
-_cairo_filler_add_edge (void *closure, XPointFixed *p1, XPointFixed *p2)
+_cairo_filler_add_edge (void *closure, cairo_point_t *p1, cairo_point_t *p2)
{
cairo_filler_t *filler = closure;
cairo_polygon_t *polygon = &filler->polygon;
@@ -77,7 +79,9 @@
}
static cairo_status_t
-_cairo_filler_add_spline (void *closure, XPointFixed *a, XPointFixed *b, XPointFixed *c, XPointFixed *d)
+_cairo_filler_add_spline (void *closure,
+ cairo_point_t *a, cairo_point_t *b,
+ cairo_point_t *c, cairo_point_t *d)
{
int i;
cairo_status_t status = CAIRO_STATUS_SUCCESS;
Index: cairo_path_stroke.c
===================================================================
RCS file: /local/src/CVS/cairo/src/cairo_path_stroke.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- cairo_path_stroke.c 18 Jul 2003 19:42:49 -0000 1.2
+++ cairo_path_stroke.c 30 Jul 2003 15:30:51 -0000 1.3
@@ -49,13 +49,15 @@
_cairo_stroker_fini (cairo_stroker_t *stroker);
static cairo_status_t
-_cairo_stroker_add_edge (void *closure, XPointFixed *p1, XPointFixed *p2);
+_cairo_stroker_add_edge (void *closure, cairo_point_t *p1, cairo_point_t *p2);
static cairo_status_t
-_cairo_stroker_add_edge_dashed (void *closure, XPointFixed *p1, XPointFixed *p2);
+_cairo_stroker_add_edge_dashed (void *closure, cairo_point_t *p1, cairo_point_t *p2);
static cairo_status_t
-_cairo_stroker_add_spline (void *closure, XPointFixed *a, XPointFixed *b, XPointFixed *c, XPointFixed *d);
+_cairo_stroker_add_spline (void *closure,
+ cairo_point_t *a, cairo_point_t *b,
+ cairo_point_t *c, cairo_point_t *d);
static cairo_status_t
_cairo_stroker_done_sub_path (void *closure, cairo_sub_path_done_t done);
@@ -64,7 +66,7 @@
_cairo_stroker_done_path (void *closure);
static void
-_translate_point (XPointFixed *pt, XPointFixed *offset);
+_translate_point (cairo_point_t *pt, cairo_point_t *offset);
static int
_cairo_stroker_face_clockwise (cairo_stroke_face_t *in, cairo_stroke_face_t *out);
@@ -125,7 +127,7 @@
}
static void
-_translate_point (XPointFixed *pt, XPointFixed *offset)
+_translate_point (cairo_point_t *pt, cairo_point_t *offset)
{
pt->x += offset->x;
pt->y += offset->y;
@@ -134,14 +136,12 @@
static int
_cairo_stroker_face_clockwise (cairo_stroke_face_t *in, cairo_stroke_face_t *out)
{
- XPointDouble d_in, d_out;
+ cairo_slope_t in_slope, out_slope;
- d_in.x = XFixedToDouble (in->cw.x - in->pt.x);
- d_in.y = XFixedToDouble (in->cw.y - in->pt.y);
- d_out.x = XFixedToDouble (out->cw.x - out->pt.x);
- d_out.y = XFixedToDouble (out->cw.y - out->pt.y);
+ _cairo_slope_init (&in_slope, &in->pt, &in->cw);
+ _cairo_slope_init (&out_slope, &out->pt, &out->cw);
- return d_out.y * d_in.x > d_in.y * d_out.x;
+ return _cairo_slope_clockwise (&in_slope, &out_slope);
}
static cairo_status_t
@@ -150,7 +150,7 @@
cairo_status_t status;
cairo_gstate_t *gstate = stroker->gstate;
int clockwise = _cairo_stroker_face_clockwise (out, in);
- XPointFixed *inpt, *outpt;
+ cairo_point_t *inpt, *outpt;
if (in->cw.x == out->cw.x
&& in->cw.y == out->cw.y
@@ -171,7 +171,7 @@
case CAIRO_LINE_JOIN_ROUND: {
int i;
int start, step, stop;
- XPointFixed tri[3], initial, final;
+ cairo_point_t tri[3], initial, final;
cairo_pen_t *pen = &gstate->pen_regular;
tri[0] = in->pt;
@@ -219,7 +219,7 @@
XDouble x1, y1, x2, y2;
XDouble mx, my;
XDouble dx1, dx2, dy1, dy2;
- XPointFixed outer;
+ cairo_point_t outer;
x1 = XFixedToDouble (inpt->x);
y1 = XFixedToDouble (inpt->y);
@@ -256,7 +256,7 @@
/* fall through ... */
}
case CAIRO_LINE_JOIN_BEVEL: {
- XPointFixed tri[3];
+ cairo_point_t tri[3];
tri[0] = in->pt;
tri[1] = *inpt;
tri[2] = *outpt;
@@ -279,8 +279,8 @@
case CAIRO_LINE_CAP_ROUND: {
int i;
int start, stop;
- cairo_slope_fixed_t slope;
- XPointFixed tri[3];
+ cairo_slope_t slope;
+ cairo_point_t tri[3];
cairo_pen_t *pen = &gstate->pen_regular;
slope = f->dev_vector;
@@ -303,8 +303,8 @@
}
case CAIRO_LINE_CAP_SQUARE: {
double dx, dy;
- cairo_slope_fixed_t fvector;
- XPointFixed occw, ocw;
+ cairo_slope_t fvector;
+ cairo_point_t occw, ocw;
cairo_polygon_t polygon;
_cairo_polygon_init (&polygon);
@@ -338,12 +338,12 @@
}
static void
-_compute_face (XPointFixed *pt, cairo_slope_fixed_t *slope, cairo_gstate_t *gstate, cairo_stroke_face_t *face)
+_compute_face (cairo_point_t *pt, cairo_slope_t *slope, cairo_gstate_t *gstate, cairo_stroke_face_t *face)
{
double mag, tmp;
double dx, dy;
XPointDouble usr_vector;
- XPointFixed offset_ccw, offset_cw;
+ cairo_point_t offset_ccw, offset_cw;
dx = XFixedToDouble (slope->dx);
dy = XFixedToDouble (slope->dy);
@@ -388,12 +388,12 @@
}
static cairo_status_t
-_cairo_stroker_add_sub_edge (cairo_stroker_t *stroker, XPointFixed *p1, XPointFixed *p2,
+_cairo_stroker_add_sub_edge (cairo_stroker_t *stroker, cairo_point_t *p1, cairo_point_t *p2,
cairo_stroke_face_t *start, cairo_stroke_face_t *end)
{
cairo_gstate_t *gstate = stroker->gstate;
- XPointFixed quad[4];
- cairo_slope_fixed_t slope;
+ cairo_point_t quad[4];
+ cairo_slope_t slope;
if (p1->x == p2->x && p1->y == p2->y) {
/* XXX: Need to rethink how this case should be handled, (both
@@ -402,7 +402,7 @@
return CAIRO_STATUS_SUCCESS;
}
- _compute_slope (p1, p2, &slope);
+ _cairo_slope_init (&slope, p1, p2);
_compute_face (p1, &slope, gstate, start);
/* XXX: This could be optimized slightly by not calling
@@ -419,7 +419,7 @@
}
static cairo_status_t
-_cairo_stroker_add_edge (void *closure, XPointFixed *p1, XPointFixed *p2)
+_cairo_stroker_add_edge (void *closure, cairo_point_t *p1, cairo_point_t *p2)
{
cairo_status_t status;
cairo_stroker_t *stroker = closure;
@@ -458,7 +458,7 @@
* Dashed lines. Cap each dash end, join around turns when on
*/
static cairo_status_t
-_cairo_stroker_add_edge_dashed (void *closure, XPointFixed *p1, XPointFixed *p2)
+_cairo_stroker_add_edge_dashed (void *closure, cairo_point_t *p1, cairo_point_t *p2)
{
cairo_status_t status = CAIRO_STATUS_SUCCESS;
cairo_stroker_t *stroker = closure;
@@ -466,7 +466,7 @@
double mag, remain, tmp;
double dx, dy;
double dx2, dy2;
- XPointFixed fd1, fd2;
+ cairo_point_t fd1, fd2;
int first = 1;
cairo_stroke_face_t sub_start, sub_end;
@@ -564,7 +564,9 @@
}
static cairo_status_t
-_cairo_stroker_add_spline (void *closure, XPointFixed *a, XPointFixed *b, XPointFixed *c, XPointFixed *d)
+_cairo_stroker_add_spline (void *closure,
+ cairo_point_t *a, cairo_point_t *b,
+ cairo_point_t *c, cairo_point_t *d)
{
cairo_status_t status = CAIRO_STATUS_SUCCESS;
cairo_stroker_t *stroker = closure;
@@ -572,7 +574,7 @@
cairo_spline_t spline;
cairo_pen_t pen;
cairo_stroke_face_t start, end;
- XPointFixed extra_points[4];
+ cairo_point_t extra_points[4];
status = _cairo_spline_init (&spline, a, b, c, d);
if (status == cairo_int_status_degenerate)
@@ -645,7 +647,7 @@
/* fall through... */
case cairo_sub_path_done_cap:
if (stroker->have_first) {
- XPointFixed t;
+ cairo_point_t t;
/* The initial cap needs an outward facing vector. Reverse everything */
stroker->first.usr_vector.x = -stroker->first.usr_vector.x;
stroker->first.usr_vector.y = -stroker->first.usr_vector.y;
@@ -702,8 +704,8 @@
_cairo_stroker_init (&stroker, gstate, traps);
status = _cairo_path_interpret (path,
- cairo_path_direction_forward,
- callbacks, &stroker);
+ cairo_path_direction_forward,
+ callbacks, &stroker);
if (status) {
_cairo_stroker_fini (&stroker);
return status;
Index: cairo_pen.c
===================================================================
RCS file: /local/src/CVS/cairo/src/cairo_pen.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- cairo_pen.c 24 Jul 2003 04:20:25 -0000 1.3
+++ cairo_pen.c 30 Jul 2003 15:30:51 -0000 1.4
@@ -34,13 +34,7 @@
_cairo_pen_compute_slopes (cairo_pen_t *pen);
static int
-_slope_clockwise (cairo_slope_fixed_t *a, cairo_slope_fixed_t *b);
-
-static int
-_slope_counter_clockwise (cairo_slope_fixed_t *a, cairo_slope_fixed_t *b);
-
-static int
-_cairo_pen_vertex_compare_by_theta (const void *a, const void *b);
+_pen_vertex_compare (const void *av, const void *bv);
static cairo_status_t
_cairo_pen_stroke_spline_half (cairo_pen_t *pen, cairo_spline_t *spline, cairo_pen_stroke_direction_t dir, cairo_polygon_t *polygon);
@@ -60,8 +54,6 @@
_cairo_pen_init (cairo_pen_t *pen, double radius, cairo_gstate_t *gstate)
{
int i;
- cairo_pen_vertex_t *v;
- double dx, dy;
if (pen->num_vertices) {
/* XXX: It would be nice to notice that the pen is already properly constructed.
@@ -87,17 +79,13 @@
}
for (i=0; i < pen->num_vertices; i++) {
- v = &pen->vertex[i];
- v->theta = 2 * M_PI * i / (double) pen->num_vertices;
- dx = radius * cos (v->theta);
- dy = radius * sin (v->theta);
+ double theta = 2 * M_PI * i / (double) pen->num_vertices;
+ double dx = radius * cos (theta);
+ double dy = radius * sin (theta);
+ cairo_pen_vertex_t *v = &pen->vertex[i];
cairo_matrix_transform_distance (&gstate->ctm, &dx, &dy);
v->pt.x = XDoubleToFixed (dx);
v->pt.y = XDoubleToFixed (dy);
- /* Recompute theta in device space */
- v->theta = atan2 (v->pt.y, v->pt.x);
- if (v->theta < 0)
- v->theta += 2 * M_PI;
}
_cairo_pen_compute_slopes (pen);
@@ -128,26 +116,10 @@
return CAIRO_STATUS_SUCCESS;
}
-static int
-_cairo_pen_vertex_compare_by_theta (const void *a, const void *b)
-{
- double diff;
- const cairo_pen_vertex_t *va = a;
- const cairo_pen_vertex_t *vb = b;
-
- diff = va->theta - vb->theta;
- if (diff < 0)
- return -1;
- else if (diff > 0)
- return 1;
- else
- return 0;
-}
-
cairo_status_t
-_cairo_pen_add_points (cairo_pen_t *pen, XPointFixed *pt, int num_pts)
+_cairo_pen_add_points (cairo_pen_t *pen, cairo_point_t *pt, int num_pts)
{
- int i, j;
+ int i;
cairo_pen_vertex_t *v, *v_next, *new_vertex;
pen->num_vertices += num_pts;
@@ -162,21 +134,18 @@
for (i=0; i < num_pts; i++) {
v = &pen->vertex[pen->num_vertices-(i+1)];
v->pt = pt[i];
- v->theta = atan2 (v->pt.y, v->pt.x);
- if (v->theta < 0)
- v->theta += 2 * M_PI;
}
- qsort (pen->vertex, pen->num_vertices, sizeof (cairo_pen_vertex_t), _cairo_pen_vertex_compare_by_theta);
+ qsort (pen->vertex, pen->num_vertices, sizeof (cairo_pen_vertex_t), _pen_vertex_compare);
/* eliminate any duplicate vertices */
- for (i=0; i < pen->num_vertices - 1; i++ ) {
+ for (i=0; i < pen->num_vertices; i++ ) {
v = &pen->vertex[i];
- v_next = &pen->vertex[i+1];
- if (v->pt.x == v_next->pt.x && v->pt.y == v_next->pt.y) {
- for (j=i+1; j < pen->num_vertices - 1; j++)
- pen->vertex[j] = pen->vertex[j+1];
+ v_next = (i < pen->num_vertices - 1) ? &pen->vertex[i+1] : &pen->vertex[0];
+ if (_pen_vertex_compare (v, v_next) == 0) {
pen->num_vertices--;
+ memmove (&pen->vertex[i], &pen->vertex[i+1],
+ (pen->num_vertices - i) * sizeof (cairo_pen_vertex_t));
/* There may be more of the same duplicate, check again */
i--;
}
@@ -219,34 +188,53 @@
v = &pen->vertex[i];
next = &pen->vertex[(i + 1) % pen->num_vertices];
- _compute_slope (&prev->pt, &v->pt, &v->slope_cw);
- _compute_slope (&v->pt, &next->pt, &v->slope_ccw);
+ _cairo_slope_init (&v->slope_cw, &prev->pt, &v->pt);
+ _cairo_slope_init (&v->slope_ccw, &v->pt, &next->pt);
}
}
-/* Is a clockwise of b?
+/* Is a further clockwise from (1,0) than b?
*
- * NOTE: The strict equality here is not significant in and of itself,
- * but there are functions up above that are sensitive to it,
- * (cf. _cairo_pen_find_active_cw_vertex_index).
+ * There are a two special cases to consider:
+ * 1) a and b are not in the same half plane.
+ * 2) both a and b are on the X axis
+ * After that, the computation is a simple slope comparison.
*/
static int
-_slope_clockwise (cairo_slope_fixed_t *a, cairo_slope_fixed_t *b)
+_pen_vertex_compare (const void *av, const void *bv)
{
- return ((cairo_fixed_48_16_t) b->dy * (cairo_fixed_48_16_t) a->dx
- > (cairo_fixed_48_16_t) a->dy * (cairo_fixed_48_16_t) b->dx);
-}
+ const cairo_pen_vertex_t *a = av;
+ const cairo_pen_vertex_t *b = bv;
+ cairo_fixed_48_16_t diff;
-static int
-_slope_counter_clockwise (cairo_slope_fixed_t *a, cairo_slope_fixed_t *b)
-{
- return ! _slope_clockwise (a, b);
+ int a_above = a->pt.y >= 0;
+ int b_above = b->pt.y >= 0;
+
+ if (a_above != b_above)
+ return b_above - a_above;
+
+ if (a->pt.y == 0 && b->pt.y == 0) {
+ int a_right = a->pt.x >= 0;
+ int b_right = b->pt.x >= 0;
+
+ if (a_right != b_right)
+ return b_right - a_right;
+ }
+
+ diff = ((cairo_fixed_48_16_t) a->pt.y * (cairo_fixed_48_16_t) b->pt.x
+ - (cairo_fixed_48_16_t) b->pt.y * (cairo_fixed_48_16_t) a->pt.x);
+
+ if (diff > 0)
+ return 1;
+ if (diff < 0)
+ return -1;
+ return 0;
}
/* Find active pen vertex for clockwise edge of stroke at the given slope.
*
* NOTE: The behavior of this function is sensitive to the sense of
- * the inequality within _slope_clockwise/_slope_counter_clockwise.
+ * the inequality within _cairo_slope_clockwise/_cairo_slope_counter_clockwise.
*
* The issue is that the slope_ccw member of one pen vertex will be
* equivalent to the slope_cw member of the next pen vertex in a
@@ -255,14 +243,14 @@
*/
cairo_status_t
_cairo_pen_find_active_cw_vertex_index (cairo_pen_t *pen,
- cairo_slope_fixed_t *slope,
+ cairo_slope_t *slope,
int *active)
{
int i;
for (i=0; i < pen->num_vertices; i++) {
- if (_slope_clockwise (slope, &pen->vertex[i].slope_ccw)
- && _slope_counter_clockwise (slope, &pen->vertex[i].slope_cw))
+ if (_cairo_slope_clockwise (slope, &pen->vertex[i].slope_ccw)
+ && _cairo_slope_counter_clockwise (slope, &pen->vertex[i].slope_cw))
break;
}
@@ -274,23 +262,23 @@
/* Find active pen vertex for counterclockwise edge of stroke at the given slope.
*
* NOTE: The behavior of this function is sensitive to the sense of
- * the inequality within _slope_clockwise/_slope_counter_clockwise.
+ * the inequality within _cairo_slope_clockwise/_cairo_slope_counter_clockwise.
*/
cairo_status_t
_cairo_pen_find_active_ccw_vertex_index (cairo_pen_t *pen,
- cairo_slope_fixed_t *slope,
+ cairo_slope_t *slope,
int *active)
{
int i;
- cairo_slope_fixed_t slope_reverse;
+ cairo_slope_t slope_reverse;
slope_reverse = *slope;
slope_reverse.dx = -slope_reverse.dx;
slope_reverse.dy = -slope_reverse.dy;
for (i=pen->num_vertices-1; i >= 0; i--) {
- if (_slope_counter_clockwise (&pen->vertex[i].slope_ccw, &slope_reverse)
- && _slope_clockwise (&pen->vertex[i].slope_cw, &slope_reverse))
+ if (_cairo_slope_counter_clockwise (&pen->vertex[i].slope_ccw, &slope_reverse)
+ && _cairo_slope_clockwise (&pen->vertex[i].slope_cw, &slope_reverse))
break;
}
@@ -309,9 +297,9 @@
cairo_status_t status;
int start, stop, step;
int active = 0;
- XPointFixed hull_pt;
- cairo_slope_fixed_t slope, initial_slope, final_slope;
- XPointFixed *pt = spline->pts;
+ cairo_point_t hull_pt;
+ cairo_slope_t slope, initial_slope, final_slope;
+ cairo_point_t *pt = spline->pts;
int num_pts = spline->num_pts;
if (dir == cairo_pen_stroke_direction_forward) {
@@ -345,11 +333,11 @@
if (i + step == stop)
slope = final_slope;
else
- _compute_slope (&pt[i], &pt[i+step], &slope);
- if (_slope_counter_clockwise (&slope, &pen->vertex[active].slope_ccw)) {
+ _cairo_slope_init (&slope, &pt[i], &pt[i+step]);
+ if (_cairo_slope_counter_clockwise (&slope, &pen->vertex[active].slope_ccw)) {
if (++active == pen->num_vertices)
active = 0;
- } else if (_slope_clockwise (&slope, &pen->vertex[active].slope_cw)) {
+ } else if (_cairo_slope_clockwise (&slope, &pen->vertex[active].slope_cw)) {
if (--active == -1)
active = pen->num_vertices - 1;
} else {
Index: cairo_polygon.c
===================================================================
RCS file: /local/src/CVS/cairo/src/cairo_polygon.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- cairo_polygon.c 18 Jul 2003 18:34:19 -0000 1.1
+++ cairo_polygon.c 30 Jul 2003 15:30:51 -0000 1.2
@@ -36,8 +36,7 @@
_cairo_polygon_grow_by (cairo_polygon_t *polygon, int additional);
static void
-_cairo_polygon_set_last_point (cairo_polygon_t *polygon, XPointFixed *pt);
-
+_cairo_polygon_set_last_point (cairo_polygon_t *polygon, cairo_point_t *pt);
void
_cairo_polygon_init (cairo_polygon_t *polygon)
@@ -94,14 +93,14 @@
}
static void
-_cairo_polygon_set_last_point (cairo_polygon_t *polygon, XPointFixed *pt)
+_cairo_polygon_set_last_point (cairo_polygon_t *polygon, cairo_point_t *pt)
{
polygon->last_pt = *pt;
polygon->last_pt_defined = 1;
}
cairo_status_t
-_cairo_polygon_add_edge (cairo_polygon_t *polygon, XPointFixed *p1, XPointFixed *p2)
+_cairo_polygon_add_edge (cairo_polygon_t *polygon, cairo_point_t *p1, cairo_point_t *p2)
{
cairo_status_t status;
cairo_edge_t *edge;
@@ -144,7 +143,7 @@
}
cairo_status_t
-_cairo_polygon_add_point (cairo_polygon_t *polygon, XPointFixed *pt)
+_cairo_polygon_add_point (cairo_polygon_t *polygon, cairo_point_t *pt)
{
cairo_status_t status = CAIRO_STATUS_SUCCESS;
Index: cairo_spline.c
===================================================================
RCS file: /local/src/CVS/cairo/src/cairo_spline.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- cairo_spline.c 18 Jul 2003 19:42:49 -0000 1.2
+++ cairo_spline.c 30 Jul 2003 15:30:51 -0000 1.3
@@ -31,10 +31,10 @@
_cairo_spline_grow_by (cairo_spline_t *spline, int additional);
static cairo_status_t
-_cairo_spline_add_point (cairo_spline_t *spline, XPointFixed *pt);
+_cairo_spline_add_point (cairo_spline_t *spline, cairo_point_t *pt);
static void
-_lerp_half (XPointFixed *a, XPointFixed *b, XPointFixed *result);
+_lerp_half (cairo_point_t *a, cairo_point_t *b, cairo_point_t *result);
static void
_de_casteljau (cairo_spline_t *spline, cairo_spline_t *s1, cairo_spline_t *s2);
@@ -48,7 +48,9 @@
#define CAIRO_SPLINE_GROWTH_INC 100
cairo_int_status_t
-_cairo_spline_init (cairo_spline_t *spline, XPointFixed *a, XPointFixed *b, XPointFixed *c, XPointFixed *d)
+_cairo_spline_init (cairo_spline_t *spline,
+ cairo_point_t *a, cairo_point_t *b,
+ cairo_point_t *c, cairo_point_t *d)
{
spline->a = *a;
spline->b = *b;
@@ -56,21 +58,21 @@
spline->d = *d;
if (a->x != b->x || a->y != b->y) {
- _compute_slope (&spline->a, &spline->b, &spline->initial_slope);
+ _cairo_slope_init (&spline->initial_slope, &spline->a, &spline->b);
} else if (a->x != c->x || a->y != c->y) {
- _compute_slope (&spline->a, &spline->c, &spline->initial_slope);
+ _cairo_slope_init (&spline->initial_slope, &spline->a, &spline->c);
} else if (a->x != d->x || a->y != d->y) {
- _compute_slope (&spline->a, &spline->d, &spline->initial_slope);
+ _cairo_slope_init (&spline->initial_slope, &spline->a, &spline->d);
} else {
return cairo_int_status_degenerate;
}
if (c->x != d->x || c->y != d->y) {
- _compute_slope (&spline->c, &spline->d, &spline->final_slope);
+ _cairo_slope_init (&spline->final_slope, &spline->c, &spline->d);
} else if (b->x != d->x || b->y != d->y) {
- _compute_slope (&spline->b, &spline->d, &spline->final_slope);
+ _cairo_slope_init (&spline->final_slope, &spline->b, &spline->d);
} else {
- _compute_slope (&spline->a, &spline->d, &spline->final_slope);
+ _cairo_slope_init (&spline->final_slope, &spline->a, &spline->d);
}
spline->num_pts = 0;
@@ -92,7 +94,7 @@
static cairo_status_t
_cairo_spline_grow_by (cairo_spline_t *spline, int additional)
{
- XPointFixed *new_pts;
+ cairo_point_t *new_pts;
int old_size = spline->pts_size;
int new_size = spline->num_pts + additional;
@@ -100,7 +102,7 @@
return CAIRO_STATUS_SUCCESS;
spline->pts_size = new_size;
- new_pts = realloc (spline->pts, spline->pts_size * sizeof (XPointFixed));
+ new_pts = realloc (spline->pts, spline->pts_size * sizeof (cairo_point_t));
if (new_pts == NULL) {
spline->pts_size = old_size;
@@ -113,7 +115,7 @@
}
static cairo_status_t
-_cairo_spline_add_point (cairo_spline_t *spline, XPointFixed *pt)
+_cairo_spline_add_point (cairo_spline_t *spline, cairo_point_t *pt)
{
cairo_status_t status;
@@ -130,7 +132,7 @@
}
static void
-_lerp_half (XPointFixed *a, XPointFixed *b, XPointFixed *result)
+_lerp_half (cairo_point_t *a, cairo_point_t *b, cairo_point_t *result)
{
result->x = a->x + ((b->x - a->x) >> 1);
result->y = a->y + ((b->y - a->y) >> 1);
@@ -139,9 +141,9 @@
static void
_de_casteljau (cairo_spline_t *spline, cairo_spline_t *s1, cairo_spline_t *s2)
{
- XPointFixed ab, bc, cd;
- XPointFixed abbc, bccd;
- XPointFixed final;
+ cairo_point_t ab, bc, cd;
+ cairo_point_t abbc, bccd;
+ cairo_point_t final;
_lerp_half (&spline->a, &spline->b, &ab);
_lerp_half (&spline->b, &spline->c, &bc);
@@ -162,7 +164,7 @@
}
static double
-_PointDistanceSquaredToPoint (XPointFixed *a, XPointFixed *b)
+_PointDistanceSquaredToPoint (cairo_point_t *a, cairo_point_t *b)
{
double dx = XFixedToDouble (b->x - a->x);
double dy = XFixedToDouble (b->y - a->y);
@@ -171,12 +173,12 @@
}
static double
-_PointDistanceSquaredToSegment (XPointFixed *p, XPointFixed *p1, XPointFixed *p2)
+_PointDistanceSquaredToSegment (cairo_point_t *p, cairo_point_t *p1, cairo_point_t *p2)
{
double u;
double dx, dy;
double pdx, pdy;
- XPointFixed px;
+ cairo_point_t px;
/* intersection point (px):
Index: cairo_surface.c
===================================================================
RCS file: /local/src/CVS/cairo/src/cairo_surface.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- cairo_surface.c 18 Jul 2003 18:34:19 -0000 1.1
+++ cairo_surface.c 30 Jul 2003 15:30:51 -0000 1.2
@@ -29,6 +29,34 @@
#include "cairoint.h"
+static const XTransform CAIRO_XTRANSFORM_IDENTITY = {
+ {
+ {65536, 0, 0},
+ { 0, 65536, 0},
+ { 0, 0, 65536}
+ }
+};
+
+#define CAIRO_SURFACE_RENDER_AT_LEAST(surface, major, minor) \
+ (((surface)->render_major > major) ? 1 \
+ : ((surface)->render_major == major) ? ((surface)->render_minor >= minor) : 0)
+
+#define CAIRO_SURFACE_RENDER_HAS_CREATE_PICTURE(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 0)
+#define CAIRO_SURFACE_RENDER_HAS_COMPOSITE(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 0)
+
+#define CAIRO_SURFACE_RENDER_HAS_FILL_RECTANGLE(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 1)
+#define CAIRO_SURFACE_RENDER_HAS_FILL_RECTANGLES(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 1)
+
+#define CAIRO_SURFACE_RENDER_HAS_DISJOINT(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 2)
+#define CAIRO_SURFACE_RENDER_HAS_CONJOINT(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 2)
+
+#define CAIRO_SURFACE_RENDER_HAS_TRAPEZOIDS(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 4)
+#define CAIRO_SURFACE_RENDER_HAS_TRIANGLES(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 4)
+#define CAIRO_SURFACE_RENDER_HAS_TRISTRIP(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 4)
+#define CAIRO_SURFACE_RENDER_HAS_TRIFAN(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 4)
+
+#define CAIRO_SURFACE_RENDER_HAS_PICTURE_TRANSFORM(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 6)
+
cairo_surface_t *
cairo_surface_create_for_drawable (Display *dpy,
Drawable drawable,
@@ -42,19 +70,34 @@
if (surface == NULL)
return NULL;
+ /* XXX: We should really get this value from somewhere like Xft.dpy */
+ surface->ppm = 3780;
+
+ surface->ref_count = 1;
+
surface->dpy = dpy;
surface->image_data = NULL;
+ surface->icimage = NULL;
- surface->xc_surface = XcSurfaceCreateForDrawable (dpy, drawable, visual, format, colormap);
- if (surface->xc_surface == NULL) {
- free (surface);
- return NULL;
- }
+ surface->type = CAIRO_SURFACE_TYPE_DRAWABLE;
+ surface->xtransform = CAIRO_XTRANSFORM_IDENTITY;
- /* XXX: We should really get this value from somewhere like Xft.dpy */
- surface->ppm = 3780;
+ surface->gc = 0;
+ surface->drawable = drawable;
+ surface->visual = visual;
- surface->ref_count = 1;
+ if (! XRenderQueryVersion (dpy, &surface->render_major, &surface->render_minor)) {
+ surface->render_major = -1;
+ surface->render_minor = -1;
+ }
+
+ /* XXX: I'm currently ignoring the colormap. Is that bad? */
+ if (CAIRO_SURFACE_RENDER_HAS_CREATE_PICTURE (surface))
+ surface->picture = XRenderCreatePicture (dpy, drawable,
+ visual
+ ? XRenderFindVisualFormat (dpy, visual)
+ : XRenderFindStandardFormat (dpy, format),
+ 0, NULL);
return surface;
}
@@ -144,25 +187,31 @@
if (surface == NULL)
return NULL;
+ /* Assume a default until the user lets us know otherwise */
+ surface->ppm = 3780;
+ surface->ref_count = 1;
+
surface->dpy = NULL;
surface->image_data = NULL;
+
image = IcImageCreateForData ((IcBits *) data, &icformat, width, height, cairo_format_bpp (format), stride);
if (image == NULL) {
free (surface);
return NULL;
}
- surface->xc_surface = XcSurfaceCreateForIcImage (image);
- if (surface->xc_surface == NULL) {
- IcImageDestroy (image);
- free (surface);
- return NULL;
- }
+ surface->type = CAIRO_SURFACE_TYPE_ICIMAGE;
+ surface->xtransform = CAIRO_XTRANSFORM_IDENTITY;
- /* Assume a default until the user lets us know otherwise */
- surface->ppm = 3780;
+ surface->gc = 0;
+ surface->drawable = 0;
+ surface->visual = NULL;
+ surface->render_major = -1;
+ surface->render_minor = -1;
- surface->ref_count = 1;
+ surface->picture = 0;
+
+ surface->icimage = image;
return surface;
}
@@ -205,8 +254,6 @@
cairo_surface_t *surface = NULL;
cairo_color_t color;
- /* XXX: create_similar should perhaps move down to Xc, (then we
- could drop xrsurface->dpy as well) */
if (other->dpy) {
Display *dpy = other->dpy;
int scr = DefaultScreen (dpy);
@@ -270,32 +317,130 @@
if (surface->ref_count)
return;
- surface->dpy = 0;
-
- XcSurfaceDestroy (surface->xc_surface);
- surface->xc_surface = NULL;
+ if (surface->picture)
+ XRenderFreePicture (surface->dpy, surface->picture);
+
+ if (surface->icimage)
+ IcImageDestroy (surface->icimage);
if (surface->image_data)
free (surface->image_data);
surface->image_data = NULL;
+ surface->dpy = 0;
+
free (surface);
}
+static void
+_cairo_surface_ensure_gc (cairo_surface_t *surface)
+{
+ if (surface->gc)
+ return;
+
+ surface->gc = XCreateGC (surface->dpy, surface->drawable, 0, NULL);
+}
+
cairo_status_t
cairo_surface_put_image (cairo_surface_t *surface,
- char *data,
- int width,
- int height,
- int stride)
+ char *data,
+ int width,
+ int height,
+ int stride)
{
- XcSurfacePutImage (surface->xc_surface, data,
- width, height, stride);
+ if (surface->picture) {
+ XImage *image;
+ unsigned bitmap_pad;
+
+ /* XXX: This is obviously bogus. depth needs to be figured out for real */
+ int depth = 32;
+
+ if (depth > 16)
+ bitmap_pad = 32;
+ else if (depth > 8)
+ bitmap_pad = 16;
+ else
+ bitmap_pad = 8;
+
+ image = XCreateImage(surface->dpy,
+ DefaultVisual(surface->dpy, DefaultScreen(surface->dpy)),
+ depth, ZPixmap, 0,
+ data, width, height,
+ bitmap_pad,
+ stride);
+ if (image == NULL)
+ return CAIRO_STATUS_NO_MEMORY;
+
+ _cairo_surface_ensure_gc (surface);
+ XPutImage(surface->dpy, surface->drawable, surface->gc,
+ image, 0, 0, 0, 0, width, height);
+
+ /* Foolish XDestroyImage thinks it can free my data, but I won't
+ stand for it. */
+ image->data = NULL;
+ XDestroyImage(image);
+ } else {
+ /* XXX: Need to implement the IcImage method of setting a picture. memcpy? */
+ }
return CAIRO_STATUS_SUCCESS;
}
-/* XXX: Symmetry demands an cairo_surface_get_image as well */
+/* XXX: Symmetry demands an cairo_surface_get_image as well. */
+
+void
+_cairo_surface_pull_image (cairo_surface_t *surface)
+{
+/* XXX: NYI (Also needs support for pictures with external alpha.)
+ if (surface->type == CAIRO_SURFACE_TYPE_ICIMAGE)
+ return;
+
+ if (surface->icimage) {
+ IcImageDestroy (surface->icimage);
+ surface->icimage = NULL;
+ }
+
+ _cairo_surface_ensure_GC (surface);
+ surface->ximage = XGetImage (surface->dpy,
+ surface->drawable,
+ surface->gc,
+ 0, 0,
+ width, height,
+ AllPlanes, ZPixmap);
+
+ surface->icimage = IcImageCreateForData (image->data,
+ IcFormat *format,
+ int width, int height,
+ int bpp, int stride);
+*/
+}
+
+void
+_cairo_surface_push_image (cairo_surface_t *surface)
+{
+/* XXX: NYI
+ if (surface->type == CAIRO_SURFACE_TYPE_ICIMAGE)
+ return;
+
+ if (surface->ximage == NULL)
+ return;
+
+ _cairo_surface_ensure_GC (surface);
+ XPutImage (surface->dpy,
+ surface->drawable,
+ surface->gc,
+ surface->ximage,
+ 0, 0,
+ 0, 0,
+ width, height);
+
+ * Foolish XDestroyImage thinks it can free my data, but I won't
+ stand for it. *
+ surface->ximage->data = NULL;
+ XDestroyImage(surface->ximage);
+ surface->ximage = NULL;
+*/
+}
/* XXX: We may want to move to projective matrices at some point. If
nothing else, that would eliminate the two different transform data
@@ -303,22 +448,31 @@
cairo_status_t
cairo_surface_set_matrix (cairo_surface_t *surface, cairo_matrix_t *matrix)
{
- XTransform xtransform;
+ XTransform *xtransform = &surface->xtransform;
- 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[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 (matrix->m[0][1]);
- xtransform.matrix[1][1] = XDoubleToFixed (matrix->m[1][1]);
- xtransform.matrix[1][2] = XDoubleToFixed (matrix->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;
- xtransform.matrix[2][2] = XDoubleToFixed (1);
+ xtransform->matrix[2][0] = 0;
+ xtransform->matrix[2][1] = 0;
+ xtransform->matrix[2][2] = XDoubleToFixed (1);
- XcSurfaceSetTransform (surface->xc_surface,
- &xtransform);
+ if (surface->picture) {
+ if (CAIRO_SURFACE_RENDER_HAS_PICTURE_TRANSFORM (surface))
+ XRenderSetPictureTransform (surface->dpy, surface->picture, xtransform);
+ /* XXX: Need support here if using an old RENDER without support
+ for SetPictureTransform */
+ }
+
+ /* XXX: This cast should only occur with a #define hint from libic that it is OK */
+ if (surface->icimage) {
+ IcImageSetTransform (surface->icimage, (IcTransform *) xtransform);
+ }
return CAIRO_STATUS_SUCCESS;
}
@@ -326,51 +480,134 @@
cairo_status_t
cairo_surface_get_matrix (cairo_surface_t *surface, cairo_matrix_t *matrix)
{
- XTransform xtransform;
-
- XcSurfaceGetTransform (surface->xc_surface, &xtransform);
+ XTransform *xtransform = &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][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]);
+ 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 CAIRO_STATUS_SUCCESS;
}
+/* XXX: The Render specification has capitalized versions of these
+ strings. However, the current implementation is case-sensitive and
+ expects lowercase versions. */
+static char *
+_render_filter_name (cairo_filter_t filter)
+{
+ switch (filter) {
+ case CAIRO_FILTER_FAST:
+ return "fast";
+ case CAIRO_FILTER_GOOD:
+ return "good";
+ case CAIRO_FILTER_BEST:
+ return "best";
+ case CAIRO_FILTER_NEAREST:
+ return "nearest";
+ case CAIRO_FILTER_BILINEAR:
+ return "bilinear";
+ default:
+ return "best";
+ }
+}
+
cairo_status_t
cairo_surface_set_filter (cairo_surface_t *surface, cairo_filter_t filter)
{
- XcSurfaceSetFilter (surface->xc_surface, filter);
+ if (surface->picture) {
+ XRenderSetPictureFilter (surface->dpy, surface->picture,
+ _render_filter_name (filter), NULL, 0);
+ }
+
+ if (surface->icimage) {
+ IcImageSetFilter (surface->icimage, filter);
+ }
+
return CAIRO_STATUS_SUCCESS;
}
-/* XXX: The Xc version of this function isn't quite working yet
+/* XXX: NYI
cairo_status_t
-cairo_surface_set_clip_region (cairo_surface_t *surface, Region region)
+cairo_surface_clip_rectangle (cairo_surface_t *surface,
+ int x, int y,
+ int width, int height)
{
- XcSurfaceSetClipRegion (surface->xc_surface, region);
- return CAIRO_STATUS_SUCCESS;
}
*/
+/* XXX: NYI
+cairo_status_t
+cairo_surface_clip_restore (cairo_surface_t *surface);
+*/
+
cairo_status_t
cairo_surface_set_repeat (cairo_surface_t *surface, int repeat)
{
- XcSurfaceSetRepeat (surface->xc_surface, repeat);
+ if (surface->picture) {
+ unsigned long mask;
+ XRenderPictureAttributes pa;
+
+ mask = CPRepeat;
+ pa.repeat = repeat;
+
+ XRenderChangePicture (surface->dpy, surface->picture, mask, &pa);
+ }
+
+ if (surface->icimage) {
+ IcImageSetRepeat (surface->icimage, repeat);
+ }
return CAIRO_STATUS_SUCCESS;
}
-/* XXX: This function is going away, right? */
-Picture
-_cairo_surface_get_picture (cairo_surface_t *surface)
+void
+_cairo_surface_composite (cairo_operator_t operator,
+ cairo_surface_t *src,
+ cairo_surface_t *mask,
+ cairo_surface_t *dst,
+ int src_x,
+ int src_y,
+ int mask_x,
+ int mask_y,
+ int dst_x,
+ int dst_y,
+ unsigned int width,
+ unsigned int height)
{
- return XcSurfaceGetPicture (surface->xc_surface);
+ if (dst->type == CAIRO_SURFACE_TYPE_DRAWABLE
+ && CAIRO_SURFACE_RENDER_HAS_COMPOSITE (dst)
+ && src->dpy == dst->dpy
+ && (mask == NULL || mask->dpy == dst->dpy)) {
+
+ XRenderComposite (dst->dpy, operator,
+ src->picture,
+ mask ? mask->picture : 0,
+ dst->picture,
+ src_x, src_y,
+ mask_x, mask_y,
+ dst_x, dst_y,
+ width, height);
+ } else {
+ _cairo_surface_pull_image (src);
+ _cairo_surface_pull_image (mask);
+ _cairo_surface_pull_image (dst);
+
+ IcComposite (operator,
+ src->icimage,
+ mask ? mask->icimage : NULL,
+ dst->icimage,
+ src_x, src_y,
+ mask_x, mask_y,
+ dst_x, dst_y,
+ width, height);
+
+ _cairo_surface_push_image (dst);
+ }
}
void
@@ -382,10 +619,80 @@
int width,
int height)
{
- XcFillRectangle (operator,
- surface->xc_surface,
- &color->xc_color,
- x, y,
- width, height);
+ cairo_rectangle_t rect;
+
+ rect.x = x;
+ rect.y = y;
+ rect.width = width;
+ rect.height = height;
+
+ _cairo_surface_fill_rectangles (surface, operator, color, &rect, 1);
+}
+
+void
+_cairo_surface_fill_rectangles (cairo_surface_t *surface,
+ cairo_operator_t operator,
+ const cairo_color_t *color,
+ cairo_rectangle_t *rects,
+ int num_rects)
+{
+ if (surface->type == CAIRO_SURFACE_TYPE_DRAWABLE
+ && CAIRO_SURFACE_RENDER_HAS_FILL_RECTANGLE (surface)) {
+
+ XRenderColor render_color;
+ render_color.red = color->red_short;
+ render_color.green = color->green_short;
+ render_color.blue = color->blue_short;
+ render_color.alpha = color->alpha_short;
+
+ /* XXX: This XRectangle cast is evil... it needs to go away somehow. */
+ XRenderFillRectangles (surface->dpy, operator, surface->picture,
+ &render_color, (XRectangle *) rects, num_rects);
+
+ } else {
+ IcColor ic_color;
+
+ ic_color.red = color->red_short;
+ ic_color.green = color->green_short;
+ ic_color.blue = color->blue_short;
+ ic_color.alpha = color->alpha_short;
+
+ _cairo_surface_pull_image (surface);
+
+ /* XXX: The IcRectangle cast is evil... it needs to go away somehow. */
+ IcFillRectangles (operator, surface->icimage,
+ &ic_color, (IcRectangle *) rects, num_rects);
+
+ _cairo_surface_push_image (surface);
+ }
+}
+
+void
+_cairo_surface_composite_trapezoids (cairo_operator_t operator,
+ cairo_surface_t *src,
+ cairo_surface_t *dst,
+ int xSrc,
+ int ySrc,
+ const cairo_trapezoid_t *traps,
+ int num_traps)
+{
+ if (dst->type == CAIRO_SURFACE_TYPE_DRAWABLE
+ && CAIRO_SURFACE_RENDER_HAS_TRAPEZOIDS (dst)
+ && src->dpy == dst->dpy) {
+
+ /* XXX: The XTrapezoid cast is evil and needs to go away somehow. */
+ XRenderCompositeTrapezoids (dst->dpy, operator, src->picture, dst->picture,
+ XRenderFindStandardFormat (dst->dpy, PictStandardA8),
+ xSrc, ySrc, (XTrapezoid *) traps, num_traps);
+ } else {
+ _cairo_surface_pull_image (src);
+ _cairo_surface_pull_image (dst);
+
+ /* XXX: The IcTrapezoid cast is evil and needs to go away somehow. */
+ IcCompositeTrapezoids (operator, src->icimage, dst->icimage,
+ xSrc, ySrc, (IcTrapezoid *) traps, num_traps);
+
+ _cairo_surface_push_image (dst);
+ }
}
Index: cairo_traps.c
===================================================================
RCS file: /local/src/CVS/cairo/src/cairo_traps.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- cairo_traps.c 25 Jul 2003 20:29:08 -0000 1.6
+++ cairo_traps.c 30 Jul 2003 15:30:51 -0000 1.7
@@ -32,13 +32,13 @@
cairo_traps_grow_by (cairo_traps_t *traps, int additional);
cairo_status_t
-cairo_traps_add_trap (cairo_traps_t *traps, XFixed top, XFixed bottom,
- XLineFixed *left, XLineFixed *right);
+cairo_traps_add_trap (cairo_traps_t *traps, cairo_fixed_t top, cairo_fixed_t bottom,
+ cairo_line_t *left, cairo_line_t *right);
cairo_status_t
-cairo_traps_add_trap_from_points (cairo_traps_t *traps, XFixed top, XFixed bottom,
- XPointFixed left_p1, XPointFixed left_p2,
- XPointFixed right_p1, XPointFixed right_p2);
+cairo_traps_add_trap_from_points (cairo_traps_t *traps, cairo_fixed_t top, cairo_fixed_t bottom,
+ cairo_point_t left_p1, cairo_point_t left_p2,
+ cairo_point_t right_p1, cairo_point_t right_p2);
static int
_compare_point_fixed_by_y (const void *av, const void *bv);
@@ -50,72 +50,72 @@
_compare_cairo_edge_by_slope (const void *av, const void *bv);
static cairo_fixed_16_16_t
-_compute_x (XLineFixed *line, XFixed y);
+_compute_x (cairo_line_t *line, cairo_fixed_t y);
static double
-_compute_inverse_slope (XLineFixed *l);
+_compute_inverse_slope (cairo_line_t *l);
static double
-_compute_x_intercept (XLineFixed *l, double inverse_slope);
+_compute_x_intercept (cairo_line_t *l, double inverse_slope);
-static XFixed
-_line_segs_intersect_ceil (XLineFixed *left, XLineFixed *right, XFixed *y_ret);
+static cairo_fixed_t
+_line_segs_intersect_ceil (cairo_line_t *left, cairo_line_t *right, cairo_fixed_t *y_ret);
void
cairo_traps_init (cairo_traps_t *traps)
{
- traps->num_xtraps = 0;
+ traps->num_traps = 0;
- traps->xtraps_size = 0;
- traps->xtraps = NULL;
+ traps->traps_size = 0;
+ traps->traps = NULL;
}
void
cairo_traps_fini (cairo_traps_t *traps)
{
- if (traps->xtraps_size) {
- free (traps->xtraps);
- traps->xtraps = NULL;
- traps->xtraps_size = 0;
- traps->num_xtraps = 0;
+ if (traps->traps_size) {
+ free (traps->traps);
+ traps->traps = NULL;
+ traps->traps_size = 0;
+ traps->num_traps = 0;
}
}
cairo_status_t
-cairo_traps_add_trap (cairo_traps_t *traps, XFixed top, XFixed bottom,
- XLineFixed *left, XLineFixed *right)
+cairo_traps_add_trap (cairo_traps_t *traps, cairo_fixed_t top, cairo_fixed_t bottom,
+ cairo_line_t *left, cairo_line_t *right)
{
cairo_status_t status;
- XTrapezoid *trap;
+ cairo_trapezoid_t *trap;
if (top == bottom) {
return CAIRO_STATUS_SUCCESS;
}
- if (traps->num_xtraps >= traps->xtraps_size) {
+ if (traps->num_traps >= traps->traps_size) {
status = cairo_traps_grow_by (traps, CAIRO_TRAPS_GROWTH_INC);
if (status)
return status;
}
- trap = &traps->xtraps[traps->num_xtraps];
+ trap = &traps->traps[traps->num_traps];
trap->top = top;
trap->bottom = bottom;
trap->left = *left;
trap->right = *right;
- traps->num_xtraps++;
+ traps->num_traps++;
return CAIRO_STATUS_SUCCESS;
}
cairo_status_t
-cairo_traps_add_trap_from_points (cairo_traps_t *traps, XFixed top, XFixed bottom,
- XPointFixed left_p1, XPointFixed left_p2,
- XPointFixed right_p1, XPointFixed right_p2)
+cairo_traps_add_trap_from_points (cairo_traps_t *traps, cairo_fixed_t top, cairo_fixed_t bottom,
+ cairo_point_t left_p1, cairo_point_t left_p2,
+ cairo_point_t right_p1, cairo_point_t right_p2)
{
- XLineFixed left;
- XLineFixed right;
+ cairo_line_t left;
+ cairo_line_t right;
left.p1 = left_p1;
left.p2 = left_p2;
@@ -129,23 +129,23 @@
static cairo_status_t
cairo_traps_grow_by (cairo_traps_t *traps, int additional)
{
- XTrapezoid *new_xtraps;
- int old_size = traps->xtraps_size;
- int new_size = traps->num_xtraps + additional;
+ cairo_trapezoid_t *new_traps;
+ int old_size = traps->traps_size;
+ int new_size = traps->num_traps + additional;
- if (new_size <= traps->xtraps_size) {
+ if (new_size <= traps->traps_size) {
return CAIRO_STATUS_SUCCESS;
}
- traps->xtraps_size = new_size;
- new_xtraps = realloc (traps->xtraps, traps->xtraps_size * sizeof (XTrapezoid));
+ traps->traps_size = new_size;
+ new_traps = realloc (traps->traps, traps->traps_size * sizeof (cairo_trapezoid_t));
- if (new_xtraps == NULL) {
- traps->xtraps_size = old_size;
+ if (new_traps == NULL) {
+ traps->traps_size = old_size;
return CAIRO_STATUS_NO_MEMORY;
}
- traps->xtraps = new_xtraps;
+ traps->traps = new_traps;
return CAIRO_STATUS_SUCCESS;
}
@@ -153,7 +153,7 @@
static int
_compare_point_fixed_by_y (const void *av, const void *bv)
{
- const XPointFixed *a = av, *b = bv;
+ const cairo_point_t *a = av, *b = bv;
int ret = a->y - b->y;
if (ret == 0) {
@@ -163,15 +163,15 @@
}
cairo_status_t
-cairo_traps_tessellate_triangle (cairo_traps_t *traps, XPointFixed t[3])
+cairo_traps_tessellate_triangle (cairo_traps_t *traps, cairo_point_t t[3])
{
cairo_status_t status;
- XLineFixed line;
+ cairo_line_t line;
cairo_fixed_16_16_t intersect;
- XPointFixed tsort[3];
+ cairo_point_t tsort[3];
- memcpy (tsort, t, 3 * sizeof (XPointFixed));
- qsort (tsort, 3, sizeof (XPointFixed), _compare_point_fixed_by_y);
+ memcpy (tsort, t, 3 * sizeof (cairo_point_t));
+ qsort (tsort, 3, sizeof (cairo_point_t), _compare_point_fixed_by_y);
/* horizontal top edge requires special handling */
if (tsort[0].y == tsort[1].y) {
@@ -226,11 +226,11 @@
/* Warning: This function reorders the elements of the array provided. */
cairo_status_t
-cairo_traps_tessellate_rectangle (cairo_traps_t *traps, XPointFixed q[4])
+cairo_traps_tessellate_rectangle (cairo_traps_t *traps, cairo_point_t q[4])
{
cairo_status_t status;
- qsort (q, 4, sizeof (XPointFixed), _compare_point_fixed_by_y);
+ qsort (q, 4, sizeof (cairo_point_t), _compare_point_fixed_by_y);
if (q[1].x > q[2].x) {
status = cairo_traps_add_trap_from_points (traps,
@@ -335,7 +335,7 @@
}
static int
-_lines_intersect (XLineFixed *l1, XLineFixed *l2, XFixed *y_intersection)
+_lines_intersect (cairo_line_t *l1, cairo_line_t *l2, cairo_fixed_t *y_intersection)
{
double dx1 = XFixedToDouble (l1->p1.x - l1->p2.x);
double dy1 = XFixedToDouble (l1->p1.y - l1->p2.y);
@@ -362,7 +362,7 @@
}
*/
static cairo_fixed_16_16_t
-_compute_x (XLineFixed *line, XFixed y)
+_compute_x (cairo_line_t *line, cairo_fixed_t y)
{
cairo_fixed_16_16_t dx = line->p2.x - line->p1.x;
cairo_fixed_32_32_t ex = (cairo_fixed_48_16_t) (y - line->p1.y) * (cairo_fixed_48_16_t) dx;
@@ -372,20 +372,20 @@
}
static double
-_compute_inverse_slope (XLineFixed *l)
+_compute_inverse_slope (cairo_line_t *l)
{
return (XFixedToDouble (l->p2.x - l->p1.x) /
XFixedToDouble (l->p2.y - l->p1.y));
}
static double
-_compute_x_intercept (XLineFixed *l, double inverse_slope)
+_compute_x_intercept (cairo_line_t *l, double inverse_slope)
{
return XFixedToDouble (l->p1.x) - inverse_slope * XFixedToDouble (l->p1.y);
}
static int
-_line_segs_intersect_ceil (XLineFixed *l1, XLineFixed *l2, XFixed *y_ret)
+_line_segs_intersect_ceil (cairo_line_t *l1, cairo_line_t *l2, cairo_fixed_t *y_ret)
{
/*
* x = m1y + b1
@@ -406,7 +406,7 @@
y_intersect = XDoubleToFixed ((b2 - b1) / (m1 - m2));
if (m1 < m2) {
- XLineFixed *t;
+ cairo_line_t *t;
t = l1;
l1 = l2;
l2 = t;
@@ -418,6 +418,22 @@
most, we must increment once. */
if (_compute_x (l2, y_intersect) > _compute_x (l1, y_intersect))
y_intersect++;
+ /* XXX: Hmm... Keith's error calculations said we'd at most be off
+ by one sub-pixel. But, I found that the paint-fill-BE-01.svg
+ test from the W3C SVG conformance suite definitely requires two
+ increments.
+
+ It could be that we need one to overcome the error, and another
+ to round up.
+
+ It would be nice to be sure this code is correct, (but we can't
+ do the while loop as it will work for way to long on
+ exceedingly distant intersections with large errors that we
+ really don't care about anyway as they will be ignored by the
+ calling function.
+ */
+ if (_compute_x (l2, y_intersect) > _compute_x (l1, y_intersect))
+ y_intersect++;
*y_ret = y_intersect;
@@ -458,7 +474,7 @@
{
cairo_status_t status;
int i, active, inactive;
- XFixed y, y_next, intersect;
+ cairo_fixed_t y, y_next, intersect;
int in_out, num_edges = poly->num_edges;
cairo_edge_t *edges = poly->edges;
Index: cairoint.h
===================================================================
RCS file: /local/src/CVS/cairo/src/cairoint.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- cairoint.h 26 Jul 2003 06:16:31 -0000 1.5
+++ cairoint.h 30 Jul 2003 15:30:51 -0000 1.6
@@ -70,6 +70,40 @@
typedef cairo_fixed_32_32_t cairo_fixed_48_16_t;
typedef int32_t cairo_fixed_16_16_t;
+/* The common 16.16 format gets a shorter name */
+typedef cairo_fixed_16_16_t cairo_fixed_t;
+
+typedef struct cairo_point {
+ cairo_fixed_t x;
+ cairo_fixed_t y;
+} cairo_point_t;
+
+typedef struct cairo_slope
+{
+ cairo_fixed_t dx;
+ cairo_fixed_t dy;
+} cairo_slope_t;
+
+typedef struct cairo_point_double {
+ double x;
+ double y;
+} cairo_point_double_t;
+
+typedef struct cairo_line {
+ cairo_point_t p1;
+ cairo_point_t p2;
+} cairo_line_t;
+
+typedef struct cairo_trapezoid {
+ cairo_fixed_t top, bottom;
+ cairo_line_t left, right;
+} cairo_trapezoid_t;
+
+typedef struct cairo_rectangle_int {
+ short x, y;
+ unsigned short width, height;
+} cairo_rectangle_t;
+
/* Sure wish C had a real enum type so that this would be distinct
from cairo_status_t. Oh well, without that, I'll use this bogus 1000
offset */
@@ -95,10 +129,10 @@
} cairo_sub_path_done_t;
typedef struct cairo_path_callbacks {
- cairo_status_t (*AddEdge) (void *closure, XPointFixed *p1, XPointFixed *p2);
- cairo_status_t (*AddSpline) (void *closure, XPointFixed *a, XPointFixed *b, XPointFixed *c, XPointFixed *d);
- cairo_status_t (*DoneSubPath) (void *closure, cairo_sub_path_done_t done);
- cairo_status_t (*DonePath) (void *closure);
+ cairo_status_t (*add_edge) (void *closure, cairo_point_t *p1, cairo_point_t *p2);
+ cairo_status_t (*add_spline) (void *closure, cairo_point_t *a, cairo_point_t *b, cairo_point_t *c, cairo_point_t *d);
+ cairo_status_t (*done_sub_path) (void *closure, cairo_sub_path_done_t done);
+ cairo_status_t (*done_path) (void *closure);
} cairo_path_callbacks_t;
#define CAIRO_PATH_BUF_SZ 64
@@ -112,7 +146,7 @@
typedef struct cairo_path_arg_buf {
int num_pts;
- XPointFixed pt[CAIRO_PATH_BUF_SZ];
+ cairo_point_t pt[CAIRO_PATH_BUF_SZ];
struct cairo_path_arg_buf *next, *prev;
} cairo_path_arg_buf_t;
@@ -126,10 +160,10 @@
} cairo_path_t;
typedef struct cairo_edge {
- XLineFixed edge;
- Bool clockWise;
+ cairo_line_t edge;
+ int clockWise;
- XFixed current_x;
+ cairo_fixed_16_16_t current_x;
} cairo_edge_t;
typedef struct cairo_polygon {
@@ -137,29 +171,23 @@
int edges_size;
cairo_edge_t *edges;
- XPointFixed first_pt;
+ cairo_point_t first_pt;
int first_pt_defined;
- XPointFixed last_pt;
+ cairo_point_t last_pt;
int last_pt_defined;
int closed;
} cairo_polygon_t;
-typedef struct cairo_slope_fixed
-{
- XFixed dx;
- XFixed dy;
-} cairo_slope_fixed_t;
-
typedef struct cairo_spline {
- XPointFixed a, b, c, d;
+ cairo_point_t a, b, c, d;
- cairo_slope_fixed_t initial_slope;
- cairo_slope_fixed_t final_slope;
+ cairo_slope_t initial_slope;
+ cairo_slope_t final_slope;
int num_pts;
int pts_size;
- XPointFixed *pts;
+ cairo_point_t *pts;
} cairo_spline_t;
/* XXX: This can go away once incremental spline tessellation is working */
@@ -169,11 +197,10 @@
} cairo_pen_stroke_direction_t;
typedef struct _cairo_pen_vertex {
- XPointFixed pt;
+ cairo_point_t pt;
- double theta;
- cairo_slope_fixed_t slope_ccw;
- cairo_slope_fixed_t slope_cw;
+ cairo_slope_t slope_ccw;
+ cairo_slope_t slope_cw;
} cairo_pen_vertex_t;
typedef struct cairo_pen {
@@ -184,24 +211,51 @@
cairo_pen_vertex_t *vertex;
} cairo_pen_t;
+typedef enum cairo_surface_type {
+ CAIRO_SURFACE_TYPE_DRAWABLE,
+ CAIRO_SURFACE_TYPE_ICIMAGE
+} cairo_surface_type_t;
+
struct cairo_surface {
- Display *dpy;
char *image_data;
- XcSurface *xc_surface;
-
double ppm;
-
unsigned int ref_count;
+
+ cairo_surface_type_t type;
+ XTransform xtransform;
+
+ /* For TYPE_DRAWABLE */
+ Display *dpy;
+ GC gc;
+ Drawable drawable;
+ Visual *visual;
+
+ int render_major;
+ int render_minor;
+
+ Picture picture;
+
+ /* For TYPE_ICIMAGE */
+ IcImage *icimage;
};
+/* XXX: Right now, the cairo_color structure puts unpremultiplied
+ color in the doubles and premultiplied color in the shorts. Yes,
+ this is crazy insane, (but at least we don't export this
+ madness). I'm still working on a cleaner API, but in the meantime,
+ at least this does prevent precision loss in color when changing
+ alpha. */
typedef struct cairo_color {
double red;
double green;
double blue;
double alpha;
- XcColor xc_color;
+ unsigned short red_short;
+ unsigned short green_short;
+ unsigned short blue_short;
+ unsigned short alpha_short;
} cairo_color_t;
struct cairo_matrix {
@@ -209,9 +263,9 @@
};
typedef struct cairo_traps {
- int num_xtraps;
- int xtraps_size;
- XTrapezoid *xtraps;
+ cairo_trapezoid_t *traps;
+ int num_traps;
+ int traps_size;
} cairo_traps_t;
#define CAIRO_FONT_KEY_DEFAULT "serif"
@@ -265,7 +319,7 @@
cairo_surface_t *surface;
cairo_surface_t *solid;
cairo_surface_t *pattern;
- XPointDouble pattern_offset;
+ cairo_point_double_t pattern_offset;
cairo_clip_rec_t clip;
@@ -278,8 +332,8 @@
cairo_path_t path;
- XPointDouble last_move_pt;
- XPointDouble current_pt;
+ cairo_point_double_t last_move_pt;
+ cairo_point_double_t current_pt;
int has_current_pt;
cairo_pen_t pen_regular;
@@ -293,11 +347,11 @@
};
typedef struct cairo_stroke_face {
- XPointFixed ccw;
- XPointFixed pt;
- XPointFixed cw;
- cairo_slope_fixed_t dev_vector;
- XPointDouble usr_vector;
+ cairo_point_t ccw;
+ cairo_point_t pt;
+ cairo_point_t cw;
+ cairo_slope_t dev_vector;
+ cairo_point_double_t usr_vector;
} cairo_stroke_face_t;
/* cairo_gstate_t.c */
@@ -370,6 +424,9 @@
cairo_status_t
_cairo_gstate_set_fill_rule (cairo_gstate_t *gstate, cairo_fill_rule_t fill_rule);
+cairo_fill_rule_t
+_cairo_gstate_get_fill_rule (cairo_gstate_t *gstate);
+
cairo_status_t
_cairo_gstate_set_line_width (cairo_gstate_t *gstate, double width);
@@ -421,10 +478,10 @@
_cairo_gstate_identity_matrix (cairo_gstate_t *gstate);
cairo_status_t
-cairo_gstateransform_point (cairo_gstate_t *gstate, double *x, double *y);
+cairo_gstate_transform_point (cairo_gstate_t *gstate, double *x, double *y);
cairo_status_t
-cairo_gstateransform_distance (cairo_gstate_t *gstate, double *dx, double *dy);
+cairo_gstate_transform_distance (cairo_gstate_t *gstate, double *dx, double *dy);
cairo_status_t
_cairo_gstate_inverse_transform_point (cairo_gstate_t *gstate, double *x, double *y);
@@ -459,6 +516,11 @@
double dx2, double dy2,
double dx3, double dy3);
+/* XXX: NYI
+cairo_status_t
+_cairo_gstate_stroke_path (cairo_gstate_t *gstate);
+*/
+
cairo_status_t
_cairo_gstate_close_path (cairo_gstate_t *gstate);
@@ -481,16 +543,16 @@
_cairo_gstate_scale_font (cairo_gstate_t *gstate, double scale);
cairo_status_t
-cairo_gstateransform_font (cairo_gstate_t *gstate,
- double a, double b,
- double c, double d);
+cairo_gstate_transform_font (cairo_gstate_t *gstate,
+ double a, double b,
+ double c, double d);
cairo_status_t
-cairo_gstateext_extents (cairo_gstate_t *gstate,
- const unsigned char *utf8,
- double *x, double *y,
- double *width, double *height,
- double *dx, double *dy);
+cairo_gstate_text_extents (cairo_gstate_t *gstate,
+ const unsigned char *utf8,
+ double *x, double *y,
+ double *width, double *height,
+ double *dx, double *dy);
cairo_status_t
_cairo_gstate_show_text (cairo_gstate_t *gstate, const unsigned char *utf8);
@@ -591,13 +653,6 @@
void
_cairo_surface_reference (cairo_surface_t *surface);
-XcSurface *
-_cairo_surface_get_xc_surface (cairo_surface_t *surface);
-
-/* XXX: This function is going away, right? */
-Picture
-_cairo_surface_get_picture (cairo_surface_t *surface);
-
void
_cairo_surface_fill_rectangle (cairo_surface_t *surface,
cairo_operator_t operator,
@@ -607,6 +662,42 @@
int width,
int height);
+void
+_cairo_surface_composite (cairo_operator_t operator,
+ cairo_surface_t *src,
+ cairo_surface_t *mask,
+ cairo_surface_t *dst,
+ int src_x,
+ int src_y,
+ int mask_x,
+ int mask_y,
+ int dst_x,
+ int dst_y,
+ unsigned int width,
+ unsigned int height);
+
+void
+_cairo_surface_fill_rectangles (cairo_surface_t *surface,
+ cairo_operator_t operator,
+ const cairo_color_t *color,
+ cairo_rectangle_t *rects,
+ int num_rects);
+
+void
+_cairo_surface_composite_trapezoids (cairo_operator_t operator,
+ cairo_surface_t *src,
+ cairo_surface_t *dst,
+ int xSrc,
+ int ySrc,
+ const cairo_trapezoid_t *traps,
+ int ntraps);
+
+void
+_cairo_surface_pull_image (cairo_surface_t *surface);
+
+void
+_cairo_surface_push_image (cairo_surface_t *surface);
+
/* cairo_pen_t.c */
cairo_status_t
_cairo_pen_init (cairo_pen_t *pen, double radius, cairo_gstate_t *gstate);
@@ -621,23 +712,23 @@
_cairo_pen_fini (cairo_pen_t *pen);
cairo_status_t
-_cairo_pen_add_points (cairo_pen_t *pen, XPointFixed *pt, int num_pts);
+_cairo_pen_add_points (cairo_pen_t *pen, cairo_point_t *pt, int num_pts);
cairo_status_t
_cairo_pen_add_points_for_slopes (cairo_pen_t *pen,
- XPointFixed *a,
- XPointFixed *b,
- XPointFixed *c,
- XPointFixed *d);
+ cairo_point_t *a,
+ cairo_point_t *b,
+ cairo_point_t *c,
+ cairo_point_t *d);
cairo_status_t
_cairo_pen_find_active_cw_vertex_index (cairo_pen_t *pen,
- cairo_slope_fixed_t *slope,
+ cairo_slope_t *slope,
int *active);
cairo_status_t
_cairo_pen_find_active_ccw_vertex_index (cairo_pen_t *pen,
- cairo_slope_fixed_t *slope,
+ cairo_slope_t *slope,
int *active);
cairo_status_t
@@ -654,10 +745,10 @@
_cairo_polygon_fini (cairo_polygon_t *polygon);
cairo_status_t
-_cairo_polygon_add_edge (cairo_polygon_t *polygon, XPointFixed *p1, XPointFixed *p2);
+_cairo_polygon_add_edge (cairo_polygon_t *polygon, cairo_point_t *p1, cairo_point_t *p2);
cairo_status_t
-_cairo_polygon_add_point (cairo_polygon_t *polygon, XPointFixed *pt);
+_cairo_polygon_add_point (cairo_polygon_t *polygon, cairo_point_t *pt);
cairo_status_t
_cairo_polygon_close (cairo_polygon_t *polygon);
@@ -665,10 +756,10 @@
/* cairo_spline_t.c */
cairo_int_status_t
_cairo_spline_init (cairo_spline_t *spline,
- XPointFixed *a,
- XPointFixed *b,
- XPointFixed *c,
- XPointFixed *d);
+ cairo_point_t *a,
+ cairo_point_t *b,
+ cairo_point_t *c,
+ cairo_point_t *d);
cairo_status_t
_cairo_spline_decompose (cairo_spline_t *spline, double tolerance);
@@ -714,19 +805,25 @@
cairo_traps_fini (cairo_traps_t *traps);
cairo_status_t
-cairo_traps_tessellate_triangle (cairo_traps_t *traps, XPointFixed t[3]);
+cairo_traps_tessellate_triangle (cairo_traps_t *traps, cairo_point_t t[3]);
cairo_status_t
-cairo_traps_tessellate_rectangle (cairo_traps_t *traps, XPointFixed q[4]);
+cairo_traps_tessellate_rectangle (cairo_traps_t *traps, cairo_point_t q[4]);
cairo_status_t
cairo_traps_tessellate_polygon (cairo_traps_t *traps,
cairo_polygon_t *poly,
cairo_fill_rule_t fill_rule);
-/* cairo_misc.c */
+/* cairo_slope.c */
void
-_compute_slope (XPointFixed *a, XPointFixed *b, cairo_slope_fixed_t *slope);
+_cairo_slope_init (cairo_slope_t *slope, cairo_point_t *a, cairo_point_t *b);
+
+int
+_cairo_slope_clockwise (cairo_slope_t *a, cairo_slope_t *b);
+
+int
+_cairo_slope_counter_clockwise (cairo_slope_t *a, cairo_slope_t *b);
#endif
--- cairo_misc.c DELETED ---
- Previous message: [Commit] cairo ChangeLog, 1.36, 1.37 cairo.pc.in, 1.1,
1.2 configure.in, 1.6, 1.7
- Next message: [Commit] slim ChangeLog,1.1,1.2 configure.in,1.1,1.2
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the Commit
mailing list