Gr		Die gemeinsame moderne Graphikuntersttzung des MyMouse-
ver 1.25	Pakets, der Graphics-Vision-Bibliothek und der MetaGraph-Unit.
		Copyright (c) 1993 by Matthias Kppe.



Gr ist eine Unit, die der Verwaltung und Aufteilung des Vga-Speichers und
der Bereitstellung von Graphikmodusparametern und einiger gemeinsam
genutzter Graphikdatenstrukturen dient. Ferner ist sie die zentrale Unit
des Zeiger-Qualitts-Konzepts fr die Modularisierung von Graphikaufgaben
und des Benachrichtigungsketten-Konzepts.

Die Versionen 1.22+ untersttzen DPMI; ferner stellen sie fr die Version 6.0
oft bentigte 7.0-Prozeduren bereit (NewCache, DisposeCache, GetShiftState).

Die Versionen 1.25+ untersttzen Bildspeicher-Mapping, so da die bisherige
Beschrnkung auf 256KB entfllt. Mittels der VESA-Unit werden die SuperVGA-
Modi von VESA-Karten untersttzt.

P r o z e d u r e n


procedure SetGrMode(Mode: Word);

  SetGrMode setzt die Parameter des Graphikmodus. War die Graphik zuvor
  initialisiert, wird sie beendet und neu initialisiert. Ansonsten ist
  ein manuelles Einschalten der Graphik mittels InitGraphics erforderlich.

  Als Parameter von SetGrMode ist eine der grXXXX-Konstanten zu verwenden.
  Sie bezeichnen - unabhngig vom System - die verschiedenen Graphikmodi.

  Bezeichner	Alternativ	Beschreibung
    
  grVgaLoStd			* 640 x 200, 2 Seiten, normale Anordnung
  grVgaLoPak	gr640x200x16	  640 x 200, 2 Seiten, gepackte Anordnung
  grVgaMedStd			* 640 x 350, 2 Seiten, normale Anordnung
  grVgaMedOne	gr640x350x16	* 640 x 350, 1 Seite
  grVgaMedPak			  640 x 350, 2 Seiten, gepackte Anordnung
  grVgaHiStd	gr640x480x16	* 640 x 480, 1 Seite
  grSvgaStd	gr800x600x16	+ 800 x 600, 1 Seite
  grVga256Std	gr320x200x256	  320 x 200, 1 Seite, 256 Farben
  grVgaWdMedStd			  720 x 350, 2 Seiten, normale Anordnung
  grVgaWdMedOne	gr720x350x16	  720 x 350, 1 Seite
  grVgaWdMedPak			  720 x 350, 2 Seiten, gepackte Anordnung
  grVgaWdHiStd	gr720x480x16	  720 x 480, 1 Seite
  gr640x480x256			+ 640 x 480, 256 Farben
  gr800x600x256			+ 800 x 600, 256 Farben
  gr1024x768x16			+1024 x 768, 16 Farben
  gr1024x768x256		+1024 x 768, 256 Farben

  Bitte beachten Sie, da nur die mit einem Asterisk (*) gekennzeichneten
  Modi Standard-Modi darstellen, d.h. solche, die vom Borland Graphics
  Interface untersttzt werden. Die mit einem Pluszeichen (+) markierten
  Modi erfordern die Verwendung der VESA-Unit und arbeiten nur mit VESA-
  kompatiblen Karten.

  Weitere Informationen zum Einschalten des Graphikmodus erhalten Sie im
  Abschnitt Verfahren 1.

function InitGraphics: Boolean;

  InitGraphics schaltet durch einen Aufruf der InitGraphProc in den
  Graphikmodus um, der mit SetGrMode vereinbart wurde, und benachrichtigt
  andere Module durch die GrNotify-Kette.
  Das Funktionsergebnis ist true, wenn der Graphikmodus erfolgreich
  initialisiert werden konnte, ansonsten false.

procedue CloseGraphics;

  CloseGraphics benachrichtigt andere Module von dem bevorstehenden Schlieen
  des Graphikmodus durch die GrNotify-Kette und schliet den Graphikmodus
  durch einen Aufruf der CloseGraphProc.

