Zum Inhalt springen

Cairo (Grafikbibliothek)

aus Wikipedia, der freien Enzyklopädie
Cairo

[[Datei:Lua-Fehler in Modul:Wikidata, Zeile 1686: attempt to index field 'wikibase' (a nil value)|150px]]
Der Cairo-Banner
Basisdaten

Maintainer Lua-Fehler in Modul:Wikidata, Zeile 1686: attempt to index field 'wikibase' (a nil value)
Entwickler Das Cairo-Team
Erscheinungsjahr Lua-Fehler in Modul:Wikidata, Zeile 1686: attempt to index field 'wikibase' (a nil value)
Aktuelle Version Lua-Fehler in Modul:Wikidata, Zeile 1686: attempt to index field 'wikibase' (a nil value)
(Lua-Fehler in Modul:Wikidata, Zeile 1686: attempt to index field 'wikibase' (a nil value))
Aktuelle Vorabversion Lua-Fehler in Modul:Wikidata, Zeile 1686: attempt to index field 'wikibase' (a nil value)
(Lua-Fehler in Modul:Wikidata, Zeile 1686: attempt to index field 'wikibase' (a nil value))
Betriebssystem Unix, Linux, Windows, macOS
Programmier­sprache C
Kategorie Grafikbibliothek
Lizenz LGPL/MPL
deutschsprachig ja
www.cairographics.org

Cairo ist eine freie 2D-Grafikbibliothek. Sie ermöglicht über eine geräteunabhängige, vektorbasierte API für Softwareentwickler die Ausgabe auf verschiedenen sogenannten Backends. Derzeit wird die Ausgabe auf dem X Window System, unter Win32, unter Quartz, in lokale Bildpuffer, und in die Dateiformate PNG, PostScript, PDF und SVG als stabil bezeichnet. Back-Ends für die Ausgabe unter OpenGL (via Glitz) und XCB befinden sich in Entwicklung.

Cairo wurde so gestaltet, dass es – soweit vorhanden – bei den Ausgabe-Back-Ends die Möglichkeit der Beschleunigung durch den Grafikprozessor, beispielsweise zur Kantenglättung, zur Verfügung stellt. Diese Möglichkeit wird jedoch z. B. unter Win32 momentan nicht genutzt.

Die Cairo-Entwicklung wurde ursprünglich unter dem Namen Xr beziehungsweise Xr/Xc von Keith Packard und Carl Worth für den Gebrauch mit dem X Window System begonnen. So leitet sich auch der Name von den griechischen Buchstaben Chi und Rho ab.

Konkurrenztechnologien sind WPF sowie GDI+ von Microsoft, Quartz von Apple und Skia von Google.

Zeichenmodell

Datei:Cairo's drawing model.svg
Cairos Zeichenmodell

Cairo verfolgt eine ungewöhnliche Zeichentechnik, die auf einem dreigliedrigen Schichtenmodell basiert (siehe Bild „Cairos Zeichenmodell“):

Ein Zeichenvorgang findet statt, indem eine Mask (englisch für Maske) erstellt wird, welche eine oder mehrere Vektorenprimitiven bzw. -formen beinhaltet, d. h. Kreise, Vierecke, TTF-Schriften, Bézierkurven usw. Anschließend muss eine Source (englisch für Quelle) definiert werden, welche z. B. aus einer Farbe, einem Farbverlauf, einer Bitmap- oder Vektorgrafik bestehen kann. Nun wird mit der Mask wie mit einer Ausstechform der bemalte Teil aus der Source herausgestochen. Das Ergebnis wird schließlich auf die Destination bzw. Surface übertragen, welche durch das Ausgabebackend gestellt wird.

Damit wird ein grundsätzlich anderer Ansatz verfolgt als z. B. bei SVG-Vektorgrafiken.

Programmierbeispiel

Datei:Cairo example.svg
Das von diesem Programm generierte SVG-Bild

Cairo wurde in C geschrieben, zudem gibt es Sprachbindungen zu vielen anderen Programmiersprachen, unter anderem Haskell, Java, Perl, Ruby, Python, Scheme, Smalltalk.

Auch komplexere „Hallo Welt“-Grafiken lassen sich mit Cairo bereits mit wenigen Zeilen Quelltext zeichnen:

<syntaxhighlight line lang="c">

  1. include <cairo/cairo-svg.h>
  2. include <stdio.h>

int main(int argc, char **argv) {

   cairo_t *cr;
   cairo_surface_t *surface;
   cairo_pattern_t *pattern;
   cairo_text_extents_t text;
   int x,y;
   surface = 
     (cairo_surface_t *)cairo_svg_surface_create("Cairo_example.svg", 100.0, 100.0);
   cr = cairo_create(surface);
   /* Quadrate im Hintergrund zeichnen */
   for (x=0; x<10; x++)
      for (y=0; y<10; y++)
          cairo_rectangle(cr, x*10.0, y*10.0, 5, 5);
   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);
   /* Schrift im Vordergrund */
   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);
   return 0;

} </syntaxhighlight>

Zunächst werden in Zeile 11 bis 13 in Verbindung mit den Deklarationen in Zeilen fünf und sechs eine SVG-Surface sowie ein Cairo-Objekt erstellt. Anschließend kann mit diesem gezeichnet werden, in dem jeweils Formen gezeichnet werden und eine Quelle (cairo_set_source_...) festgelegt wird. In Zeile 16f wird auf diese Weise ein 10×10-Feld von regelmäßigen Quadraten generiert, welches anschließend mit einem radialen Farbverlauf gezeichnet wird. Ab Zeile 28 wird eine einfache Möglichkeit dargestellt, um mit Cairo Texte zu zeichnen.

