Hallo,
Michael Gerbracht schrieb:
> Hallo Ulrich,
> ...
> Ok, vielen Dank für den Hinweis! Ich erzeuge die Grafiken bereits mit Cairo,
> allerdings mit LuaCairo (der Code zum Erzeugen der Grafiken ist in lua
> geschrieben, daher möchte ich bei LuaCairo bleiben). Die Idee war mit
> LuaCairo SVG-Grafiken zu erzeugen, diese an C# weiterzureichen und dort zu
> rendern. Hier gibt es eine Liste mit surfaces, die sich in LuaCairo rendern
> lassen:
>
>
http://www.dynaset.org/dogusanh/download/luacairo.html
>
> "COM" taucht dort nicht explizit auf, ich frage mich aber, ob WIN32 identisch
> ist mit COM? Oder gibt es etwas naheliegendes, wenn man sich die Liste
> ansieht? Bräuchte ich zur Darstellung noch den COM-Wrapper? Mir fehlt noch
> der Durchblick...
> ...
Versuche mal abzuhelfen:
Cairo ist eine Graphikbibliothek, die Graphiken erzeugen kann. Dazu
stellt sie ua. eine Reihe von graphikerzeugenden Befehlen zur Verfügung
(zB zum Linienzeichnen, Rechteckzeichnen etc). Diese graphikerzeugenden
Befehle brauchen aber eine "Zeichenfläche", auf die sie zeichnen sollen.
Im Cairo-"Speak" heissen die "Surfaces". Man wählt also eine
"Zeichenfläche" aus und "zeichnet" darauf durch den Aufruf der von Cairo
zur Verfügung gestellten Zeichenmethoden. Cairo setzt diese Cairo
eigenen Zeichenmethoden um in für die ausgewählte Zeichenfläche
verständliche Daten/Methoden.
Die Zeichenfläche kann zB eine "SVG-Zeichenfläche" sein. Dann wird, wenn
per Cairo-Methode eine Linie auf eine "SVG-Zeichenfläche" gezeichnet
werden soll, einfach ein passender SVG-Eintrag erzeugt. Wäre die
Zeichenfläche eine "WIN32-Zeichenfläche", würde die Cairo-Methode einen
passenden Windows-API Aufruf zum Zeichnen einer Linie generieren.
LuaCairo ist eine Anwendung, die es erlaubt, per Lua-Code interaktiv
Cairo anzuweisen, diverse Zeichenbefehle auszuführen. Das "Ergebnis"
dieser Zeichenbefehle ist dabei sichtbar, da LuaCairo alle diese
Zeichenbefehle erstmal auf eine (wenns ein Rechner unter Windows ist)
"Win32-Surface" ausgibt. Das ist praktisch, weil man gleich das Ergebnis
sieht (an der graphischen Ausgabe), was man da vorgegeben hat. So kann
man lernen, was die Cairo-Zeichenaufrufe bewirken (zB wie sich die
Vorgaben für Linienenden auswirken).
Dank des Cairo-Konzeptes ist es nun einfach, nachdem man zufrieden ist
mit dem, was man da ausgeben liess, den ganzen Schmodder nicht graphisch
auf den Schirm auszugeben, sondern (zur späteren Verwendung sozusagen)
im SVG-Format als Datei abzuspeichern. Dazu muß man nur die gleichen
Cairo-Graphikbefehle auf eine andere "Surface", eben die "SVG-Surface",
ausgeben.
Will man nun diese SVG-Daten wieder in eine "Graphik umwandeln", kann
man dazu wiederum Cairo benutzen. Dazu muß man aber die SVG-"Befehle"
wieder in Cairo-Zeichenmethoden umwandeln, die ihrerseits wieder auf die
zur Verfügung stehenden "Surfaces" rendert. Man könnte also mit Cairo
aus einer SVG-Graphik wieder eine SVG-Graphik erzeugen, oder aber eine
Bitmapgraphik im PNG Format oder eine Vektorgraphik im PDF-Format
(letztendlich Postscript) etc.
Man braucht also Cairo. Das steht hauptsächlich (so ist das halt eben
bei OpenSource) im Sourcecode zur Verfügung. Die übersetzte Version muß
ans Betriebsystem, auf dem sie verwendet werden soll, angepasst sein
(unter Windows sind das andere Voraussetzungen als zb unter Linux).
Unter Windows sollte das Ergebnis eine Dll mit einer Aufrufkonvention
gemäß StdCall sein. Sowas ist nicht leicht zu finden, da die OpenSource
Szene hier Vorbehalte (um nicht zu sagen, Vorurteile) hat. Deshalb mein
Hinweis auf die von Olaf Schmidt zur Verfügung gestellte Windowsversion.
Alternativ gibt es noch eine Variante, die Cairo im Rahmen einer Gtk+
bzw Gimp-Installation sozusagen als Beifang mit bringt.
Du willst diese Dll aus einem .NET Programm heraus ansprechen. Das geht
mit PInvoke. Einfacher ist es, diesen Umweg über PInvoke auszulassen und
direkt .NET kompatible Methoden verwenden zu können. Sowas nennt man
Wrapper oder Language Binding. Das Mono-Projekt hat sowas. Oder eben der
COM-Wrapper von Olaf.