cairo/src
Chris Wilson aaec63d483 [scaled-font] Global glyph cache
Currently glyphs are cached independently in each font i.e. each font
maintains a cache of up to 256 glyphs, and there can be as many scaled fonts
in use as the application needs and references (we maintain a holdover
cache of 512 scaled fonts as well).

Alternatively, as in this patch, we can maintain a global pool of glyphs
split between all open fonts. This allows a heavily used individual font
to cache more glyphs than we could allow if we used per-font glyph caches,
but at the same time maintains fairness across all fonts (by using random
replacement) and provides a cap on the maximum number of global glyphs.

The glyphs are allocated in pages, which are cached in the global pool.
Using pages means we can exploit spatial locality within the font
(nearby indices are typically used in clusters) to reduce frequency of small
allocations and allow the scaled font to reserve a single MRU page of
glyphs. This caching dramatically reduces the cairo overhead during the
cairo-perf benchmarks, and drastically reduces the number of allocations
made by the application (for example browsing multi-lingual site with
firefox).
2009-01-29 10:10:39 +00:00
..
.gitignore [build] Include all generated win32 build files in the repo 2009-01-09 15:55:24 -05:00
cairo-analysis-surface-private.h [analysis] Merge two analysis status codes. 2008-09-26 13:42:28 +01:00
cairo-analysis-surface.c [path] Rename _cairo_path_fixed_approximate_extents() 2009-01-29 10:10:39 +00:00
cairo-arc-private.h Add cairo_private to several function prototypes that were missing it. 2005-08-09 13:01:14 +00:00
cairo-arc.c Remove some bogus XXX marks 2008-05-28 19:10:09 -04:00
cairo-array.c Mark allocation failures as unlikely. 2008-11-29 11:20:34 +00:00
cairo-atomic-private.h Make sure feature macros are checked using #if, not #ifdef; add a test for it 2008-09-20 17:20:36 -04:00
cairo-atomic.c Make sure feature macros are checked using #if, not #ifdef; add a test for it 2008-09-20 17:20:36 -04:00
cairo-base85-stream.c Mark allocation failures as unlikely. 2008-11-29 11:20:34 +00:00
cairo-bentley-ottmann.c [skiplist] Allocate elements in chunks. 2008-12-12 13:43:36 +00:00
cairo-beos-surface.cpp [cairo-spans] Add a check/create_span_renderer backend methods. 2008-12-06 14:04:36 +02:00
cairo-beos.h Use #include "cairo-*." instead of #include <cairo-*.h> 2008-06-23 00:30:04 -04:00
cairo-cache-private.h [scaled-font] Global glyph cache 2009-01-29 10:10:39 +00:00
cairo-cache.c [scaled-font] Global glyph cache 2009-01-29 10:10:39 +00:00
cairo-cff-subset.c Use PS font name in CFF and TrueType PDF font subsets 2009-01-22 23:12:14 +11:00
cairo-clip-private.h Revamp the build system. 2008-09-02 20:24:08 -04:00
cairo-clip.c [path] Rename _cairo_path_fixed_approximate_extents() 2009-01-29 10:10:39 +00:00
cairo-color.c [directfb] When blitting check if we need the un-premultiplied color. 2008-10-20 23:20:24 +01:00
cairo-combsort-private.h [tessellator] Use a combsort for sorting the event queue. 2008-10-30 19:08:24 +00:00
cairo-compiler-private.h [compiler] likelihood macros 2008-11-19 11:59:20 +00:00
cairo-debug.c [scaled-font] Make cairo_debug_reset_static_data() work again 2008-12-26 00:05:19 -05:00
cairo-deflate-stream.c Mark allocation failures as unlikely. 2008-11-29 11:20:34 +00:00
cairo-deprecated.h [cairo-deprecated.h] Remove mention of cairoint.h from public header 2008-05-09 15:54:10 +02:00
cairo-directfb-surface.c Merge branch '1.8' 2008-12-11 14:41:01 -05:00
cairo-directfb.h Make sure feature macros are checked using #if, not #ifdef; add a test for it 2008-09-20 17:20:36 -04:00
cairo-features-uninstalled.pc.in Build -uninstalled.pc files 2008-09-11 00:38:30 -04:00
cairo-features.pc.in More fixes for pkgconfig files 2008-09-10 12:41:57 -04:00
cairo-fixed-private.h [cairo-fixed] Implement _cairo_fixed_mul_div() 2008-05-15 20:02:33 -04:00
cairo-fixed-type-private.h Change cairo's fixed-point format from 16.16 to 24.8 2008-02-27 15:08:18 -08:00
cairo-fixed.c [fixpt] Make fixed point methods static inline and generic 2007-07-18 22:45:21 +02:00
cairo-font-face-twin-data.c [twin] Improve glyph hints 2008-12-25 02:46:27 -05:00
cairo-font-face-twin.c make "make check" happy again 2008-12-29 12:55:10 +00:00
cairo-font-face.c [toy-font-face] Move toy font face code in a file of its own 2008-12-20 01:18:12 -05:00
cairo-font-options.c Remove all lcd_filter code. 2008-09-25 13:31:20 -07:00
cairo-freelist-private.h Revamp the build system. 2008-09-02 20:24:08 -04:00
cairo-freelist.c [src] Make sure all source files #include "cairoint.h" as their first include 2007-04-03 20:28:11 -04:00
cairo-ft-font.c Iterate over hash table using foreach() in destructors. 2009-01-02 09:53:26 +00:00
cairo-ft-private.h Add CairoScript backend. 2008-11-13 11:36:54 +00:00
cairo-ft.h Use #include "cairo-*." instead of #include <cairo-*.h> 2008-06-23 00:30:04 -04:00
cairo-glitz-private.h [slim] hide cairo_glitz_surface_create() (#8551) 2006-10-08 17:07:17 -04:00
cairo-glitz-surface.c [cairo-spans] Add a check/create_span_renderer backend methods. 2008-12-06 14:04:36 +02:00
cairo-glitz.h Use #include "cairo-*." instead of #include <cairo-*.h> 2008-06-23 00:30:04 -04:00
cairo-gstate-private.h Remove include of cairoint.h from *-private.h header files. 2007-08-23 16:13:04 -07:00
cairo-gstate.c [in-stroke] Check point against extents before computing path. 2009-01-29 10:10:39 +00:00
cairo-hash-private.h [scaled-font] Global glyph cache 2009-01-29 10:10:39 +00:00
cairo-hash.c [scaled-font] Global glyph cache 2009-01-29 10:10:39 +00:00
cairo-hull.c Mark allocation failures as unlikely. 2008-11-29 11:20:34 +00:00
cairo-image-info-private.h Add PNG get info function 2008-11-24 22:27:09 +10:30
cairo-image-info.c Change uint to uint32_t 2008-11-26 06:40:47 +10:30
cairo-image-surface.c [image] Eliminate the short-lived context used for coercing. 2008-12-18 10:40:14 +00:00
cairo-lzw.c Mark allocation failures as unlikely. 2008-11-29 11:20:34 +00:00
cairo-malloc-private.h [malloc] Check for integer overflow when realloc'ing. 2007-10-04 00:42:29 +01:00
cairo-matrix.c [matrix] Optimise invert for simple scaling|translation matrices. 2008-12-02 17:31:51 +00:00
cairo-meta-surface-private.h Make meta-surface store and replay extents of each operation 2008-11-02 20:12:29 +10:30
cairo-meta-surface.c Query the backend to see if we can repaint the solid pattern. 2008-12-18 12:06:45 +00:00
cairo-misc.c Add a missing _cairo_error() to a bunch of status returns. 2008-12-17 17:42:18 -05:00
cairo-mutex-impl-private.h [mutex] Civilise the comment. 2009-01-29 10:10:38 +00:00
cairo-mutex-list-private.h [scaled-font] Global glyph cache 2009-01-29 10:10:39 +00:00
cairo-mutex-private.h [cairo-mutex] Move semicolons out of cairo-mutex-list-private.h 2008-09-19 18:45:44 -04:00
cairo-mutex-type-private.h Ensure that the scaled font is frozen for the lifetime of the scaled glyph. 2008-10-22 00:53:55 +01:00
cairo-mutex.c [cairo-mutex] Move semicolons out of cairo-mutex-list-private.h 2008-09-19 18:45:44 -04:00
cairo-os2-private.h [os2] Fix includes 2008-11-26 20:22:57 +00:00
cairo-os2-surface.c [os2] Fix memory leak of surface on error path 2009-01-02 09:53:27 +00:00
cairo-os2.h [os2] Move include cairo.h before os2.h 2008-11-26 20:23:05 +00:00
cairo-output-stream-private.h Add CairoScript backend. 2008-11-13 11:36:54 +00:00
cairo-output-stream.c Mark allocation failures as unlikely. 2008-11-29 11:20:34 +00:00
cairo-paginated-private.h [svg] Use finer-grained fallbacks for SVG 1.2 2008-10-08 12:43:35 +01:00
cairo-paginated-surface-private.h Remove include of cairoint.h from *-private.h header files. 2007-08-23 16:13:04 -07:00
cairo-paginated-surface.c Query the backend to see if we can repaint the solid pattern. 2008-12-18 12:06:45 +00:00
cairo-path-bounds.c [bounds] Skip spline evaluation based on bounding bbox of control points. 2009-01-29 10:10:39 +00:00
cairo-path-fill.c [path] Mark points as const during _cairo_path_fixed_interpret() 2008-12-12 11:11:49 +00:00
cairo-path-fixed-private.h [fill] Allow rectangles to be implicitly closed. 2008-11-29 10:14:26 +00:00
cairo-path-fixed.c [path] A degenerate curve_to becomes a line_to. 2009-01-29 10:10:39 +00:00
cairo-path-in-fill.c [path] Mark points as const during _cairo_path_fixed_interpret() 2008-12-12 11:11:49 +00:00
cairo-path-private.h [cairo-path] Make _cairo_path_nil static. 2007-10-30 10:58:16 +00:00
cairo-path-stroke.c [path] Mark points as const during _cairo_path_fixed_interpret() 2008-12-12 11:11:49 +00:00
cairo-path.c [path] Mark points as const during _cairo_path_fixed_interpret() 2008-12-12 11:11:49 +00:00
cairo-pattern.c [pattern] Fix comment typo 2008-12-25 23:29:02 -05:00
cairo-pdf-operators-private.h PDF: Disable PDF 1.5 features when version 1.4 is selected 2008-11-24 22:27:09 +10:30
cairo-pdf-operators.c [path] Mark points as const during _cairo_path_fixed_interpret() 2008-12-12 11:11:49 +00:00
cairo-pdf-surface-private.h PDF: Add cairo_pdf_surface_restrict_to_version API 2008-11-24 22:27:09 +10:30
cairo-pdf-surface.c Embed full font name in PDF TrueType and CFF fonts 2009-01-22 23:12:14 +11:00
cairo-pdf.h Document PDF restrict_to_version API 2008-12-23 15:04:10 +10:30
cairo-pen.c [path] Mark points as const during _cairo_path_fixed_interpret() 2008-12-12 11:11:49 +00:00
cairo-png.c [png] Fix leak of original png data on error path. 2008-11-29 11:20:34 +00:00
cairo-polygon.c Mark allocation failures as unlikely. 2008-11-29 11:20:34 +00:00
cairo-private.h [cairo] Embed a second gstate. 2009-01-02 09:53:25 +00:00
cairo-ps-surface-private.h PS: Implement EXTEND_PAD for image patterns 2008-11-02 20:12:29 +10:30
cairo-ps-surface.c Use PS font name in PS TrueType fonts 2009-01-22 23:12:14 +11:00
cairo-ps.h Use #include "cairo-*." instead of #include <cairo-*.h> 2008-06-23 00:30:04 -04:00
cairo-quartz-font.c [quartz] Delay allocation of string until after guard. 2009-01-02 09:53:27 +00:00
cairo-quartz-image-surface.c [cairo-spans] Add a check/create_span_renderer backend methods. 2008-12-06 14:04:36 +02:00
cairo-quartz-image.h Use #include "cairo-*." instead of #include <cairo-*.h> 2008-06-23 00:30:04 -04:00
cairo-quartz-private.h Make sure feature macros are checked using #if, not #ifdef; add a test for it 2008-09-20 17:20:36 -04:00
cairo-quartz-surface.c [quartz] Define RTLD_DEFAULT 2009-01-03 21:53:15 +00:00
cairo-quartz.h Make sure feature macros are checked using #if, not #ifdef; add a test for it 2008-09-20 17:20:36 -04:00
cairo-rectangle.c [path] Separate the approx. bounds into 3 distinct functions 2008-12-18 14:55:20 +00:00
cairo-reference-count-private.h Make sure (and check) that all private headers include some cairo header first 2008-09-19 17:19:10 -04:00
cairo-region-private.h Review users of cairo_rectangle_int_t for incorrect unsigned promotion. 2008-10-30 16:19:38 +00:00
cairo-region.c Mark allocation failures as unlikely. 2008-11-29 11:20:34 +00:00
cairo-scaled-font-private.h [scaled-font] Global glyph cache 2009-01-29 10:10:39 +00:00
cairo-scaled-font-subsets-private.h Use PS font name in CFF and TrueType PDF font subsets 2009-01-22 23:12:14 +11:00
cairo-scaled-font-subsets.c Mark allocation failures as unlikely. 2008-11-29 11:20:34 +00:00
cairo-scaled-font.c [scaled-font] Global glyph cache 2009-01-29 10:10:39 +00:00
cairo-script-surface.c Query the backend to see if we can repaint the solid pattern. 2008-12-18 12:06:45 +00:00
cairo-script.h Add CairoScript backend. 2008-11-13 11:36:54 +00:00
cairo-sdl-surface.c [cairo-spans] Add a check/create_span_renderer backend methods. 2008-12-06 14:04:36 +02:00
cairo-sdl.h [sdl] Add new backend. 2008-10-30 17:04:53 +00:00
cairo-skiplist-private.h [skiplist] Allocate elements in chunks. 2008-12-12 13:43:36 +00:00
cairo-skiplist.c [skiplist] Allocate elements in chunks. 2008-12-12 13:43:36 +00:00
cairo-slope.c [slope] Replace open-coding 64bit integer arithmetic. 2008-10-07 01:45:45 +01:00
cairo-spans-private.h [cairo-spans] New cairo_tor_scan_converter_t. 2008-12-06 14:04:36 +02:00
cairo-spans.c [spans] Close open subpaths when filling with a scan converter. 2008-12-23 03:32:07 +02:00
cairo-spline.c [spline] Correct the definition of a cubic Bezier curve. 2009-01-29 10:10:39 +00:00
cairo-stroke-style.c Mark allocation failures as unlikely. 2008-11-29 11:20:34 +00:00
cairo-surface-fallback-private.h [pattern] Avoid needless copying of patterns. 2008-10-30 17:52:05 +00:00
cairo-surface-fallback.c [path] Rename _cairo_path_fixed_approximate_extents() 2009-01-29 10:10:39 +00:00
cairo-surface-private.h [mime-data] Allow embedding of arbitrary mime-types. 2008-11-03 11:24:12 +00:00
cairo-surface.c Query the backend to see if we can repaint the solid pattern. 2008-12-18 12:06:45 +00:00
cairo-svg-surface-private.h Remove include of cairoint.h from *-private.h header files. 2007-08-23 16:13:04 -07:00
cairo-svg-surface.c [image] Eliminate the short-lived context used for coercing. 2008-12-18 10:40:14 +00:00
cairo-svg.h Use #include "cairo-*." instead of #include <cairo-*.h> 2008-06-23 00:30:04 -04:00
cairo-system.c [cairo.h] Don't define cairo_public to __declspec(dllimport) for static build 2008-09-26 13:27:42 -04:00
cairo-tor-scan-converter.c [spans] Add a sentinel cell to the cell_list. 2008-12-12 12:00:45 +00:00
cairo-toy-font-face.c [toy-font-face] Return defaults for error objects. 2009-01-02 15:44:50 +00:00
cairo-traps.c Mark allocation failures as unlikely. 2008-11-29 11:20:34 +00:00
cairo-truetype-subset-private.h Revamp the build system. 2008-09-02 20:24:08 -04:00
cairo-truetype-subset.c Use PS font name in CFF and TrueType PDF font subsets 2009-01-22 23:12:14 +11:00
cairo-type1-fallback.c [path] Mark points as const during _cairo_path_fixed_interpret() 2008-12-12 11:11:49 +00:00
cairo-type1-private.h Revamp the build system. 2008-09-02 20:24:08 -04:00
cairo-type1-subset.c Mark allocation failures as unlikely. 2008-11-29 11:20:34 +00:00
cairo-type3-glyph-surface-private.h Don't add a notdef glyph to Type 3 font subsets 2008-10-22 22:00:31 +10:30
cairo-type3-glyph-surface.c [image] Eliminate the short-lived context used for coercing. 2008-12-18 10:40:14 +00:00
cairo-types-private.h [spline] Be pedantic and propagate errors. 2008-12-29 16:11:29 +00:00
cairo-unicode.c [doc] Fix a few gtk-doc errors. 2008-10-14 14:42:48 +01:00
cairo-uninstalled.pc.in Build -uninstalled.pc files 2008-09-11 00:38:30 -04:00
cairo-user-font-private.h Revamp the build system. 2008-09-02 20:24:08 -04:00
cairo-user-font.c [twin] Add face properties 2008-12-23 13:41:03 -05:00
cairo-version.c Some nasty tracks to make changing version number not cause a total rebuild 2008-08-28 18:18:23 -04:00
cairo-version.h Some nasty tracks to make changing version number not cause a total rebuild 2008-08-28 18:18:23 -04:00
cairo-wideint-private.h [tessellator] Compile fixes for !HAVE_INT64_T 2008-10-07 22:16:26 +01:00
cairo-wideint-type-private.h Make sure (and check) that all private headers include some cairo header first 2008-09-19 17:19:10 -04:00
cairo-wideint.c [tessellator] Replace open-coding _cairo_int64_cmp(). 2008-10-06 12:07:41 +01:00
cairo-win32-font.c win32-font: truncate instead of fail if toy font name too long 2008-12-22 11:09:27 +10:30
cairo-win32-printing-surface.c [path] Mark points as const during _cairo_path_fixed_interpret() 2008-12-12 11:11:49 +00:00
cairo-win32-private.h Win32-print: Add PNG embedding support 2008-11-24 22:27:09 +10:30
cairo-win32-surface.c [win32] Use MOD instead of the '%' operator 2008-12-08 11:37:38 -05:00
cairo-win32.h Make sure feature macros are checked using #if, not #ifdef; add a test for it 2008-09-20 17:20:36 -04:00
cairo-xcb-surface.c [xcb] check for render extension presence 2008-12-14 11:01:41 +00:00
cairo-xcb-xrender.h Use #include "cairo-*." instead of #include <cairo-*.h> 2008-06-23 00:30:04 -04:00
cairo-xcb.h Use #include "cairo-*." instead of #include <cairo-*.h> 2008-06-23 00:30:04 -04:00
cairo-xlib-display.c Mark allocation failures as unlikely. 2008-11-29 11:20:34 +00:00
cairo-xlib-private.h [xlib] Only clear the GC clip mask as necessary. 2008-10-30 17:52:14 +00:00
cairo-xlib-screen.c Mark allocation failures as unlikely. 2008-11-29 11:20:34 +00:00
cairo-xlib-surface-private.h [region] Use the caller supplied array for extracting boxes. 2008-11-21 09:40:42 +00:00
cairo-xlib-surface.c Query the backend to see if we can repaint the solid pattern. 2008-12-18 12:06:45 +00:00
cairo-xlib-visual.c Mark allocation failures as unlikely. 2008-11-29 11:20:34 +00:00
cairo-xlib-xrender-private.h Define RepeatNone, etc if the available Render version doesn't (#18385) 2008-11-05 11:54:54 -05:00
cairo-xlib-xrender.h Use #include "cairo-*." instead of #include <cairo-*.h> 2008-06-23 00:30:04 -04:00
cairo-xlib.h Use #include "cairo-*." instead of #include <cairo-*.h> 2008-06-23 00:30:04 -04:00
cairo.c [doc] Give a small hint about Twin font 2009-01-02 06:51:15 -05:00
cairo.h Add JPEG2000 mimetype and image info function 2008-11-23 21:05:36 +10:30
cairo.pc.in Improve backend .pc files generation: 2006-07-12 04:27:55 -04:00
cairoint.h [scaled-font] Global glyph cache 2009-01-29 10:10:39 +00:00
check-def.sh [check-*.sh] Redirect error reports to stderr 2008-09-26 11:08:22 -04:00
check-doc-syntax.sh [check] Search for the word NOTE 2008-11-29 10:14:26 +00:00
check-has-hidden-symbols.c [check] Move the hidden symbol check into check-{def,plt}.sh 2008-01-11 21:21:34 +00:00
check-headers.sh [check-*.sh] Redirect error reports to stderr 2008-09-26 11:08:22 -04:00
check-link.c [src/check-link.c] Simple test to check we can link to the built cairo.so 2008-09-02 21:31:43 -04:00
check-plt.sh [check-*.sh] Redirect error reports to stderr 2008-09-26 11:08:22 -04:00
check-preprocessor-syntax.sh [check-*.sh] Redirect error reports to stderr 2008-09-26 11:08:22 -04:00
Makefile.am [build] Include all generated win32 build files in the repo 2009-01-09 15:55:24 -05:00
Makefile.am.analysis [Makefile.am] Only rerun headers-standalone if a header file has changed 2008-09-30 11:11:47 +01:00
Makefile.sources [toy-font-face] Move toy font face code in a file of its own 2008-12-20 01:18:12 -05:00
Makefile.win32 [win32] Use -MDd and -LDd instead of -MD and -LD for debug build 2008-10-04 00:35:43 -04:00
Makefile.win32.features [build] Include all generated win32 build files in the repo 2009-01-09 15:55:24 -05:00
README Fix various README typos 2009-01-02 02:56:38 -05:00
test-fallback-surface.c [cairo-spans] Add a check/create_span_renderer backend methods. 2008-12-06 14:04:36 +02:00
test-fallback-surface.h [test-surfaces] Prefix public symbols with _cairo 2007-03-13 05:14:19 -04:00
test-meta-surface.c Query the backend to see if we can repaint the solid pattern. 2008-12-18 12:06:45 +00:00
test-meta-surface.h [test-surfaces] Prefix public symbols with _cairo 2007-03-13 05:14:19 -04:00
test-paginated-surface.c Query the backend to see if we can repaint the solid pattern. 2008-12-18 12:06:45 +00:00
test-paginated-surface.h [test-surfaces] Prefix public symbols with _cairo 2007-03-13 05:14:19 -04:00

Cairo Library Source Code
=========================

This directory contains the source code of the cairo library.


Source Code Listing
-------------------

The canonical list of source files is the file Makefile.sources.  See that
file for how it works.


New Backends
------------

The rule of the thumb for adding new backends is to see how other
backends are integrated.  Pick one of the simpler, unsupported, backends
and search the entire tree for it, and go from there.

To add new backends you need to basically:

  * Modify $(top_srcdir)/configure.in to add checks for your backend.

  * Modify Makefile.sources to add source files for your backend,

  * Modify $(top_srcdir)/boilerplate/ to add boilerplate code for
    testing your new backend.


New API
-------

After adding new API, run "make check" in this directory and fix any
reported issues.  Also add new API to the right location in
$(top_srcdir)/doc/public/cairo-sections.txt and run "make check"
in $(top_builddir)/doc/public to make sure that any newly added
documentation is correctly hooked up.

Do not forget to add tests for the new API.  See next section.


Tests
-----

There are some tests in this directory that check the source code and
the build for various issues.  The tests are very quick to run, and
particularly should be run after any documentation or API changes.  It
does not hurt to run them after any source modification either.  Run
them simply by calling:

	make check

There are also extensive regression tests in $(top_srcdir)/test.  It is
a good idea to run that test suite for any changes made to the source
code.  Moreover, for any new feature, API, or bug fix, new tests should
be added to the regression test suite to test the new code.


Bibliography
------------

A detailed list of academic publications used in cairo code is available
in the file $(top_srcdir)/BIBLIOGRAPHY.  Feel free to update as you
implement more papers.

For more technical publications (eg. Adobe technical reports) just
point them out in a comment in the header of the file implementing them.