Cairo
Cairo graphics.svg
Original author(s)Keith Packard, Carl Worth[1]
Developer(s)Carl Worth, Behdad Esfahbod
Initial releaseBefore 2003; 19 years ago (2003)[2]
Stable release1.17.4 (November 29, 2020; 19 months ago (2020-11-29)[3]) [±]
Repositorygitlab.freedesktop.org/cairo/cairo
Written inC
TypeGraphics library
LicenseGNU Lesser General Public License version 2.1 (only) or Mozilla Public License 1.1
Websitewww.cairographics.org

Cairo (stylized as cairo) is an open-source graphics library that provides a vector graphics-based, device-independent API for software developers. It provides primitives for two-dimensional drawing across a number of different back ends. Cairo uses hardware acceleration[4] when available.

Software architecture

Language bindings

A library written in one programming language may be used in another language if bindings are written; Cairo has a range of bindings for various languages including C++, C# and other CLI languages, Delphi, Eiffel, Factor, Harbour, Haskell, Julia, Lua, Perl, PHP, Python, Ruby, Rust, Scheme, Smalltalk and several others like Gambas (Visual Basic like).[5]

Toolkit bindings

Since Cairo is only a drawing library, it can be quite useful to integrate it with a graphical user interface toolkit.

Available back-ends

Cairo supports output (including rasterisation) to a number of different back-ends, known as "surfaces" in its code. Back-ends support includes output to the X Window System, via both Xlib and XCB, Win32 GDI, OS X Quartz Compositor, the BeOS API, OS/2, OpenGL contexts (directly[7] and via glitz), local image buffers, PNG files, PDF, PostScript, DirectFB and SVG files.

There are other back-ends in development targeting the graphics APIs OpenVG,[8] Qt,[9] Skia,[10] and Microsoft's Direct2D.[11] The BeOS, OS/2 and DirectFB backends were dropped in 2022.[12]

Drawing model

The Cairo drawing model
The Cairo drawing model

The Cairo drawing model relies on a three-layer model.

Any drawing process takes place in three steps:

  1. First a mask is created, which includes one or more vector primitives or forms, i.e., circles, squares, TrueType fonts, Bézier curves, etc.
  2. Then source must be defined, which may be a color, a color gradient, a bitmap or some vector graphics, and from the painted parts of this source a die cut is made with the help of the above defined mask.
  3. Finally the result is transferred to the destination or surface, which is provided by the back-end for the output.

This constitutes a fundamentally different approach from Scalable Vector Graphics (SVG), which specifies the color of shapes with Cascading Style Sheets (CSS) rules.[citation needed] Whereas Cairo would create a mask of a shape, then make a source for it, and then transfer them onto the surface, an SVG file would simply specify the shape with a style attribute. That said, the models are not incompatible; many SVG renderers use Cairo for heavy lifting.[13]

Example

SVG picture generated by this example
SVG picture generated by this example

Quite complex "Hello world" graphics can be drawn with the help of Cairo with only a few lines of source code:

#include <cairo-svg.h>
#include <stdio.h>

int main(int argc, char **argv) {
    cairo_surface_t *surface = cairo_svg_surface_create("Cairo_example.svg", 100.0, 100.0);
    cairo_t *cr = cairo_create(surface);

    /* Draw the squares in the background */
    for (int x = 0; x < 10; ++x)
       for (int y = 0; y < 10; ++y)
           cairo_rectangle(cr, x * 10.0, y * 10.0, 5, 5);

    cairo_pattern_t *pattern = cairo_pattern_create_radial(50, 50, 5, 50, 50, 50);
    cairo_pattern_add_color_stop_rgb(pattern, 0, 0.75, 0.15, 0.99);
    cairo_pattern_add_color_stop_rgb(pattern, 0.9, 1, 1, 1);

    cairo_set_source(cr, pattern);
    cairo_fill(cr);

    /* Writing in the foreground */
    cairo_set_font_size (cr, 15);
    cairo_select_font_face (cr, "Georgia", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
    cairo_set_source_rgb (cr, 0, 0, 0);

    cairo_move_to(cr, 10, 25);
    cairo_show_text(cr, "Hallo");

    cairo_move_to(cr, 10, 75);
    cairo_show_text(cr, "Wikipedia!");

    cairo_destroy(cr);
    cairo_surface_destroy(surface);
}

Notable usage

Cairo is popular in the open source community for providing cross-platform support for advanced 2D drawing.

History

Keith Packard and Carl Worth founded the Cairo project for use in the X Window System.[2] It was originally (until at least 2003) called Xr or Xr/Xc. The name was changed to emphasize the idea of a cross-platform library to access display server, not tied to the X Window System.[21] The name Cairo derives from the original name Xr, interpreted as the Greek letters chi and rho.[22]

Complex text layout

Cairo handles latin and CJK based fonts, but does not support complex text layout fonts, which require shaping the glyphs.[23]

See also

References

  1. ^ "Carl's boring web pages". cworth.org. 2013. Retrieved 11 July 2014.
  2. ^ a b "Xr: Cross-device Rendering for Vector Graphics". Retrieved 2009-06-08.
  3. ^ "Latest cairo news". Retrieved 8 June 2021.
  4. ^ "Cairo homepage". Retrieved 2010-10-30.
  5. ^ "Cairo Language Bindings". Retrieved 2014-04-16.
  6. ^ "SDL". Cairo. 2009-02-17. Retrieved 2014-11-03.
  7. ^ Chris Wilson (2009-07-22). "New OpenGL backend merged". Retrieved 2010-02-12.
  8. ^ Øyvind Kolås (2008-01-24). "Announcing OpenVG backend". Retrieved 2010-02-12.
  9. ^ Vladimir Vukićević (2008-05-06). "Well Isn't That Qt". Archived from the original on 2010-04-09. Retrieved 2010-02-12.
  10. ^ Chris Wilson (2009-08-31). "Cool Stuff". Retrieved 2010-02-12.
  11. ^ Bas Schouten (2009-11-22). "Direct2D: Hardware Rendering a Browser". Retrieved 2010-02-12.
  12. ^ Larabel, Michael (2022-02-27). "Cairo graphics library drops many old backends". Phoronix. Retrieved 2022-06-05.
  13. ^ "GNOME/librsvg". GitHub.
  14. ^ "GTK+ to Use Cairo Vector Engine". Retrieved 2009-12-27.
  15. ^ "Details of package gtk-vector-screenshot in stretch". Debian. GitHub
  16. ^ "Mono - Drawing". Retrieved 2009-12-27.
  17. ^ "Moonlight Notes". Retrieved 2009-12-27.
  18. ^ "Gecko 1.9 Roadmap". Retrieved 2009-12-27.
  19. ^ "ReleaseNotes046". Inkscape Wiki. Retrieved 2008-03-31.
  20. ^ "Gnuplot version 4.4.0 announcement". Gnuplot homepage. Archived from the original on 2011-05-14. Retrieved 2011-02-22.
  21. ^ "Mailing list thread about the Cairo name change". Retrieved 2009-06-08.
  22. ^ "Mailing list thread about the Cairo name change". Retrieved 2006-12-02.
  23. ^ "Text". Readthedocs. Retrieved 2022-03-11.