Kody specjalne

Za pomocą kodów specjalnych można utworzyć dodatkowe formy geometryczne i określić konkretne operacje.

Drugi znak w trzyznakowym ciągu (określenie długości wektora) musi być znakiem 0; można również określić numer kodu specjalnego. Na przykład 008 i 8 są prawidłowymi wartościami kodu.

Kody bajtów określających

Kod

Opis

000

Koniec definicji symbolu

Tryb rysowania jest włączany na początku każdego symbolu. Włączony tryb rysowania (kod 1) powoduje rysowanie linii. Wyłączenie trybu rysowania (kod 2) powoduje przesunięcie do nowego położenia bez rysowania.

001

Włączenie trybu rysowania (pisak opuszczony)

002

Wyłączenie trybu rysowania (pisak podniesiony)

003

Dzielenie długości wektora przez następny bajt

Wysokość określana w poleceniu SYMBOL jest wstępnie traktowana jako długość pojedynczego wektora ortogonalnego (zwrot 0, 4, 8 lub C). Kod 3 dzieli długości wektora przez następny bajt. Kod 4 mnoży długości wektora przez następny bajt. Po kodach 3 i 4 występuje bajt określający, zawierający współczynnik skali wyrażony w liczbach całkowitych (od 1 do 255).

Jeżeli wysokość symbolu ma określać jego wysokość całkowitą, a do jego rysowania używany ma być wektor o długości 10, wówczas można określić skalę jego wysokości za pomocą bajtów 3,10. Wartość współczynnika skali, w obrębie definicji symbolu, podlega kumulacji. Oznacza to, że pomnożenie przez 2, a następnie przez 6, da w rezultacie współczynnik skali równy 12. Zwykle na końcu definicji symbolu należy odwrócić skutki wprowadzonych współczynników skali, szczególnie w przypadku definicji symboli podrzędnych oraz symboli czcionek tekstowych. Program nie resetuje współczynnika skali.

004

Mnożenie długości wektora przez następny bajt

005

Zapamiętanie bieżącego położenia (włożenie na stos)

Należy pamiętać o tym, że wszystko co zostało włożone na stos, musi zostać ze stosu zdjęte. Głębokość stosu pozwala na umieszczenie na nim danych dotyczących tylko 4 położeń. W przypadku wystąpienia przepełnienia stosu z powodu zbyt wielu włożeń na stos lub zbyt wielu zdjęć ze stosu, w momencie rysowania symbolu pojawi się następujący komunikat.

Stos danych przepełniony dla symbolu nnn

Podobnie próba zdjęcia ze stosu większej ilości danych niż uprzednio na niego włożono spowoduje podczas rysowania symbolu wyświetlenie następującego komunikatu:

Stos danych niedopełniony dla symbolu nnn

006

Przywrócenie zapamiętanego położenia (zdjęcie ze stosu)

007

Rysowanie symbolu podrzędnego o numerze podanym w następnym bajcie

Dla czcionki spoza zestawu Unicode bajt określający następujący po kodzie 7 jest numerem wywoływanego symbolu z przedziału od 1 do 255. Dla czcionki Unicode po kodzie 7 następuje numer symbolu Unicode od 1 do 65535. Numery symboli Unicode powinny być liczone jako dwa bajty.

Rysowany jest wtedy oznaczony tym numerem podsymbol (jego definicja musi znajdować się w tym samym pliku symboli). Należy pamiętać o tym, że tryb rysowania nie jest resetowany dla nowego symbolu. Po narysowaniu podsymbolu następuje wznowienie rysowania bieżącego symbolu.

008

Przesunięcie X-Y o kolejne 2 bajty

Normalnie bajty określające kreślenie wektorów pozwalają rysować je jedynie z 16 wcześniej określonymi zwrotami, o długości nie większej niż 15 jednostek. Ograniczenia te powodują z jednej strony większą efektywność tworzenia definicji symboli, z drugiej zaś stanowią niekiedy utrudnienie. Kod 8 określa przesunięcie X-Y podane przez dwa następne bajty. Po kodzie 8 muszą następować dwa bajty o postaci:

8,X-displacement,Y-displacement

Przesunięcia X-Y muszą mieścić się w przedziale od –128 do +127. Znak + poprzedzający liczbę określającą przesunięcie jest opcjonalny, a dla poprawienia czytelności zapisu można stosować nawiasy. Poniższy przykład daje w rezultacie wektor, który rysuje (lub przesuwa) o 10 jednostek w lewo i jednocześnie 3 jednostki do góry.

