Commit graph

340 commits

Author SHA1 Message Date
Chris Wilson
f8a2665840 [cairo] Trivial code tidy 2009-06-27 16:32:51 +01:00
Chris Wilson
62dc0ae46c [cairo] Offset the current path when pushing/popping groups.
We need to translate the path in order to compensate for the device offset
applied to the group surface when pushing and popping. (The path is
transformed to device space on creation, and so needs recomputing for the
new device.)
2009-06-19 19:08:34 +01:00
Chris Wilson
116c93cb7f [cairo] Remove instance of 'return free()'
Gah! This is a GCC-ism, so therefore it has to go.
2009-06-16 11:36:36 +01:00
Chris Wilson
7d8a0a1cdd [cairo] Keep a small stash of cairo contexts
A cairo context is meant to be extremely cheap to create such that it can
be used in transient expose events. Thus these are allocated reasonably
frequently and show up malloc profiles.
2009-06-07 19:48:59 +01:00
Chris Wilson
132f44dce1 valgrindify init/fini routines
Annotate object init/fini routines to detect use-after-free for
on-stack/embedded objects.
2009-06-04 14:17:43 +01:00
Chris Wilson
c988dc3719 [cairo] Doc typo.
Fix conflicting sentence as pointed out by
https://bugs.freedesktop.org/show_bug.cgi?id=20183
2009-06-03 10:51:23 +01:00
Chris Wilson
8d39dee8e2 [cairo] Update documentation for bug 20154
Several typographical errors were pointed out in
https://bugs.freedesktop.org/show_bug.cgi?id=20154
2009-06-03 10:40:38 +01:00
Chris Wilson
c9cd2f9ca1 [cairo] PLT symbols for cairo_set_source_rgb
Added a private use in user-font, but forgot to add a hidden symbol.
2009-06-02 18:47:07 +01:00
Chris Wilson
dc083ab30a [cairo] Track the MRU scaled font
When observing applications two patterns emerge. The first is due to
Pango, which wraps each glyph run within a context save/restore. This
causes the scaled font to be evicted after every run and reloaded on the
next. This is caught by the MRU slot on the cairo_scaled_font_map and
prevents a relatively costly traversal of the hash table and holdovers.

The second pattern is by applications that directly manage the rendering
of their own glyphs. The prime example of this is gnome-terminal/vte. Here
the application frequently alternates between a few scaled fonts - which
requires a hash table retrieval every time.

By introducing a MRU slot on the gstate we are able to directly recover
the scaled font around 90% of the time.

Of 110,000 set-scaled-fonts:
  4,000 were setting the current font
 96,000 were setting to the previous font
  2,500 were recovered from the MRU on the cairo_scaled_font_map
  7,500 needed a hash retrieval
which compares to ~106,000 hash lookups without the additional MRU slot on
the gstate.

This translates to an elapsed time saving of ~5% when replaying a
gnome-terminal trace using the drm backend.
2009-06-02 15:13:44 +01:00
Jeff Muizelaar
fe7d5323f5 Relanding: Add CAIRO_ENSURE_UNIQUE macro and use it in _cairo_error()
When using MSVC, _cairo_error() can be folded into other identical functions.
If that happens, _cairo_error isn't really useful anymore. Using the
CAIRO_ENSURE_UNIQUE macro makes sure this doesn't happen.

Use __asm to serve as a line delimiter. This allows us to use the
__asm{} block in a macro.
2009-02-19 16:00:17 -05:00
Jeff Muizelaar
78de0e045e Revert "Add CAIRO_ENSURE_UNIQUE macro and use it in _cairo_error()"
This reverts commit 126824f5e6.

It turns out MSVC doesn't handle line continuation characters in __asm{}
blocks very well, so revert for now until I come up with something that
works.
2009-02-19 15:45:11 -05:00
Jeff Muizelaar
126824f5e6 Add CAIRO_ENSURE_UNIQUE macro and use it in _cairo_error()
When using MSVC, _cairo_error() can be folded into other identical functions. If
that happens, _cairo_error isn't really useful anymore. Using the
CAIRO_ENSURE_UNIQUE macro makes sure this doesn't happen.
2009-02-19 13:31:55 -05:00
Chris Wilson
d295942b9d Inline _cairo_restrict_value()
This is one instance where the function call overhead dominated the
function call in both time and size.
2009-02-13 13:26:52 +00:00
Chris Wilson
2280de9d02 Merge branch '1.8' 2009-02-13 10:08:21 +00:00
Chris Wilson
de7270cb1e [cairo] Describe the restrictions upon cairo_set_tolerance()
Truc Troung reported that the behaviour of
cairo_set_tolerance()/cairo_get_tolerance() was inconsistent with the
documentation, i.e. we failed to mention that the tolerance would be
restricted to the smalled fixed-point value.

