Commit graph

71 commits

Author SHA1 Message Date
Keith Packard
7cf9a6e4e3 Directly check the miter corner to detect wild miters.
The original test for wild miters would only work with a square transform
(and, in fact, the original code required an identity transform). Instead of
fixing that, I replaced it with a more obvious test which makes sure the
miter corner lies between the two faces and not out in space somewhere.
2008-01-04 17:47:31 -08:00
Carl Worth
00d701ff7d Limit miters for small angles
This fixes the current failure get-path-extents, which is a
demonstration of the following bug:

	cairo_stroke_extents() gives wrong result for arcs in some cases
	https://bugs.freedesktop.org/show_bug.cgi?id=7245

Many thanks to Michael Urman whose review of early versions of
this work found a fatal mistake in my algebra.
2007-10-30 08:18:57 -07:00
Carl Worth
9bf0a640d2 Add figure illustrating derivation of miter limit
And use sin in the first place rather than the more awkward
secant.
2007-10-30 08:18:56 -07:00
Chris Wilson
b7adcf67f8 [cairo-path-stroke] Jump to cleanup after error.
Incorrect early return in _cairo_stroker_curve_to() after
_cairo_stroker_join() resulted in leaking the local spline and pen.
2007-10-11 15:01:14 +01:00
Chris Wilson
bed8239f03 [cairo-error] Clean up all the warnings and missing _cairo_error() calls.
Every time we assign or return a hard-coded error status wrap that value
with a call to _cairo_error(). So the idiom becomes:
    status = _cairo_error (CAIRO_STATUS_NO_MEMORY);
or
    return _cairo_error (CAIRO_STATUS_INVALID_DASH);

This ensures that a breakpoint placed on _cairo_error() will trigger
immediately cairo detects the error.
2007-10-04 13:31:44 +01:00
Chris Wilson
8ad56b308a [malloc/error] Add call to _cairo_error() after a failed malloc.
Blitz all allocations to ensure that they raise a
_cairo_error(CAIRO_STATUS_NO_MEMORY) on failure.
2007-10-04 00:42:30 +01:00
Chris Wilson
e49bcde27f [malloc] Check for integer overflow when realloc'ing.
Perform similar sanity checks to Vlad's _cairo_malloc_ab() but on the
arguments to realloc instead.
2007-10-04 00:42:29 +01:00
Chris Wilson
4e39e30d83 [cairo-pen] Remove status from _cairo_pen_find_active_vertex_*()
This pair of functions unconditionally return SUCCESS, so remove the
status return and supporting tests from their callers.
2007-08-16 15:20:25 +01:00
Carl Worth
b1086caf3b Add a status field to cairo_polygon_t
Now, the functions to add new data to a polygon all become void,
and there's a new _cairo_polygon_status call to query the status
at the end of a sequence of operations.

