Cairo (graphics)

Source: Wikipedia, the free encyclopedia.
Original author(s)Keith Packard, Carl Worth[1]
Developer(s)Carl Worth, Behdad Esfahbod
Initial releaseBefore 2003; 21 years ago (2003)[2]
Stable release
1.18.0 (September 23, 2023; 6 months ago (2023-09-23)[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

backends. 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

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

SVG
files.

There are other back-ends in development targeting the graphics APIs

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 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

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

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

display server, not tied to the X Window System.[22]
The name Cairo derives from the original name Xr, interpreted as the Greek letters

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.[24]

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. ^ "Cairo 1.18 Released - First Stable Release In Five Years". www.phoronix.com. Retrieved 2023-09-23.
  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. ^ "ManimCE tutorial by TheoremOfBeethoven — ManimCE tutorial by TB documentation". zavden.github.io. Retrieved 2023-01-29.
  21. ^ "Gnuplot version 4.4.0 announcement". Gnuplot homepage. Archived from the original on 2011-05-14. Retrieved 2011-02-22.
  22. ^ "Mailing list thread about the Cairo name change". 15 July 2003. Retrieved 2009-06-08.
  23. ^ "Mailing list thread about the Cairo name change". 12 July 2003. Retrieved 2006-12-02.
  24. ^ "How do I use Pango instead of Cairo's "toy" text API?". Retrieved 2024-03-20.

External links