Cairo (graphics)

Last updated

Original author(s) Keith Packard, Carl Worth [1]
Developer(s) Carl Worth, Behdad Esfahbod
Initial releaseBefore 2003;22 years ago (2003) [2]
Stable release
1.18.2 (September 1, 2024;5 months ago (2024-09-01) [3] ) [±]
Repository gitlab.freedesktop.org/cairo/cairo
Written in C
Type Graphics library
License GNU Lesser General Public License version 2.1 (only) or Mozilla Public License 1.1
Website www.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 backends. Cairo uses hardware acceleration [4] when available.

Contents

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, Fortran, 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, DirectFB and OpenGL backends were dropped in 2022. [12] [13]

Drawing model

The Cairo drawing model Cairo's drawing model.svg
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. [14]

Example

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

SVG picture generated by this example Cairo example.svg
SVG picture generated by this example
#include<cairo-svg.h>#include<stdio.h>intmain(intargc,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(intx=0;x<10;++x)for(inty=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. [23] The name Cairo derives from the original name Xr, interpreted as the Greek letters chi and rho. [24]

Complex text layout

Cairo handles Latin and CJK based fonts, but does not directly support complex text layout fonts, which require shaping the glyphs. The Cairo developers recommend using Pango, which provides complex text layout and can integrate with Cairo. [25]

See also

References

  1. "Carl's boring web pages". cworth.org. 2013. Retrieved July 11, 2014.
  2. 1 2 "Xr: Cross-device Rendering for Vector Graphics" . Retrieved June 8, 2009.
  3. "cairo-1.18.2". www.cairographics.org. Retrieved September 8, 2024.
  4. "Cairo homepage" . Retrieved October 30, 2010.
  5. "Cairo Language Bindings" . Retrieved April 16, 2014.
  6. "SDL". Cairo. February 17, 2009. Retrieved November 3, 2014.
  7. Chris Wilson (July 22, 2009). "New OpenGL backend merged" . Retrieved February 12, 2010.
  8. Øyvind Kolås (January 24, 2008). "Announcing OpenVG backend" . Retrieved February 12, 2010.
  9. Vladimir Vukićević (May 6, 2008). "Well Isn't That Qt". Archived from the original on April 9, 2010. Retrieved February 12, 2010.
  10. Chris Wilson (August 31, 2009). "Cool Stuff" . Retrieved February 12, 2010.
  11. Bas Schouten (November 22, 2009). "Direct2D: Hardware Rendering a Browser" . Retrieved February 12, 2010.
  12. Larabel, Michael (February 27, 2022). "Cairo graphics library drops many old backends". Phoronix. Retrieved June 5, 2022.
  13. Larabel, Michael (January 29, 2023). "Cairo Graphics Library Drops OpenGL Support After A Decade Of Inactivity". Phoronix. Retrieved February 7, 2025.
  14. "GNOME/librsvg". GitHub.
  15. "GTK+ to Use Cairo Vector Engine". February 5, 2005. Retrieved December 27, 2009.
  16. "Details of package gtk-vector-screenshot in stretch". Debian. GitHub
  17. "Mono - Drawing" . Retrieved December 27, 2009.
  18. "Moonlight Notes" . Retrieved December 27, 2009.
  19. "Gecko 1.9 Roadmap" . Retrieved December 27, 2009.
  20. "ReleaseNotes046". Inkscape Wiki. Retrieved March 31, 2008.
  21. "ManimCE tutorial by TheoremOfBeethoven — ManimCE tutorial by TB documentation". zavden.github.io. Retrieved January 29, 2023.
  22. "Gnuplot version 4.4.0 announcement". Gnuplot homepage. Archived from the original on May 14, 2011. Retrieved February 22, 2011.
  23. "Mailing list thread about the Cairo name change". July 15, 2003. Retrieved June 8, 2009.
  24. "Mailing list thread about the Cairo name change". July 12, 2003. Retrieved December 2, 2006.
  25. "How do I use Pango instead of Cairo's "toy" text API?" . Retrieved March 20, 2024.