Speedo-Gonzales: Ein Schriftsystem lernt laufen! (Teil 3)

In diesem abschließenden dritten Teil gehen wir auf die verbleibenden Funktionen zur Bearbeitung von Bézier-Linien und zur Steuerung der Speedo-Caches durch eine Applikation ein.

Zunächst wollen wir aber noch die versprochene Liste der Fehlercodes nachreichen, die von der Funktion vst_error() geliefert werden.

Error # Bedeutung
1 Out of system memory (Misc cache)
2 Error opening font file
3 Error reading font file
4 Error while writing out cache buffer
5 Font scaler error
6 (Not implemented)
7 Not enough memory for scratch buffer
8 Out of system memory (character cache)
255 Misc Speedo Error

Baiser != Bézier

Wie schon mehrfach erwähnt, basieren die Schriften der Speedo-Familie auf Vektorbeschreibungen in Form von Bézier-Kurven. ATARI hat diese Chance genutzt und die Funktionen zur Bézier-Ausgabe auch nach ,außen' gelegt, so daß jede Applikation nun in der Lage ist, neben den alten Polylines auch Bézier-Kurven auszugeben.

Wie sie den beiliegenden Auflistungen entnehmen können, existieren Funktionen zur Kontrolle der Bézier-Operationen (v_bez_on(), v_bez_off(), v_set_app_ buff() und v_bez_qual()) sowie die beiden Ausgabefunktionen v_bez() und v_bez_fill(). Bei der Benutzung der Funktionen gilt es zu beachten, daß diese nicht lokal, sondern auf dem ganzen GDOS-System arbeiten. Das heißt, wenn Sie mittels v_bez_off() die Bézier-Fähigkeiten abschalten, stehen die anderen Applikationen auch nicht mehr zur Verfügung. Generell kann man sagen, daß eine Nutzung der Kontrollfunktionen nur in Ausnahmefällen einen Sinn ergibt. z.B. dann, wenn man sehr komplexe Bézier-Linien zeichnen will und dazu den Arbeitsspeicher der Bézier-Routinen erweitern muß (s. v_set_app_buff()).

Wichtiger sind in diesem Zusammenhang die beiden Ausgabefunktionen, die man nutzen kann, um eigene Bezier-Limen auszugeben, was z.B. für vektororientierte, GDOS-orientierte Zeichenprogramme eine sehr nützliche Erweiterung darstellt. Der Parameter bezarray enthält dabei eine Beschreibung der auszugebenden Daten. Die klassische Möglichkeit, eine Bézier-Kurve auszugeben, ist eine 4-Punkt-Bézier-Kurve, bestehend aus zwei Basispunkten und zwei Richtungspunkten. Die Funktion erlaubt es aber auch, einfache Polylines auszugeben. Eine Besonderheit der Bézier-Kurven sind die sogenannten Sprungstellen. Sinnvolle Anwendungen ergeben sich hierfür unter anderem in der Schrifterzeugung. Sie werden sicherlich zustimmen, wenn wir behaupten, daß der Punkt oberhalb des Buchstabens ,i‘ integraler Bestandteil seiner Darstellung ist. Um dies auch in einer vektoriellen Beschreibung ausdrücken zu können, muß man irgendwie die Lücke zwischen Buchstabenrumpf und dem Punkt charakterisieren. Dazu dienen die Sprungstellen. Damit teilt man dem System mit, daß zwischen dem letzten angegebenen und dem nächsten Punkt nicht gezeichnet werden, sondern nur der Stift weiterbewegt werden soll.

Eine Sprungstelle

In diesem Zusammenhang soll noch die Funktion v_getoutline() angesprochen werden. Ihr Aufruf liefert Ihnen die komplette vektorielle Beschreibung eines Zeichens (natürlich nur bei Vektor-Fonts). Sie können die so erfragten Béziers direkt an v_bez() oder v_bez_fill() übergeben oder aber auch die Stützpunkte mathematischen Verfremdungen (z.B. Projektionen auf Körper, Flächen etc.) unterziehen und dann erst ausgeben. Der Phantasie sind hier keine Grenzen gesetzt.

Gut gecachet ist halb gewonnen