procedure SetActivePage(Page: Word);

  SetActivePage setzt die Bildschirmseite, die modifiziert werden soll. Der
  bergebene Parameter wird in die Variable ActivePage eingetragen. Darber-
  hinaus wird die Variable ActiveSeg mit dem entsprechenden Speichersegment
  belegt.
  Ferner ruft SetActivePage die ActivePageProc auf, um z.B. das BGI zu
  benachrichtigen.

procedure SetVisualPage(Page: Word);

  SetVisualPage setzt die angezeigte Bildschirmseite. Dies geschieht durch
  einen direkten Zugriff auf die Hardware. Bitte verwenden Sie nur diese
  Prozedur, aber nicht die gleichnamige BGI-Prozedur.


Folgende Routinen sollten anstelle direkter Zuweisungen an die jeweiligen
Datenstrukturen aufgerufen werden.

procedure SetDrawOrigin(x, y: Integer);

  SetDrawOrigin setzt den Zeichenursprung auf die angegebenen Koordinaten
  und benachrichtigt andere Module durch einen Aufruf von ClipNotifyProc
  (gcnUpdOrigin).

procedure SetDrawOriginP(var P: TPoint);

  SetDrawOriginP setzt den Zeichenursprung auf den bergebenen Punkt und
  benachrichtigt andere Module durch einen Aufruf von ClipNotifyProc
  (gcnUpdOrigin).

procedure SetClipRect(x1, y1, x2, y2: Integer);

  SetClipRect setzt das Clipping-Rechteck auf die angegebenen Koordinaten
  und benachrichtigt andere Module durch einen Aufruf von ClipNotifyProc
  (gcnUpdAll).
  Bitte beachten Sie, da Turbo-Vision-Notation verwendet wird, d.h., die
  Koordinaten x2, y2 liegen auerhalb des Zeichenbereiches.

procedure SetClipRectR(var R: TRect);

  SetClipRectR setzt das Clipping-Rechteck auf das bergebene Rechteck und
  benachrichtigt andere Module durch einen Aufruf von ClipNotifyProc
  (gcnUpdAll).

Bildschirmseiten, Bildspeicher-Mapping, Adrebersetzung


function PageSeg(Page: Word): Word;

  PageSeg ermittelt die Segmentadresse zu einer angegebenen Seite.

function PageLinear(Page: Word): LongInt;

  PageLinear ermittelt die lineare Bildspeicher-Adresse der angegebenen
  Seite.

function PageAddr(Page: Word): pointer;

  PageAddr bildet den Bildspeicher so in das Speicherfenster ab, da der
  Anfang der Bildseite in diesem enthalten ist, und gibt die Adresse
  zurck.

function SegLinear(Seg: Word): LongInt;

  SegLinear wandelt ein Pseudo-Segment in eine lineare Adresse um.

function SegAddr(Seg: Word): pointer;

  SegLinear bildet den Bildspeicher so in das Speicherfenster ab, da
  das angegebene Pseudo-Segment in diesem enthalten ist, und gibt die
  Adresse zurck.

function LinearToAddress(Linear: LongInt): pointer;

  Diese Funktion bildet den Bildspeicher so in das Speicherfenster ab, da
  die angegebene lineare Bildadresse in diesem enthalten ist, und gibt
  die Adresse zurck.

procedure MapToNextWindow;

  Diese Prozedur schaltet zum folgenden Speicherfenster um.

procedure MapToPrevWindow;

  Diese Prozedur schaltet zum vorherigen Speicherfenster um.


Speicherreservierung


function ReserveSegs(Size: Integer): LongInt;

  ReserveSegs reserviert im freien VGA-Speicher (Size) Paragraphen. Das
  Startsegment wird im niederwertigen Wort des Funktionsergebnisses zurck-
  gegeben. Das hherwertige Wort gibt die reservierte Gre an.
  Wenn Size = -1, so wird der grte verfgbare Speicherbereich reserviert.