8,(-10,3)

Po dwóch bajtach określających przesunięcie następuje powrót do normalnego trybu określania wektorów.

Kod 9 stosowany jest do rysowania sekwencji niestandardowych wektorów. Kod 9 określa dowolną liczbę par przesunięć X-Y. Sekwencja taka kończona jest parą (0,0). W następnym przykładzie rysowane są trzy niestandardowe wektory, po czym następuje powrót do normalnego trybu określania wektorów.

9,(3,1),(3,2),(2,-3),(0,0)

Należy kończyć sekwencję par przesunięć X-Y parą (0,0), aby program mógł rozpoznać występujące dalej wektory normalne lub kody specjalne.

009

Wielokrotne przesunięcie X-Y, koniec (0,0)

00A

Łuk oktantowy definiowany przez dwa następne bajty

Taki łuk zwany jest łukiem oktantowym, ponieważ obejmuje jeden lub więcej 45-stopniowych oktantów, rozpoczynając się i kończąc na ich obwiedniach. Oktanty są numerowane w kierunku przeciwnym do ruchu wskazówek zegara, poczynając od zwrotu odpowiadającego godzinie trzeciej, co ilustruje poniższy rysunek:

Określenie łuku ma postać

10,radius,(-)0SC

Promień może być dowolną liczbą z przedziału od 1 do 255. Drugi bajt określający wskazuje zwrot rysowania łuku (zgodny z ruchem wskazówek zegara, jeżeli jego wartość jest ujemna, a przeciwny, jeżeli jest dodatnia), jego oktant początkowy ( s , przyjmuje wartości od 0 do 7), oraz liczbę obejmowanych oktantów ( c , przyjmuje wartości od 0 do 7, przy czym 0 oznacza osiem oktantów, czyli pełny okrąg). Dla poprawy czytelności zapisu można stosować nawiasy. Jako przykład rozważony zostanie następujący fragment definicji symbolu:

...012,10,(1,-032),01E,...

Przykład ten pokazuje rysowanie najpierw wektora o długości 1 jednostki, zwróconego w prawo do góry, następnie łuku o promieniu 1 jednostki, rozpoczynającego się od 3. oktantu i biegnącego zgodnie z ruchem wskazówek zegara przez 2 oktanty, a wreszcie wektora o długości 1 jednostki, zwróconego w prawo w dół. Przedstawiono to na poniższym rysunku.

00B

Łuk ułamkowy definiowany przez pięć następnych bajtów

Definicja takiego łuku wykorzystuje pięć bajtów określających.

11,start_offset,end_offset,high_radius,radius,(-)0SC

odsunięcie_pocz oraz odsunięcie_końc określają, jak daleko od obwiedni oktantu zaczyna się i kończy rysowany łuk. Wartość promień_wys odpowiada majbardziej znaczącym 8 bitom promienia łuku. Będzie ona równa 0, jeśli promień nie przekracza 255 jednostek. Dla określenia promienia większego niż 255 należy pomnożyć wartość promień_wys przez 256 i dodać do wartości promień . Wartość promień oraz ostatni bajt określający mają takie samo znaczenie, jak bajty w definicji łuku oktantowego (kod 00A, opisany powyżej).

Odsunięcie początkowe określa się przez obliczenie różnicy w stopniach między obwiednią oktantu początkowego (wielokrotności 45 stopni) i początkiem łuku. Różnicę tę należy pomnożyć przez 256 i podzielić przez 45. Jeśli łuk zaczyna się na obwiedni oktantu, wówczas jego odsunięcie_pocz jest równe 0.

Odsunięcie_końc jest obliczane w podobny sposób, z taką różnicą, że używa się liczby stopni od ostatnio przeciętej obwiedni oktantu do końca łuku. Jeśli łuk kończy się na obwiedni oktantu, jego odsunięcie_końc jest równe 0.

Na przykład, łuk ułamkowy z punktem początkowym leżącym względem jego środka pod kątem 55 stopni i z punktem końcowym położonym pod kątem 95 stopni, którego promień jest równy 3 jednostkom, byłby zakodowany następująco:

11,(56,28,0,3,012)