Add a sentence to the documentation that describes the restriction without
mentioning what that is... Hopefully that is sufficient detail to
accommodate the reporter, without exposing internal implementation details.

Fixes https://bugs.freedesktop.org/show_bug.cgi?id=20095
Bug 20095 - The cairo_set_tolerance() function behavior is inconsistency
with the spec
2009-02-13 10:07:37 +00:00
Behdad Esfahbod
d478d5ed5c [doc] Give a small hint about Twin font
Though, the details are not documented yet.  I'm not sure how much of it
I do want to document.
2009-01-02 06:51:15 -05:00
Chris Wilson
c601f30843 [cairo] Early return if we attempt to set the same colour.
Profiling a silly video renderer that called set-source; rectangle; fill;
for each pixel, we can shave 5% off the cairo overhead by introducing an
early return if we attempt to reset the current colour.
2009-01-02 09:53:27 +00:00
Chris Wilson
1c4ea84b24 [cairo] Early return if we attempt to set the same scaled_font
If the application calls cairo_set_scaled_font() with the current
scaled font, we can return early as it is a no-op.
2009-01-02 09:53:26 +00:00
Chris Wilson
b661f3d27b [cairo] Embed a second gstate.
Experiment with embedding a second gstate into the initial context to
reduce allocations.
2009-01-02 09:53:25 +00:00
Chris Wilson
e10af38799 make "make check" happy again
Add the missing scoping that caused check-plt to complain.
2008-12-29 12:55:10 +00:00
Jeff Muizelaar
1d72e53c3e Add a missing _cairo_error() to a bunch of status returns. 2008-12-17 17:42:18 -05:00
Chris Wilson
af53297a97 [cairo] Use a stack buffer for text path.
First try to allocate glyphs from the stack, similar to cairo_show_text().
2008-12-12 12:00:41 +00:00
Chris Wilson
095a1fd786 [gstate] Remove culled glyphs from clusters.
Sascha Steinbiss reported a bug where the PDF backend was reading beyond
the end of the glyph array:
http://lists.cairographics.org/archives/cairo/2008-December/015976.html.

It transpires that in the early glyph culling in the gstate we were
not updating the clusters to skip culled glyphs.
2008-12-12 10:20:47 +00:00
Chris Wilson
e6963a5bfe Mark allocation failures as unlikely.
Use the gcc likelihood annotation to indicate that allocation failures are
extremely unlikely.
2008-11-29 11:20:34 +00:00
Chris Wilson
d1801c23fa Mark if(status) as being unlikely.
The error paths should be hit very rarely during normal operation, so mark
them as being unlikely so gcc may emit better code.
2008-11-29 11:20:33 +00:00
Chris Wilson
b8991a1c69 [in-fill] Add the implicit close-path during move-to.
When interpreting a fixed-path for a fill operation, any move-to
implicitly closes the current path.
2008-11-25 10:24:58 +00:00
Chris Wilson
59de6fb89e [path] Compute approximate extents.
When computing the bounds of the clip path, we care more for a fast result
than absolute precision as the extents are only used as a guide to trim
the future operations. So computing the extents of the path suffices.
2008-11-25 10:16:32 +00:00
Chris Wilson
b6bf047494 [clip] Check for error surface
The update to use a NULL backend with an error surface broke creating a
context from an error surface.
2008-11-25 10:14:25 +00:00
Chris Wilson
a11442154d [cairo] Allocate glyphs on the stack for show_text().
First try to use a stack buffer for the glyphs and clusters if the user
calls cairo_show_text() - for example, as pango does to draw the unknown hex
box.
2008-11-21 09:40:42 +00:00
Chris Wilson
97edc680c1 [twin] Reduce tolerance.
As the glyphs are rendered to cache, ensure that they are rendered at the
highest quality settings.
2008-11-19 11:59:20 +00:00
Chris Wilson
db9ed77d8a [cairo] FLush surface on cairo_destroy()
When discussing the implications of snapshot cow, one of the questions
that we raised was what happens on cairo_destroy()? The lifetime of the
context implicitly marks the extents of the drawing operations, typically
the expose event (or perhaps one phase of it). Therefore at the end of the
sequence we implicitly wish to flush the graphics events to the surface.
2008-11-16 16:21:24 +00:00
Chris Wilson
b06c50cc54 [cairoint.h] Remove unused PLT entries.
Trim the slim_hidden_proto/def to match the currently used functions.
2008-11-13 11:36:43 +00:00
Chris Wilson
6ed957fc24 [gstate] Use _cairo_pattern_black for the default source.
Avoid allocating a default source pattern by using the static black pattern
object. The one complication is that we need to ensure that the static
pattern does leak to the application, so we replace it with an allocated
solid pattern within _cairo_gstate_get_source().
2008-10-30 17:52:11 +00: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
Behdad Esfahbod
096f9def0f Add slim markers to make check-plt.sh happy 2008-09-26 11:07:10 -04:00
Chris Wilson
06f0cc81d2 Add a macro to determine whether a status is a fatal error.
In a few places we need to check whether we have a fatal error or an
internal return code, so provide a utility macro to centralise the check.
2008-09-26 13:42:28 +01:00
Carl Worth
1d896aa9d8 Actually remove cairo_has_show_text_glyphs
The release notes for 1.7.6 say that we had dropped this
function, but apparently we had only planned to do that
and didn't actually get around to it until now.

