^

2.8.4 Die Systemvariable "graphic" : Mixmodes und mehr

Alle Parameter des Grafik-Systems vom R-BASIC lassen sich über die Felder der Systemvariablen graphic einstellen. Die Verwendung dieser Variablen gestattet einen wesentlich detaillierten Zugriff auf die Grafik-Eigenschaften, als die Befehle COLOR, PAPER und INK. GEOS verwaltet getrennte Farben für Text, Linien und Flächen. R-BASIC speichert zusätzlich noch eine Farbe für den Hintergrund (z.B. von Textausgaben, siehe PAPER-Befehl).

graphic ist vom Typ GraphicDrawStruct, der folgendermaßen definiert ist:

STRUCT  GraphicDrawStruct
  mixMode              AS Word
  backColor            AS DWord
  lineColor            AS DWord
  lineDrawMask         AS Word
  lineWidth, lineStyle AS Word
  lineEnd, lineJoin    AS Word
  areaColor            AS DWord
  areaDrawMask         AS Word
  textColor            AS DWord
  textDrawMask         AS Word
  drawFlags            AS Word
  reserve(6)           AS Word  'reserviert für zukünftige Erweiterungen
END STRCUT

Die folgende Tabelle enthält die Bedeutung der einzelnen Felder, sortiert nach der Wichtigkeit / Häufigkeit ihrer Verwendung.

Häufig verwendete Felder

Weniger häufig verwendete Felder

Hinweis: Während der Ausführung einer PRINT-Anweisung werden einige Felder der graphic-Variablen intern zeitweise geändert, dann aber wieder zurück gesetzt. Das kann bedeutsam sein, wenn die Printliste Funktionsaufrufe enthält.

Tabelle der Lininenstile: Erlaubte Werte für das Feld lineStyle

Tabelle der Füllmuster: Erlaubte Werte für die Felder areaDrawMask, lineDrawMask und textDrawMask.

Beispiele für Füllmuster. Weitere Beispiele finden Sie im Anhang C.



Der Mix-Mode

Im Normalfall geht man davon aus, dass neu gezeichnete Linien oder Flächen vorhandene Grafiken überschreiben. Das muss aber nicht so sein. Mit dem Feld graphic.mixMode können Sie bestimmen, wie neu gezeichnete Linien oder Flächen mit dem bereits vorhandenen Hintergrund verknüpft werden sollen. Dabei wird der Farbwert jedes Pixels ermittelt, indem der Farbwert des an dieser Stelle bereits vorhandenen Pixels über eine logische Operation mit dem Farbwert der Zeichenfarbe verknüpft wird.

Von besonderer Bedeutung sind die Modi MM_XOR und MM_INVERT. In diesen Modi wird z.B. eine Linie beim ersten Zeichnen erscheinen und beim nochmaligen Zeichnen wieder gelöscht. So kann man z.B. "Gummi-Linien" realisieren, ohne den Hintergrund zu beschädigen. Im Zweifelsfall verwenden Sie MM_INVERT.

Achtung! graphic.mixMode wirkt nicht bei Textausgaben (PRINT) und bei der Ausgabe von Bildern (DrawImage, DrawPicture, DrawBitmap, DrawIcon).

Tabelle der Mix-Modes: Erlaubte Werte für das Feld mixMode

Der Mix-Mode verwendet logische Operationen (AND, OR, XOR) zur Verknüpfung der Farbwerte. Für System-Farben (beschrieben durch einen Index) wirkt die Verknüpfung auf den Index. Deshalb hängen die Ergebnisse einiger Mix-Modi davon ab, welche Farbtiefe verwendet wird. Das kann insbesondere in dem häufigen Fall, dass eine 256-Farb-Bitmap gemeinsam mit einem True-Color Bildschirm verwendet wird, zu unerwarteten Ergebnissen führen (die Resultate in der Bitmap und auf dem Bildschirm unterscheiden sich). Hier hilft nur ausprobieren, ob das Ergebnis für die eigenen Zwecke geeignet ist oder nicht. R-BASIC reicht an dieser Stelle einfach das vom GEOS-System bereitgestellte Verhalten durch.

^

2.8.5 Arbeit mit Graphic Strings

Ein Graphic String (im Folgenden kurz GString) ist eine Folge von Grafikbefehlen oder Textausgaben, die gemeinsam gespeichert werden. Dieser GString kann später beliebig oft "abgespielt" werden. Dabei werden die enthaltenen grafischen Kommandos mit hoher Geschwindigkeit ausgeführt, viel schneller als dies als Folge von BASIC-Anweisungen möglich ist. Das folgende Bild gibt einen Überblick über die Möglichkeiten, die R-BASIC zur Arbeit mit GStrings bietet.