With this change, we fix many callerswhich were previously not
checking the return values of _cairo_polygon functions by adding
only a single call to _cairo_polygon_status rathern than several
new checks.
2007-04-10 10:45:15 -07:00
Chris Wilson
3f7ca6ef5b cairo-pen - cairo_pen_init() can fail propagate its error.
Add status returns in order to propagate an intialisation failure
back up the call chain.
2007-04-09 15:51:31 -07:00
Chris Wilson
293122279f cairo-path-stroke - add trivial missing status checks
Propagate the error status.
2007-04-09 15:11:47 +01:00
Behdad Esfahbod
dcdcb7ac2a Fix leak in rectilinear stroking code
The code was not cleaning up after itself when rejecting a path as
rectilinear.
2007-03-01 18:36:16 -05:00
Jeff Smith
0fcd6cfe0e Clean up some inconsistent spacing in the stroking code 2007-02-19 16:06:57 -05:00
Jeff Smith
89010db3ad Add or reword several comments in the stroking code 2007-02-19 16:06:57 -05:00
Jeff Smith
adb573d0ba Minor changes to shorten the stroking code 2007-02-19 16:06:57 -05:00
Jeff Muizelaar
fb29fddd40 Rename tmp to step_length because that is what it actually is. 2007-02-19 16:06:57 -05:00
Jeff Muizelaar
afd5f92195 Fix several issues with dashed stroking code, particularly 'leaky-dash'
Adds some state, 'dash_starts_on', to keep track of whether a dashed path
starts with dash_on or not. This fixes the 'leaky-dash' bug (#4863) and
some other degenerate cases. The new version is, in my opinion,
considerably cleaner and more understandable than the old code.

Finally, the rewrite changes the behaviour of dashing to add degenerate
caps around corners that start at the same place as a dash begins. This
matches the behaviour seen in acroread.

This rewrite is based on an initial rewrite done by Jeff Smith.
2007-02-19 16:06:57 -05:00
Jeff Muizelaar
78ae474d96 Rename has_sub_path to has_initial_sub_path
has_initial_sub_path more accurately describes the condition we want to
track. This flag is used to indicate when an initial sub_path needs capping
but has no associated slope and thus no associated faces.
2007-02-19 16:06:56 -05:00
Jeff Muizelaar
9f3fb4f753 Add a comment about the point choice when capping degenerate paths 2007-02-19 16:06:56 -05:00
Jeff Smith
a1a4d6966e Modify how _cairo_stroker_add_caps handles zero-length sub-paths
For zero-length sub-paths, _cairo_stroker_add_caps sets up a dummy face,
then lets later parts of the function add the caps.
2007-02-19 16:06:56 -05:00
Jeff Smith
849a9ef81b Change type of cairo_stroker_t's dash_on from int to cairo_bool_t 2007-02-19 16:06:56 -05:00
Behdad Esfahbod
ded08256ef Spell check the docs 2007-01-07 02:08:15 -05:00
Carl Worth
ba531642f7 Add optimization for rectilinear stroke
This custom stroking code allows backends to use optimized region-based
drawing operations for rectilinear strokes. This results in a 5-25x
performance improvement when drawing rectilinear shapes:

image-rgb          box-outline-stroke-100 0.18 -> 0.01: 25.58x speedup
████████████████████████▋
image-rgba         box-outline-stroke-100 0.18 -> 0.01: 25.57x speedup
████████████████████████▋
 xlib-rgb          box-outline-stroke-100 0.49 -> 0.06:  8.67x speedup
███████▋
 xlib-rgba         box-outline-stroke-100 0.22 -> 0.04:  5.39x speedup
████▍

In other words, using cairo_stroke instead of cairo_fill to draw the
same shape was 5-15x slower before, but is 1.2-2x faster now.
2006-12-22 17:59:20 -08:00
Carl Worth
4cd871b6f3 Switch from old tessellator to new tessellator 2006-11-22 16:56:51 -08:00
Carl Worth
29b01f93ca Make miter join code use tessellate_convex_quad rather than tessellate_polygon
This provides an additional 22-29% speedup on top of the previous
fix for stroking paths with many miter joins:

image-rgba  world_map-800  459.73 0.27% -> 356.80 0.32%:  1.29x speedup
▎
image-rgb   world_map-800  458.83 0.37% -> 358.08 0.41%:  1.28x speedup
▎
 xlib-rgba  world_map-800  566.57 0.23% -> 463.84 0.31%:  1.22x speedup
▎
 xlib-rgb   world_map-800  562.31 0.64% -> 460.51 0.83%:  1.22x speedup
▎
2006-11-13 16:50:30 -08:00
Carl Worth
3d53f623fa Make _cairo_stroker_add_sub_edge use tessellate_convex_quad rather than tessellate_polygon
This gives a 17-20% speedup for stroking polygons with many
straight line segments as seen in the world_map test case:

Speedups
========
image-rgba  world_map-800  555.41 0.17% -> 460.69 0.20%:  1.21x speedup
▎
image-rgb   world_map-800  554.91 0.25% -> 460.73 0.26%:  1.20x speedup
▎
 xlib-rgb   world_map-800  669.85 3.70% -> 570.31 0.24%:  1.17x speedup
▏
 xlib-rgba  world_map-800  663.71 0.46% -> 567.74 0.19%:  1.17x speedup
▏
2006-11-13 16:50:00 -08:00
Carl Worth
861f1cb4f7 Merge branch 'jrmuizel-stroking-fixes' into cairo
Conflicts:

	test/dash-caps-joins-ps-argb32-ref.png
	test/degenerate-path-ps-argb32-ref.png
	test/degenerate-path.c
2006-08-18 07:59:20 -07:00
Carl Worth
eb9caf0833 Add -Wsign-compare compiler flag and fix all warnings 2006-07-28 22:50:06 -07:00
Jeff Muizelaar
fbb1758ba8 Fix degenerate-path stroking with dashed lines.
This draws dashed degenerate-paths if the dash is on at the point of the
path and otherwise draws nothing.
2006-07-15 14:44:29 -04:00
Carl Worth
ce2b9e1b5c Prefer TRUE and FALSE over 1 and 0 for assigning cairo_bool_t values 2006-06-25 16:57:59 +02:00
Carl Worth
773cb6475b Prefer sub_path over subpath in identifiers. 2006-06-25 16:51:25 +02:00
Jeff Muizelaar
15caa88c64 Initial support for degenerate-path stroking
This follows the PDF and SVG specifications which only draw degenerate paths when
round caps are in effect.

With this commit, the degenerate-path test passes with the image, xlib, and pdf
backends, (but still fails with ps and svg backends).
2006-06-25 16:12:38 +02:00
Carl Worth
4670366ede Remove trailing whitespace from lines that look like comments.
This patch was produced with the following (GNU) sed script:

	sed -i -r -e '/^[ \t]*\/?\*/ s/[ \t]+$//'

run on all *.[ch] files within cairo, (though I manually excluded
src/cairo-atsui-font.c which has a code line that appears as a comment
to this script).
2006-06-06 15:35:48 -07:00
Carl Worth
80b8deb1e4 Remove extraneous whitespace from "blank" lines.
This patch was produced with the following (GNU) sed script:

	sed -i -r -e 's/^[ \t]+$//'

run on all *.[ch] files within cairo.
2006-06-06 15:25:49 -07:00
Carl Worth
448e904b2a Merge branch 'cairo' into new-sub-path
Conflicts:

	src/cairo-path-stroke.c
	src/cairo-pdf-surface.c
	src/cairo-ps-surface.c
2006-04-18 15:18:31 -07:00
Jeff Muizelaar
2078557c5c Fix skipping zero length dash segments in dash_start.
The extra check makes sure zero length segments are not skipped when computing
the dash start state. This is needed so that we get proper line capping if, for
example, the first dash segment has zero length and we have a dash offset of
zero.
2006-04-14 01:51:26 -04:00
Jeff Muizelaar
5eaf71e77b Move the test for zero length sub edges below the computation of faces.
Face computation still works if a line has zero length, all that is needed is a
slope and a point. This patch fixes bug #5561 because the faces are initialized
even if the segment has zero length as expected by
_cairo_stroker_line_to_dashed.
2006-04-13 23:41:45 -04:00
Jeff Muizelaar
20fca01a2c Move calculation of slope outside of _cairo_stroker_add_sub_edge.
This makes the slope calculation more accurate for dashed lines by computing it
once for the entire line instead for each individual dash segment. It also
adjusts stroker_line_to() to match the new convention for
stroker_add_sub_edge().
2006-04-13 23:41:26 -04:00
Jeff Muizelaar
8a2ea660fb Check for zero length dashed lines.
This makes line_to_dashed more like line_to by returning immediately on
degenerate paths. This is needed so that we can do the slope calculation for
the entire line.
2006-04-13 23:40:21 -04:00
Jeff Muizelaar
65e706ee14 Reset dashing for new subpaths.
Fixes the bug mentioned in b87726ee2a by reseting
the dash pattern for each new subpath. This is correct behaviour according to
the end of PDF Reference v1.6 section 4.3.2.

This commit now makes the dash-caps-joins test case pass for all
backends except for the PostScript backend.
2006-04-10 10:57:28 -07:00
Carl Worth
1dc1b57b4e cairo_new_sub_path: Making cairo_arc easier to use and more.
This adds a new function which has as its only effect the elimination
of
the current point. This makes it much easier to use the various
cairo_arc calls when the initial line_to is not actually desired.

This function also unifies and generalizes the long-existing behavior
of cairo_line_to being treated as cairo_move_to when there is no
current point. With the addition of cairo_new_sub_path this becomes a
documented feature with similar behavior in cairo_curve_to as well.
2006-02-23 22:01:07 -08:00
Carl Worth
39eca22bfe Rework support in the surface backend for the five basic drawing operations (paint, mask, stroke, fill, and show_glyphs). Now, all 5 operations have backend functions, and all use a consistent convention for argument naming and ordering. The old fill_path has been replaced with a new fill. The old show_glyphs function was recently renamed to old_show_glyphs and has not yet been ported to the new show_glyphs, (so all backends have a NULL show_glyphs function). In fact, of the 5 new backend functions, fill is the only one that has an implementation in any backend. As part of this cleanup a new cairo_stroke_style_t object is introduced to capture the many settings unique to the stroke operation, (line_width, line_cap, line_join, miter_limit, dash, num_dashes, and dash_offset).
Track changes in surface backend from fill_path to fill.
Track the new canonical argument naming and ordering for the 5 drawing operations.
Move various stroke style settings into new cairo_stroke_style_t.
Drop NULL fill_path backend function which no longer exists.
2005-11-04 11:16:38 +00:00
Carl Worth
a7228cc37a Originally 2005-10-28 Keith Packard <keithp@keithp.com>:
Remove pen_regular field from the gstate.
Move stroke fallback from gstate to surface where it belongs.
Eliminate dependence on cairo_gstate_t object.
Fix to include just cairo-clip-private.h rather than cairo-gstate.private.h.
2005-10-31 16:55:21 +00:00
Carl Worth
abaf346810 Note that bug #4409 (Dashes are missing initial caps) is now fixed.
Move face-flipping from inside _cairo_stroker_add_caps to new _cairo_stroker_add_leading_cap variant of _cairo_stoker_add_cap.
Change to call _cairo_stroker_add_leading_cap or _cairo_stroker_add_trailing_cap as appropriate.
Remove dash-caps-joins from the XFAIL list and add reference image.
2005-09-27 12:44:32 +00:00
Carl Worth
6d14b3c1fc Prefer cairo_bool_t, TRUE, and FALSE over int, 1, and 0. 2005-09-16 10:49:48 +00:00
Carl Worth
5b9be26d26 Tested by: John Ellson Closes bug #4408 https://bugs.freedesktop.org/show_bug.cgi?id=4408
Add support for dashed splines. (The antialiasing quality isn't perfect, but at least the curves are dashed now).
2005-09-16 10:24:54 +00:00
Carl Worth
256456b708 Fix for bug #4205:
Abstract the cap-addition code from the end of the stroke operation into a new _cairo_stroker_add_caps function.
Call the new _cairo_stroker_add_caps at the beginning of every move_to so that we get caps on every subpath and not just the last one.
2005-08-23 07:44:14 +00:00
Carl Worth
5170c1f4d2 Remove unneeded includes of cairo-path-fixed-private.h.
Fix indentation.
2005-03-23 14:17:40 +00:00
Carl Worth
f218c14b9d Rename cairo_path_real_t to cairo_path_fixed_t and fix all _cairo_path functions to be named as _cairo_path_fixed functions.
Track name change of cairo_path_real_t and _cairo_path_fixed functions.
2005-03-23 13:52:54 +00:00
Carl Worth
cb5bbd0aa7 Begin the process of breaking up cairoint.h, moving structure definitions of cairo_t, cairo_gstate_t, and cairo_path_real_t into their own header files.
Track changes to header files, reaching into the new private headers where necessary.
2005-03-23 13:50:51 +00:00