Wie Sie im ersten Teil des Artikels lesen konnten, verfügt Speedo über mehrere Cache-Systeme, die auch durch eine Applikation manipuliert werden können. So kann der Cache zum Beispiel auf Platte gesichert (v_savecache()) oder ein alter Cache von Platte geladen werden (v_loadcache()). Die Vorteile dieser Möglichkeiten liegen klar auf der Hand. Sichern Sie am Ende Ihres Programmes die Daten des Caches auf Platte, so können Sie beim nächsten Aufruf Ihrer Applikation den alten Systemzustand sehr schnell wieder herstellen. Dazu müssen Sie nur „Ihren“ alten Cache wieder ins System laden, und schon ersparen Sie Ihrem Benutzer die Wartezeiten zum erneuten Berechnen der Zeichensätze. Dieses Verfahren ist sicherlich nicht für alle Applikationen empfehlenswert - man denke nur an den Platzbedarf der Caches auf der Platte -, aber vor allem Textverarbeitungen können von diesem Prinzip profitieren. Interessant ist sicherlich auch, daß beim Laden des Caches nicht nur eine komplette Ersetzung möglich ist, sondern auch das Anhängen des zugeladenen Caches an den aktuellen Cache. Damit wird Ihre Applikation noch flexibler, denn Sie gehen damit auch auf eine evtl, veränderte Systemumgebung ein. Sie können sich aber auch einfach nur einen Überblick über den Zustand des Cache-Systems verschaffen, indem Sie mittels vqt_cachesize() bei Speedo nachfragen, wie die Caches belegt sind. Mit ein wenig Rechenaufwand oder Vorüberlegungen können Sie so sogar eine Aussage darüber machen, welche Zeichengrößen für Vektor-Fonts zugelassen werden, ohne daß der Bitmap-Cache für die Pixel-Informationen überläuft.

Der Vollständigkeit halber sei hier noch die Funktion v_flushcache() auf geführt, die den Teil des Cache-Systems leert, der die Pixel-Darstellungen der Vektorzeichen beherbergt (s. Bindings).

Beispielhaft

Damit Sie neben der reinen Auflistung der Funktionen auch einen Einblick erhalten, wie die Speedo-Funktionen in einem Programm eingebunden werden, liefern wir Ihnen auf der zum Heft gehörenden Monatsdiskette ein kleines Beispielprogramm mit allen zugehörigen Quellen. (Aus Platzgründen ist ein Abdruck an dieser Stelle leider nicht möglich)

Resümee

Wir hoffen, Ihnen mit dieser kleinen Artikelserie einen Einblick in die Leistungsfähigkeit von Speedo gegeben zu haben. Sicherlich ist Speedo noch nicht am Ende seiner Entwicklung. Wie schon mehrfach angedeutet, nimmt sich ATARI derzeit der diversen Probleme an, die sich seit dem ersten Erscheinen von Speedo gezeigt haben. Welchen Zeitrahmen man sich dabei gesetzt hat, ist derzeit noch nicht abzusehen und hängt auch stark von der Produktpolitik ab, die man in Zukunft verfolgen will.

Es gilt darüber hinaus zu überlegen, ob man das Speedo-System in Zukunft nicht generell vom GDOS abkoppeln sollte bzw. durch ein neues, leistungsfähigeres Ausgabesystem ersetzt. Das steht natürlich in klarem Widerspruch zu der Forderung nach Kompatibilität zum alten System, aber bei der Arbeit mit GDOS zeigt sich, daß diese Jacke Speedo überall ein wenig zwackt.

Aber auch ohne einen solch gravierenden Einschnitt kann man Speedo durch gewissenhafte Pflege noch ein wenig mehr aufpeppen. Vor allem bei den Druckertreibern und der Systemsteuerung muß nochmal nachgedacht werden, wie man diese Einstellungen leichter, übersichtlicher und flexibler gestalten kann.

Literatur:

[1] Jankowsky, Reschke, Rabisch: „ATARI Profibuch ST-STE-TT", Sybex-Verlag

[2] GDOS Addendum 2.1, ATARI Corporation, Copyright 1993 (Denis Fung)

Neue VDI-Aufrufe unter Speedo (Fortsetzg.)

Enable Bézier capabilities (VD111)

