cairo snapshot 1.3.4 now available

[If you're not familiar with cairo at all, skip down to the final
paragraphs explaining "What is cairo"]

A new cairo snapshot 1.3.4 is now available from:

    which can be verified with:
        0c412d56c01ea5fcbcfeafdfc6f23b3772a9711e  cairo-1.3.4.tar.gz
        (signed by Carl Worth)

  Additionally, a git clone of the source tree:

        git clone git://

    will include a signed 1.3.4 tag which points to a commit named:

    which can be verified with:
        git verify-tag 1.3.4

    and can be checked out with a command such as:
        git checkout -b build 1.3.4

What's new since 1.3.2?
This is the second development snapshot in the 1.3 series. It comes
one week after the 1.3.2 snapshot.

This snapshot has a couple of significant performance improvements,
and also adds new support for producing multi-page SVG output, (when
targeting SVG 1.2)---thanks to Emmanuel Pacaud. The details of the
performance improvements are as follows:

1. The long-awaited "new tessellator".

   The credit for this being an improvement goes to Joonas Pihlaja. He
   took my really slow code and really put it through its paces to get
   the dramatic performance improvement seen below (up to 38x faster
   on realistic cases, and more than 10x faster for the zrusin_another

   His own writeup of the work he did is quite thorough, but more than
   can be quoted here. Please see his post for the interesting details:

   (Though note that this snapshot also includes some additional,
   significant improvements that were only sketched out in that
   email---see "Generating fewer trapezoids").

2. More floating-point improvements

   Daniel Amelang continues to work the magic he began in the 1.3.2
   snapshot. This time he short-circuits floating-point
   transformations by identity matrices and applies the earlier
   floating-to-fixed-point technique to the problem of rounding.

   The improvements here will primarily benefit text performance, and
   will benefit platforms without hardware floating-point more than
   those that have it, (some text tests show 20% improvement on an x86
   machine and closer to 80% improvement on arm).

The performance chart comparing 1.3.2 to 1.3.4 really speaks for
itself, (this is on an x86 laptop). This is quite a lot of progress
for one week:

 xlib-rgb    stroke_similar_rgba_over-256   74.99 1.45% ->   2.03 68.38%: 36.86x speedup
 xlib-rgb  stroke_similar_rgba_source-256   78.23 1.43% ->   3.30 67.05%: 23.71x speedup
 xlib-rgba             tessellate-256-100  820.42 0.15% ->  35.06 2.84%: 23.40x speedup
image-rgba             tessellate-256-100  819.55 0.32% ->  35.04 3.56%: 23.39x speedup
 xlib-rgb      stroke_image_rgba_over-256   78.10 1.43% ->   4.33 65.56%: 18.04x speedup
 xlib-rgb    stroke_image_rgba_source-256   80.11 1.63% ->   5.75 63.99%: 13.94x speedup
 xlib-rgba  zrusin_another_tessellate-415   89.22 0.35% ->   8.38 5.23%: 10.65x speedup
image-rgba  zrusin_another_tessellate-415   87.38 0.89% ->   8.37 5.22%: 10.44x speedup
image-rgba        zrusin_another_fill-415  117.67 1.34% ->  12.88 2.77%:  9.14x speedup
 xlib-rgba        zrusin_another_fill-415  140.52 1.57% ->  15.79 2.88%:  8.90x speedup
image-rgba              tessellate-64-100    9.68 3.42% ->   1.42 0.60%:  6.82x speedup
 xlib-rgba              tessellate-64-100    9.78 4.35% ->   1.45 0.83%:  6.72x speedup
 xlib-rgb     stroke_linear_rgba_over-256   46.01 2.44% ->   7.74 54.51%:  5.94x speedup
 xlib-rgb   stroke_linear_rgba_source-256   48.09 2.15% ->   9.14 53.00%:  5.26x speedup
 xlib-rgb     stroke_radial_rgba_over-256   50.96 2.34% ->  12.46 47.99%:  4.09x speedup
 xlib-rgb   stroke_radial_rgba_source-256   53.06 1.57% ->  13.96 46.57%:  3.80x speedup
image-rgba  paint_similar_rgba_source-256    0.12 1.57% ->   0.08 9.92%:  1.42x speedup
image-rgba    paint_image_rgba_source-256    0.12 2.49% ->   0.08 10.70%:  1.41x speedup
image-rgba                  world_map-800  356.28 0.46% -> 275.72 1.15%:  1.29x speedup
 xlib-rgba                  world_map-800  456.81 0.39% -> 357.95 1.39%:  1.28x speedup
image-rgb               tessellate-16-100    0.09 0.57% ->   0.07 3.43%:  1.23x speedup
image-rgba              tessellate-16-100    0.09 0.06% ->   0.07 2.46%:  1.23x speedup
image-rgba        text_solid_rgb_over-256    5.39 4.01% ->   4.47 0.70%:  1.21x speedup
image-rgba       text_solid_rgba_over-256    5.37 0.82% ->   4.45 0.75%:  1.21x speedup
image-rgba        text_image_rgb_over-64     0.78 0.10% ->   0.65 0.74%:  1.20x speedup
image-rgba       text_image_rgba_over-64     0.78 0.29% ->   0.65 0.68%:  1.19x speedup
image-rgb         text_solid_rgb_over-64     0.76 2.45% ->   0.63 0.81%:  1.19x speedup
image-rgba       text_solid_rgba_over-64     0.76 0.33% ->   0.64 0.66%:  1.19x speedup
image-rgba     text_similar_rgba_over-256    5.99 4.72% ->   5.04 1.09%:  1.19x speedup

We should point out that there is some potential for slowdown in this
snapshot. The following are the worst slowdowns reported by the cairo
performance suite when comparing 1.3.2 to 1.3.4:

image-rgba              subimage_copy-256    0.01 0.87% ->   0.01 3.61%:  1.45x slowdown
 xlib-rgb        paint_solid_rgb_over-256    0.31 10.23% ->   0.38 0.33%:  1.26x slowdown
image-rgba           box-outline-fill-100    0.01 0.30% ->   0.01 2.52%:  1.21x slowdown
image-rgba        fill_solid_rgb_over-64     0.20 1.22% ->   0.22 1.59%:  1.12x slowdown
image-rgb       fill_similar_rgb_over-64     0.21 1.04% ->   0.24 1.06%:  1.11x slowdown
image-rgba        fill_image_rgb_over-64     0.21 1.19% ->   0.24 0.72%:  1.11x slowdown
image-rgba      fill_similar_rgb_over-64     0.21 0.18% ->   0.24 0.30%:  1.11x slowdown
image-rgb        fill_solid_rgba_over-64     0.22 1.66% ->   0.24 1.15%:  1.11x slowdown
image-rgb         fill_image_rgb_over-64     0.21 0.14% ->   0.24 0.80%:  1.11x slowdown
image-rgba       fill_image_rgba_over-64     0.22 1.34% ->   0.25 0.20%:  1.11x slowdown
image-rgba       fill_solid_rgba_over-64     0.22 1.48% ->   0.24 0.95%:  1.11x slowdown
image-rgb      fill_similar_rgba_over-64     0.22 1.13% ->   0.25 1.25%:  1.10x slowdown

The 45% slowdown for subimage_copy is an extreme case. It's unlikely
to hit many applications unless they often use cairo_rectangle;
cairo_fill to copy a single pixel at a time. In any case, it shows a
worst-case impact of the overhead of the new tessellator. The other
slowdowns (~ 10%) are probably more realistic, and still very

We will work to ensure that performance regressions like these are not
present from one major release of cairo to the next, (for example,
from 1.2 to 1.4).

But we're putting this 1.3.4 snapshot out there now, even with this
potential slowdown so that people can experiment with it. If you've
got complex geometry, we hope you will see some benefit from the new
tessellator. If you've got primarily simple geometry, we hope things
won't slowdown too much, but please let us know what slowdown you see,
if any, so we can calibrate our performance suite against real-world

Log of changes from 1.3.2 to 1.3.4
Behdad Esfahbod (4):
      [SVG] Define enum _cairo_svg_version.
      [PS] Eliminate compiler warnings about unoptimizable loops
      [PS] Rename n_glyphs to num_glyphs_unsigned
      [SVG] Fix compiler warning

Carl Worth (18):
      Increment cairo version to 1.3.3 after 1.3.2 snapshot
      ROADMAP: Set cairo 1.4 to early January for sake of Gnome 2.18
      cairo-perf: When iteration count is given on command-line, never execute fewer
      perf: Add box_outline test case.
      Add const qualifier to cairo_path_t* parameter of cairo_append_path
      Require librsvg 2.15.0 (was 2.14.0) for testing of SVG backend.
      test/clip-operator: Use round to pass only integers to cairo_show_glyphs
      test: Use round to pass only integers to cairo_show_glyphs (in 3 more tests)
      give the big-trap test the XFAIL treatment.
      Add skip list implementation (many thanks to Keith Packard)
      Add new tessellator (unused) in cairo-bentley-ottmann.c
      Adapt new tessellator to match the interface provided by the old tessellator.
      Switch from old tessellator to new tessellator
      Make event_queue_insert ignore duplicate intersection events (not duplicate start/stop events)
      Add some missing cairo_private decorators
      Add Daniel Amelang and Joonas Pihlaja to the AUTHORS file
      NEWS: Add notes for 1.3.4 snapshot
      Increment cairo version to 1.3.4

Dan Amelang (5):
      Add _cairo_matrix_is_translation
      Refactor _cairo_matrix_is_integer_translation
      Add and incorporate _cairo_gstate_transform_glyphs_to_backend
      Optimize _cairo_matrix_to_pixman_matrix for the common case of an identity matrix
      Change _cairo_matrix_to_pixman_matrix to use a pixman_transform_t as the template, thus avoiding a forced memcpy

Daniel Amelang (2):
      Add _cairo_lround for much faster rounding
      Replace existing rounding code with _cairo_lround

Emmanuel Pacaud (5):
      Add SVGPrint support.
      Use SVG multipage capability.
      test/pixman-rotate.c: Don't issue a show_page, it's already done in cairo-test.c
      Merge branch 'svgprint'
      SVG: plug a memory leak

Joonas Pihlaja (11):
      A 96 by 64 bit divrem that produces a 32 bit quotient and 64 bit remainder.
      Replace the 128 bit divrem by a 96/64 bit one.
      Use an LFSR instead of random().
      Special cases for skip list comparators.
      Avoid a skip-list lookup when deactivating edges.
      Separate start and stop events from intersections (first try.)
      Tweak comparators.
      Malloc less using a free list of nodes.
      Make the skip list check for uniqueness.
      Sort pointers instead of cairo_bo_events in the tessellator.
      perf: new-tessellator: Deferred trapezoid generation (first try)

Vladimir Vukicevic (1):
      [test] add big-trap test

What is cairo
Cairo is a 2D graphics library with support for multiple output
devices. Currently supported output targets include the X Window
System, win32, and image buffers, as well as PDF, PostScript, and SVG
file output. Experimental backends include OpenGL (through glitz),
Quartz, XCB, BeOS, and DirectFB.

Cairo is designed to produce consistent output on all output media
while taking advantage of display hardware acceleration when available
(for example, through the X Render Extension).

The cairo API provides operations similar to the drawing operators of
PostScript and PDF. Operations in cairo including stroking and filling
cubic Bézier splines, transforming and compositing translucent images,
and antialiased text rendering. All drawing operations can be
transformed by any affine transformation (scale, rotation, shear,

Cairo has been designed to let you draw anything you want in a modern
2D graphical user interface.  At the same time, the cairo API has been
designed to be as fun and easy to learn as possible. If you're not
having fun while programming with cairo, then we have failed
somewhere---let us know and we'll try to fix it next time around.

Cairo is free software and is available to be redistributed and/or
modified under the terms of either the GNU Lesser General Public
License (LGPL) version 2.1 or the Mozilla Public License (MPL) version

Where to get more information about cairo
The primary source of information about cairo is:

The latest releases of cairo can be found at:

Snapshots of in-development versions of cairo:

The programming manual for using cairo:

Mailing lists for contacting cairo users and developers:

Answers to some frequently asked questions about cairo:

Attachment: pgpSQFEMaeiuJ.pgp
Description: PGP signature

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]