function GetFreeSegs: LongInt;

  Diese Funktion ermittelt die Bildspeicher-Allozierungs-Information.
  Wenn Sie Bildspeicher allozieren und spter wieder freigeben wollen,
  speichern Sie diese Information ab und verwenden Sie SetFreeSegsBack
  zum Wiederherstellen.

procedure SetFreeSegsBack(Segs: LongInt);

  Diese Prozedur stellt eine zuvor gespeicherte Allozierungs-Information
  wieder her.


BIOS-Interface


Normalerweise mssen Sie diese Prozeduren nicht direkt aufrufen.

procedure SetBiosMode(Mode: Byte);

  SetBiosMode schaltet einen Bildschirmmodus ein, indem es einen VGA-BIOS-
  Funktionsaufruf verwendet. Die Werte fr Mode sind teilweise systemspezi-
  fisch. Whlen Sie

  $0E	fr 640 x 200 x 16
  $10	fr 640 x 350 x 16
  $12	fr 640 x 480 x 16
  $13	fr 320 x 200 x 256

procedure SaveTextMode;

  Diese Prozedur speichert den aktuellen Textmodus ab.

procedure RestoreTextMode;

  RestoreTextMode schaltet in den Textmodus zurck, der vor dem ersten Aufruf
  von SetBiosMode oder SaveTextMode herrschte.

procedure Extend;

  Extend verndert einen initialisierten, 640 Pixel breiten Graphikmodus so,
  da er 720 Pixel breit wird. Um den Modus grVgaWdHiStd zu initialisieren,
  rufen Sie SetBiosMode($12) und danach Extend auf.

procedure InitBiosGraph;		* InitGraphProc, Qualitt 10

  InitBiosGraph ermittelt aus dem Gr-Modus den passenden Standard-VGA-BIOS-
  Modus und ruft SetBiosMode auf und erweitert ihn gegebenenfalls mittels
  Extend auf 720 Pixel Breite.
  Bitte beachten Sie, da SVGA-Modi systemspezifisch sind und daher von
  InitBiosGraph nicht gesetzt werden knnen. Falls Sie mit InitGraphProc
  einen solchen Graphikmodus initialisieren wollen und keinen VESA-Treiber
  besitzen, schreiben Sie eine Prozedur hherer "Qualitt" (vgl.
  Zeiger-Qualitts-Konzept).

procedure CloseBiosGraph;		* CloseGraphProc, Qualitt 10

  CloseBiosGraph ruft RestoreTextMode auf, so da die Graphik ausgeschaltet
  wird.

Temporrer Speicher


procedure GetTempMem(var Handle: Integer; Size: Word);

  Diese Prozedur alloziert gemeinsam genutzen temporren Speicher bestimmter
  Gre. Rufen Sie GetTempMem auf, whrend Handle auf 0 gesetzt ist, und
  es wird ein eindeutiges Handle zurckgegeben. Mittels dieses Handles
  kann der Speicherplatzbedarf fr einen bestimmten Zweck spter
  eingestellt werden. Das Maximum aller zu einem Zeitpunkt fr verschiedene
  Zwecke bentigten Speichergren bleibt alloziert.

  Die Variable TempMem enthlt einen Zeiger auf den Speicherbereich.

Hintergrundfarbe/-modus


procedure SetBkColor(Color: Word);

  Diese Prozedur setzt die Hintergrundfarbe, welche bei einigen
  Graphikoperationen im Modus Opaque verwendet wird.

procedure SetBkMode(Mode: Integer);

  Diese Prozedur setzt den Hintergrundmodus auf Opaque oder Transparent.
  SetBkMode ruft die Graphik-Benachrichtigung auf, wenn sich der Modus
  verndert hat.

V a r i a b l e n


