Die Verwendung der Low-Level-Schnittstelle von Pangomonium ist schwieriger als die Verwendung der High-Level-Schnittstelle, da Sie damit direkt auf die APIs von Pango und Cairo zugreifen können. Das bedeutet, dass Sie sich zunächst mit diesen APIs vertraut machen sollten, damit Sie wissen, wie sie konzipiert sind und wie sie Ihren Zwecken dienen können.
Zusätzlich zu den Kern-APIs von Pango und Cairo bietet Pangomonium auch einige spezielle Funktionen, die zur Überbrückung von Pango/Cairo-Aufrufen und Hollywood-Befehlen verwendet werden können. Eine der Schlüsselfunktionen, die als solche Brücke dient, ist csurface:ToBrush(), mit der Sie eine Cairo-Oberfläche in einen Hollywood-Pinsel umwandeln können. Umgekehrt ist es mit der Funktion cairo.ImageSurfaceFromBrush() auch möglich, Cairo-Oberflächen aus Hollywood-Pinseln zu erstellen.
Durch die Verwendung dieser Überbrückungsfunktionen können Sie Pango/Cairo-APIs direkt verwenden und das Ergebnis dann in einen Hollywood-Pinsel konvertieren. Das Zeichnen von Text mit Pango umfasst beispielsweise normalerweise die folgenden Schritte:
Wie Sie sehen, ist es ziemlich aufwändig, mit Pangomonium Text zu zeichnen, wenn die Pango/Cairo-APIs direkt verwendet werden. Es ist viel einfacher, dies mit der High-Level-Schnittstelle zu tun, aber nur die Low-Level-Schnittstelle ermöglicht Ihnen den Zugriff auf alle Funktionen von Pango und Cairo.
So sehen die oben beschriebenen Schritte im tatsächlichen Code aus:
@REQUIRE "pangomonium"
@DISPLAY {Color = #WHITE}
fontmap = pango.FontMap(#CAIRO_FONT_TYPE_FT)
context = fontmap:CreateContext()
layout = pango.Layout(context)
fontdesc = pango.FontDescription("DejaVu Sans 72")
layout:SetFontDescription(fontdesc)
fontmap:LoadFont(context, fontdesc)
layout:SetText("Hello World")
img = cairo.ImageSurface(#CAIRO_FORMAT_ARGB32, 640, 480)
cr = cairo.Context(img)
cr:ShowLayout(layout)
img:ToBrush(1)
DisplayBrush(1, 0, 0)
|
Wenn Sie die Low-Level-Schnittstelle verwenden, müssen Sie auch daran denken,
Objekte zu löschen, wenn sie nicht mehr verwendet werden. Dies kann durch den
Aufruf der Free()-Funktionen der einzelnen Objekte erfolgen, z.B. pcontext:Free(),
um einen Pango-Kontext zu löschen. Alternativ können Sie das Objekt auch auf
Null setzen. Dies signalisiert Hollywoods Speicherbereiniger, dass das Objekt
nicht mehr verwendet wird und gelöscht werden kann. Beachten Sie jedoch,
dass die Speicherbereinigung nur dann erfolgt, wenn wirklich nirgendwo mehr
Verweise auf das Objekt vorhanden sind. Daher ist es möglicherweise sicherer,
die Free()-Funktionen explizit aufzurufen, anstatt Objekte auf Null zu setzen.
Wenn Sie den Code aus dem obigen Beispiel in eine Funktion einfügen und nur
lokale Variablen verwenden, können Sie jedoch auf den expliziten Aufruf von
Free() für alle Objekte verzichten, da lokale Variablen automatisch vom
Speicherbereiniger gelöscht werden, sobald die Funktion beendet ist.
Betrachten Sie den folgenden Code, der mit dem oben genannten
identisch ist, mit dem einzigen Unterschied, dass der Code jetzt in eine
Funktion eingeschlossen ist:
Function p_DrawText(t$, brush)
Local fontmap = pango.FontMap()
Local context = fontmap:CreateContext()
Local layout = pango.Layout(context)
Local fontdesc = pango.FontDescription("DejaVu Sans 72")
layout:SetFontDescription(fontdesc)
fontmap:LoadFont(context, fontdesc)
layout:SetText(t$)
Local img = cairo.ImageSurface(#CAIRO_FORMAT_ARGB32, 640, 480)
Local cr = cairo.Context(img)
cr:ShowLayout(layout)
img:ToBrush(brush)
EndFunction
|
Da alle Pango- und Cairo-Objekte in lokalen Variablen gespeichert werden, wird
alles für den Speicherbereiniger markiert, sobald die Funktion beendet ist.
Daher ist es in diesem Fall nicht notwendig, Objekte explizit durch den Aufruf
von Free() tz löschen, auch wenn es dennoch als gute Vorgehensweise
angesehen werden könnte.
Weitere Informationen zu den APIs Pango und Cairo finden Sie in den folgenden Kapiteln.