Commit graph

134 commits

Author SHA1 Message Date
Carl Worth
a6186604f7 cairo_pattern_set_matrix: Validate that matrix is invertible
If not, set an error in the pattern.
2007-04-11 01:21:10 -07:00
Carl Worth
bff45ec9f9 Invert condition to more intuitive form.
The idiom for checking the return value of malloc is:

	if (pointer == NULL) { ... }

rather than:

	if (pointer != NULL) { ... }
2007-04-10 10:14:49 -07:00
Carl Worth
01955a6e82 Rename ARRAY_LEN to ARRAY_LENGTH
Yet another victim in my hunt against abbreviations within cairo's implementation.
2007-04-10 10:14:49 -07:00
Chris Wilson
ac33953a81 Correct handling of a malloc failure during pattern_create_in_error()
Confusion had been introduced as to who provided the fixup after
the malloc failed which resulted in a NULL deference whilst checking for
an erroneous pattern in _cairo_pattern_create_in_error.
2007-04-09 16:47:38 -07:00
Chris Wilson
b32a5b1dc6 cairo-pattern - propagate status
Catch, cleanup and propagate after an error return.
2007-04-09 15:05:35 +01: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
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
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
ad51ee5aa0 Define and use ARRAY_LEN 2007-03-20 18:59:19 -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
Mathias Hasselmann
c4bd7cf6f8 Move declaration of cairo_mutex_t to cairo-mutex-private.h 2007-03-20 13:32:33 +01: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
Behdad Esfahbod
e803e2e69b [cairo-pattern] Add a cache of two color stops to cairo_gradient_pattern_t
Most of gradients have only two color stops.  This avoids
calling malloc() for those cases.
2007-03-14 17:24:54 -04:00
Behdad Esfahbod
4514fdca1b [cairo-pattern] Grow color-stops array exponentially 2007-03-14 17:24:54 -04:00
Behdad Esfahbod
9267cb0424 [cairo-pattern] Use _cairo_color_double_to_short() to fix color conversion 2007-03-13 16:49:42 -04:00
Behdad Esfahbod
956fdfbb62 [cairo-pattern] Fix color conversion from short to double
We should divide by 65535.0, not 65536.0.
2007-03-13 06:30:11 -04:00
Behdad Esfahbod
2030490862 [cairo-pattern] Add XXX note 2007-03-13 06:20:21 -04:00
Behdad Esfahbod
4f138e4af5 Uniform object handling in _reference(), _destroy(), and _get_reference_count()
All three now regard NULL and nil inputs the same.  This is new for
_get_reference_count().  It now returns 0 on NULL too, like it does on
nil objects.
2007-03-05 16:28:31 -05:00
Behdad Esfahbod
1082fed692 [doc] Docuemnt all symbols but cairo_filter_t and cairo_operator_t
Lets see if this is enough to push Carl Worth document those two.
2007-03-02 22:42:17 -05:00
Behdad Esfahbod
9be961eb0c [doc] Some documentation love 2007-03-02 22:01:15 -05:00
Carl Worth
c12a4571af Cast -1 values to unsigned to quiet the compiler.
Marking the magic values to indicate we really did mean to type them.
2007-03-02 00:37:21 -08:00
Carl Worth
df2d42ac7f Merge branch 'radial-gradient-fixes' into cairo 2007-03-01 17:08:03 -08:00
Carl Worth
0439f4c4f7 Rename radial gradient inner/outer to c1/c2
The inner/outer names were totally bogus. It is quite
legitimate to have the first circle's radius be larger than
that of the second.
2007-03-01 13:21:54 -08:00
Behdad Esfahbod
d0fe666a6a Revert the solid-pattern cache
This reverts the following commits:

	2715f20981
	67e3b3c53b

See this thread for an analysis of the problems it caused:

	http://lists.freedesktop.org/archives/cairo/2007-February/009825.html

