AMIGA-Magazin · Ausgabe 11/04 OS4-Programmierung: Grafik und Schriften in AmigaOS 4

Aktuelles Heft 11/04

Aufgeschrieben

Diesmal geht es gleich um drei Bibliotheken in »AmigaOS 4«. Erst in der Verbindung sind sie praktisch auch einsetzbar. Einen Großteil dieses Artikels werden dabei die Schriften einnehmen, da diese jetzt besser vom AmigaOS unterstützt werden. Speziell verschiedene Schrifttypen sind möglich.

von Michael Christoph

 

Man kann es fast nicht glauben, aber in der graphics.library selber sind keine neuen Funktionen hinzugekommen. Im Hintergrund kümmert sich die layers.library um die Organisation der Daten und intuition sorgt für die Interaktion mit dem Benutzer. Dazwischen liegt die graphics.library ­ sie ist für die Anzeige der Daten verantwortlich. In »AmigaOS 4« arbeitet das Picasso-Treiber-System (allerdings in PPC nativ Form). Erst mit 4.1 soll das neue SNAP-Treiber-System Einzug halten. In diesem Zusammenhang ist dann auch mit einer Überarbeitung der graphics.
library zu rechnen.

Interface und Layers
Um aber PPC-seitig auf die graphics.library zuzugreifen, muss auch hier wieder zuerst das Interface ermittelt werden. Im Beispiel »OeffneInterface.c« (Listing 1) ist ein Beispiel für den vollständigen Code zu finden. In diesem Falle finden Sie alle Interface-Aufrufe für alle drei in diesem Artikel behandelten Libraries. Der Interface-Zeiger für die graphics.library lautet IGraphics, für die layers.library entsprechend ILayers und für die diskfont.library dann IDiskfont. Wer schreibfaul ist, kann optional auch wieder auf den AutoInit-Code vertrauen. Nicht vergessen: Beim Linken ist die Option -lauto erforderlich.

Die layers.library verrichtet ihre Aufgabe im »Untergrund« und ist bei normalen Anwendungen auch nicht interessant. Viele der höheren OS-Funktionen (in intuition und datatypes) greifen auf Funktionen der layers.library zurück. Die eine Aufgabe ist das Organisieren von Bildbereichen, die angezeigt oder verdeckt sind. Dazu gehört auch die optimierte Abarbeitung von Refreshes. Die andere Aufgabe ist das Clipping, also dafür zu sorgen, dass nicht über einen bestimmten Bereich hinaus gezeichnet wird. Auch ein zu langer Text kann dadurch nur zum Teil angezeigt werden. Neu sind die Funktionen ShowLayer und HideLayer, die ihre praktische Anwendung bereits im letzten Kursteil anhand von ShowWindow und HideWindow demonstriert haben. Auch das Füllen von Hintergrundbereichen lässt sich jetzt einfacher automatisieren. Interessierte seien an die Funktionen CreateBackFillHock und DeleteBackFillHook, sowie SetBackFillHookAttrs und GetBackFillHookAttrs verwiesen.

Neue Funktionen in der diskfont.library V50
Öffnen und schließen einer skalierbaren Schrift
struct OutlineFont *OpenOutlineFont(STRPTR fileName, struct List *list, ULONG flags);
VOID CloseOutlineFont(struct OutlineFont *font, struct List *list);


Öffnen und schließen der Zeichen-Engine
LONG EOpenEngine(struct EGlyphEngine *engine);
VOID ECloseEngine(struct EGlyphEngine *engine);


Ermittelt Daten von der Zeichen-Engine bzw. gibt diese frei
ULONG EObtainInfoA(struct EGlyphEngine *engine, struct TagItem *taglist);
ULONG EReleaseInfoA(struct EGlyphEngine *engine, struct TagItem *taglist);

Setzen von OT_xxx-Tags in der Zeichen-Engine
ULONG ESetInfoA(struct EGlyphEngine *engine, struct TagItem *taglist);

