Commit graph

3695 commits

Author SHA1 Message Date
Chris Wilson
d11014386f Add support for lockdep.
lockdep is a valgrind skin which performs pthread locking correctness
validation. In particular it allows one to write assert(HOLDS_LOCK(mutex))
which both documents the preconditions for a function and enforces them
when the program is run under lockdep.

As an aide to lockdep (as it works by intercepting the pthread functions),
all the mutexes should be initialised and destroyed using
pthread_mutex_init() and pthread_mutex_destroy() rather than using static
initializers and no-ops.
2008-10-17 22:52:47 +01:00
Chris Wilson
974fabfe05 [ft] Add more comments about FT_Face lifetime issues.
Currently we only have an example of how to call FT_Done after the last
reference to the FT cairo_font_face_t has been dropped, but do not
actually explain why this needs to be done. So add a couple of sentences
to clarify the likely lifetime of the FT_Face once exposed to cairo.
2008-10-17 22:52:47 +01:00
Chris Wilson
c1164a574d [type1] Add comment to warn about read() as macro.
In case we are ever tempted to simplify the function pointer, warn that it
may alias with a macro.
2008-10-16 17:19:00 +01:00
Adrian Johnson
5911c6966d Use correct inverse ctm for stroke in meta surface replay
This fixes #9189 Dashed strokes too long in fallback images
2008-10-16 17:22:48 +10:30
Jeff Muizelaar
b94b600b34 [quartz] Completely remove CAIRO_HAS_QUARTZ_IMAGE_SURFACE check
Instead of fixing the check in d36b02dc66, just
remove it. Conditionally compilation will keep cairo-quartz-image-surface.c
from being compiled in when it is not configured to be. Suggested by Behdad.
2008-10-15 13:41:03 -04:00
Jeff Muizelaar
d36b02dc66 [quartz] Rebalance 'CAIRO_HAS_QUARTZ_IMAGE_SURFACE' #ifdef
Fixes compilation by re-adding '#ifdef CAIRO_HAS_QUARTZ_IMAGE_SURFACE' which
was, I assume, unintentionally removed by
2cf4b3161c.
2008-10-15 12:45:11 -04:00
Jeff Muizelaar
83162360a4 Fix quratz_image typo in Makefile.sources. 2008-10-15 10:34:12 -04:00
Chris Wilson
877e77fa3e [glitz] Disable caching of solid surfaces.
glitz currently has no mechanism to release resources upon connection
closure (ala XCloseDisplay) and so will attempt invalid accesses when
evicting old surfaces from the solid pattern cache.
2008-10-15 12:20:00 +01:00
Chris Wilson
e17f02add0 [type1] Protect against read macro
POSIX allows for any of its functions to be implemented as a macro,
inflicting damage upon innocent function pointers that happen to share
the same name.

face->stream->read() is one such example.

