3.5 Verwendung der Low-Level-Schnittstelle

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:

  1. Erstellung einen Pango-Zeichensatz
  2. Erstellung einen Pango-Kontext aus dem Zeichensatz
  3. Erstellung aus dem Kontext ein Pango-Layout
  4. Erstellung einer Pango-Schriftartenbeschreibung und weist sie dem Layout zu
  5. Laden einer Schriftart in den Zeichensatz
  6. Festlegen des Texts, der gerendert werden soll
  7. Erstellung eine Cairo-Oberfläche
  8. Erstellung von der Oberfläche aus einen Cairo-Kontext
  9. Anzeigen des Pango-Layout im Cairo-Kontext
  10. Umwandlung der Cairo-Oberfläche in einen Hollywood-Pinsel

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.


Navigation zeigen