* Parameter des Graphikmodus (gesetzt durch SetGrMode)

  GrMode	Word	Gr-Modus (grXXXX, Parameter von SetGrMode)
  SavedTextMode	Byte	BIOS-Nummer des vorherigen Textmodus

  SizeX		Word	Horizontale Anzahl der Pixel (z.B. 640)
  SizeY		Word	Vertikale Anzahl der Pixel (z.B. 480)

  Page0Seg	Word	Segmentadresse von Seite 0
  Free0Seg	Word	Segmentadresse des ersten freien Bereichs
  Page1Seg	Word	Segmentadresse von Seite 1
  Free1Seg	Word	Segmentadresse des zweiten freien Bereichs
  EndSeg	Word	Segmentadresse des Graphikspeicherendes

  GrFlags	Word	Kombination der folgenden Flags:

			Flag	Beschreibung
				
			gf16	Zeigt einen 16-Farb-Modus an.
			gf256	Zeigt einen 256-Farb-Modus an.
			gfMap	Zeigt an, da der Modus Speichermapping
				erfordert.

  ScreenF	Word	Verzerrungsfaktor * 10000
  RealBytesPerLine	Anzahl der Bytes pro Zeile
		Word
  Granularity	Byte	Granularitt der Pseudo-Segmente (Linksschieben)
  MapFlags	Byte	1 zeigt den Kompatibilitts-Mapping-Modus an
			(die Pseudo-Segmente zhlen ab $A000, nicht ab 0)

* aktuelle Parameter der Graphikkarte

  ActivePage	Word	Nummer der aktiven Seite (0 oder 1)
  ActiveSeg	Word	Segment der aktiven Seite
  BytesPerLine	Word	Anzahl der Bytes pro Zeile
  GrActive	Boolean	true, wenn die Graphik initialisiert wurde

* Speicher-Mapping

  WindowSize	Word	Gre eines Speicherfensters, 0 fr 64K
  OffsetMask	Word    WindowSize minus 1
  GransPerWindow Word	Zahl der Mapping-Granularitts-Einheiten pro
			Speicherfenster
  MapGranRight	Byte	Logarithmus dualis der Mapping-Granularitts-Einheiten
			(Anzahl der Schiebeoperationen)
  MapGranLeft	Byte	16 minus MapGranRight
  WindowNum	Word	Position des aktuellen Speicherfensters in
			Mapping-Granularitts-Einheiten
  WindowAddr	pointer	Zeiger auf den Bildschirmspeicher

  Bitte beachten Sie, da Mapping-Granularitts-Einheiten nicht notwendiger-
  weise mit den Pseudo-Segment-Granularitts-Einheiten bereinstimmen.

* gemeinsam genutzte Zusatzparameter

  DrawOrigin	TPoint	Zeichenursprung fr hhere Graphikroutinen
  ClipRect	TRect	Clipping-Rechteck fr Graphikroutinen
  BkMode	Integer	Hintergrund-Modus (Opaque oder Transparent)
  BkColor	Word	Hintergrund-Farbe

* temporrer Speicher

  TempUsed	Word	Zahl der verwendeten Handles
  TempHandles	array	Verlangte Speichergren, indiziert durch das Handle
		of Word
  TempMem	pointer	Adresse des temporren Speichers
  TempMemSize	Word	Aktuell reservierte Speichergre

* MetaGraph-Untersttzung

  MetaState	Word	Darstellen und/oder Aufzeichnen von Graphikoperationen
  MetaClipRect	TRect	Global-ClipRect bei Meta-Wiedergabe
  MetaOrigin	TPoint	Global-DrawOrigin bei Meta-Wiedergabe

* Zeiger-Qualitts-Konzept

  UserXX	pointer	Frei verfgbare Zeiger, vorgesehen fr gemeinsam
			genutzte Graphikroutinen.
  QualityXX	Byte	Qualittsbytes der jeweiligen installierten
			Zeiger.

* Segment-Selektoren fr die Version 6.0

  Seg0040	Word	Enthlt den Wert $0040.
  SegA000	Word	Enthlt den Wert $A000.
  SegB000	Word	Enthlt den Wert $B000.
  SegB800	Word	Enthlt den Wert $B800.

* Speicherung der VGA-Register

  UserRegArea	array	Datenbereich fr die Speicherung
		of Byte


V e r f a h r e n