Es gibt mehrere Möglichkeiten an eine GString zu kommen. In vielen Fällen werden Sie ihn selbst aufzeichnen. Dazu müssen Sie zunächst mit StartRecordGS die Aufzeichnung starten. StartRecordGS liefert ein Handle zurück, mit dem Sie später den GString wiedergeben können. Intern wird der GString in einer Datei gespeichert, die R-BASIC zur Verfügung stellt. Deswegen müssen Sie die ungefähre Datenmenge, die der GString aufnehmen soll, angeben.

Ab diesem Zeitpunkt gehen alle Grafik- und Textausgaben, die sonst auf den Bildschirm gehen würden, in den GString und werden aufgezeichnet. Es sind grundsätzlich alle Text- und Grafikbefehle erlaubt. Das schließt explizit die Wiedergabe anderer GStrings ein. Die Grafikbefehle werden dabei in den neuen GString kopiert. Mit EndRecordGS wird der Aufzeichnungsmodus beendet.

Der GString kann nun mit DrawGS ausgegeben werden. Die Routine GetGStringInfo liefert Informationen über einen GString, z.B. seine Abmessungen. Damit können Sie ihn z.B. zentriert oder rechtsbündig an eine bestimmte Position zeichnen. Außerdem können Sie GStrings mit CaptionGString als grafische Captions für Objekte und mit ItemGString ( ) als grafische Listeneinträge in DynamicList Objekten verwenden.

Statt einen GString selbst aufzuzeichnen können Sie ihn mit ClipboardGetGS aus der Zwischenablage zu holen oder mit ReadGStringFromFile aus einer GEOS Hintergrunddatei lesen. Außerdem bieten die R-BASIC Libraries "VMFiles" und "ResFile" Funktionen an, einen GString in eine Datei zu schreiben bzw. ihn von dort zu laden. Sie haben weiterhin die Möglichkeit einen GString mit ClipboardPutGS in die Zwischenablage zu kopieren.

Wenn Sie den GString nicht mehr benötigen müssen Sie ihn meist mit FreeGS freigeben. Beachten Sie dazu die Dokumentatzion der Routine, die den GString angelegt hat! Mit FreeGS wird der GString aus der Datei, die ihn enthält, gelöscht. Beachten Sie, dass ein GString bei einem System Shutdown nicht automatisch gelöscht wird, das Handle auf ihn steht nach einem Systemneustart aber nicht mehr zur Verfügung. Sie sollten deswegen alle "globale" GStrings, die von einer Routine angelegt und von anderen verwendet werden, im OnExit-Handler des Application-Objekts freigeben.

StartRecordGS

StartRecordGS beginnt die Aufzeichnung eines GStrings. Der GString wird als unsichtbarer Screen gesetzt, die aktuellen Screendaten werden gesichert und nach EndRecordGS wieder hergestellt. Alle Text- und Grafikausgaben gehen ab sofort in den GString und werden aufgezeichnet.

Dabei gelten anfangs die folgenden Einstellungen:

  • Textfont: Es wird der Standard-Font eingestellt: Fontmode Fixed, FID_MONO, 14 Punkt.

  • Farben: Die Vordergrundfarbe wird auf Schwarz, die Hintergrundfarbe wird auf Transparentgestellt. Texte werden also transparent ausgegeben.

  • Änderung des Fonts, der Textgröße, der Farben und anderer Grafikeigenschaften während der Aufzeichnung des GStrings haben keine Auswirkungen auf andere Teile des Programms.

  • Die Blockfonts sind immer global. Das heißt, dass geladene Fonts nach dem Aufruf von FontSetBlock zur Verfügung stehen und dass diesbezügliche Änderungen auch nach dem Aufruf von EndRecordGS bestehen bleiben und so andere Teile des Programms beeinflussen können.

  • GStrings haben prinzipiell keine Begrenzung. Die globale Variablen MaxX und MaxY sind ohne Bedeutung.

Syntax: <hanVar> = StartRecordGS ( dataSize )

<hanVar> = StartRecordGS ( ) ' entspricht DS_TINY. Die Klammern sind erforderlich!

<hanVar> Variable vom Typ HANDLE. Speichert die Referenz auf den GString


Das von StartRecordGS zurückgegeben Handle wird für die anderen GString-Befehle benötigt. Der Parameter dataSize bestimmt die ungefähre Größe der GStringdaten. Damit kann R-BASIC abschätzen, wieviel Platz es in der Datei, die den GString aufnehmen soll, reservieren muss. Wenn sich schon viele Daten in der Datei befinden (z.B. Bitmaps von BitmapContent-Objekten oder andere GStrings) kann R-BASIC gegebenen Falls eine neue Datei anlegen. Allerdings ist der Wert nicht kritisch. Geben Sie DS_TINY an und verbrauchen trotzdem ein Megabyte passiert im Allgemeinen nichts. Haben Sie aber viele GStrings, Bitmap-Objekte oder Objekte im gepufferten Modus (z.B. Canvas mit buffered = TRUE gesetzt) gleichzeitig sollten Sie dem Wert etwas mehr Aufmerksamkeit widmen.