In short, a single cache for all backends doesn't work, as one thread
using any backend can cause an unused xlib pattern to be evicted from
the cache, and trigger an xlib call while the display is being used
from another thread.  Xlib is not prepared for this.
2007-02-28 14:58:57 -05:00
Behdad Esfahbod
11b3f43e92 [TODO] Add various TODO items 2007-02-23 17:26:43 -05:00
Behdad Esfahbod
8d812ae9a6 [cairo-pattern] Correctly delegate device_transform so tests pass again 2007-02-23 17:26:42 -05:00
Behdad Esfahbod
7cbfb9556d [cairo-pattern] Fall back on cairo_surface_create_similar in _cairo_pattern_acquire_surface_for_surface
This was needed for SVG backend because it does not implement clone_similar.
However, I'm worried about possible infinite recursion here.  Not sure what
to do.
2007-02-23 17:26:42 -05:00
Behdad Esfahbod
5562050bcf Support CAIRO_EXTEND_REFLECT on surface patterns
We do this through a hack, that is, we make
_cairo_pattern_acquire_surface to return a surface that has four
copies of the original surface painted such that this image can
be simply repeated to get the effect of reflecting the original
surface.

This fixes the formerly XFAIL test extend-reflect.
2007-02-23 17:26:42 -05:00
Vladimir Vukicevic
5a72aac598 [core] put back REF_COUNT_INVALID to be -1, fix finish
Previous commit broke cairo_surface_finish, since it was checking for
ref_count == CAIRO_REF_COUNT_INVALID and bailing.  But, that condition
was reached from destroy, so finish was bailing out early.
2007-02-23 14:24:04 -08:00
Vladimir Vukicevic
cf73118522 [core] Add user_data and reference count getters to all objects
user_data setters/getters were added to public refcounted objects
that were missing them (cairo_t, pattern, scaled_font).  Also,
a refcount getter (cairo_*_get_reference_count) was added to all
public refcounted objects.
2007-02-23 13:05:23 -08:00
Jorn Baayen
2715f20981 [cairo-pattern] Cache surface for solid patterns
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.

Only surfaces that are "compatible" are used.  The definition of compatible
is backend specific.  For the xlib backend, it means that the two surfaces
are allocated on the same display.  Implementations for compatibility are
provided for all backends that it makes sense.
2007-02-14 18:28:56 -08:00
Carl Worth
a63ceef06c Fix _cairo_pattern_acquire_surface_for_surface to not clone outside surface extents
Rotation and other transformations would cause extents to be
computed which were outside the bounds of the surface to be
cloned, (and for non repeating patterns). Now we simply
restrict the computed extents to the surface extents.

This fixes the xlib failure of the recent rotate-image-surface-paint
test, (the apparently distinct ps failure remains).
2007-01-26 18:03:43 -08:00
Behdad Esfahbod
ded08256ef Spell check the docs 2007-01-07 02:08:15 -05:00
Carl Worth
fc584e1fbb Rewrite _cairo_matrix_transform_bounding_box to actually accept a box not a rectangle
It turns out that all of the callers want a box anyway, so this
simplfies the code in addition to being more honest to the name.

(For those new to the convention, a "box" is an (x1,y2),(x2,y2)
pair while a "rectangle" is an (x,y),(width,height) pair.)
2006-11-07 01:42:21 -08:00
Carl Worth
7e9aad2289 Fix repeating source surface patterns with xlib backend.
This broke with the clone_similar optimization in
8d7a02ed58 The optimization added an
interest rectangle to clone_similar, but with a repeating source
pattern, the interest rectangle might not intersect the extents of the
surface at all.

The test suite caught this with the trap-clip case.

The fix here is to clone the entire surface if the pattern has an
extend mode of REPEAT.
2006-10-25 10:32:37 -07:00
Carl Worth
8381e53cc7 8711: Fix transformed source surface patterns with xlib backend.
This broke with the clone_similar optimization in
	 8d7a02ed58
The optimization added an interest rectangle to clone_similar,
but the acquire_surface path was neglecting to transform its
rectangle by the pattern matrix.

The test suite did catch this, but apparently we were too
distracted by the performance improvements to notice. Only
backends other than image that implemented clone_similar
would be affected by the bug, (which meant I only saw xlib
failures in my testing).

