Commit graph

3811 commits

Author SHA1 Message Date
Chris Wilson
35a2ed0335 [cairo-ft-font] Destroy surface if glyph transformation fails.
As we allocated the surface we need to destroy it if we encounter an
error.
2007-05-16 16:06:25 +01:00
Chris Wilson
6a43c02723 [cairo-xlib-screen] Increase number of GC depths.
Add support for depths 12 and 30, and a separate unknown.
2007-05-16 16:06:25 +01:00
Chris Wilson
70611846de [cairo-xlib-surface] Always nullify GC after pushing to screen.
The status return from _cairo_xlib_screen_put_gc() indicates the failure
to queue a job to free an old GC - the current GC is always transferred
away from the caller, so always nullify it in the surface.
2007-05-16 16:06:25 +01:00
Chris Wilson
58c35e6d7b [cairo-paginated-surface] Check surface status during finish.
Propagate children status during finish.
2007-05-16 16:06:25 +01:00
Chris Wilson
9ffd8154e2 [cairo-scaled-font-subsets] Correctly destroy the hash table.
After an allocation failure in
_cairo_scaled_font_subsets_create_internal() call
_cairo_hash_table_destroy() instead of a mere free().
2007-05-16 16:06:25 +01:00
Chris Wilson
bcfc5f0bdb [pixman] Propagate allocation failure.
pixman_op() failed to propagate the failure from
pixman_region_appendNonO() and the generic op.
2007-05-16 16:06:24 +01:00
Chris Wilson
9e99f0611c [cairo-traps] Initialize traps to use embedded buffer.
Set the traps to use the embedded buffer during initialization which will
save one redundant _cairo_traps_grow()
2007-05-16 16:06:12 +01:00
Chris Wilson
35eb65b777 [cairo-path] Check for errors during the count.
Return the nil object if we encounter any error whilst trying to
generate the path.

Also special case the NO_MEMORY error object to return the nil object.
2007-05-16 15:28:57 +01:00
Chris Wilson
a60afb0e78 [cairo-scaled-font] Return status of _cairo_scaled_font_glyph_path()
The status return of _cairo_path_fixed_interpret() was being ignored,
propagate it.
2007-05-16 15:21:02 +01:00
Behdad Esfahbod
d46f6872a5 [docs] Update to latest source changes and kill warnings 2007-05-13 21:52:52 -04:00
Chris Wilson
40558cb15e [cairo-xlib-screen] Clear the gc_needs_clip_reset after use.
After consuming the GC we need to unset the clip reset flag, so that
if we try and get a new GC without first putting a fresh one we do not
try to call XSetClipMask on a NULL GC.