Schreibt einen Zeichensatz auf Diskette (als Bitmap-Schrift)
LONG WriteDiskFontHeaderA(struct TextFont *font,STRPTR filename, struct TagItem *taglist);
LONG WriteFontContents(BPTR fh, STRPTR fontname, struct FontContentsHeader *header);

Ermitteln bzw. freigeben von Schrift-Attributen
struct TTextAttr *ObtainTTextAttr(struct TextFont *textFont);
VOID FreeTTextAttr(struct TTextAttr *tta);


Arbeit mit Schriften
Viel interessanter wird es aber mit den Schriften, die ja auch von der graphics.library auf den Bildschirm gebracht werden (mit der Text-Funktion). Das alte »IntellitiFont«-Installations-Programm wurde in den Ruhestand geschickt und durch »FontManager« ersetzt. Dieses Programm erlaubt die Installation von neuen Schriften für den Amiga. Notwendig ist es deshalb, da bestimmte Informationen in den .font-Dateien (bei Bitmap-Schriften) bzw. .otag-Dateien (bei skalierbaren Schriften) hinterlegt werden. Die altbekannten »Agfa Intelliti«-Schriften werden vom FontManager auch weiterhin unterstützt, auch wenn kaum derartige Schriften im Umlauf sind.

Interessanter wird es aber bei den aus dem PC-Bereich stammenden TrueType-Schriften und den aus dem Druckbereich stammenden PostScript-Schriften (Type1). Damit begnügt sich der FontManager aber noch nicht. Auch andere, eher unbekannte Schriftarten finden Unterstützung, wie z.B. die OpenType-Schriften.

Sind die Schriften erst einmal installiert, macht der Amiga keinen Unterschied mehr zwischen den verschiedenen Schriftarten. Und auch programmseitig lassen sich alle Schriften identisch verwenden und anzeigen. Das geht sogar soweit, dass die Schriften automatisch antialiasied (das heißt, mit geglätteten Kanten) dargestellt werden, wenn der entsprechende Punkt in den »Font Preferences« gesetzt ist.

Eine weitergehende Unterstützung finden allerdings die skalierbaren Schriften unter Verwendung der neuen Funktionen der diskfont.library. Die bullet.library sollte nicht mehr verwendet werden. Alle notwendigen Funktionen sind jetzt direkt in der diskfont.library zu finden. Auch spezielle Libraries wie die type1.library oder ttf werden nicht mehr benötigt und müssen vom Programm nicht mehr angefordert (geöffnet) werden.

Neues beim Encoding
OS 4 unterstützt jetzt auch verschiedene Encoding-Tabellen. So war z.B. lange Zeit die »ISO 8859-1 (Latin-1)«-Tabelle für Westeuropa gültig. Abgelöst wurde sie mit der Euro-Einführung durch die 15er-Tabelle (Latin-9). Für Mitteleuropa wird -2 verwendet, für Griechenland -7 usw. Während die ersten 128 Zeichen der ASCII-Tabelle weltweit einheitlich sind, können die oberen 128 Bytes (Wert 128-255) unterschiedlich belegt sein. Hier sind zum Beispiel länderspezifische Sonderzeichen zu finden. Bei Deutschland sind das die Umlaute »äöü« bzw. »ÄÖÜ« und das »ß«.

Verschiedene Bibliotheken und »Font Engines«
bullet.library: Die mit »AmigaOS 2.0« eingeführten CompuGraphic-Schriften von Agfa mussten mit dem Intellifont-Programm installiert werden, damit die Amiga-eigenenVerwaltungsdateien font und otag angelegt wurden. Da die Schriften in der Praxis kaum anzutreffen und relativ teuer sind, spielen sie heute praktisch keine Rolle mehr.

type1.library: Der »T1Manager« installiert »PostScript Type 1«-Fonts und ist eine Weiterentwicklung von Detlef Würkner aus dem Public-Domain-Bereich. Die Schriften kommen aus dem Druckbereich und finden daher auch Verwendung z.B. in »PageStream«. Sie verfügen über die Endung pfa (ascii-codiert) oder pfb (binär-codiert).

