Commit graph

2155 commits

Author SHA1 Message Date
Chris Wilson
ae5d4a1c17 [cairo] Return after detecting the invalid font-options.
Do not continue to copy the contents of the nil cairo_font_options_t,
but set the error on the context and return.
2007-05-09 16:28:52 +01:00
Chris Wilson
dfd4d41ac9 [cairo-xlib-surface] Free the allocation if we fail to queue the work.
Avoid the leak of the allocated argument if we fail to queue the work to
free the glyph.
2007-05-09 12:56:49 +01:00
Chris Wilson
8ddfc1b2e4 [cairo-pattern] Return status from _cairo_pattern_init_copy()
During the copy, allocation of the gradient may fail and so the callers
need to check for a pattern that returned in an error state. No callers
did so and in order to force all callers to check the error status,
the status return was added to _cairo_pattern_init_copy().  The early
error checking may appear redundant for an object with an embedded
structure, however it does fix an error where an uninitialised pattern
was being used:

==1922== Process terminating with default action of signal 11 (SIGSEGV)
==1922==  Access not within mapped region at address 0x55555555
==1922==    at 0x402CF6F: _cairo_array_index (cairo-array.c:208)
==1922==    by 0x402D4F3: _cairo_user_data_array_fini (cairo-array.c:370)
==1922==    by 0x4046464: _cairo_pattern_fini (cairo-pattern.c:188)
==1922==    by 0x404992A: _cairo_meta_surface_paint (cairo-meta-surface.c:266)
==1922==    by 0x403FCE0: _cairo_surface_paint (cairo-surface.c:1331)
==1922==    by 0x405CB5E: _test_meta_surface_paint (test-meta-surface.c:195)
==1922==    by 0x403FCE0: _cairo_surface_paint (cairo-surface.c:1331)
==1922==    by 0x4032A60: _cairo_gstate_paint (cairo-gstate.c:822)
==1922==    by 0x402B2D1: cairo_paint (cairo.c:1879)
==1922==    by 0x804A4F7: draw (radial-gradient.c:73)
==1922==    by 0x804AFA4: cairo_test_expecting (cairo-test.c:326)
==1922==    by 0x804A57C: main (radial-gradient.c:109)
==1922== Injected fault at:
==1922==    at 0x4020EA5: malloc (vg_replace_malloc.c:207)
==1922==    by 0x404475C: _cairo_pattern_init_copy (cairo-pattern.c:136)
==1922==    by 0x403F779: _cairo_surface_copy_pattern_for_destination (cairo-surface.c:2153)
==1922==    by 0x403FCC1: _cairo_surface_paint (cairo-surface.c:1328)
==1922==    by 0x405CB5E: _test_meta_surface_paint (test-meta-surface.c:195)
==1922==    by 0x403FCE0: _cairo_surface_paint (cairo-surface.c:1331)
==1922==    by 0x4032A60: _cairo_gstate_paint (cairo-gstate.c:822)
==1922==    by 0x402B2D1: cairo_paint (cairo.c:1879)
==1922==    by 0x804A4F7: draw (radial-gradient.c:73)
==1922==    by 0x804AFA4: cairo_test_expecting (cairo-test.c:326)
==1922==    by 0x804A57C: main (radial-gradient.c:109)
2007-05-09 10:14:20 +01:00
Chris Wilson
dbdaf0690e [cairo-scaled-font] Check _cairo_scaled_glyph_loop() status
In _cairo_scaled_font_glyph_path() we forgot to check the status return
of _cairo_scaled_glyph_loop() - propagate any failures.
2007-05-09 09:23:57 +01:00
James Cloos
b744c27051 [cairo-directfb-surface] Fix typo from commit a8c8e17d
Fix typo in name of _cairo_directfb_surface_is_similar().
2007-05-09 09:03:21 +01:00
Chris Wilson
cbc9218cd3 [cairo-xcb-surface] Fix compilation
As spotted by James Cloos <cloos@jbcloos.com>, I broke the compilation...
This is a minimal fix with no claims of completeness.
2007-05-09 09:03:04 +01:00
Chris Wilson
21c6643b09 [cairo-surface] Check for errors when generating the scaled font.
cairo_surface_show_glyphs() attempts to generate a device specific
scaled font and so needs to check for failure before attempting to use
it.
2007-05-08 22:00:54 +01:00
Chris Wilson
ede76a97ea [cairo-font-options] Check for the nil-object.
The design is for the user to create a cairo_font_options_t object with
cairo_font_options_create() and then is free to use it with any Cairo
operation. This requires us to check when we may be about to overwrite
the read-only nil object.
2007-05-08 22:00:46 +01:00
Chris Wilson
c441938569 [cairo-pattern] Cleanly handle an invalid pattern in cairo_pattern_transform()
Simply return without writing to potentially read-only members of an
invalid pattern rather than assert. This is cleaner than tracking down
all the error paths that may call into cairo_pattern_transform()...
2007-05-08 21:41:09 +01:00
Chris Wilson
0bf3ffacda [test-fallback-surface] Destroy the backing image on malloc failure.
Ensure we free all local resource should we encounter an allocation
failure during _cairo_test_fallback_surface_create().
2007-05-08 16:47:29 +01:00
Chris Wilson
eac18d44c7 [cairo-paginated-surface] Propagate malloc failure
Check for an allocation failure during _cairo_analysis_surface_create()
and propagate to caller - where we discover that the callers themselves
missed the status checks...
2007-05-08 16:46:54 +01:00
Emmanuel Pacaud
0d8a1540ec SVG: Don't clip SVG element, as clipping region is implicit.
That makes editing of produced SVG easier.
2007-05-08 09:11:57 +02:00
Jinghua Luo
936c965777 glitz: kill some compiler warnings. 2007-05-08 13:24:40 +08:00
Jinghua Luo
413705872e glitz: fix a typo preventing build glitz backend from succeeding. 2007-05-08 13:19:35 +08:00
Chris Wilson
d81907734e [cairo-color] Only compare the shorts for equality.
By only checking the premultiplied shorts inside the cairo_color_t we
only have to compare at most 8 bytes instead of the full 24 bytes.
2007-05-05 12:33:29 +01:00
Chris Wilson
056d149212 [cairo-pattern] Don't cache fallback surfaces
_cairo_surface_create_similar_solid() may return an image surface,
should the backend not support the required content or should it
encounter an error whilst creating the surface. In those circumstances
we choose not to cache the fallback surface.
2007-05-04 14:29:48 +01:00
Chris Wilson
a8c8e17d84 [cairo-pattern] Cache surface for solid patterns
Original work by Jorn Baayen <jorn@openedhand.com>,
2715f20981

