Die specbytes definieren eine Reihe von Befehlen, um ein Shape zu zeichnen. Folgende Befehle gibt es:

Wert Beschreibung
00 Ende der Shape-Definition.
01 Zeichnen an.
02 Zeichnen aus.
03 Dividiere Vektorlängen durch den Wert des nächsten Bytes.
04 Multipliziere Vektorlängen mit dem Wert des nächsten Bytes.
05 Schiebe aktuelle Stiftposition in den Stapelspeicher.
06 Hole aktuelle Stiftposition vom Stapelspeicher.
07 Zeichne Sub-Shape mit der Nummer des nächsten Bytes.
08 XY-Verschiebung zu Punkt, der in den nächsten 2 Bytes definiert ist.
09 Mehrfache XY-Verschiebung.
0A Achtel-Kreisbogen. Definiert in den nächsten 2 Bytes.
0B Beliebiger Kreisbogen. Definiert in den nächsten 5 Bytes.
0C Kreisbogen. Definiert durch Sehnenlänge und Segmenthöhe.
0D Mehrfache Kreissegmente.
0E Nächsten Befehl nur ausführen, wenn Schrift im vertikalen Modus gesetzt wird.
alle anderen Ein komprimierter Vektorbefehl. Bewegt den Stift relativ auf einen bestimmten Punkt.

Tabelle: Byte-Befehle

Vektoren zeichnen

Sofern kein besonderer Befehl vorliegt, wird ein Vektor gezeichnet. Das besondere dabei ist die Kodierung des Vektors. Es wird in einem Byte Länge und Richtung kodiert. In hexadezimaler Schreibweise lässt sich ein Byte in zwei Buchstaben ausdrücken (z.B. AE). Der erste Buchstabe gibt dabei die Länge an und der zweite Buchstabe die Richtung. Die folgende Grafik veranschaulicht die Richtungskodierung:

Bild: Richtungswert für Vektoren

Die Länge muss mindestens 1 (0x1) und darf maximal 15 (0xF) sein. Bei der Richtung ist wichtig zu wissen, dass die Länge durch die Hauptachsen bestimmt wird. Die Zwischenwinkel (z.B. 1 oder 2) haben auch die Länge 1, da der Vektor auf der Kante eines virtuellen Quadrats endet.

Das folgende Beispiel zeichnet ein Dreieck:

*1,4,dreieck
010,014,01A,0

 

Bild: Beispiel Vektoren

Befehl 000, 001, 002 - Allgemeine Befehle

Durch ein 000-Befehl wird das Ende eines Shapes angezeigt. Mit den Befehlen 001 und 002 lässt sich steuern, ob während des Zeichnens eine Linie erstellt wird, oder ob der Stift die Positionen nur virtuell abfährt, ohne eine Linie zu zeichnen.

Befehl 003, 004 - Skalierung

Mit den Befehlen 003 und 004 lässt sich die Skalierung steuern. Bytewerte sind naturgemäß ganze Zahlen, hier meist vorzeichenbehaftet im Bereich von (-127 bis 127). Damit aber auch Zwischengrößen angesteuert werden können, besteht die Möglichkeit die Einheiten zu skalieren. Bei dem Befehl 003 wird durch das darauf folgende Byte definiert, mit welcher Zahl die Längeneinheiten dividiert werden sollen. Und bei 004 wird durch das darauf folgende Byte definiert, mit welcher Zahl die Längeneinheiten multipliziert werden sollen.

Die Skalierung bleibt solange aktiv, bis ein neuer Skalierungsbefehl aufgerufen wird. Daher ist es in der Regel notwendig, einen angewendeten Befehl durch seine Umkehrfunktion wieder aufzuheben. Das heißt, wenn im ersten Befehl durch x dividiert wurde, ist am Ende der Operationen wieder mit x zu multiplizieren.

003,002 ; alle weiteren Längen durch 2 dividieren
004,009 ; alle weiteren Längen mit 9 multiplizieren

Bild: Beispiel Skalierungsbefehle

Befehl 005, 006 - Speicheroperationen

Der Grafikprozessor für SHX-Dateien besitzt einen Stapelspeicher (Stack, LIFO - last in - first out) auf dem Stiftpositionen abgelegt werden können. Zuletzt gespeicherte Werte werde als erstes wieder abgerufen. Zu beachten ist, dass der Stapel maximal 4 Speicherplätze besitzt. Darauf ist während der Programmierung zu achten.

Befehl 007 - Sub-Shape zeichnen