Thanks to the RELEASING insctructions which gave a diff
command that pointed out this problem.
2008-09-25 15:56:57 -07:00
Chris Wilson
8c0ff8b585 [cairo] Define min-tolerance in terms of cairo_fixed_t
By using the cairo_fixed_t macros we can compute the correct minimum
tolerance for any configuration.
2008-09-24 17:05:08 +01:00
Chris Wilson
b7ab1fc791 Return the real error status for set_user_data()
Instead of returning a new NO_MEMORY error, return the status from the
error object.
2008-09-23 20:08:30 +01:00
Behdad Esfahbod
1fe7088a11 [show_text_glyphs] Replace the bool backward with cairo_text_cluster_flags
Chris rightfully complained that having a boolean function argument is
new in cairo_show_text_glyphs, and indeed avoiding them has been one
of the API design criteria for cairo.  Trying to come up with alternatives,
Owen suggested using a flag type which nicely solves the problem AND
future-proofs such a complex API.

Please welcome _flags_t APIs to cairo.h
2008-09-18 00:26:07 -04:00
Behdad Esfahbod
47b3c9aa3f Move version functions to cairo-misc.c 2008-08-28 17:29:32 -04:00
Behdad Esfahbod
00bc650455 Add new public API cairo_surface_has_show_text_glyphs()
We added cairo_has_show_text_glyphs() before.  Since this is really a
surface property, should have the surface method too.  Like we added
cairo_surface_show_page()...
2008-08-18 14:54:21 -04:00
Behdad Esfahbod
a1e5d40376 [doc] Another typo fix 2008-08-17 00:11:34 -04:00
Behdad Esfahbod
eabe572981 Document all new API
Also validate clusters generated by font backends.
2008-08-08 03:04:38 -04:00
Behdad Esfahbod
d9408041aa Add cairo_scaled_font_text_to_glyphs()
And update user-font text_to_glyphs() method to match.

Currently disable the win32-font text_to_glyphs(), until that one
is updated.  Or better yet, remove it and implement ucs4_to_index().
It's the toy font API afterall.
2008-08-08 03:01:16 -04:00
Behdad Esfahbod
d6ae23478a Check for NULL pointer in cairo_set_scaled_font 2008-08-08 03:01:15 -04:00
Behdad Esfahbod
7e57892983 Add toy font constructor and getters
New public API:

	cairo_toy_font_face_create()
	cairo_toy_font_face_get_family()
	cairo_toy_font_face_get_slant()
	cairo_toy_font_face_get_weight()
2008-08-08 03:01:14 -04:00
Jeff Muizelaar
16939e1a86 Center the group pattern transform around the device_transformed origin
When popping a group, transform it by the ctm centered at the origin
specified by the device_transform so that it ends up in the right place
when we try to paint. This fixes the regressions caused by
1a9809baab as shown by the pdf backend.
2008-08-07 19:25:40 -04:00
Behdad Esfahbod
17a5f10f53 [show_text_glyphs] Allow clusters with zero text
As Adrian points out, PDF can handle it, and it doesn't harm allowing.
2008-06-29 15:00:10 -04:00
Behdad Esfahbod
4ffea75d90 Change cairo_text_cluster_t members signed
Also reject clusters with no text.
2008-06-27 11:18:22 -04:00