1 Umschalten in den gesetzten Graphikmodus.


  Nach dem Setzen eines Graphikmodus mittels Gr.SetGrMode stehen Ihnen
  verschiedene Mglichkeiten zur Verfgung, die Graphik einzuschalten.

  Sie sollten im allgemeinen die High-level-Routine InitGraphics verwenden,
  nicht die folgenden Methoden.

  (a) Graph.InitGraph	Rufen Sie diese Prozedur auf, wenn Sie die Unit Graph
			fr Graphikausgaben verwenden wollen. Achten Sie
			darauf, da Sie passende Treiber- und Moduswerte
			verwenden.
  (b) BGI.InitBgiGraph	Diese Prozedur ruft Graph.InitGraph auf und verwendet
			automatisch die passenden Parameter, die sie aus dem
			gesetzten Gr-Modus ermittelt.
  (c) Gr.SetBiosMode	Rufen Sie diese Prozedur auf, wenn Sie einen Graphik-
			modus setzen wollen, der von Ihrem VGA-BIOS unter-
			sttzt wird. Der erforderliche Parameter ist von
			Ihrer Graphikkarte abhngig (SVGA-Modus).
  (d) Gr.InitBiosGraph	Diese Prozedur ruft Gr.SetBiosMode auf und verwendet
			automatisch den passenden Parameter, sofern es sich
			um einen Standard-Modus handelt.
  (e) Direktzugriffe	Verwenden Sie systemspezifische Direktzugriffe, um
			Graphikmodi einzuschalten, die von dem BIOS Ihrer
			Karte nicht untersttzt zu werden.
  (f) UserParams(0);	Verwenden Sie diese Befehlsfolge, um die Graphik
      InitGraphProc;	entsprechend den Erfordernissen installierter Module
			zu initialisieren. - vgl. Zeiger-Qualitts-Konzept

2 Rckschalten in den Textmodus.


  Das Rckschalten in den Textmodus sollte durch die High-level-Prozedur
  CloseGraphics geschehen, nicht durch die folgenden Methoden.

  (a) Graph.CloseGraph
  (b) BGI.CloseBgiGraph
  (c) Gr.RestoreTextMode
  (d) Gr.CloseBiosGraph
  (e) entsprechende Direktzugriffe
  (f) UserParams(0); CloseGraphProc;

3 Einreihen von graphischen Modulen in die Notifikations-Schlange


Die Unit Gr untersttzt die Graphikbenachrichtigungs-Schlange, in die
andere Units Prozeduren einreihen knnen, damit diese bei bestimmten
Aktionen aufgerufen werden.

Es gibt mehrere vordefinierte Botschaften. Nheres dazu finden Sie in
der Beschreibung von User07.


Z e i g e r - Q u a l i t  t s - K o n z e p t


Die Unit Gr stellt eine gewisse Anzahl frei verfgbarer Zeiger bereit, die
Adressen von Routinen aufnehmen sollen, so da Module eines Programms auf
gewisse Dienstleistungen zurckgreifen knnen, ohne da sie das bereitstel-
lende Modul kennen mssen.

Die meisten der Zeiger sind noch nicht belegt, d.h., die Parameterlisten der
evtl. Routinen sind Gr nicht bekannt. Gr aber trgt in seinem Initialisie-
rungsteil in alle UserXX-Zeiger die Adresse einer Dummy-Routine ein, die
nur die Parameter vom Stack nimmt. Die Anzahl der Parameterworte mu daher
im Register AX bergeben werden. Wollen Sie eine User-Routine in Pascal
aufrufen, so verwenden Sie das Makro UserParams(Count: Word).

In Gr ist ein Mechanismus vorgesehen, mit dem es mglich wird, da mehrere
Module konkurrierende Routinen bereitstellen, von denen nur die beste
installiert wird, unabhngig von der Reihenfolge des Erscheinens in den
uses-Listen.

Jedem der Zeiger UserXX ist ein Qualittsbyte QualityXX zugeordnet. Wenn
Initialisierungsteile ihre Routinen in den Zeigern installieren wollen, so
berprfen sie zuvor, ob sie eine hhere Qualitt haben als die bereits
installierten.