(Fixes http://bugs.freedesktop.org/show_bug.cgi?id=10921)
2007-05-12 10:11:46 +01:00
Chris Wilson
abba3f2375 [valgrind-suppressions] Update to cover XrmGetStringDatabase
By dropping the top frame from suppression, the XrmGetFileDatabase
suppressions will also match XrmGetStringDatabase leaks which are
starting to occur.
2007-05-10 23:05:46 +01:00
Chris Wilson
c4abc3a0e3 [cairo-truetype-subset] Set CAIRO_STATUS_NO_MEMORY on malloc failure.
_cairo_truetype_font_create() failed to update the status before
returning after detecting an allocation failure, leaving its callers
none the wishing - and eventually triggering a segmentation fault when
the font was used in anger.
2007-05-10 21:29:03 +01:00
Chris Wilson
ebababc0cf [cairo-pattern] Return the nil cairo_pattern_t for CAIRO_STATUS_NO_MEMORY.
If we asked to create a pattern after encountering an allocation failure,
we can avoid another allocation by returning the nil pattern object.
2007-05-10 21:03:03 +01:00
Chris Wilson
e8e5f93ffe [cairo-meta-surface] Add a surface->status guard to meta_surface_replay()
Before attempting to access the cairo_meta_surface_t specific members,
we need to ensure that _cairo_meta_surface_replay() has received a true
meta surface rather than an error surface (e.g. _cairo_surface_nil).
2007-05-10 20:53:37 +01:00
elaine
195112697f [xlib] The buggy_repeat path should be removed for Xsun now
Sun never released a version of Solaris with Xorg with the buggy repeat
problem.  This patch was only needed for development versions of Solaris
Nevada (roughly builds 25-30).  The latest S10U release and Nevada releases
have a fixed Xorg.  So no users should ever encounter this bug.

We need to remove this test because Xsun has the same VendorString and a lower
VendorRelease number so it falsely triggers buggy_repeat to be turned on.
They just added Xrender support recently to Xsun, so this wasn't an issue
before recently.
2007-05-10 13:58:44 -04:00
Chris Wilson
ab6a767cf4 [cairo-scaled-font] Check for allocation failure.
cairo_scaled_font_create() returns a nil object on failure whereas a few
callers were checking for NULL.

Secondly review the public entry points for cairo_scaled_font_*() to
ensure that all check that they will not attempt to overwrite the
read-only nil object.
2007-05-10 17:18:27 +01:00
Chris Wilson
aec92188f1 [cairo-clip] Correctly report allocation failure
Distinguish between the unrepresentable clip and the failure to allocate
the clip extents.
2007-05-10 09:30:14 +01:00
Chris Wilson
1a719d1189 [cairo] Use _cairo_clip_nil for CAIRO_STATUS_NO_MEMORY
When creating a error clip list for CAIRO_STATUS_NO_MEMORY, simply
reuse the nil object rather than allocate a fresh list.
2007-05-10 09:30:06 +01:00
Chris Wilson
3fbc4bb5ae [cairo-clip] Add missing error status for _cairo__clip_intersect_region()
An out-of-memory error path missed setting CAIRO_STATUS_NO_MEMORY.
2007-05-09 21:42:15 +01:00
Chris Wilson
b5d2506879 [cairo] cairo_pop_group() returns a NULL pattern
cairo_pop_group() checks for a NULL return from
cairo_pattern_create_for_surface() instead of the nil cairo_pattern_t,
and then returns a NULL pattern instead of the nil object.
2007-05-09 16:29:39 +01:00
Chris Wilson
6f09e93ad7 [ciro-surface-fallback] Propagate status for _clip_and_composite_trapezoids
The result of _clip_and_composite_trapezoids() was ignored by 2/3 of
its callers - simply propagate the status.
2007-05-09 16:29:04 +01:00
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
069514a10f [test/in-fill-empty-trapezoid] Cleanup after test failure.
Ensure that the failure path also calls cairo_test_fini().
2007-05-08 22:04:51 +01:00
Chris Wilson
43645eb486 [test/fallback-resolution] Cleanup after test failure
Be valgrind clean even for test failures.
2007-05-08 22:04:41 +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
Behdad Esfahbod
409f973429 [test] If a test target fails, end the test
otherwise cairo is left in a dirty state and further tests are
unreliable.
2007-05-08 14:18:42 -04:00
Chris Wilson
aad66d05fd [test/nil-surface] Destroy the auxiliary context on failure paths.
Just to be tidy, and aim to be valgrind-clean.
2007-05-08 16:48:47 +01:00
Chris Wilson
e3acacc096 [cairo-boilerplate-ps] Destroy the target on creation failure
Remember to destroy the ptc->target as well as the ordinary surface, if
we need to.
2007-05-08 16:48:34 +01:00
Chris Wilson
efd212bfa2 [cairo-boilerplate] Protect against the nil cairo_scaled_font_t
Beware the NULL pointer deference when trying to adjust the max glyph
cache size...
2007-05-08 16:48:21 +01:00
Chris Wilson
b85920684f [cairo-test] Destroy the check image on failure
If drawing the checker pattern should fail, we need to free the
resources allocated locally.
2007-05-08 16:47:40 +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
966a39396e [NEWS] Surface cache for solid patterns
Add an entry describing the surface cache to NEWS.
2007-05-04 15:25:18 +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