[cairo] [PATCH] Contribution to line join and end caps
horakm at centrum.cz
horakm at centrum.cz
Sun Aug 3 03:59:03 PDT 2008
Hello,
I tried several times to post my contribution to forum at cairo at cairographics.org first,
but for last two days I didn't receive any reply and therefore I thought that my address is blocked.
So I add my contribution to the web interface at http://bugs.freedesktop.org/ (Bug #16954)
But two hours ago I got info about successfull reception of the previous posts.
I am deeply sorry for flooding mailing list. Is it possible to delete them?
Martin
______________________________________________________________
> Od: horakm at centrum.cz
> Komu: <cairo at cairographics.org>
> Datum: 03.08.2008 11:53
> Předmět: [cairo] [PATCH] Contribution to line join and end caps
>
>Hello,
>
>I am working on a project which uses the cairo library for primary
graphics rendering.
>Because I quickly needed a special (not currently available in the
version 1.6.4) join and end
>caps for lines, I implemented them myself. I added new two options to
type cairo_line_join_t
>(CAIRO_LINE_JOIN_TRIANGLE, CAIRO_LINE_JOIN_NONE) and one option to type
cairo_line_cap_t
>(CAIRO_LINE_CAP_TRIANGLE)
>The patches for cairo.h and cairo-path-stroke.c files are attached. I
hope they will be useful.
>
>Martin Horak
>
>
>--- cairo.h 2008-04-08 00:30:32.000000000 +0200
>+++ new\cairo.h 2008-08-01 10:19:34.343750000 +0200
>@@ -495,6 +495,7 @@
>* @CAIRO_LINE_CAP_BUTT: start(stop) the line exactly at the start(end)
point
>* @CAIRO_LINE_CAP_ROUND: use a round ending, the center of the circle is
the end point
>* @CAIRO_LINE_CAP_SQUARE: use squared ending, the center of the square is
the end point
>+ * @CAIRO_LINE_CAP_TRIANGLE: use triangle ending, the triangle vertex is
half of line width from the end point
>*
>* Specifies how to render the endpoints of the path when stroking.
>*
>@@ -503,7 +504,8 @@
>typedef enum _cairo_line_cap {
>CAIRO_LINE_CAP_BUTT,
>CAIRO_LINE_CAP_ROUND,
>- CAIRO_LINE_CAP_SQUARE
>+ CAIRO_LINE_CAP_SQUARE,
>+ CAIRO_LINE_CAP_TRIANGLE
>} cairo_line_cap_t;
>
>cairo_public void
>@@ -517,6 +519,9 @@
>* joint point
>* @CAIRO_LINE_JOIN_BEVEL: use a cut-off join, the join is cut off at half
>* the line width from the joint point
>+ * @CAIRO_LINE_JOIN_TRIANGLE: use a triangle join, the triangle vertex
is at half
>+ * of line width from the join point
>+ * @CAIRO_LINE_JOIN_NONE: no line join
>*
>* Specifies how to render the junction of two lines when stroking.
>*
>@@ -525,7 +530,9 @@
>typedef enum _cairo_line_join {
>CAIRO_LINE_JOIN_MITER,
>CAIRO_LINE_JOIN_ROUND,
>- CAIRO_LINE_JOIN_BEVEL
>+ CAIRO_LINE_JOIN_BEVEL,
>+ CAIRO_LINE_JOIN_TRIANGLE,
>+ CAIRO_LINE_JOIN_NONE
>} cairo_line_join_t;
>
>cairo_public void
>
>
>--- cairo-path-stroke.c 2008-04-05 00:45:22.000000000 +0200
>+++ new\cairo-path-stroke.c 2008-08-01 14:40:48.421875000 +0200
>@@ -278,6 +278,10 @@
>}
>
>switch (stroker->style->line_join) {
>+ case CAIRO_LINE_JOIN_NONE:
>+ {
>+ return CAIRO_STATUS_SUCCESS;
>+ }
>case CAIRO_LINE_JOIN_ROUND: {
>int i;
>int start, step, stop;
>@@ -477,7 +481,59 @@
>
>return _cairo_traps_tessellate_triangle (stroker->traps, tri);
>}
>- }
>+ case CAIRO_LINE_JOIN_TRIANGLE: {
>+ double x1, y1, x2, y2, x3, y3;
>+ double d, douter;
>+ double centerx, centery;
>+
>+ x1 = _cairo_fixed_to_double (inpt->x);
>+ y1 = _cairo_fixed_to_double (inpt->y);
>+ x2 = _cairo_fixed_to_double (outpt->x);
>+ y2 = _cairo_fixed_to_double (outpt->y);
>+ x3 = _cairo_fixed_to_double (in->point.x);
>+ y3 = _cairo_fixed_to_double (in->point.y);
>+
>+ /* center point between inpt and outpt points */
>+ centerx = ( x1 + x2 ) / 2.0;
>+ centery = ( y1 + y2 ) / 2.0;
>+
>+ /* distance between inpt and in points */
>+ douter = sqrt( ( x1 - x3 ) * ( x1 - x3 ) + ( y1 - y3 ) * ( y1 - y3 ) );
>+
>+ /* distance between center and in points */
>+ d = sqrt( ( centerx - x3 ) * ( centerx - x3 ) + ( centery - y3 ) * (
centery - y3 ) );
>+
>+ if ( d )
>+ {
>+ double dx, dy;
>+ cairo_point_t quad[4];
>+ cairo_point_t outer;
>+
>+ /* extrapolate distance between in and center to outer point in
cartesian space */
>+ dx = ( x3 - centerx ) * douter / d;
>+ dy = ( y3 - centery ) * douter / d;
>+
>+ outer.x = _cairo_fixed_from_double ( x3 - dx );
>+ outer.y = _cairo_fixed_from_double ( y3 - dy );
>+
>+ quad[0] = in->point;
>+ quad[1] = *inpt;
>+ quad[2] = outer;
>+ quad[3] = *outpt;
>+
>+ return _cairo_traps_tessellate_convex_quad (stroker->traps, quad);
>+ }
>+ else
>+ {
>+ /* bevel */
>+ cairo_point_t tri[3];
>+ tri[0] = in->point;
>+ tri[1] = *inpt;
>+ tri[2] = *outpt;
>+ return _cairo_traps_tessellate_triangle (stroker->traps, tri);
>+ }
>+ }
>+ }
>}
>
>static cairo_status_t
>@@ -516,6 +572,29 @@
>
>return _cairo_traps_tessellate_triangle (stroker->traps, tri);
>}
>+ case CAIRO_LINE_CAP_TRIANGLE: {
>+ double dx, dy, x1, y1;
>+ cairo_point_t outer;
>+ cairo_point_t tri[3];
>+
>+ dx = f->usr_vector.x;
>+ dy = f->usr_vector.y;
>+ dx *= stroker->style->line_width / 2.0;
>+ dy *= stroker->style->line_width / 2.0;
>+ cairo_matrix_transform_distance (stroker->ctm, &dx, &dy);
>+
>+ x1 = _cairo_fixed_to_double( f->ccw.x + f->cw.x ) / 2.0 + dx;
>+ y1 = _cairo_fixed_to_double( f->ccw.y + f->cw.y ) / 2.0 + dy;
>+
>+ outer.x = _cairo_fixed_from_double( x1 );
>+ outer.y = _cairo_fixed_from_double( y1 );
>+
>+ tri[0] = outer;
>+ tri[1] = f->cw;
>+ tri[2] = f->ccw;
>+
>+ return _cairo_traps_tessellate_triangle (stroker->traps, tri);
>+ }
>case CAIRO_LINE_CAP_SQUARE: {
>double dx, dy;
>cairo_slope_t fvector;
>
>_______________________________________________
>cairo mailing list
>cairo at cairographics.org
>http://lists.cairographics.org/mailman/listinfo/cairo
>
More information about the cairo
mailing list