Commit graph

60 commits

Author SHA1 Message Date
Chris Wilson
4032438625 [path] Eliminate redundant line-to before a close
As the close implicitly issues a line-to to the initial point, remove an
identical line-to if present.
2009-08-29 08:08:34 +01:00
Chris Wilson
111f2be71b [path] Discard redundant line-to
Eliminate repeated line-to to the current point.
2009-08-29 08:08:33 +01:00
Chris Wilson
3fcac1ef21 [slope] Inline _cairo_slope_init()
Move the definition to a separate header file and allow callers to inline
the simple function.
2009-08-29 08:08:33 +01:00
Chris Wilson
cb30c1f367 [path] Extend identical lines.
If a subsequent PATH_OP is just a continuation of the previous line, i.e.
it has the same gradient, then just replace the end-point of the previous
line with the new point rather than adding a new operation. Surprisingly
this occurs in the wild, but the main motivation is a future optimisation
to reduce the number of intersections during stroke-to-path.
2009-08-06 10:16:02 +01:00
Chris Wilson
71f5649846 [path] Fix iter to handle circular list of buffers
When switching the path over to use the circularly linked list, 73f801,
I missed updating the path iterator.
2009-07-29 16:17:12 +01:00
Chris Wilson
acfcf4a31b [path] Remove the broken rel-curve-to as line-to
As pointed out by Andrea, and now tested by test/degenerate-rel-curve-to,
this attempt at removing degenerate curve-to was broken.
2009-07-29 16:17:11 +01:00
Chris Wilson
128d6fb2da [path] Remove the erroneous conversion of a 'zero-length' curve-to
As pointed out by Andrea, and now tested by test/degenerate-curve-to, a
curve-to that begins and ends on the same point may extend further due to
its control points. It can not be simply replaced with a degenerate
line-to. In order to do so we will need more extensive degeneracy
checking, ala _cairo_spline_init().
2009-07-28 08:37:54 +01:00
Carl Worth
45919a4f0c Revert "[path] Convert straight curve-to to line-to"
This reverts commit c72ca2f229.

This commit was broken as verified by the curve-to-as-line-to test
case.
2009-07-27 15:45:55 -07:00
Chris Wilson
c72ca2f229 [path] Convert straight curve-to to line-to
Avoid the high cost associated with curves if we can convert the curve to
a straight line.
2009-07-27 10:18:25 +01:00
Chris Wilson
bed2701e1c Remove clip handling from generic surface layer.
Handling clip as part of the surface state, as opposed to being part of
the operation state, is cumbersome and a hindrance to providing true proxy
surface support. For example, the clip must be copied from the surface
onto the fallback image, but this was forgotten causing undue hassle in
each backend. Another example is the contortion the meta surface
endures to ensure the clip is correctly recorded. By contrast passing the
clip along with the operation is quite simple and enables us to write
generic handlers for providing surface wrappers. (And in the future, we
should be able to write more esoteric wrappers, e.g. automatic 2x FSAA,
trivially.)

In brief, instead of the surface automatically applying the clip before
calling the backend, the backend can call into a generic helper to apply
clipping. For raster surfaces, clip regions are handled automatically as
part of the composite interface. For vector surfaces, a clip helper is
introduced to replay and callback into an intersect_clip_path() function
as necessary.

Whilst this is not primarily a performance related change (the change
should just move the computation of the clip from the moment it is applied
by the user to the moment it is required by the backend), it is important
to track any potential regression:

ppc:
Speedups
========
image-rgba         evolution-20090607-0    1026085.22 0.18% -> 672972.07 0.77%:  1.52x speedup
▌
image-rgba         evolution-20090618-0    680579.98 0.12% -> 573237.66  0.16%:  1.19x speedup
▎
image-rgba      swfdec-fill-rate-4xaa-0    460296.92 0.36% -> 407464.63  0.42%:  1.13x speedup
▏
image-rgba      swfdec-fill-rate-2xaa-0    128431.95 0.47% -> 115051.86  0.42%:  1.12x speedup
▏
Slowdowns
=========
image-rgba     firefox-periodic-table-0    56837.61 0.78% -> 66055.17    3.20%:  1.09x slowdown
▏
2009-07-23 15:32:14 +01:00
Chris Wilson
fbd88db938 [path] Don't include current-point in hash
As we don't strictly use the current-point in comparing paths, exclude it
from the hash. Similarly use the path content flags as a cheap means to
differentiate contents.
2009-07-05 15:01:08 +01:00
Chris Wilson
73f8019fd2 [path] Use cairo_list_t instead of open-coding its own
Use the cairo_list_t and its style of iterators to improve the readability
of the cairo_path_buf_t management. Note the complications that arise from
the embedding of the initial buf -- however the macros do help make the
unusual manipulations more identifiable.
2009-07-05 15:01:03 +01:00
Chris Wilson
a04e372664 [path] Add path watch debugging
Simple debug macro to print the path to stderr during construction.
2009-07-05 10:34:33 +01:00
Chris Wilson
1645352bfb [path] Evaluate is_box && is_region during construction
Whilst constructing the path, if the operations continue to be
axis-aligned lines, allow the is_box and is_region flags to persist. These
are set to false as soon as a curve-to is added, a diagonal or in the case
of is_region a non-integer point.
2009-07-05 09:30:02 +01:00
Nis Martensen
bc87074185 [path] Fix missing implicit move-to
When cairo_curve_to happens to start a new subpath (e.g., after a call
to cairo_new_sub_path()), it also needs to update the last_move_point.
Otherwise the new current point after a close_path() will be at an
unexpected position.