Schaltet die Bézier-Möglichkeiten für das ganze System ein. Rückgabewert ist die Genauigkeit der Bézier-Linien als Exponent von 2 (0 = Gerade; 7 = 128 Teilstücke).

Prototyp:

ini v_bez_on( int handle);

GEM-Arrays:

contrl      = 11
contrl+2    = 1 (Ein)
contrl+4    = 0
contrl+6    = 0
contrl+8    = 4
contrl+10   = 13
contrl+12   = handle
intout      = retval

Disable Bézier capabilities (VD111)

Schaltet die Bézier-Möglichkeiten für das ganze System aus. Allozierter Speicher für Béziers wird freigegeben.

Prototyp:

void v_bez_off( int handle);

GEM-Arrays

contrl      = 11
contrl+2    = 0 (indicates OFF)
contrl+4    = 0
contrl+6    = 0
contrl+8    = 0
contrl+10   = 13
contrl+12   = handle

Reserve Bézier workspace (VDI -1)

Speicher für Bézier-Operationen bereitstellen

Prototyp:

void v_set_app_buff( int handle, void *address, int nparagraphs);

GEM-Arrays:

contrl      = -1
contrl+2    = 0
contrl+4    = 0
contrl+6    = 3
contrl+8    = 0
contrl+10   = 6
contrl+12   = handle
intin       = address[0] (Die beiden oberen Bytes der Adresse des Puffers)
intin+2     = address[1] (Die beiden unteren Bytes der Adresse des Puffers)
intin+4     = nparagraphs (Anzahl der 16-Bvte-Blöcke)

Output Bézier (VDi 6)

Zeichnen einer Bézier-Kurve. Inhalt wird nicht gefüllt.

Prototyp:

void v_bez( int handle, int count, int *xyarr, char *bezarr, int *extent int *totpts, int *totmoves);

GEM-Arrays:

contrl      = 6
contrl+2    = count (Anzahl der Stutzstßlleni
contrl+4    = 2
contrl+6    = (Anzahl der Stutzstellen + 1 )/2
contrl+8    = 6
contrl+10   = 13
contrl+12   = handle
intin       = bezarr  
              { Array mit Beschreibungen der Stützpunkte 
                bit 0 = 1 erster Punkt einer 4-Punkt-Bézier-Kurve (2 Basispunkte und 2 Richtungspunkte)  
                bit 0 = 0 Start einet Polyline 
                bit 1 = 1 Sprungstelle
              }
ptsm        = xyarray (Array mit Stutzpunkten)
intout      = totpt (Anzahl der Punkte Im resultierenden Polygon)
intout+2    = totmoves (Anzahl der Sprungstellen im resultierenden Polygon)
intout+4    = reserviert
intout+6    = reserviert
intout+8    = reserviert
intout+10   = reserviert
ptsout      = extent[0] (minimale x-Ausdehnung einer die Kurve umfassenden Box)
ptsout+2    = extent[1] (minimale y-Ausdehnung einer die Kurve umfassenden Box()
ptsout+4    = extent[2] (maximale x-Ausdehnung einer die Kurve umfassenden Box)
ptsout+6    = extert[3] (maximale y-Ausdehnung einet die Kurve umfassenden Box)

Output Filled Bézier (VDI 9)

Zeichnen einer Bézier-Kuive. Inhalt wird gefüllt.

Prototyp:

void v_bez_fill( int handle, int count int *xyarr, char *bezarr, int *extent, int *totpts int *totmoves):

GEM-Arrays:

contrl      = 9
contrl+2    = count (Anzahl der Stutzstellen)
contrl+4    = 2
contrl+6    = (Anzahl der Stützstellen +1 )/2
contrl+8    = 6
contrl+10   = 13
contrl+12   = handle
intin       = bezarr
              { Array mit Beschreibunyen der Stützpunkte
              bit 0 = 1 erster Punkt einer 4-Punkt-Bezier-Kurve (2 Bnsispunkte und 2 Richtungspunkte) 
              bit 0 = 0 Start einer Polyline 
              bit 1 = 1 Sprungstelle,
              }
ptsin       = xyarray (Array mit Stutzpunkten)
intout      = totpt (Anzahl der Punkte im resultierenden Polygon)
intout+2    = totmoves (Anzahl der Sprungstellen im resultierenden Polygon) 
intout+4    = reserviert
intout+6    = reserviert
intout+8    = reserviert
intout+10   = reserviert
ptsout      = extent[0] (minimale x-Ausdehnung einer die Kurve umfassenden Box)
ptsout+2    = extent[1] (minimale y-Ausdehnung einer die Kurve umfassenden Box) 
ptsout+4    = extent[2] (maximale x-Ausdehnung einer die Kurve umfassenden Boxi 
ptsout+6    = extent[3] (maximale y-Ausdehnung einer die Kurve umfassenden Box

Set Bezier Quality (VDI5)

Setzt die Qualität der Ausgabe und damit auch die Geschwindigkeit der Ausgabe von Bézier-Kurven.

Prototyp:

void v_bez_qual( int handle, int prent, int *actual):

contrl      = 5
contrl+2    = 0
conirl+4    = 0
contrl+6    = 3
contrl+8    = 1
contrl+10   = 99
contrl+12   = handle
intin       = 32
infin+2     = 1
intin+4     = prcnt (angeforderte Qualitätsstufe in Prozent)
intout      = actual (tatsächlich gesetzte Qualitätstufe)

Get Character outline (VDI 243)

Die Funktion liefert die .Outline eines Zeichens. Die gelieferten Werte können direkt an die Aus-gabefunktionfur Beziers weitergereichtwerden.

Prototyp:

void v_getoutline( int handle, int ch, int *xyarray chat *bezarray, int maxverts, int *numverts);

GEM-Arrays:

contrl      = 243
contrl+2    = 0
contrl+6    = 6
contrl+12   = handle
intin       = ch
intin+2     = maxverts
intin+4 
intin+6     = xyarray
intin+8 
intin+10    = bezarray (Puffer für die Bézier-Informationen)
contrl+4    = 0
contrl+8    = 1
intout      = numverts

Save outline font cache to disk (VDI 249)

Sichert den Inhalt der Vektorzeichen-Caches in eine Datei Die Datei wird im aktuellen Verzeichnis angelegt.

Prototyp

int v_savecache( int handle, char *filename).

GEM-Arrays:

contrl      = 249
contrl+2    = 0
contrl+6    = Länge des Datemamens
contrl+12   = handle

intin
intin+2
...         = filename
intout      = -1 = Ein Fehler ist wahrend des Ladens aufgetreten 
               0 = Kein Fehler

Load outline font cache (VDI 250)

Die Funktion lädt eine mit v_savecache() angelegte Datei in den Vektorzeichen-Cache Es kann ein Modus angegeben werden, mit dem man bestimmt ob die Cache-Daten die aktuellen ersetzen oder an die aktuellen angehängt werden sollen.

Prototyp:

int v_loadcache( int handle, char *filename, int mode)

GEM-Arrays:

contrl      = 250
contrl+2    = 0
contrl+6    = 1 + Länge des Dateinamens 
contrl+12   = handle

intin       = mode
              (0 = Datei an aktuellen Cache anhangen)
               1 = Aktuellen Cachen löschen und Datei komplett ln den Cache lesen)
intin+2
intin+4
...         = filename
intout      = -1 = Ein Fehler ist wahrend des Ladens aufgetreten 
               0 = Kein Fehler

Flush outline font cache (VDI 251)

Löscht den Vektorzeichen-Cache. Allerdings nur den Teil, der die Pixel-Daten der Vektorzeichensätze beinhaltet.

Prototyp:

int v_flushcache( int handle)

GEM-Arrays

contrl      = 251
contrl+2    = 0
contrl+12   = handle
intout      = -1 = Cache konnte nicht gelöscht werden
               0 = Cache wurde gelöscht

Get outline font cache size (VDI 255)

Liefert die jeweils größten verfügbaren Speicherblöcke innerhalb der beiden Speedo-Caches.

Prototyp:

void vqt_cachesize( mt handle mt whrch_cache, long *size);

GEM-Arrays:

contrl      = 255
contrl+2    = 0
contrl+6    = 1
contrl+12   = handle
intin       = which_cache
              (0 = Bitmap-Cache für Vektorzeichen 
               1 = Verwaltungs-Cache)
intout
intout+2    = size (of the largest allocatable block)

Eric Dick
Links

Copyright-Bestimmungen: siehe Über diese Seite