We use a small cache of size 16 for surfaces created for solid patterns.
This mainly helps with the X backends where we don't have to create a
pattern for every operation, so we save a lot on X traffic.  Xft uses a
similar cache, so cairo's text rendering traffic with the xlib backend
now completely matches that of Xft.

The cache uses an static index variable, which itself acts like a cache of
size 1, remembering the most recently used solid pattern.  So repeated
lookups for the same pattern hit immediately.  If that fails, the cache is
searched linearly, and if that fails too, a new surface is created and a
random member of the cache is evicted.

A cached surface can only be reused if it is similar to the destination.
In order to check for similar surfaces a new test is introduced for the
backends to determine that the cached surface is as would be returned by
a _create_similar() call for the destination and content.

As surfaces are in general complex encapsulation of graphics state we
only return unshared cached surfaces and reset them (to clear any error
conditions and graphics state). In practice this makes little difference
to the efficacy of the cache during various benchmarks. However, in order
to transparently share solid surfaces it would be possible to implement a
COW scheme.

Cache hit rates:    (hit same index + hit in cache) / lookups
cairo-perf:         (42346 + 28480) / 159600 = 44.38%
gtk-theme-torturer: (3023  + 3502)  / 6528   = 99.95%
gtk-perf:           (8270  + 3190)  / 21504  = 53.29%