Therefore, call _cairo_path_fixed_move_to() explicitly.
2009-06-17 16:39:56 +01:00
Chris Wilson
132f44dce1 valgrindify init/fini routines
Annotate object init/fini routines to detect use-after-free for
on-stack/embedded objects.
2009-06-04 14:17:43 +01:00
Behdad Esfahbod
3ec94f9b59 Support compiling without fontconfig
Adds a new, fake, fontconfig font backend.  Fontconfig can be disabled
using --disable-fc, in which case the toy text API wont find fonts and
the internal font will always be used.

Also defines the feature macro CAIRO_HAS_FC_FONT.  The two fontconfig-specific
functions in cairo-ft.h depend on that macro now.
2009-03-17 00:58:40 -04:00
Chris Wilson
ee7ac5681f [path] A degenerate curve_to becomes a line_to.
Be consistent.
2009-01-29 10:10:39 +00:00
Chris Wilson
1950abd14c [doc] Fix erroneous doc comment.
A normal comment was marked as a gtk-doc entry and thus causing gtk-doc to
complain.
2008-12-14 16:39:24 +00:00
Chris Wilson
bcb2724920 [path] Mark points as const during _cairo_path_fixed_interpret()
Use const to document the read-only nature of the arguments passed to the
callbacks.
2008-12-12 11:11:49 +00:00
Chris Wilson
68b29cafa5 [spline] Propagate errors during add point.
Yikes! The callback could fail so we need to propagate the error status.
2008-12-12 11:11:48 +00:00
M Joonas Pihlaja
a370d077bc [path-fixed] New _cairo_path_fixed_is_region().
We want to hit the current fast paths for rendering axis aligned
rectilinear paths rather than spans, and for that we need to be able
to identify regional paths.
2008-12-06 14:04:35 +02:00
M Joonas Pihlaja
6acb822393 [path-fixed] Avoid extra indirection when iterating already flat paths.
Perform a plain iteration rather than a flattening one if the path
knows it doesn't have any curves.
2008-12-06 14:04:35 +02:00
Chris Wilson
e6963a5bfe Mark allocation failures as unlikely.
Use the gcc likelihood annotation to indicate that allocation failures are
extremely unlikely.
2008-11-29 11:20:34 +00:00
Chris Wilson
d1801c23fa Mark if(status) as being unlikely.
The error paths should be hit very rarely during normal operation, so mark
them as being unlikely so gcc may emit better code.
2008-11-29 11:20:33 +00:00
Chris Wilson
f2982e103c [fill] Allow rectangles to be implicitly closed.
Also scan for appendages of simple rectangles.
2008-11-29 10:14:26 +00:00
Chris Wilson
d2bcf1d76d [path] Carefully check for no more points.
As the empty path points to an embedded buf, we cannot rely on the buf
pointer being NULL to mark end-of-path.
2008-11-29 10:14:26 +00:00
Chris Wilson
4ac38f7c2b [fill] Emit rectangles for GdkRegion
Scan the path for a series of consistently wound rectangles.
2008-11-25 12:54:58 +00:00
Chris Wilson
d7873eecc5 [spline] Eliminate intermediate allocations during spline decomposition.
The spline decomposition code allocates and stores points in a temporary
buffer which is immediately consumed by the caller. If the caller supplies
a callback that handles each point computed along the spline, then we can
use the point immediately and avoid the allocation.
2008-11-16 16:21:25 +00:00
Chris Wilson
a856371bef Add CairoScript backend.
A new meta-surface backend for serialising drawing operations to a
CairoScript file. The principal use (as currently envisaged) is to provide
a round-trip testing mechanism for CairoScript - i.e. we can generate
script files for every test in the suite and check that we can replay them
with perfect fidelity. (Obviously this does not provide complete coverage
of CairoScript's syntax, but should give reasonable coverage over the
operators.)
2008-11-13 11:36:54 +00:00
Behdad Esfahbod
3f5051fab1 Fix now-detected doc formatting issues 2008-06-01 19:14:13 -04:00
Behdad Esfahbod
df5ad168aa [cairo-path-fixed] Fixe compiler warning 2008-05-28 16:47:55 -04:00
Behdad Esfahbod
16fe67ea19 [cairo-path-fixed] Implement full-matrix _cairo_path_fixed_transform()
Based on patch from Peter Clifton.
2008-05-13 16:10:28 -04:00
Behdad Esfahbod
dca892c83e Fix gtk-doc warnings 2008-05-10 01:21:44 +02:00
Behdad Esfahbod
0e965c970b [cairo-path-fixed] Add _cairo_path_fixed_append() 2008-05-09 15:54:11 +02:00
Behdad Esfahbod
e9b6bb06d6 [cairo-path-fixed] Add a couple consts to function signatures 2008-05-09 15:54:11 +02:00
Adrian Johnson
112b43452d Fix bug in _cairo_path_fixed_is_equal
Ensure the entire path is compared.
2008-03-15 00:18:59 +10:30
Adrian Johnson
40f4750f5e Use PDF 're' operator for rectangle paths
Modify cairo-pdf-operators.c to emit to 're' path operator when the
path contains only a rectangle. This can only be done when the path is
logically equivilent to the the path drawn by the 're'
operator. Otherwise dashed strokes may start on the wrong line.