Verwendung

In der Open-Source-Community findet Cairo dank seiner Fähigkeit, plattformunabhängige qualitativ hochwertige 2D-Zeichnungen zu erstellen, weite Verbreitung. Unter anderem verwenden diverse GUI-Toolkits (z. B. GTK), Browserengines und Grafikprogramme Cairo.

Verwendung in GUI-Toolkits

Datei:Cairo-clock-smooth-1.ogv
Beispiel: Das Zeichnen einer transparenten Uhr mit Cairo realisiert

Cairo wird ab Version 2.8.0 von GTK unterstützt. Damit ist es möglich, von GTK-Widgets einen Cairokontext (cairo_t, siehe Zeile fünf im Beispiel) zu erlangen und dann mit Cairofunktionen in diesen zu zeichnen.<ref>library.gnome.org: <templatestyles src="Webarchiv/styles.css" />Cairo Interaction – Functions to support using Cairo (Memento vom 15. April 2008 im Internet Archive). In: GDK Reference Manual</ref> Mit den gleichen Methoden zeichnet GTK intern ab dieser Version die meisten seiner Widgets mit Cairo<ref>Einen Ansatz dazu entwickelte Julien Boulnois mit seiner <templatestyles src="Webarchiv/styles.css" />cairo-gtk-engine (Memento vom 24. Juli 2008 im Internet Archive)</ref> und kann damit von hardwarebeschleunigtem Rendering profitieren.

Die Entwickler der C++-Anbindung von GTK, gtkmm, stuften das Zeichnen mit dem GDK schon 2012 als veraltet (deprecated) ein, weil die Zeichenfunktionen von GDK kompliziert zu bedienen und vergleichsweise leistungsschwach sind. Stattdessen wird die ausnahmslose Benutzung von Cairo empfohlen.<ref>Anatoly Spektor: SWT migration to GTK+ 3.x: Use Cairo Instead GDK : First Patch – Tracker Widget. In: My Programming Blog. 7. Juli 2012, abgerufen am 14. Februar 2024 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).</ref>

Auch das FLTK kann Cairo zum Zeichnen der kompletten Oberfläche nutzen.<ref>Article #622: New Poll: FLTK2 and Cairo. In: ftlk.org. 27. Juni 2006, abgerufen am 14. Februar 2024 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).</ref> Dank seiner Plattformunabhängigkeit wird Cairo in wxWidgets verwendet.<ref>wxcairo - Combining Cairo with WxWidgets. Google Project Hosting</ref> Das Mono-Projekt verwendet ebenfalls seit den ersten Versionen Cairo, um die GDI+-Oberfläche zu zeichnen.<ref>Holger Schwichtenberg, Christian Weyer: Keine Monokultur. In: Heise online. 10. Februar 2005.Vorlage:Abrufdatum</ref> Das Standard Widget Toolkit verwendet Cairo ab Version 3.1 auf Linux für seine Zeichen-API.

Verwendung in Browserengines

In Gecko-basierten Webbrowsern wird Cairo ab der Gecko-Version 1.8 (unter anderem beispielsweise verwendet ab Firefox 1.5) zur Darstellung von SVG-Dateien verwendet<ref>Mozilla SVG Project. In: mozilla.org. 1. Februar 2006, abgerufen am 14. Februar 2024 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).</ref> und ab Gecko-Version 1.9 (Firefox 3) zusätzlich auch zur Darstellung der gesamten grafischen Benutzeroberfläche (XUL), einschließlich von Webseiten.<ref>Cairo is being switched on for Windows nightly builds. In: m.newsmth.net. 22. Februar 2006, archiviert vom Vorlage:IconExternal am 14. Februar 2024; abgerufen am 14. Februar 2024 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).</ref>

Auch WebKit verwendet Cairo zum Rendern aller grafischen Elemente in seinem GTK-Port. SVG- und <canvas>-Elemente werden dabei ebenfalls mittels Cairo gerendert.

Verwendung in Grafiksoftware

Seit Version 0.46 verwendet das Vektorgrafikprogramm Inkscape Cairo für den Umriss-Anzeigemodus sowie für das Schreiben von PDF- und PostScript-Dokumenten.<ref>Release Notes for Version 0.46 aus der Inkscape-Wiki (englisch)</ref>

Auch die PDF-Rendering-Engine Poppler verwendet Cairo zum Rendern von PDF-Dokumenten. Als Abspaltung von Xpdf findet Poppler in vielen verbreiteten PDF-Betrachtern wie Evince und Okular Verwendung.

Cairo kann in dem Office-Paket OpenOffice.org ab Version 2 für hardwarebeschleunigte Präsentationseffekte benutzt werden.

Selbst Programme wie rsvg verwenden Cairo zum Rendern. Auf diese Weise entstehen Bitmapgrafiken aus SVG-Dateien, eine Technik, von der beispielsweise auch die Wikipedia Gebrauch macht.

Anbindung an andere Programmiersprachen

Dank seiner Implementierung in der Programmiersprache C sind Anbindungen an andere Programmiersprachen (language bindings) einfach umzusetzen. Es existieren Bindungen für C++ (cairomm, analog zu gtkmm), Java, Haskell, Mono/.Net-Framework, Perl, PHP, Python, Ruby, Rust,<ref>github.com</ref> Objective Caml, Scheme, Lua, Vala und viele andere Programmiersprachen.<ref>Projekthomepage: Language bindings</ref>

Siehe auch

Weblinks

Einzelnachweise

<references responsive />