ttf.library: Der »TTFManager« ist eine Entwicklung von Richard Griffith aus dem Public- Domain-Bereich und ist für TrueType-Fonts (TTF) gedacht. Die aus dem Windows stammenden Schriften mit der Endung ttf- installiert der »TTFManager«. Die Fonts sind in großer Anzahl und in unterschiedlichen Qualitäten zu finden.

ft2.library: Der »TypeManager« arbeitet sowohl mit »CompuGraphic«-, »PostScript«- und »TrueType«-Fonts zusammen. Die Bibliothek wurde von Detlef Würkner entwickelt und befindet sich im Lieferumfang von »AmigaOS 4«. Die Library fasst alle drei Engines zu einer einzigen zusammen und kann darüberhinaus auch noch weitere Schriftarten verarbeiten. Entsprechend gibt es auch einen neuen Installer ­ er heißt »TypeManager«.

Die ISO-8859-Zeichensätze für die Kodierungen von europäischen Schriftzeichen wurden von der »European Computer Manufacturer`s Association« (ECMA) entwickelt und in den 80er-Jahren von der internationalen Organisation für Standardisierung (ISO) genormt. Die internationale Norm »ISO 8859« beschreibt gegenwärtig zehn verschiedene Zeichensätze (8859-1 bis 8859-10). Jedes Zeichen (engl. »character«) ist in einem Byte (8 Bit) kodiert. Jeder Zeichensatz (engl. »Character Encoding Scheme«, CES) kann also bis zu 256 Zeichen (druckbare Zeichen und Steuerzeichen) umfassen. Unter den zehn ISO-8859-Standards dienen sechs zur Kodierung lateinischer Schriften (Latin-1 bis Latin-6) und je ein weiterer für das kyrillische, arabische, griechische und hebräische Alphabet.

Die erste Hälfte der Zeichen aller Latin-Zeichensätze (Zeichen Nr. 0 bis Nr. 127) stimmt mit dem »American Standard Code for Information Interchange« (ASCII) überein, in den übrigen 128 Zeichen, in denen sie über den ASCII hinausgehen, unterscheiden sich alle ISO-Zeichensätze voneinander. Zu jedem Zeichen enthalten die Sätze eine standardisierte Beschreibung, zum Beispiel wird das deutsche ß als »LATIN SMALL LETTER SHARP S« bezeichnet.

Mit »AmigaOS 4« kann jetzt im Locale-Einsteller festgelegt werden, welche Kodierung benutzt werden soll. Beim Öffnen einer Schriftt wird dann automatisch nach einer passenden Kodierung gesucht. Wird keine passende Schrift gefunden, wird noch nach einer Schrift ohne Kodierungsinformationen gesucht. Trifft beides nicht zu, schlägt das Öffnen der Schrift fehl. Namensgleiche Schriften mit anderer Kodierung werden auf keinen Fall verwendet.

Da die Schrifteinstellung vom Anwender getroffen wird, kann sich kein Programmierer mehr darauf verlassen, dass z.B. das Copyright-Symbol © an ASCII-Code 169 zu finden ist. Stattdessen ist es besser, die neutrale Formulierung "(C)" zu verwenden. Auch Cataloge müssen jetzt mit der korrekten Kodierung versehen werden, wobei hier aber normalerweise bereits die Sprache für eine eindeutige Zuordnung ausreicht. Eine Besserung der Situation wird sich mit der geplanten Einführung von Unicode einstellen. Da hierbei zwei Bytes je Zeichen verwendet werden, steht ein Bereich von 0 bis 65535 zur Verfügung. Also ausreichend, um alle Arten von Sonderzeichen einer festen ID zuordnen zu können. Unicode wird allerdings erst nach der Version 4.0 ein Thema.

Direktes Layout
Übersicht: Zeichen-Code-ISO-Tabellen
Nummer Beschreibung
ISO 8859-1 Westeuropäische Sprachen (Latin-1)
ISO 8859-2

Zentral- und osteuropäische Sprachen (Latin-2)

ISO 8859-3 Südosteuropäsche Sprachen (Latin-3)
ISO 8859-4 Skandinavien, Baltikum(Latin-4)
ISO 8859-5 Latein (Latin) ­ Kryllisch
ISO 8859-6 Latein (Latin) ­ Arabisch
ISO 8859-7 Latein (Latin) ­ Griechisch
ISO 8859-8 Latein (Latin) ­ Hebräisch
ISO 8859-9 Latin-1-Modifikation für Türkisch (Latin-5)
ISO 8859-10 Lappland, Eskimo und nordische Sprachen (Latin-6)
ISO 8859-11 Latein (Latin) ­ Thai
ISO 8859-13 Baltischer Raum (Latin-7)
ISO 8859-14 Keltisch (Celtic) (Latin-8)
ISO 8859-15 Westeuropäische Sprachen (Latin-9)
ISO 8859-16 Einige südosteuropäische Sprachen (Latin-10)

Nach dieser ganzen Theorie folgt jetzt die praktische Anwendung. Solange die Texte einfach auf den Bildschirm gepinselt werden, reichen Move() und Text() aus. Eventuell geben Sie noch ein OpenDiskFont() und SetFont() zum Öffnen und Verwenden der Schrift an ­ alles altbekannte Funktionen. Sollen die einzelnen Buchstaben aber gedreht, gestaucht oder auch ein anderer Zeichenabstand verwendet werden, wird es schon interessanter.

All das lässt sich einfach über die neuen Funktionen der diskfont.library realisieren. Voraussetzung ist aber, dass es sich um eine skalierbare Schrift handelt. Mit den alten Bitmap-Fonts funktioniert es nicht. Bevor es allerdigs losgeht, muss erst einmal die FontEngine geöffnet werden (s. Listing 2). Die verschiedenen Aktionen und auch die gewünschten Buchstaben legen Sie per ESetInfo() fest. Bei einem Returncode von 0 war alles in Ordnung (Listing 3).

amit wären die Daten vorbereitet und können über EObtainInfo ausgelesen werden (Listing 4). Wie der kurze Ausschnitt schon zeigt, stehen in der GlyphMap-Struktur die Bitmap-Daten des Zeichens zur Verfügung und können direkt in das Fenster geblittet werden. Mit Hilfe von EReleaseInfo() geben Sie die belegten Ressourcen schließlich am Ende wieder frei. Jedoch noch ausführlicher sind die Zusammenhänge im Source-Code von »myFontView« zu finden.

Der nächste Teil befasst sich mit dem Datatype-System. Für den Programmierer hat sich zwar kaum etwas geändert, aber die Handhabung soll trotzdem in Erinnerung gerufen werden. Auch AHI wird beim Sound-Datatype ein Thema sein.

lb

Kantenglättung:
Antialiasing für Schriften lässt sich systemweit unter »AmigaOS 4« zuschalten.

 

Ortswahl:
Im Local-Einsteller wählt der Anwender Länderauswahl inklusive Encoding.

 

Listingübersicht:

Listing1:
Die notwendigen Interfaces öffnen.
Listing2:
Die Initialisierung und das Schließen der FontEngine.
Listing3:

Die Ausgabe eine Zeichens.
Listing4:
Arbeit mit der GlyphMap-Struktur.

 

Fonts hinzufügen:
Einfache Schrifteninstallationen erfolgen mit dem »Type Manager«.

 

Klein aber fein:
Das Beispielprogramm für das Schrift-Handling zu diesem Artikel in Aktion.


 

 

 

 

 

 

 

 

 


Download:
Download
os4prog-4-gfx-src.lha,
101.162 bytes


Hauptseite © 2004 All Rights Reserved. Alle Rechte vorbehalten Franzis' Verlag GmbH
Veröffentlichung und Vervielfältigung nur mit schriftlicher Genehmigung des Verlags

Kommentare, Fragen, Korrekturen und Kritik bitte an Webmaster AMIGA schicken.
Zuletzt aktualisiert am 19. November 2004, Michael Christoph.