Commit graph

1921 commits

Author SHA1 Message Date
Behdad Esfahbod
b6924722b8 [cairo-skiplist] Use one random number per insertion, instead of two 2007-04-09 19:39:50 -04:00
Behdad Esfahbod
6daaf8a89d [cairo-skiplist] Reduce MAX_LEVEL from 31 to 15
The probability that a node of level L is generated is
0.25^(L-1) * 0.75.  It means, a node of level 15 or
more will be used with a probability of about 3 * 10^-9.
That's really rare...

Actually that's not still true, because the level of a new
node is capped by current max-level plus one.  So to really
get a node with a level of 15 one should first get a node
of level 2, then 3, then 4, ..., finally 15.  Now that's
REALLY rare.

And guess what, the skiplist only start behaving bad with a
max level cap of MAX_LEVEL when having on the order of
4**MAX_LEVEL items in it.  I really hope we don't get there.
2007-04-09 19:38:22 -04:00
Behdad Esfahbod
a7de9501f6 [cairo-skiplist] Group levels two-by-two in freelists
Most memory allocators allocate in multiples of twice the size of
a pointer.  So there is no point in keeping freelists for both
even and odd levels.  We now round odd levels up to the next
even level for freelist computations.  This reduces the number of
node mallocations.
2007-04-09 19:38:08 -04:00
Behdad Esfahbod
9da86e4a38 Add references to the skiplist paper 2007-04-08 22:56:30 -04:00
Behdad Esfahbod
ad0e13805c [cairo-skiplist] Clarify MAX_LEVEL in comment, and adjust accordingly
Reading the code, MAX_LEVEL is in fact what could have been named
MAX_NUM_LEVELS.  That is, it is maximum possible level plus one.
All code is correct: it uses MAX_LEVEL as array size and never produces
a level of MAX_LEVEL.  The comment is fixed.
2007-04-08 22:51:10 -04:00
Behdad Esfahbod
6f93092217 Rename pixman_region_uninit to pixman_region_fini 2007-04-08 22:03:38 -04:00
Mathias Hasselmann
df9ea31df5 [pixman-region] Separate pixman_region_init
Most of the time pixman_region_init is called without any extents, and
followed by a pixman_region_union_rect, used to used to initialize
rectangular regions. pixman_region_union_rect is not that cheap, but
the sequence is called quite often. So it should be worth introducing
a specialized and fast function for this sequence.

This introduces pixman_region_init_rect.  This new function makes
_cairo_region_init_from_rectangle obsolete.