Einige der Zeiger sind bereits vergeben. Dazu sind in Gr Alias-Bezeichner
(var ... absolute UserXX) definiert, zumeist prozedurale Variablen, so da
der Zugriff von Pascal-Ebene einfacher erfolgen kann.

UserXX	Alias           Service				        Anbieter
      
User00	ExtSave         MetaGraph - Speicherung [extern]	MetaGr
User01	LineProc        Exportierte Linienroutine		MetaGr, BGI
User02	ClipNotifyProc	Clipping-Benachrichtigung		BGI
User03	InitGraphProc	Graphik einschalten nach GrMode		BGI, Gr
User04	CloseGraphProc	Graphik ausschalten			BGI, Gr
User05	ActivePageProc	Aktive Seite setzen nach ActivePage	BGI
User06	ChParamsProc	Graphik-Parameter verndern		MetaGr, BGI
User07	GrNotifyProc	Graphik-Benachrichtigungskette		MyMouse, VgaMem
User08	procedure	Bildspeicher-Mapping-Prozedur		Vesa, Gr
User09	SetDispStartProc  Bildanfang setzen			Vesa, Gr

Die obige Spalte "Anbieter" enthlt die Units, die die jeweiligen Zeiger
belegen, in der Reihenfolge der Qualitten (absteigend).

Ein Beispiel zur Verdeutlichung des Konzepts


  Nehmen wir an, Sie setzen eine graphische Oberflche fr Ihre Programme ein,
  die - um maximale Geschwindigkeit zu erzielen - die MetaGraph-Unit fr
  ihre Graphik-Ausgaben verwendet und die Unit Graph nicht einsetzt. Daher
  wird Graph auch nicht initialisiert.
  Jetzt fgen Sie der graphischen Oberflche ein Element hinzu, das ohne
  die Unit Graph nicht auskommt. Dann binden Sie in die uses-Liste Ihres
  Programms die Unit BGI ein. Diese Unit verknpft die Mglichkeiten der
  Unit Graph mit den Konventionen der Unit Gr.
  Die Init- und CloseGraphProc von BGI haben eine hhere Qualitt als die
  von Gr, folglich wird nun - ohne Anpassung des Codes - die Graphik durch
  einen BGI-Aufruf statt durch einen VGA-BIOS-call initialisiert, und Sie
  knnen Ihr BGI-Element einsetzen.

Dokumentation der vergebenen Zeiger


User00	ExtSave         MetaGraph - Speicherung [extern]	MetaGr

  Diese Routine dient dem Aufzeichnen von Graphikparametern fr das
  Metafile-Konzept. Sie darf nur innerhalb von Assembler-Routinen aufgerufen
  werden und hat ein spezielles Aufrufschema.
  Diese Routine wird in der MetaGraph-Dokumentation genauer beschrieben.

User01	LineProc        Exportierte Linienroutine		MetaGr, BGI

  Diese Routine dient dem Zeichnen einer Linie. Sie wird von MyFonts
  verwendet, um skalierbare Schriftarten darzustellen.
  Die Unit BGI bietet eine solche Linienroutine an; empfohlen wird jedoch
  die Verwendung der Unit MetaGraph, da diese direkter und schneller
  arbeitet.

User02	ClipNotifyProc	Clipping-Benachrichtigung		BGI

  Diese Routine dient der Benachrichtigung fremder Pakete, da sich das
  Clipping oder der Zeichenursprung verndert hat, und der Vernderung eines
  Clipping-Modus eines fremden Paketes, sofern dieses dazu in der Lage ist.

  ClipNotifyProc hat einen Parameter. Setzen Sie fr diesen die in Gr
  definierten gcnXXXX-Konstanten ein.

  Parameter	  Beschreibung
    
  Befehle:
  gcnUpdAll	  Pat das fremde Clipping an neue Parameter an.
  gcnUpdOrigin    Pat das fremde Clipping an einen neuen DrawOrigin an.

  Modusvernderer:
  gcnStopUpd	  Hlt die automatische Anpassung vor jedem Zeichenbefehl an.
  gcnContUpd	  Setzt die automatische Anpassung fort.
  gcnHaltUpd	  Beendet die automatische Anpassung.
  gcnStartUpd	  Beginnt die automatische Anpassung.
  gcnUpdOnReq	  Setzt den Modus, in dem die Befehle sofort das fremde
		  Clipping anpassen.

  Die Unit BGI verwendet die Clipping-Benachrichtigung, damit sie nicht
  vor jedem Zeichenbefehl das Clipping zeitraubend an die Gr-Parameter
  anpassen mu.

  ClipNotifyProc wird von den Routinen SetDrawOrigin, SetDrawOriginP,
  SetClipRect und SetClipRectR aufgerufen.