This fixes bug #8711
2006-10-23 20:46:43 -07:00
Christopher (Monty) Montgomery
8d7a02ed58 Add extents to clone_similar (fixing subimage_copy performance bug)
This fixes a huge performance bug (entire image was being pushed to X
server in order to copy a tiny piece of it). I see up to 50x improvement
from subimage_copy (which was designed to expose this problem) but also
a 5x improvement in some text performance cases.

 xlib-rgba              subimage_copy-512    3.93 2.46% ->   0.07 2.71%: 52.91x faster
███████████████████████████████████████████████████▉
 xlib-rgb               subimage_copy-512    4.03 1.97% ->   0.09 2.61%: 44.74x faster
███████████████████████████████████████████▊
 xlib-rgba              subimage_copy-256    1.02 2.25% ->   0.07 0.56%: 14.42x faster
█████████████▍
 xlib-rgba        text_image_rgb_over-256   63.21 1.53% ->  11.87 2.17%:  5.33x faster
████▍
 xlib-rgba       text_image_rgba_over-256   62.31 0.72% ->  11.87 2.82%:  5.25x faster
████▎
 xlib-rgba     text_image_rgba_source-256   67.97 0.85% ->  16.48 2.23%:  4.13x faster
███▏
 xlib-rgba      text_image_rgb_source-256   68.82 0.55% ->  16.93 2.10%:  4.07x faster
███▏
 xlib-rgba              subimage_copy-128    0.19 1.72% ->   0.06 0.85%:  3.10x faster
██▏
2006-10-18 17:06:23 -07:00
Behdad Esfahbod
a13d58ff3a [slim] hide cairo_pattern_status() #8551 2006-10-08 17:06:44 -04:00
Carl Worth
783b69a8d3 Rename the create_for_status pattern to create_in_error. 2006-10-04 17:14:12 -07:00
Carl Worth
01502471e3 Add new _cairo_pattern_create_for_status so that patterns properly propagate errors.
In particular, many possible error values on a surface provided
to cairo_pattern_create_for_surface were previously being swallowed
and a nil pattern was returned that erroneously reported
CAIRO_STATUS_NO_MEMORY.
2006-10-04 17:14:12 -07:00
Carl Worth
c9c259903d Cast to squelch warning message 2006-10-04 17:14:12 -07:00
Vladimir Vukicevic
303b529195 dash and pattern getter functions
Adds API functions for inspecting the current dash state, as well as
the contents of pattern objects:

  cairo_get_dash
  cairo_get_dash_count
  cairo_pattern_get_rgba
  cairo_pattern_get_surface
  cairo_pattern_get_color_stop_rgba
  cairo_pattern_get_color_stop_count
  cairo_pattern_get_linear_points
  cairo_pattern_get_radial_circles
2006-09-19 12:19:21 -07:00
Carl Worth
d7f08794ef Add many missing slim_hidden calls to bypass PLT entries for local use of public functions 2006-09-05 17:22:00 -07:00
Behdad Esfahbod
bbc9a1290a Update doc syntax
Annoying, but a function doc should have a body, not only "Returns", or
gtk-doc will not pick it up.
2006-08-07 22:27:15 -04:00
Carl Worth
7ee94c0285 Squelch an annoying -Wswitch-enum warning by not using switch 2006-08-07 14:30:06 -07:00
Carl Worth
43b579d757 Add -Wswitch-enum compiler flag and fix all trivial warnings 2006-08-07 14:30:06 -07:00
Carl Worth
eb9caf0833 Add -Wsign-compare compiler flag and fix all warnings 2006-07-28 22:50:06 -07:00
Behdad Esfahbod
5e0f46cdeb Standardize on unsigned for ref_count type and add CAIRO_REF_COUNT_INVALID
The CAIRO_REF_COUNT_INVALID macro simply hides the ((unsigned int)-1) cast
to avoid warnings about comparison between signed and unsigned values.
2006-07-28 15:41:11 -07:00
Behdad Esfahbod
320ce67d63 Add "Since: 1.2" to docs for most new API functions. 2006-06-30 02:21:49 +02:00