As it's outside of our control (being a FT_Face) we cannot simply rename
the data member, so we need to explicitly dereference it as a function
pointer in order to disambiguate it for the compiler.
2008-10-15 10:52:33 +01:00
Chris Wilson
bc872a5f5f [xlib] Handle 4,20,24,28 depth XImages
Bug 9102 cairo doesn't support 24 bits per pixel mode on X11
(https://bugs.freedesktop.org/show_bug.cgi?id=9102)
is a reminder that that we need to support many obscure XImage formats.
With Carl's and Behdad's work to support psuedocolor we have a mechanism
in place to handle any format that is not natively handled by pixman. The
only piece we were missing was extending the swapper to handle all-known
formats and putting in defensive checks that pixels were correctly aligned
in accordance with pixman's requirements.
2008-10-15 10:21:05 +01:00
Chris Wilson
1728fa3520 [svg] Add notes about why we shouldn't add DOCTYPE.
Emmanuel Pacaud did some research into adding DOCTYPE after we had a
complaint that our SVG output failed to be validated by batik. The
conclusion he came to was that the validation of SVG was incomplete and
misleading, i.e. our output might generate false negatives leading to more
confusion.
2008-10-15 09:23:01 +01:00
Chris Wilson
e9f5ee6efe [doc] Fix a few gtk-doc errors.
gtk-doc insists on a non-empty long description, even for trivial
functions that are fully described by their input arguments and return
value. Grrr.
2008-10-14 14:42:48 +01:00
Chris Wilson
0d3e152d2f [check-doc-syntax.sh] Allow quoting.
func_regexp was incorrectly complaining that cairo_pure was a function without
parenthesis. The simplest solution appeared to be allow quoting of
'cairo_pure'.
2008-10-14 13:44:47 +01:00
Chris Wilson
02a7ca80f9 [pattern] Correctly optimize away fractional translations.
As is so often the case, reading the commit log gives you fresh insight in
the problem - often called confessional debugging...

We can simplify the problem by ignoring attr->[xy]_offset, for the time
being, and focus on computing the correct matrix. This is comparatively
simple as all we need to do is perform the appropriate rounding on the
translation vector.
2008-10-14 11:08:43 +01:00
Chris Wilson
9886cb3353 [pattern] Only perform non-integer optimization for identity matrices.
A complication I realised after pushing 3eb4bc3 was handling larger
sampled areas.  Extending the test case revealed that the optimization
was broken for anything but the identity transform (after removing the
translation).  Correctness first, leaving the "pixel-exact" solution for
interested reader...
2008-10-14 10:27:21 +01:00
Chris Wilson
8dc3deecb8 Add documentation for function attributes 'pure' and 'const'.
Carl suggested that cairo_pure and cairo_const are pretty opaque, even to
the developer who added them, so it is extremely important that they have
a good description so that they are used correctly and perhaps ported to
other compilers.
2008-10-14 08:17:23 +01:00
Chris Wilson
6aa1143d5a Update documentation to remove references to cairo_has_show_text_glyphs().
With the addition of cairo_show_text_glyphs() came a couple of functions
to query whether the target supported the extended attributes. However,
at Carl's request cairo_has_show_text_glyphs() was removed - but the
documentation was not updated to reflect that.
2008-10-13 23:49:17 +01:00
Chris Wilson
b2053945df [scaled-font] Correct documentation for cairo_scaled_font_create().
Fix the documentation not to suggest that NULL is a legal value for
font_options (as we temporarily made it during the 1.[57] dev cycle).
2008-10-13 23:39:47 +01:00
Chris Wilson
3eb4bc3757 [pattern] Optimize away fractional translation for NEAREST patterns.
As identified in bug 15479,
  Unpredictable performance of cairo-xlib with non-integer translations of a
  source surface pattern
  (https://bugs.freedesktop.org/show_bug.cgi?id=15479),
source surfaces with a fractional translation hit slow paths for some
drivers, causing seemingly random performance variations. As a work-around
Owen Taylor proposed that cairo could convert non-integer translations on
NEAREST sources patterns to their integer equivalents.

The messy detail involved here is replicating the rounding mode used by
pixman for the sample offset, but otherwise the conversion is fairly
trivial.
2008-10-13 23:34:51 +01:00
Chris Wilson
ceab32e2c3 [win32] win32 also uses font subsets.
Include win32 in the list of font subset users, fixes build when
cross-compiling.
2008-10-12 12:11:12 +01:00
Chris Wilson
1d3453eee5 [pattern] Rescale the linear pattern matrix to avoid overflow.
As proof-of-principle, compute a scale factor to avoid overflow when
converting a linear pattern to pixman_fixed_t. Fixes test/huge-pattern,
but the principle should be extended to handle more cases of overflow.
2008-10-12 11:38:42 +01:00
Chris Wilson
ab1d106cba [xlib] Use the cached xrender formats.
Use the cached formats for consistency and simplify several double pointer
dereferences.
2008-10-11 19:52:28 +01:00
Adrian Johnson
34ff7e4ac4 Check that reads in truetype_reverse_cmap are within valid data
Bulia Byak reported a bug where cairo was crashing with a particular
font. The font had an incorrect entry in the cmap table that caused
cairo to read from outside of the buffer allocated for the cmap.
2008-10-11 23:44:37 +10:30
Chris Wilson
eba9d87d54 [image] Warn about a potential NULL return after finish().
Improve the wording as suggested by
  https://bugs.freedesktop.org/show_bug.cgi?id=12659
to warn about the possibility of returning NULL even if the passed in
surface was an image surface.
2008-10-10 16:51:07 +01:00
Chris Wilson
ac3e4b4bea [xlib] Disable XRender support if the surface has no xrender_format
Bug 11734:
  XRender crashes due to NULL pointer from Cairo on SGI O2
  (https://bugs.freedesktop.org/show_bug.cgi?id=1173)
is an example of a case where we try to perform an XRender operation on a
surface with a format that was not supported by the XRender extension. By
marking the extension version as -1 on those surfaces, the current checks
for SURFACE_RENDER_HAS_* always correctly return false and prevent us try
to create a Picture with a NULL xrender_format.
2008-10-10 15:42:09 +01:00
Chris Wilson
ddd1615a17 [pattern] Remove incorrect assert.
It's possible to reach that point without setting the filter to NEAREST,
for example if using FAST or GAUSSIAN.
2008-10-09 12:25:07 +01:00
Chris Wilson
6487a147a2 [cairo.h] Be defensive when checking for _MSC_VER
Since cairo.h is a public header file, we need to be careful so that it
can be compiled by random compilers and even users specifying "-Werror
-Wundef" (mentioning no names, Company). So replace the bare (and legal)
  #if _MSC_VER
with
  #if defined (_MSC_VER)
just in case.
2008-10-08 15:26:03 +01:00
Chris Wilson
59141e56a7 [win32] Restore fine-grained fallback support for printing.
Missed updating win32 when implementing the new paginated API to query
support for the fine-grained fallbacks.

(Thanks to Adrian for spotting this oversight.)
2008-10-08 13:51:43 +01:00
Chris Wilson
565c02a37e [svg] Use finer-grained fallbacks for SVG 1.2
The use of fine-grained fallbacks requires the native support of the
SOURCE operator applied to an image on the target surface. SVG 1.2
introduces the "comp-op:src" mode fulfilling this criteria - so we can
enable fine-grained fallbacks for 1.2+.

Update test/fine-grained-fallbacks to exercise this pathway in SVG 1.2 -
as SVG natively supported all the current operations within that test.
This reveals yet another librsvg bug in handling SVG 1.2.
2008-10-08 12:43:35 +01:00
Vladimir Vukicevic
0c777a3e0d [win32] Use wide-char versions of some API functions, for compat with Windows Mobile 2008-10-07 15:20:33 -07:00
Chris Wilson
cf572b58e1 [tessellator] Compile fixes for !HAVE_INT64_T
Fixup a couple of instances of implicit down-casting to 32bits from a
64bit wide integer and add a new is_zero() predicate.
2008-10-07 22:16:26 +01:00
Chris Wilson
6b8c055962 [tessellator] Avoid implicit promotion to 64bit integer.
Avoid passing a 32bit integer as a cairo_int64_t in case we do not have a
64bit native integral type. As a side-effect this means we can also use a
narrower multiply.
2008-10-07 22:16:07 +01:00
Chris Wilson
eaa4bd1392 [pattern] After cloning adjust [xy]_offset if possible.
For the simple case where the pattern matrix only contains an integer
translation then care is taken to convert that to a identity source matrix
with the translation applied to the [xy]_offsets. 5b97ee6525 broke this
guarantee by applying the clone offsets to the source matrix. So when the
source matrix is identity we can simply adjust the [xy]_offsets and
preserve the identity matrix. (This idea can be extended further by
removing any integer translation from the source matrix and storing it in
the [xy]_offsets as a means to extend the limited precision in
pixman_matrix_t - encountered when downscaling large images offset onto
the target surface.)
2008-10-07 21:09:16 +01:00
Chris Wilson
552cc09e6b [xlib] Check integer translation for XCopyArea.
A precondition for using the core XCopyArea protocol is that the source
attributes contain only integer translations. However, we failed to apply
any integer translations from the source matrix to the XCopyArea offsets.
This worked prior to 5b97ee6525 as
_cairo_pattern_acquire_surface_for_surface() was careful to only generate
an identity matrix if the pattern matrix only contained an integer
translation (and thus we would use XCopyArea in the xlib backend).
2008-10-07 21:05:57 +01:00
Vladimir Vukicevic
28a3b546b9 [win32] create_similar should fall back to DIBs if DDB creation fail 2008-10-07 10:25:46 -07:00
Vladimir Vukicevic
4ae37a97b3 [quartz] initialize do_reflect field correctly for pattern draws 2008-10-07 10:18:41 -07:00
Chris Wilson
1f813ff040 [array] Silence gtk-doc complaints.
gtk-doc fails make check for array as it insists that even the simplest
functions must have a long description and cannot be entirely described by
their arguments and return value.
2008-10-07 01:45:45 +01:00
Chris Wilson
7cb9ccb4cb Fixup a couple of trivials doc warnings.
Correct the 'Returns' statement to match what gtk-doc expects.
2008-10-07 01:45:45 +01:00
Chris Wilson
d6f0351b6c [skiplist] Avoid repeated calls to compare on the same element when inserting.
During insertion we must traverse the skiplist in order to find the
insertion point for the new element. As we descend each level, the next
element in the chain for this level is sometimes the same as the one we
just compared against (and know that the new element is greater than).
Hence we can skip the search on that level and descend to the next. During
world_map this reduces the number of calls into _sweep_line_elt_compare()
by ~2.5% (and when performing trapezoidation on strokes gives a similar
speed up of about 2% - not bad for the addition of a single line.)
2008-10-07 01:45:45 +01:00
Chris Wilson
1440399625 [hull] Replace open-coding of 64bit arithmetic.
Use primitives from cairo-wideint-private.h - in this case it helps to
make the code more readable as well as reduce dependence on native 64bit
integers.
2008-10-07 01:45:45 +01:00
Chris Wilson
c6a6bf580f [slope] Replace open-coding 64bit integer arithmetic.
Prefer to use the operations form cairo-wideint-private.h in order to
improve readability and reduce our assumptions on the availability of
64bit integers.
2008-10-07 01:45:45 +01:00
Chris Wilson
5e3fcb7934 [wideint] Declare the wideint arithmetic functions as const.
'const' is a stricter form of 'pure' in that functions declared with that
attribute do not access any values other than their arguments (in
contrast to 'pure' which is allowed to read from global memory).
2008-10-07 01:45:45 +01:00
Behdad Esfahbod
6578ac148e [twin-font] Make the stroke lighter
I'm still to fine-tune the font and add hinting and bold/oblique support.
In the mean time though, a lighter stroke produces much nicer glyphs.
2008-10-06 11:40:34 -04:00
Behdad Esfahbod
589564c3b0 [user-font] Fix comment re backend interface 2008-10-06 11:40:33 -04:00
Chris Wilson
c98c1cb532 [wideint] Mark functions as pure
Take advantage of the gcc function attribute 'pure', which tells gcc that
the function result only depends upon its arguments and it has zero side
effects (e.g. it does not clobber memory). This gives gcc greater
opportunity to rearrange and optimize the wideint arithmetic.
2008-10-06 12:52:09 +01:00
Chris Wilson
76dd4603d0 [tessellator] Replace open-coding _cairo_int64_cmp().
We often use the construct:
  if (_cairo_int64_lt (A, B)
     return -1;
  if (_cairo_int64_gt (A, B)
     return 1;
  return 0;
to compare two large integers (int64, or int128) which does twice the
required work on CPUs without large integer support. So replace it with a
single wideint function _cairo_int64_cmp() and therefore allow
opportunities to both shrink the code size and write a more efficient
comparison. (The primarily motivation is to simply replace each block with
a single more expressive line.)
2008-10-06 12:07:41 +01:00
Chris Wilson
6eead4a5f7 [stroke] Simplify dash-off logic.
Remove a redundant level of if-else branching (and remove a duplicate
code) block by testing dash_on first.
2008-10-06 12:02:29 +01:00
Chris Wilson
ae87382a84 [tessellator] Special case edge comparisons when on either end-point.
If the sweep-line is currently on an end-point of a line,
then we know its precise x value and can use a cheaper comparator.
Considering that we often need to compare events at end-points (for
instance on a start event), this happens frequently enough to warrant
special casing.
2008-10-04 11:58:45 +01:00
Chris Wilson
ab23c29953 [tessellator] Direct comparison of result in edges_compare_x_for_y.
We need to compare the x-coordinate of a line at a for a particular y,
without loss of precision.

The x-coordinate along an edge for a given y is:
  X = A_x + (Y - A_y) * A_dx / A_dy

So the inequality we wish to test is:
  A_x + (Y - A_y) * A_dx / A_dy -?- B_x + (Y - B_y) * B_dx / B_dy,
where -?- is our inequality operator.

By construction we know that A_dy and B_dy (and (Y - A_y), (Y - B_y)) are
all positive, so we can rearrange it thus without causing a sign
change:
  A_dy * B_dy * (A_x - B_x) -?- (Y - B_y) * B_dx * A_dy
                                - (Y - A_y) * A_dx * B_dy

Given the assumption that all the deltas fit within 32 bits, we can compute
this comparison directly using 128 bit arithmetic.
2008-10-04 10:12:37 +01:00
Chris Wilson
7db03ac68c [tessellator] Use abort() instead of exit().
More friendly when debugging, as the debug will (by default) catch the
SIGTRAP and break at the offending test.
2008-10-04 10:12:37 +01:00