Poniżej podano wyjaśnienie:

start_offset     = 56 because ((55 - 45) * 256 / 45) = 56 
end_offset       = 28 because ((95 - 90) * 256 / 45) = 28
high_radius      = 0  because (radius < 255) 
radius           = 3 
starting octant  = 1  because arc starts in the 45 degree octant
ending octant    = 2  because arc ends in the 90 degree octant

00C

Łuk zdefiniowany wg przesunięcia X-Y i wypukłości

Są one podobne do kodów 8 i 9 pod tym względem, że umożliwiają określanie przesunięć X-Y. Kody 00C i 00D rysują łuki przez dodanie do wektora przesunięcia współczynnika wypukłości. Kod 00C rysuje pojedynczy segment łukowy, podczas gdy kod 00D rysuje sekwencję segmentów łukowych (wielołuków), zakończoną przesunięciem (0,0).

Kod 00C musi poprzedzać trzy bajty opisujące łuk:

0C,X-displacement,Y-displacement,Bulge

Zarówno przesunięcia X oraz Y, jak i wypukłość określająca krzywiznę łuku, muszą mieścić się w przedziale od –127 do +127. Jeśli liniowy segment określony przesunięciem ma długość D, a strzałka łuku dla tego segmentu wynosi H, wówczas wypukłość łuku ma wartość ((2* H / D) * 127). Jest ona liczbą ujemną, jeżeli kierunek rysowania łuku jest zgodny z ruchem wskazówek zegara.

Półokrąg ma wypukłość równą 127 (lub –127) i jest największym łukiem, który może zostać narysowany jako pojedynczy segment łukowy z wykorzystaniem tego kodu (w celu narysowania większych łuków używa się dwóch, kolejno po sobie następujących, segmentów łukowych). Dopuszczalna jest również zerowa wartość wypukłości, która definiuje wtedy segment prostoliniowy. Jednak użycie kodu 8 w celu narysowania segmentu prostoliniowego oszczędza jeden bajt w opisie symbolu.

Po kodzie wielołukowym (00D lub 13) występuje 0 lub więcej trzybajtowych definicji segmentów łukowych, a na końcu następuje przesunięcie (0,0). Należy zwrócić uwagę, że po końcowym przesunięciu (0,0) nie jest już podawana żadna wypukłość. Przykładowo, litera S mogłaby być zdefiniowana następującą sekwencją:

13,(0,5,127),(0,5,-127),(0,0)

Segmenty o zerowej wypukłości są przydatne do przedzielania łuków segmentami prostoliniowymi. Jest to bardziej efektywne niż kończenie sekwencji segmentów łukowych, wstawianie pojedynczego segmentu prostoliniowego i ponowne rozpoczynanie nowej sekwencji wielołuku.

Liczba -128 nie może być używana w żadnej definicji segmentu łuku ani wielołuku.

00D

Wielokrotne łuki definiowane za pomocą wypukłości

00E

Wykonanie następnego polecenia tylko dla pionowej orientacji tekstu

Gdy kod ten pojawia się w definicji znaku, wówczas wykonanie lub pominięcie następnego kodu zależy od orientacji tekstu. Jeśli orientacja ta jest pionowa, następny kod jest wykonywany; jeśli zaś pozioma, następny kod jest pomijany.

W tekstach o orientacji poziomej punktem początkowym każdego znaku jest lewy koniec linii bazowej. W tekstach o orientacji pionowej zakłada się, że punktem początkowym jest środek górnej linii ograniczającej znak. W punkcie końcowym każdego znaku następuje podniesienie pisaka i przemieszczenie go do punktu początkowego następnego znaku. W przypadku tekstów zorientowanych poziomo jest to przemieszczenie w prawo; w przypadku tekstów zorientowanych pionowo jest to przemieszczenie w dół. Kod specjalny 00E (14) jest stosowany przede wszystkim w takim celu, aby mimo różnych punktów początkowych i końcowych znaków można było wykorzystywać tę samą definicję znaku zarówno w tekstach o orientacji poziomej, jak i pionowej. Przykładowo, przedstawiona poniżej definicja wielkiej litery D może być używana zarówno dla poziomej, jak i pionowej orientacji tekstu.

*68,22,ucd 
2,14,8,(-2, 6),1,030,012,044,016,038,2,010,1,06C,2,050,
14,8,(-4,-3),0