Der Defaultwert für dataSize ist DS_TINY. Die folgende Tabelle enthält die zulässigen Werte.

Beispiele:

  1. Normale Grafikbefehle wie Line, Rectangle, FillEllipse usw. erfordern jeweils 10 bis 15 Byte. Texte erfordern pro Zeichen 1 Byte. Für die meisten Fälle ist daher der Defaultwert DS_TINY völlig ausreichend. Das entspricht ca. 1000 Zeichenbefehlen.

  2. Block-Font Grafiken erfordern 1 Byte pro Pixel (256-Color Grafiken) oder nur 1 Byte auf 8 Pixel (monochrome Grafiken). Ein GString mit 100 Blockfont-Grafiken der Größe 32x32 Pixel erfordert, wenn es sich um 256-Color Grafiken handelt, 100x32x32 = 102400 Byte (100 kByte). Verwenden Sie DS_SMALL oder DS_MEDIUM.

  3. Eine Bitmap der Farbtiefe 8 Bit erfordert 1 Byte pro Pixel. Für eine Bitmap der Größe 640x480 Pixel (=307200 Byte) verwenden Sie DS_MEDIUM.

  4. True-Color-Bitmaps benötigen 3 Byte pro Pixel. Für eine 800x600 True-Color-Bitmap ist DS_LARGE angebracht.
 

EndRecordGS

EndRecordGS beendet die Aufzeichnung eines GString. Die vor dem Aufruf von StartRecordGS geltenden Screen- und Grafikeinstellungen werden wieder hergestellt. Ab sofort kann der GString verwendet werden.
Syntax: EndRecordGS <han>

<han>: Handle, das von StartRecordGS geliefert wurde.


 

DrawGS

DrawGS zeichnet den GString an die Position x, y.
Syntax: DrawGS <han> , x , y

<han>: Handle, das von StartRecordGS geliefert wurde.

x, y: Zeichenposition in Pixeln.
Die linke obere Ecke des GString wird an diese Position gezeichnet.

 

FreeGS

FreeGS gibt das Handle und den GString wieder frei. Der vom GString belegte Speicherplatz wird freigegeben.
Syntax: FreeGS <han>

<han>: Handle,
das von StartRecordGS, ClipboardGetGS oder ReadGStringFromFile geliefert wurde.

Tipp: Um sicherzustellen, dass das System nicht crasht, falls das Handle irrtümlich noch einmal mit DrawGS verwendet wird können Sie es nach dem Freigeben durch FreeGS () mit der Anweisung "han = NullHandle()" löschen. R-BASIC gibt dann bei einer irrtümlichen Verwendung mit DrawGS nur eine entsprechende Meldung aus.

Wichtig: Wenn Sie eine Library-Routine verwenden um einen GString zu erzeugen, lesen Sie bitte die Dokumentation der Routine sorgfältig, um zu entschieden, ob Sie diesen GString mit FreeGS freigeben müssen oder nicht!

Beispiel: Die Routine verwendet einen GString um einem Objekt eine Grafik als Caption zuzuweisen. Dazu verwenden wir die Instancevariable CaptionGString. Das ist ein üblicher Weg um einfache Grafiken, die zur Laufzeit gelegentlich geändert werden müssen, darzustellen. Die Zeile "MyObj.CaptionGString = gsHan" kopiert den GString in das Objekt, so dass wir ihn mit "FreeGS gsHan" wieder freigeben können (und müssen!).

SUB SetCaption ( )
DIM gsHan as HANDLE

  gsHan = StartRecordGS ( )
  FillRect 0, 0, 48, 32, LIGHT_BLUE
  Rectangle 0, 0, 48, 32, BLUE
  INK WHITE
  Ellipse 4, 12, 14, 22
  Ellipse 7, 5, 17, 15
  Ellipse 22, 18, 32, 28
  Ellipse 32, 14, 42, 24
  Ink BLACK
  printfont.style = TS_BOLD
  Print atxy 25,1;"ab"
  EndRecordGS gsHan

  MyObj.CaptionGString = gsHan

  FreeGS gsHan

End SUB
Beispiel: Verwendung eines GString, dessen Handle in einer globalen Variable gespeichert ist. Der GString wird beim Schließen des Programms freigegeben.

Definition der globalen Variablen