User03	InitGraphProc	Graphik einschalten nach GrMode		BGI, Gr

  Diese Routine dient der Initialisierung der Graphik, nachdem der
  Gr-Modus bereits gesetzt worden ist. Sie liefert true, wenn die Graphik
  initialisiert werden konnte.

User04	CloseGraphProc	Graphik ausschalten			BGI, Gr

  Diese Routine dient dem Ausschalten des Graphikmodus.

User05	ActivePageProc	Aktive Seite setzen nach ActivePage	BGI

  Diese Routine dient dem Setzen der aktiven Seite fremder Graphikpakete
  nach der Variablen ActivePage.

User06  ChParamsProc	Graphik-Parameter verndern		MetaGr, BGI

  Diese Routine dient der modulunabhngigen Abfrage von Graphikparametern.
  Der erste Parameter spezifiziert den Graphikparameter und die auszufhrende
  Aktion, der zweite Parameter gibt einen Puffer an. Das Funktionsergebnis
  ist die Gre des bentigten Puffers.

  Wert		Graphikparameter/Aktion				Typ
      
  gcpColor	Zeichenfarbe					Word
  gcpLineStyle	Linienstil (modulabhngig)			???
  gcpSolidThLn  Setzt durchgngige Linie bestimmter Dicke	Word

  gcpGetSize    Ermittelt Speicherbedarf fr diesen Parameter.
  gcpGetParams  Schreibt den Parameter in den Puffer.
  gcpSetParams	Liest den Parameter aus dem Puffer.

User07	GrNotifyProc	Graphik-Benachrichtigungskette		MyMouse, VgaMem

  Diese Routine stellt eine Instanz des Benachrichtigungskettenkonzeptes
  dar. Lesen Sie dazu auch den folgenden Abschnitt.

  Folgende Botschaften werden derzeit verwendet:

  Botschaft	    Sender	      Ereignis
      
  gnpInitGraphics   Gr.InitGraphics   nach erfolgreicher Initialisierung
				      der Graphik
  gnpCloseGraphics  Gr.CloseGraphics  vor der Beendigung der Graphik
  gnpBkMode	    Gr.SetBkMode      nach der Vernderung des BkMode

  Graphikmodule knnen auf diese Botschaften reagieren, um ihr Verhalten
  an die neuen Graphik-Bedingungen anzupassen.

User08	procedure	Bildspeicher-Mapping-Prozedur		Gr, Vesa

  Dies ist eine Low-Level-Prozedur, die aufgerufen wird, um den Bildspeicher
  in das Speicherfenster abzubilden. Die Prozedur hat ein spezielles
  Aufrufschema.

  In:	BH = 00
	DX = Adresse in Mapping-Granularitts-Einheiten
  Out:	AL = 4Fh: Funktion untersttzt
	AH = 00h: erfolgreich
	Die anderen Register knnen zerstrt werden.

  Normalerweise werden Sie diese Prozedur weder aufrufen noch selbst
  definieren mssen.

User09	SetDispStartProc  Bildanfang setzen			Gr, Vesa

  Diese Routine setzt den Bildanfang an die bergebene lineare Adresse.
  Sie wird in Gr fr VGA-Karten und in Vesa fr VESA-kompatible Karten
  definiert.


B e n a ch r i ch t i g u n g s k e t t e n - K o n z e p t