Also removes the extent argument from pixman_region_init as it was
called with NULL most of the time.  A pixman_region_init_with_extents
is added for the general case.
2007-04-08 21:49:46 -04:00
Mathias Hasselmann
f9057f2752 Avoid pixman_create_region in glitz-surface 2007-04-08 21:24:35 -04:00
Mathias Hasselmann
82cbb6886c Remove redundant _cairo_clip_fini function 2007-04-08 21:23:47 -04:00
Mathias Hasselmann
5ae309c456 Avoid pixman_region_create in _cairo_traps_extract_region 2007-04-08 21:23:13 -04:00
Mathias Hasselmann
241482b550 Avoid malloc in _cairo_region_create_from_rectangle 2007-04-08 21:12:02 -04:00
Mathias Hasselmann
efc9775149 Make sure clip->region is always initialized 2007-04-08 21:10:58 -04:00
Mathias Hasselmann
0e7df34e07 Make region of cairo_clip_t static 2007-04-08 21:10:12 -04:00
Chris Wilson
8bb0e5939c _get_bitmap_surface - check for calloc failure 2007-04-06 12:34:17 -07:00
Chris Wilson
2a74fd5c7f Propagate one error return through pdf. 2007-04-06 11:50:00 -07:00
Robert O'Callahan
d801aa59f8 [quartz] fix floating point precision issue (#10531)
This ensures that error due to double-to-float conversion
does not accumulate; the position of any glyph will be off by
at most one double-to-float conversion error.
2007-04-06 00:00:33 +01:00
Carl Worth
106f859045 Move misplaced CLEANUP_FONT label to avoid crash.
Previously, a failure in _cairo_win32_scaled_font_init_glyph_path leading
to the CLEANUP_FONT label would set the path into the glyph, then destroy
the path, and return an error status, (which in turn would cause a double
free when the glyph was destroyed).

The double-free apparently leads to a crash in some cases, as described
here:

	 SVG/Cairo related crash when opening specific webpage
	https://bugzilla.mozilla.org/show_bug.cgi?id=376498

This should eliminate the double-free, but does not address the original
error case, (attempting to get a path from a bitmap font?).
2007-04-05 14:44:15 -07:00
Chris Wilson
5c24711ee6 Restore gcov functionality
Add -lgcov to the shared library else the test programs fail to link.
Add a couple of lcov convenience targets to generate the coverage reports.
2007-04-04 10:13:13 +01:00
Behdad Esfahbod
a1287e483c [pixman/src/check-config.sh] Test that all source files #include <config.h>
as their first include.
2007-04-03 20:30:30 -04:00
Behdad Esfahbod
8fbf50d31d [src] Make sure all source files #include "cairoint.h" as their first include
This is necessary to avoid many portability problems as cairoint.h includes
config.h.  Without a test, we will regress again, hence add it.

The inclusion idiom for cairo now is:

	#include "cairoint.h"

	#include "cairo-something.h"
	#include "cairo-anotherthing-private.h"

	#include <some-library.h>
	#include <other-library/other-file.h>

Moreover, some standard headers files are included from cairoint.h and need
not be included again.
2007-04-03 20:28:11 -04:00
Behdad Esfahbod
ffc7d06da0 [src/check-cairoint.h] Test to check that all source files #include "cairoint.h"
as their first include.
2007-04-03 20:27:24 -04:00
Behdad Esfahbod
208c32b245 [cairoint.h] Remove inline definition for MS compilers
Such things should go to config.h.  For one thing, cairoint.h is not
included in pixman.
2007-04-03 20:02:40 -04:00
Behdad Esfahbod
88dc0c5f19 Make sure all nil objects start with _cairo_
Previously, the convention was that static ones started with cairo_, but
renamed to start with _cairo_ when they were needed from other files and
became cairo_private instead of static...

This is error prune indeed, and two symbols were already violating.  Now
all nil objects start with _cairo_.
2007-04-03 19:26:18 -04:00
Benjamin Berg
c2b1908f9b Fix typo in cairo_arc_negative() docs (#10497) 2007-04-03 15:46:51 -04:00
Chris Wilson
256f3e09a8 Destroy the current pattern before replacing with cairo_set_source().
Frequently cairo_set_source_rgb[a]() is used to replace the current
solid-pattern source with a new one of a different colour. The current
pattern is very likely to be unshared and unmodified and so it is likely
just to be immediately freed [or rather simply moved to recently freed
cache]. However as the last active pattern it is likely to cache-warm and
suitable to satisfy the forthcoming allocation. So by setting the current
pattern to 'none' we can move the pattern to the freed list before we
create the new pattern and hopefully immediately reuse it.
2007-03-26 20:58:14 +01:00
Chris Wilson
38442d4948 Back out the solid-pattern-cache from 9b53bc7c65.
Unfortunately one cannot cache live patterns and return a fresh reference
instead of creating new ones as patterns can be modified by the user and
so cannot be transparently shared between different users. However,
solid colour allocation is still a frequent operation, so we maintain a
small cache of recently freed patterns to reduce the malloc pressure.
2007-03-26 20:57:53 +01:00
Brian Ewins
c8e37af4b0 [quartz] fix order of fields in matrix conversion
There was a typo flipping the xy and yx fields when a 
cairo matrix was converted to a quartz matrix.
2007-03-25 23:31:40 +01:00
Brian Ewins
d2cdd5eba8 [atsui] fix scaling of glyph surfaces (#9568)
Atsui glyph surface were clipped incorrectly when the text is scaled,
visible in the text-pattern test.
2007-03-24 13:25:03 +00:00
Adrian Johnson
25ddc08004 PS: Remove unused variable 2007-03-23 23:19:30 +10:30
Adrian Johnson
e9a2696648 PDF: Use the TJ operator to show glyphs 2007-03-23 23:08:46 +10:30
Behdad Esfahbod
ef8515b4a6 cairo_push/pop_group(), bail out if cairo_t is in error status
Fixes the new test added to test/nil-surface to not crash
2007-03-21 15:29:18 -04:00
Behdad Esfahbod
9cea8a4bb2 [cairo.c] Don't access gstate members directly 2007-03-21 15:12:58 -04:00
Behdad Esfahbod
39ae64ff03 [cairo-path] Don't access gstate members directly 2007-03-21 14:56:34 -04:00
Behdad Esfahbod
bd275c1978 [cairo-pattern] Make sure cached solid patterns are not put in error status 2007-03-21 12:34:37 -04:00
Behdad Esfahbod
e76d3cfa4f [cairo-gstate] Make sure gstate->next is initialized 2007-03-21 12:33:31 -04:00
Behdad Esfahbod
1469ea22ba [cairo-gstate] Move save/restore logic into gstate instead of cairo_t
by adding _cairo_gstate_save/restore().  This is in preparation for
adding copy-on-write behavior to gstate.
2007-03-21 11:22:33 -04:00
Jeff Smith
5f83a1b542 [cairo-output-stream] Remove use of strtol 2007-03-21 10:41:03 -04:00
Behdad Esfahbod
bba7169805 Fix file permissions again
Where do these a+x attributes coming from every once in a while?
2007-03-20 22:55:02 -04:00
Behdad Esfahbod
ad51ee5aa0 Define and use ARRAY_LEN 2007-03-20 18:59:19 -04:00
Chris Wilson
1de12714a9 [cairo-surface] Use a stack buffer for small numbers of rectangles 2007-03-20 18:48:15 -04:00
Chris Wilson
9b53bc7c65 Cache solid patterns
We use a small cache of size 16 for patterns created from solid colors,
e.g. cairo_set_source_rgb(). This helps with toolkits that draw many
widgets using the same colour scheme.

The cache uses a static index variable, which itself acts like a cache
of size 1, remembering the most recently used colour. So repeated
lookups for the same colour hit immediately. If that fails, the cache
is searched linearly, and if that fails too, a new pattern is created
and a random member of the cache is evicted.
2007-03-20 18:21:53 -04:00
Behdad Esfahbod
39679b1b21 [cairo-path-fixed] Fix "comparison between signed and unsigned" warnings 2007-03-20 18:01:41 -04:00
Behdad Esfahbod
c939421e16 Oops. Remove cairo-mutex-private.h include from test surfaces
as that file is included from cairoint.h now.
2007-03-20 08:54:01 -04:00
Behdad Esfahbod
0d3e886b18 Include cairo-mutex-private.h in test backends 2007-03-20 08:50:38 -04:00
Mathias Hasselmann
94c367f7d7 Merge branch 'master' of git+ssh://hasselmm@git.freedesktop.org/git/cairo 2007-03-20 13:33:50 +01:00
Mathias Hasselmann
c4bd7cf6f8 Move declaration of cairo_mutex_t to cairo-mutex-private.h 2007-03-20 13:32:33 +01:00
Mathias Hasselmann
9c52a9e7d8 Remove _global_image_glyph_cache_mutex which is not used anymore. 2007-03-20 13:05:48 +01:00
Behdad Esfahbod
d3177a6875 [cairo-mutex] Rename _xlib_screen_mutex to _cairo_xlib_screen_mutex 2007-03-20 07:59:47 -04:00
Mathias Hasselmann
be52178443 Initialize mutexes at central location.
All mutex declarations have been moved to cairo-mutex-list.h.
This should avoid breaking of less frequently tested backends,
when mutexes are introduced or when existing mutexes are renamed.

Instead of initializing mutexes on library startup, mutexes are
lazily initialized within the few entry points of now by calling
CAIRO_MUTEX_INITIALIZE(). Currently only the OS/2 backend takes
care about releasing global mutexes. Therefore there is no counter
part of that macro for finalizing all global mutexes yet - but
as cairo-backend-os2.c shows such a function would be quite
easy to implement.
2007-03-20 10:11:14 +01:00
Carl Worth
725a4de42d Propagate a nil surface out of _cairo_surface_create_similar_scratch
We detect an error in the surface before calling into private surface-modifying
functions, (such as _cairo_surface_set_font_options), that don't have the
nil-surface protection of public functions.

This should fix the problem reported (again) in this bug report:

	cairo crashes in cairo_create_simular if nil surface returned by other->backend->create_similar
	https://bugs.freedesktop.org/show_bug.cgi?id=9844

Though I haven't succeeded in replicating the bug yet, (perhaps a system
difference in allowing writes to read-only memory or not, or something
like that).
2007-03-19 16:50:55 -07:00