Mit diesem Befehl ist es möglich, andere Shapes in einem neuen Shape einzubauen um Arbeit zu sparen. Beispielsweise ist es bei Umlauten wie ä, ö oder ü nicht notwendig, die Buchstabenkontur erneut zu programmieren. Es genügt das Sub-Shape zeichnen zu lassen und anschließend nur noch die Pünktchen auf den Buchstaben zu setzen.

Befehl 008, 009 - XY-Verschiebung

Manchmal ist es gewünscht, Vektoren zu zeichnen, die nicht im Winkel ein Vielfaches von 45° besitzen. Mit Befehl 008 ist es möglich, durch die zwei darauf folgenden Bytes eine relative Position anzugeben, zu der der Stift sich nun bewegt.

008,X-Verschiebung,Y-Verschiebung

 

Bild: Beispiel XY-Verschiebung

Häufiger muss man mehrere Vektoren nacheinander zeichnen. Mit dem Befehl 009 muss man dies nicht vor jedem Vektor anzeigen. Man kann einfach die Koordinaten wie bei einem Linienzug hintereinander einfügen. Beendet wird die Kette mit den Koordinaten (0,0). Sobald man mehr als zwei Vektoren in Folge zeichnet, spart man dadurch Speicherplatz.

... 009,(00A,00A),(000,-00A),(00A,005),(0,0) ...

Bild: Beispiel XY-Mehrfach-Verschiebung

Befehl 00A - Achtelkreisbogen

Mit dem Befehl 00A lassen sich einfache Kreisbögen kodieren. Dabei wird in einem Byte der Radius des Kreisbogens gespeichert (1-255) und im anderen Byte werden Start- und Endwinkel kodiert. Ähnlich wie bei den Vektoren werden dazu 8 Winkel definiert, bei denen der Kreisbogen beginnen und enden kann. Teilt man das Byte wieder in seine zwei hexadezimalen Buchstaben, steht der erste Buchstabe für das Startachtel (0-7) und der zweite Buchstabe für die Bogenlänge (0-8). Die Bogenlänge zählt dabei die Achtel, die der Bogen überspannt. 

Bild: Winkel beim Achtelkreisbogen

Folgendes Beispiel zeichnet einen Ausschnitt aus einem Shape:

... 012, 00A,(001,-033), 01C ...

Bild: Beispiel Achtelkreisbogen

 Befehl 00B - Beliebiger Kreisbogen

Mit den Achtelkreisbögen lassen sich Kreisabschnitte einfach und effizient kodieren. Leider ist diese Möglichkeit recht eingeschränkt. Wenn andere Möglichkeiten nicht ausreichen, ist es mit einem beliebigen Kreisbogen möglich, die gewünschte Form zu beschreiben. Leider schlägt sich diese Universalität auch in einer gewissen Komplexität nieder.

00B,Start-Offset,End-Offset,Radius,Radius,(-)0SC

Beschrieben wird der beliebige Kreisbogen durch 5 Bytes. start_offset und end_offset werden gleichermaßen nach folgender Formel berechnet:

Start-Offset = Achtelwinkel × 256 45

Der Startwinkel ist der absolute Winke, bei dem der Kreisbogen beginnt und der Endwinkel ist der Absolute Winkel, bei dem der Kreisbogen endet. Der Radius wird in zwei Bytes kodiert, wodurch eine 16-Bit Zahl entsteht. Das Byte 0SC beschreibt in seinen zwei hexadezimalen Buchstaben, in welchem Achtel der Kreisbogen startet (1. Buchstabe) und wieviele Achtel er überspannt (2. Buchstabe).

Befehl 00C, 00D - Kreisbogen als Kreisabschnitt

Eine weitere und recht komfortable Möglichkeit ist es, den Kreisbogen als Kreisabschnitt zu beschreiben:

00C,X-Verschiebung,Y-Verschiebung,Wölbung

 

Bild: Beschreibung mit Sehnenlänge und Segmenthöhe

Hierbei sind die ersten zwei Bytes die Richtungsverschiebung in X- und Y-Richtung. Als Vektor betrachtet ist L die Länge des Verschiebungsvektors. H ist dabei ein Maß für die Wölbung. Der Wert liegt im Bereich von 0-127 und kann positiv oder negativ sein. Bei positiven Werten verläuft der Bogen entgegen der Uhrzeigerrichtung und bei negativem Wert in Uhrzeigerrichtung.

Bild: Beispiel Kreisabschnittsbogen


Ein Wert von 127 entspricht dem Radius der Länge 1 und lässt sich nach folgener Formel berechnen:

Wölbung = 2 × H D × 127