DIM globalGS AS HANDLE
UI-Code Ausschnitt
Application DemoApplication
<.....>
OnExit = ExitHandler
End Object
Anlegen des GString
SUB CreateGS ( )
globalGS = StartRecordGS()
Ellipse 50, 50, 100, 100, RED
Print atxy 0, 20; "Hallo BASIC"
EndRecordGS ( globalGS )
END SUB
Verwendung des GString
SUB DrawGlobalGS()
DrawGS globalGS, 20, 30
DrawGS globalGS, 10, 60
DrawGS globalGS, 50, 45
End SUB
Zugehöriger OnExit-Handler zum freigeben des GString. FreeGS ignoriert leere Handles. Deswegen brauchen wir globalGS NICHT auf NullHandle() zu prüfen.
SYSTEMACTION ExitHandler
  FreeGS globalGS
END ACTION

GetGStringInfo

GetGStringInfo liest die Grafikinformationen eines Graphic String aus. Dazu wird eine Variable vom Strukturtyp GraphicInfo belegt. Diese Struktur ist im Abschnitt 2.8.6 (Zeichnen von Bildern) beschrieben.
Syntax: info = GetGStringInfo ( gsHan )

info: Variable vom Strukturtyp GraphicInfo

gsHan: Handle auf den GString


Beispiel:
DIM info as GraphicInfo
DIM gsHan as Handle

gsHan = StartRecordGS()
Rectangle 20, 20, 50, 100
EndRecordGS gsHan

info = GetGStringInfo ( gsHan )
Print "Abmessungen: ";info.sizeX;"x";info.sizeY;"Pixel"

FreeGS gsHan
Beispiel: Zeichnen eines GString (in gsHan) zentriert an die Position (50; 100)
DIM info as GraphicInfo
DIM x, y
  info = GetGStringInfo ( gsHan )
  x = 50 - info.sizeX/2;
  y = 100 - info.sizeY/2
  DrawGS gsHan, x, y

ClipboardGetGS

ClipboardGetGS holt einen GString aus der Zwischenablage. Graphic Strings sind ein universelles Grafikformat unter GEOS. Die Grafik in der Zwischenablage kann z.B. aus GeoWrite, GeoDraw oder dem Sammelalbum kommen. Der GString kann sofort mit DrawGS gezeichnet werden. ClipboardGetGS ist damit analog zur Kombination StartRecordGS / EndRecordGS. Das von ClipboardGetGS gelieferte Handle muss ebenfalls mit FreeGS wieder freigegeben werden.
Syntax: <han> = ClipboardGetGS ( )

Wird kein GString im Clipboard gefunden so liefert ClipboardGetGS ein NullHandle. ClipboardGetGS setzt die globale Variable clipboardError (Null oder Fehlercode). Sie können vorher mit ClipboardTest prüfen, ob sich ein GString im Clipboard befindet.

Beispiel:

DIM gsHan AS HANDLE
  IF ClipboardTest (0, 1) THEN! manufID = 0, format = 1
    gsHan = ClipboardGetGS()
  End IF
  <....> z.B. DrawGS gsHan, 0, 0
  FreeGS  gsHan  ' Nicht vergessen

ClipboardPutGS

ClipboardPutGS kopiert einen GString in die Zwischenablage. Von dort kann er dann z.B. in GeoDraw eingeklebt werden.
Syntax: ClipboardPutGS <han>

<han>: Handle, das von StartRecordGS geliefert wurde.


Beispiel:
DIM gsHan AS HANDLE
  gsHan = StartRecordGS ()
  Rectangle 20, 20, 50, 100, BLACK
  FillEllipse 30, 30, 40, 90, RED
  EndRecordGS gsHan
  ClipboardPutGS gsHan
  FreeGS  gsHan  ' Nicht vergessen

SaveGStringAsBackground

SaveGStringAsBackground schreibt einen GString als GEOS Hintergrunddatei. Falls die Datei bereits existiert wird sie überschrieben. WriteGStringToFile setzt die globale Variable fileError (Null oder Fehlercode).
Syntax: SaveGStringAsBackground <han> , fileName$

<han>: Handle, das den GString referenziert.

fileName$: Name der anzulegenden Datei (Pfadanteil erlaubt).


 

ReadGStringFromFile

ReadGStringFromFile liest (kopiert) einen GString aus einer Datei. Aktuell werden nur GEOS Hintergrunddateien unterstützt. ReadGStringFromFile liefert das Handle auf den gelesenen GString. Das Handle muss mit FreeGString wieder freigegeben werden. Die globale Variable fileError wird gesetzt (Null oder Fehlercode). Im Fehlerfall liefert ReadGStringFromFile ein NullHandle.
Syntax: <han> = ReadGStringFromFile ( fileName$ [, pictNum] )

<han>: Variable vom Typ Handle

fileName$: Name der Datei mit dem Bild (Pfadanteil erlaubt).

pictNum: Nummer des Bildes, falls die Datei mehr als ein Bild enthält.
Wird für GEOS Hintergrunddateien ignoriert.

Default: 1 (erstes Bild lesen)

^

Weiter...