This translates into a reduction of about 25% of the XRENDER traffic during
cairo-perf.
2007-05-04 14:29:38 +01:00
Chris Wilson
52472b740e [cairo-xlib-surface] Defer application of clip mask until required.
By deferring the issuing of the X requests to set the clip mask we can
theoretically avoid some redundant requests, but primarily we remove
another path where X requests are emitted.
2007-05-04 14:19:57 +01:00
Chris Wilson
a81823cdf9 [cairo-xlib-display] Allocate the close_display hooks from a freelist.
Similar to job allocation, but only useful for toolkits like GTK+ which
recreate a new xlib surface for each expose.
2007-05-04 14:17:27 +01:00
Chris Wilson
c29ffc64ca [cairo-xlib-display] Cache the screen_info for the lifetime of the display.
Hold an extra reference to the screen_info and explicitly destroy the
list of screens on CloseDisplay.
2007-05-04 14:14:17 +01:00
Chris Wilson
1d6f7b7a02 [cairo-xlib] Cache freed GCs
Maintain a cache of freed GCs, one for each used depth.
2007-05-04 14:11:25 +01:00
Chris Wilson
88c6d25d4e [cairo-xlib-surface] Defer xlib resource cleanup.
Due to caching, destruction of X11 resources may occur outside of a
usable X11 context. To avoid this, we defer the destruction onto a work
queue which will be run the next time we try to use the X11 connection
on behalf of the user (at which point we must have a usable X11 context!)
or we are closing the Display.
2007-05-04 14:08:20 +01:00
Chris Wilson
8ad30ccdb0 [cairo-xlib] Introduce a workqueue for deferred destruction of X resources.
Due to the nature of the reference counting, an X resource may be
destroyed later than anticipated and possibly from a different thread
than the original context. This becomes an issue for applications that
carefully manage their single X connection from a single thread and do
not use locking and are then suprised when cairo triggers X traffic when
performing work for a different part of the application in another thread.
2007-05-04 14:06:01 +01:00
Chris Wilson
dd8681b76b [cairo-xlib] Split per-display attributes from per-screen.
Previously, we stored the per-display attributes inside a special
screen=NULL _cairo_xlib_screen_info_t. Now we keep track of known X
displays and store the screen information beneath the display structure
alongside the per-display hooks.
2007-05-04 14:02:28 +01:00
Behdad Esfahbod
e5d9d51e55 [cairo-mutex] Fix typo. 2007-05-03 19:04:21 -04:00
Chris Wilson
c412e42c72 [cairo-xlib-surface] Check that the acquire surfaces are xlib surfaces
_cairo_pattern_acquire_surfaces() may substitute an image surface for
either the source or the mask should the backend not support creation
of similar scratch surfaces or an error occurs during creation. For
composition we require xlib surfaces and so we must trigger the
fallback path if this happens.
2007-05-02 21:17:39 +01:00
Behdad Esfahbod
f3153091b7 [cairo-mutex] Document the API for adding cairo_mutex_t implementations 2007-05-01 20:10:39 -04:00
Behdad Esfahbod
5bfd6553fd [cairo-mutex] Define a NOOP CAIRO_MUTEX_FINALIZE() for pthread
as now the mutex layer will define a generic CAIRO_MUTEX_FINALIZE()
whenever the implementation defines CAIRO_MUTEX_FINI().  In the
case of pthread however we don't need finalization as we don't
have any place to call it, and pthread_mutex_destroy() doesn't
do much anyway.
2007-05-01 19:48:33 -04:00
Behdad Esfahbod
c4e0a059fe [cairo-mutex] Remove NOOP definition of CAIRO_MUTEX_INITIALIZE
as now the mutex layer will use a NOOP CAIRO_MUTEX_INITIALIZE
by default if the implementation does not define CAIRO_MUTEX_INIT.
2007-05-01 19:46:51 -04:00
Behdad Esfahbod
06cc74d974 [cairo-mutex] Rewrite defaults for CAIRO_MUTEX macros not defined by the implementation
to make them better match the design I have in mind, that I will
document in a minute.  They are a lot more readable and understandable
now.
2007-05-01 19:45:29 -04:00
Behdad Esfahbod
e87a25dc7c [cairo-mutex] Fix usage of CAIRO_MUTEX_DECLARE()
Previously cairo-mutex.c was abusing cairo-mutex-private.h by
defining CAIRO_MUTEX_DECLARE before including it, and
cairo-mutex-private.h was simply not overriding any available
CAIRO_MUTEX_DECLARE.  This is not the way it should be.
cairo-mutex.c should instead define CAIRO_MUTEX_DECLARE and
include cairo-mutex-list-private.h for itself.
2007-05-01 19:24:26 -04:00
Behdad Esfahbod
4764e6222b [cairo-mutex] Improve error message if no thread implementation found
to put back Carl's "acknowledge and accept" clause (!) before suggesting
use of CAIRO_NO_MUTEX.
2007-05-01 19:20:06 -04:00
Behdad Esfahbod
b5f015f21f [cairo-mutex] Make sure mutex implementation declares enough macros
We have defaults for the rest.
2007-05-01 19:20:06 -04:00
Behdad Esfahbod
b0a0a1779d [cairo-mutex] Make CAIRO_MUTEX_INIT/FINI take mutex object, not pointer to it
This is more consistent with CAIRO_MUTEX_LOCK/UNLOCK.
2007-05-01 19:20:05 -04:00
Behdad Esfahbod
f9154f7eda [cairo-mutex] Make sure CAIRO_MUTEX_FINI() evaluates its argument once 2007-05-01 19:20:05 -04:00
Behdad Esfahbod
a8d47d0c00 [cairo-mutex] Rename macro arguments from "name" to "mutex" 2007-05-01 19:20:05 -04:00
Chris Wilson
7f7f4d4f35 [cairo-xlib-surface.c] Free the Pixmap on surface construction failure.
If we create the Pixmap whilst constructing a similar xlib surface, then
it our responsibility to free the Pixmap should we fail to allocate the
surface.
2007-05-01 12:37:38 +01:00
Chris Wilson
3e3bd4df7e Minor typo in cairo_surface_destroy() documentation.
The type of @surface is #cairo_surface_t, not #cairo_t.
2007-05-01 11:28:45 +01:00
Behdad Esfahbod
f7cdbd385a [cairo-mutex-private.h] Move implementation-specific parts to cairo-mutex-type-private.h
This fixes the problem reported by Dave Yeo that boilerplate wasn't building:

In file included from ../src/cairo-scaled-font-private.h:44,
	     from cairo-boilerplate.c:65:
../src/cairo-mutex-private.h:183: error: syntax error before "extern"
../src/cairo-mutex-private.h:184: error: syntax error before "void"
../src/cairo-mutex-private.h:185: error: syntax error before "void"
make[3]: *** [cairo-boilerplate.lo] Error 1
2007-05-01 00:41:47 -04:00
Behdad Esfahbod
6de0f2d157 [cairo-mutex] Fix CAIRO_MUTEX_FINALIZE definition to take parantheses
This was breaking build on some systems as reported by Adrian Johnson
on the list.
2007-04-30 22:38:00 -04:00
Adrian Johnson
4be608399f Fix cygwin compile error
The WINVER macros need to be defined before including <windows.h>.
As a result of some recent include file rearranging, <windows.h>
was included indirectly before WINVER was defined.
2007-04-30 14:38:19 -07:00
Carl Worth
cb6fcdae92 Fix typo in Makefile preventing builds from succeeding
The cairo-ps-surface-private.h file was not getting included in the
distribution.
2007-04-28 07:38:56 -07:00
Carl Worth
a392cc8508 Clarify documentation of cairo_in_stroke and cairo_in_fill
Like cairo_stroke_extents and cairo_fill_extents, these functions
work without regard to the surface dimensions or the current clip
region.
2007-04-27 22:46:47 -07:00
Carl Worth
8286b87416 Clip trapezoids that are partially (or wholly) outside the clip region.
It's quite simple to add a new _cairo_traps_limit call which installs
a box into the cairo_traps_t structure. Then at the time of
_cairo_traps_add we can discard any trapezoid that is wholly outside
the box and also clip any trapezoid that is partially outside the box.