Das Benachrichtigungskettenkonzept dient der Kommunikation beliebig
vieler Module, insbesondere der Benachrichtigung anderer Module von
graphischen Aktionen.

Eine Benachrichtigungskette ist eine Kette von Benachrichtigungsfunktionen
der Form TNotifyProc. Sie implementieren eine solche Funktion, wenn ein
Modul auf eine bestimmte Nachricht reagieren soll. Mit Hilfe von
Gr.InstallNotifyProc installieren Sie eine Funktion in die Kette Chain;
mit Gr.UninstallNotifyProc entfernen Sie die Funktion wieder aus der Kette.
Die Funktion wird entsprechend ihrer Qualitt in die Kette einsortiert.

Das Standardverhalten (Reaktion auf Systemnachrichten) einer Benachrichti-
gungsfunktion wird von Gr.DefaultNotify bernommen. Eine Benachrichtigungs-
Funktion mu die fr sie wesentlichen Nachrichten bearbeiten und danach
DefaultNotify aufrufen.

Im folgenden sind die DefaultNotify-Parameter angegeben:

Parameter	Beschreibung
	
Notice		Die an die Funktion bergebene Nachricht.
Info		Die an die Funktion bergebenen Informationen.
ThisProc	Die Benachrichtigungsfunktion.
NextProc	Eine globale Variable des Typs TNotifyProc, die einer
		Benachrichtigungsfunktion eindeutig zugeordnet ist.
Quality		Die Qualitt der Benachrichtigungsfunktion.


H i n w e i s e


1. Unterschied zwischen BytesPerLine und RealBytesPerLine


   Bestimmte Programme allozieren Vga-Restspeicher und leiten Graphikausgaben
   in einen so erhaltenen Puffer um. Dazu mu mitunter die Anzahl der Bytes
   pro Zeile und das aktive Segment verndert werden. Diese scheinbare
   Bildschirmbreite wird in BytesPerLine geschrieben; RealBytesPerLine bleibt
   jedoch konstant.

   Daher sollten Graphikroutinen prinzipiell BytesPerLine nutzen; Maustreiber
   hingegen werden RealBytesPerLine einsetzen.

2. "Exotische" Graphikmodi


   Falls Ihre Graphikkarte "exotische" Modi untersttzt, knnen Sie die Para-
   meter des Graphikmodus auch manuell setzen, so da Programme, die Gr
   nutzen, auch mit Ihrem Modus zusammenarbeiten.

   Durch den Einsatz einer Bildspeicher-Mapping-Funktion kann die Unit Gr
   beliebig viel Bildspeicher untersttzen. Um einen greren Speicher-
   bereich zu verwenden, benutzen Sie hhere Granularitten denn 16 Bytes.

3. Untersttzung einer Nicht-VESA-SuperVGA-Karte

   Wenn Ihre Graphikkarte den Modus grSvgaStd (800 x 600 x 16) untersttzt
   und Sie die Graphik durch einen Aufruf von InitGraphProc initialisieren
   wollen, verwenden Sie z.B. eine Unit folgender Gestalt:

     unit MySvga;

     interface
     implementation

     uses Gr;

     const
       qInitSvgaGraph = 20;		{ <-- Qualitt, grer als 10 }

     procedure InitSvgaGraph; far;
     begin
       If GrMode = grSvgaStd
	 then SetBiosMode($52)		{ <-- BIOS-Nummer }
	 else InitBiosGraph
     end;

     begin
       if qInitSvgaGraph > qInitGraphProc then Begin
	 qInitGraphProc := qInitSvgaGraph;
	  InitGraphProc :=  InitSvgaGraph
       End
     end.

   Bitte beachten Sie, da Sie mittels der VESA-Unit beliebige SuperVGA-
   Karten, die ein VESA-BIOS oder einen VESA-Treiber haben, verwenden
   knnen, ohne eine solche Spezial-Unit zu schreiben. Auerdem untersttzt
   diese Unit smtliche Modi (wie 1024x768 und die 256-Farben-Modi).