ie the path must be equivalent to:

  cairo_move_to (cr, x, y);
  cairo_rel_line_to (cr, width, 0);
  cairo_rel_line_to (cr, 0, height);
  cairo_rel_line_to (cr, -width, 0);
  cairo_close_path (cr);

which is also equivilent to cairo_rectangle().
2008-02-26 23:17:04 +10:30
Vladimir Vukicevic
a4975ab117 [quartz] Optimize path handling where possible 2008-02-25 21:06:23 -05:00
Brian Ewins
1471b3f00a [path-fixed] add _cairo_path_fixed_interpret_flat
_cairo_path_fixed_interpret_flat flattens the path as it
interprets it, meaning that a curve_to callback is not
required.
2008-01-21 12:01:44 -08:00
Chris Wilson
e82b0f46b2 [cairo-path-fixed] Consolidate cairo_path_buf_t when copying.
When copying the cairo_path_fixed_t, consolidate the list of
dynamically allocated cairo_path_buf_t into a single buffer.
2007-12-27 12:55:50 +00:00
Chris Wilson
e0187ad49b [cairo-path-fixed] Ensure the points array is naturally aligned, take 2.
By enlarging buf_size to ensure the correct alignment of the points
array with the cairo_path_buf_t block, we can efficiently use the
padding bytes to store more ops.
2007-12-27 12:46:24 +00:00
Chris Wilson
d8169b8cef [cairo-path-fixed] Ensure the array of points is correctly aligned.
In http://bugs.gentoo.org/show_bug.cgi?id=203282, it was identified that
the cairo_path_buf was causing unaligned accesses (thus generating SIGBUS
on architectures like the SPARC) to its array of points. As we manually
allocate a single block of memory for the cairo_path_buf_t and its
arrays, we must also manually ensure correct alignment - as opposed to
cairo_path_buf_fixed_t for which the compiler automatically aligns the
embedded arrays.
2007-12-27 10:45:25 +00:00
Emmanuel Pacaud
0359ad6c8d Compilation warning suppression (char as array subscript).
cairo_path_op_t is a char, and can't be directly used as array subscript.
2007-11-11 00:18:19 +01:00
Emmanuel Pacaud
1b71af7e61 Fix _cairo_path_fixed_init_copy.
All the copied data buffers except the first one weren't completely
initialized (num_ops and num_points). That was the cause of the failure
of some vector surface tests, like random-intersections.
2007-11-11 00:14:34 +01:00
Chris Wilson
901b0c9752 [cairo-path-fixed] Exponentially enlarge cairo_path_buf_t.
Allocate subsequent path bufs twice as large as the previous buf,
whilst still embedding a small initial buf into cairo_path_fixed_t
that handles the most frequent usage.
2007-11-05 08:51:06 +00:00
Chris Wilson
6fdb7f129c Simplify return value from cairo_path_fixed_get_current_point().
The only caller of cairo_path_fixed_get_current_point(), used the status
return to determine whether or not the path had a current point (and did
not propagate the error) - for which we had already removed the
_cairo_error() markup. Now we reduce the boolean status return to a
cairo_bool_t, with a net reduction in code.
2007-10-30 10:43:55 +00:00
Chris Wilson
7ff80234e3 [cairo-path-fixed] Drop the _cairo_error() markup.
Do not use _cairo_error(CAIRO_STATUS_NO_CURRENT_POINT) within
_cairo_path_fixed_get_current_point() as the only caller,
cairo_get_current_point(), expects and handles that status.
2007-10-16 10:42:15 +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