We take advantage of this for both cairo_stroke and cairo_fill, (when
cairo is computing the trapezoids in cairo-surface-fallback.c). Note
that we explicitly do not do any clipping for cairo_stroke_extents,
cairo_fill_extents, cairo_in_stroke, or cairo_in_fill which are
defined to ignore clipping.

As seen by the long-lines perf case, this fix successfully works
around the bug in the X server where it creates overly large masks for
partially-outside-the-destination-surface trapezoids:

 xlib-rgba   long-lines-uncropped-100  545.84 -> 5.83: 93.09x speedup
██████████████████████████████████████████████
 xlib-rgb    long-lines-uncropped-100  554.74 -> 8.10: 69.04x speedup
██████████████████████████████████
2007-04-27 22:44:27 -07:00
Adrian Johnson
179e339910 PDF: Change CTM to identity
Some PDF viewers forget the CTM when drawing gradient patterns
with SMasks. This patch works around these bugs by using the default
identity matrix for the CTM. All paths are transformed from
cairo to pdf coordinates before writing to the pdf file.
2007-04-27 16:13:01 -07:00
Adrian Johnson
1816d7c590 Add support for transparent gradients
This is based on the gradient patch written by Miklós Erdélyi at
http://lists.freedesktop.org/archives/cairo/2006-August/007648.html

Currently only EXTEND_NONE and EXTEND_PAD are supported. Other extend
types will go through the image fallback path.
2007-04-27 16:12:55 -07:00
Carl Worth
29670d3766 Add a content value to solid patterns
This allows for the surface acquired from the pattern to have the
same content. In particular, in a case such as cairo_paint_with_alpha
we can now acquire an A8 mask surface instead of an ARGB32 mask
surface which can be rendered much more efficiently. This results
in a 4x speedup when using the OVER operator with the recently
added paint-with-alpha test:

Speedups
========
image-rgb  paint-with-alpha_image_rgb_over-256 2.25 -> 0.60: 4.45x speedup
███▌

It does slowdown the same test when using the SOURCE operator, but
I don't think we care. Performing SOURCE with a mask is already a very
slow operation, (hitting compositeGeneral), so the slowdown here is
likely from having to convert from A8 back to ARGB32 before the
generalized compositing. So if someone cares about this slowdown,
(though SOURCE with cairo_paint_with_alpha doesn't seem extremely
useful), they will probably be motivated enough to contribute a
customized compositing function to replace compositeGeneral in which
case this slowdown should go away:

image-rgba paint-with-alpha_image_rgb_source-256 3.84 -> 8.86%: 1.94x slowdown
█
2007-04-25 11:09:31 -07:00
Carl Worth
302f1146da Fix two bugs in documentation code sample of cairo_arc
The sample code for drawing an ellipse had width and height
reversed in the call to cairo_scale, and also had both
incorrectly inverted.
2007-04-25 07:24:23 -07:00
Peter Weilbacher
ac0ef0302e Merge branch 'master' of git+ssh://pmw@git.freedesktop.org/git/cairo 2007-04-23 23:18:05 +02:00
Chris Wilson
260dcb316e Add a _cairo_error() to png_simple_error_callback()
With the introduction of the error callbacks for PNG, we have the
opportunity for the user to set a breakpoint (via _cairo_error) at the
point the error is first rasied.
2007-04-23 13:54:37 +01:00