Borland Turbo Pascal / Turbo C BGI-Treiber fr TIGA V1.10 Graphik-Interface =========================================================================== (C) Copyright 1990 by Tree Soft Systems Rolf Bartz, West Germany Annastraáe 2b, D-5102 Wrselen, Fax: +49 2405 94986 BGIDEMO Programm (C) Copyright 1988 by Borland International, Inc. Benutzt mit freundlicher Genehmigung von Borland International, Inc. Die folgenden Dateien befinden sich auf Ihrer Diskette: TIGA.BGI BGI-Treiber fr TIGA V1.10 Graphik-Interface BGIPRIMS.RLM User extended primitives fr TIGA BGI BGIDEMO.EXE Demonstrations-Programm fr BGI-Treiber READMEGR.DOC Deutsche Dokumentation READMEUS.DOC Englische Dokumentation Untersttzte Graphikkarten ========================== Dieser BGI-Treiber untersttzt ALLE Graphikkarten, auf denen das TIGA Graphik Interface Version 1.10 implementiert ist. Die Aufl”sung und Anzahl der Farben ist vollkommen dynamisch und wird extern vom Anwender bestimmt. Der BGI-Treiber stellt sich dann automatisch auf die gewnschte Konfiguration ein. Wie Sie das TIGA Graphik-Interface fr Ihre Graphikkarte installieren, ist im Handbuch zu Ihrer Graphikkarte beschrieben. Dort steht auch, wie Sie zwischen den verschiedenen Betriebsmodi umschalten k”nnen (mit TIGAMODE). TIGA.BGI BGI-Treiber ==================== Dieser BGI-Treiber untersttzt ALLE verfgbaren TIGA Graphikmodi mit maximal 16384x16384 Punkten und 256 Farben. Der Treiber erkennt den mit TIGACD oder TIGAMODE eingestellten Defaultmode. Alle andere m”glichen Modi werden alternativ angeboten. Bitte denken Sie unbedingt daran, die TIGA Environment-Variable zu setzen, da sonst diverse TIGA Systemdateien und Systemprogramme nicht gefunden werden. Die Bedeutung der einzelnen Optionen ist in Ihrem TIGA Handbuch beschrieben. So setzt zum Beispiel die Zeile SET TIGA=-mC:\TIGA\SYSTEM -lC:\TIGA\LIBRARY -i0x7F die TIGA Systemdirectory auf C:\TIGA\SYSTEM, die TIGA Librarydirectory auf C:\TIGA\LIBRARY und den TIGA Interruptlevel auf INT 7EH. In der Systemdirectory mssen sich die TIGA Systemprogramme befinden, also insbesondere TIGALNK.EXE. In der Librarydirectory mssen sich die TIGA Librarymodule befinden, also insbesondere EXTPRIMS.RLM und BGIPRIMS.RLM. Es ist also wichtig, daá sich das mitgelieferte Modul BGIPRIMS.RLM bei der Initialisierung des TIGA Treibers entweder im aktuellen Directory oder in der TIGA Librarydirectory befindet. Es ist unbedingt empfehlenswert, das Modul in die Librarydirectory zu kopieren. Falls mehrere TIGA-Karten im System installiert sind, so k”nnen mehrere TIGA Communication Driver (TIGACD.EXE) parallel installiert werden, wobei jeder TIGACD einen anderen Interruptlevel haben muá. Die Handhabung ist jedoch (zumindest in einem Singletasking-System) sehr umst„ndlich, da ja immer nur eine Environmentvariable gesetzt und somit nur ein Treiber aktiv sein kann. In einem Multitasking-System k”nnen zwei verschiedene Prozesse problemlos auf zwei verschiedenen TIGA-Karten laufen. Die Zuordnung der TIGA-Modi auf die BGI Modusnummern ist wie folgt: Modus Karten ----- ---------------------------------------------------------------------- 1 Defaultmodus der TIGA-Karte 2 erster verfgbarer Modus der TIGA-Karte ... ... n+1 letzter (n-ter) verfgbarer Modus der TIGA-Karte Die BGI Modusnummer 1 verwendet also immer den extern vom Benutzer mittels TIGACD oder TIGAMODE zuletzt eingestellten Modus. Das Einbinden eines Treibers in Turbo Pascal ============================================ Fr Turbo Pascal mssen Sie den folgenden Code in Ihr Programm einfgen. Untersttzt wird Turbo Pascal Version 5.x. var GraphDriver: integer; (* Globale Variable fr InitGraph *) GraphMode: integer; (* Globale Variable fr InitGraph *) TIGADriverMode: integer; (* Globale Variable mit TIGA Modus *) (* Die AutoDetect-Funktion fr den TIGA Treiber. Jeder Treiber muá seine *) (* eigene AutoDetect-Funktion haben. Sie wird von InitGraph aufgerufen und *) (* muá die Nummer des Modus zurckliefern, in dem der Treiber aktiviert *) (* werden soll, oder grError, wenn dieser Treiber nicht benutzt werden soll. *) (*$F+*) function AutoDetectTIGA: integer (*$F-*); begin AutoDetectTIGA := TIGADriverMode end; procedure InitializeGraphics; var DriverNumber, ErrorCode: integer; begin (* ... anderer Code ... *) (* Trage TIGA Treiber in Tabelle ein und weise AutoDetect-Funktion zu. *) DriverNumber := InstallUserDriver ('TIGA', @AutoDetectTIGA); if GraphResult <> grOK then begin WriteLn ('Fehler beim Installieren des BGI-Treibers TIGA.'); Halt (1) end; (* Wenn der TIGA Treiber ber RegisterBGIDriver direkt in das Programm *) (* eingebunden werden soll, so muá dies an DIESER Stelle erfolgen. *) (* ... anderer Code, eventuell andere Treiber laden ... *) (* Initialisierung und Umschaltung in den Graphik-Modus, *) (* zum Beispiel TIGA Defaultmodus *) GraphDriver := Detect; (* benutze AutoDetect *) TIGADriverMode := 1; (* TIGA Treiber in Defaultmodus *) (* ... alle anderen eventuell geladenen Treiber ausschalten ... *) (* Zu diesem Zeitpunkt mssen circa 48KB freier DOS Speicher vorhanden *) (* sein, um den TIGA Linker TIGALNK.EXE ausfhren zu k”nnen. *) InitGraph (GraphDriver, GraphMode, ''); ErrorCode := GraphResult; if ErrorCode <> grOK then begin WriteLn ('Fehler im Graphiksystem: ', GraphErrorMsg (ErrorCode)); Halt (1) end; (* ... anderer Code ... *) end; Das Einbinden eines Treibers in Turbo C ======================================= Fr Turbo C mssen Sie den folgenden Code in Ihr Programm einfgen. Untersttzt wird Turbo C Version 2.0 und Turbo C++ Version 1.0. int GraphDriver; /* Globale Variable fr initgraph */ int GraphMode; /* Globale Variable fr initgraph */ int TIGADriverMode; /* Globale Variable mit TIGA Modus */ /* Die AutoDetect-Funktion fr den TIGA Treiber. Jeder Treiber muá seine */ /* eigene AutoDetect-Funktion haben. Sie wird von initgraph aufgerufen und */ /* muá die Nummer des Modus zurckliefern, in dem der Treiber aktiviert */ /* werden soll, oder grError, wenn dieser Treiber nicht benutzt werden soll. */ int huge AutoDetectTIGA (void) { return (TIGADriverMode); } void InitializeGraphics (void) { int DriverNumber; int ErrorCode; /* ... anderer Code ... */ /* Trage TIGA Treiber in Tabelle ein und weise AutoDetect-Funktion zu. */ DriverNumber = installuserdriver ("TIGA", AutoDetectTIGA); if (graphresult () != grOk) { printf ("Fehler beim Installieren des BGI-Treibers TIGA.\n"); exit (1); }; /* Wenn der TIGA Treiber ber registerbgidriver direkt in das Programm */ /* eingebunden werden soll, so muá dies an DIESER Stelle erfolgen. */ /* ... anderer Code, eventuell andere Treiber laden ... */ /* Initialisierung und Umschaltung in den Graphik-Modus, */ /* zum Beispiel TIGA Defaultmodus *) GraphDriver = DETECT; /* benutze AutoDetect */ TIGADriverMode = 1; /* TIGA Treiber in Defaultmodus */ /* ... alle anderen eventuell geladenen Treiber ausschalten ... */ /* Zu diesem Zeitpunkt mssen circa 48KB freier DOS Speicher vorhanden */ /* sein, um den TIGA Linker TIGALNK.EXE ausfhren zu k”nnen. */ initgraph (&GraphDriver, &GraphMode, ""); ErrorCode = graphresult (); if (ErrorCode != grOk) { printf ("Fehler im Graphiksystem: %s\n", grapherrormsg (ErrorCode)); exit (1); }; /* ... anderer Code ... */ } BGIDEMO Beispielprogramm fr BGI-Treiber ======================================== Dies ist eine modifizierte Version des BGIDEMO Programms, das von Borland mit Turbo Pascal 5.5 ausgeliefert wird, um die F„higkeiten der BGI-Treiber zu demonstrieren. Es wurde so angepaát, daá es jetzt installierbare Treiber unter- sttzt. Der Aufruf lautet: BGIDEMO Treiber [Modus [Betriebsart]] wobei "Treiber" der Name des BGI-Treibers ist (TIGA), und "Modus" die Nummer des verlangten Modus. Wenn Sie "Modus" weglassen, bekommen Sie eine Liste aller verfgbarer Modi. Dies funktioniert allerdings nur mit unseren BGI-Treibern! "Betriebsart" ist eine Besonderheit fr TIGA-Treiber: hiermit kann zwischen den Betriebsarten "kompatibel" und "schnell" umgeschaltet werden. Geben Sie eine "0" fr "kompatibel" an oder eine "1" fr "schnell". Erweiterungen ============= Alle unsere BGI-Treiber haben einen "Info Modus": Modus Nummer 0. Wenn Sie mit der normalen InitGraph Prozedur den BGI-Treiber im Modus 0 aktivieren, so wird zwar das gesamte Graphiksystem aktiviert, aber es findet KEINE Umschaltung des Videomodus statt. Sie k”nnen daher problemlos die GetModeRange-Prozedur und die GetModeName-Funktion aufrufen, um Informationen ber die verfgbaren Modi des BGI-Treibers zu erhalten, ohne wirklich in einen Modus umschalten zu mssen. Die spezielle Funktion GetModeName (0) liefert den Namen des Treibers zurck, zum Beispiel "BGI Driver TIGA V2.00". Der BGI-Treiber TIGA hat eine weitere Sonderfunktion. Leider ist das Borland Graphics Interface (BGI) haupts„chlich fr "normale", "dumme" Videokarten ausgelegt. Viele M”glichkeiten eines eigenst„ndigen Graphikprozessors wie zum Beispiel des TMS 34010 oder eines intelligenten Graphik-Interfaces wie TIGA k”nnen gar nicht ausgenutzt werden. Deshalb gibt es bei dem TIGA BGI-Treiber zwei Betriebsarten. Die normale, standardm„áig eingestellte Betriebsart ist "kompatibel". Hier verh„lt sich der Treiber so, wie man es (leider) von anderen BGI-Treibern her gewohnt ist. Im den Betriebsmodi "TIGAxxx" werden spezielle F„higkeiten des TIGA Interfaces ausgenutzt, die die Performance sehr erh”hen. Dadurch ergeben sich jedoch Inkompatibilit„ten. Es stehen folgende Flags zur Verfgung: TIGACircles: ------------ Zeichnet Kreise, Ellipsen und B”gen statt ber die normale Emulationsroutine direkt mit TIGA. Leider funktioniert dadurch die Funktion GetArcCoords nicht mehr, es werden falsche Werte zurckgegeben. TIGAPalette255: --------------- Im Normalfall sind die RGB-Werte, die an die Prozedure SetRGBPalette bergeben werden, im Bereich 0..63 angesiedelt, wobei 0 keine und 63 maximale Intensit„t darstellt. Dies geschieht aus Grnden der Kompatibilit„t zu den VGA-Treibern, die nur 6 bit pro R, G und B verarbeiten k”nnen. M”chte man alle 8 bit aus- nutzen, so kann hiermit der Bereich auf 0..255 ausgedehnt werden. Die Umschaltung zwischen den Modi erfolgt ber die Prozedur SetWriteMode. Am besten deklarieren Sie folgende Konstanten in Ihrem Programm: const CompatibilityMode = $00 SHL 3; TIGACircles = $01 SHL 3; TIGAPalette255 = $02 SHL 3; Diese Konstante(n) mssen Sie dann bei JEDEM Aufruf von SetWriteMode zu dem Parameter der Prozedur dazuaddieren, also zum Beispiel: SetWriteMode (XORPut + TIGACircles + TIGAPalette255); (* w„hlt Schreibmodus "XOR", schnelle Kreise und erweiterte Palette *) SetWriteMode (CopyPut + CompatibilityMode); (* setzt den Schreibmodus auf "Copy" und die Betriebsart auf "kompatibel" *) SetWriteMode (NOTPut); (* setzt den Schreibmodus auf "NOT" und die Betriebsart auf "kompatibel" *) Die Umschaltung zwischen den Betriebsmodi kann jederzeit erfolgen. ACHTUNG: -------- Jeder Aufruf von InitGraph oder SetGraphMode setzt den Betriebsmodus auf "kompatibel". Nach jedem InitGraph und SetGraphMode muá also ein explizites SetWriteMode (CopyPut + TIGACircles) folgen, wenn der Treiber zum Beispiel im Modus "schnelle Kreise" betrieben werden soll. Einschr„nkungen und Modifikationen ================================== Zum ordnungsgem„áen Funktionieren des Treibers muá das TIGA-Interface geladen sein. Dieses ist meistens im Lieferumfang Ihrer Graphikkarte enthalten. Man kann feststellen, ob TIGA geladen ist, indem man den Treiber im Info-Modus 0 initialisiert und dann die Funktion GetMaxMode aufruft. Ist nur der Info- Modus m”glich, so ist kein TIGA-Interface geladen. Arc, Circle, Ellipse, FillEllipse, PieSlice, Sector: ---------------------------------------------------- Diese Funktionen k”nnen wahlweise ber die Emulationsroutine (im Betriebsmodus "CompatibilityMode") oder direkt ber TIGA (im Betriebsmodus "TIGACircles") ausgefhrt werden. Die direkte Ausfhrung ber TIGA ist wesentlich schneller, hat jedoch das Problem mit GetArcCoords (siehe dort). DetectGraph: ------------ Dies ist eine interne Funktion des Borland Graphiksystems. Sie kann keine TIGA Karten erkennen, sondern ruft die zu einem installierten Treiber geh”rige AutoDetect Funktion auf. FillPoly: --------- Wenn die FillPoly Funktion direkt ber TIGA ausgefhrt werden soll, so wird vom TIGA Graphics Manager ein Arbeitsspeicherbereich (WorkSpace) auf der TIGA-Karte ben”tigt, der so groá sein muá wie eine 1 bit tiefe Bitmap von der Gr”áe des Bildschirms. Auf manchen TIGA-Karten (insbesondere solchen mit minimaler Speicherausstattung oder extrem hohen Aufl”sungen) steht dieser Platz nicht zur Verfgung. Dort wird dann automatisch eine langsamere Emulationsroutine ver- wendet. GetArcCoords: ------------- Wegen eines Bugs im Borland Graphiksystem wird diese Funktion leider nicht bis in das BGI weitergereicht. Daher funktioniert sie nur zusammen mit der Emula- tionsroutine fr Kreis- und Ellipsenb”gen. Im Betriebsmodus "TIGACircles" werden falsche Werte zurckgeliefert. GetAspectRatio: --------------- Die Aspectratio wird fr jedem Modus dynamisch vom TIGA Treiber berechnet. Dabei wird bei GetMaxX <= GetMaxY ein Bildschirmseitenverh„ltnis von 4:3 (Landscape-Monitor) angenommen, und sonst 3:4 (Portrait-Monitor). Dies kann in Sonderf„llen zu Fehlberechnungen fhren, z.B. wenn 512x768 mittig auf einem Landscape-Monitor dargestellt werden. GetDriverName: -------------- Wegen eines Bugs in der GRAPH Unit liefert die Funktion GetDriverName nur einen Leerstring zurck, wenn ein installierbarer BGI-Treiber benutzt wird. Dies tritt nur bei Turbo Pascal auf. GetPalette (Palette), GetDefaultPalette (Palette): -------------------------------------------------- Diese Funktion ist eigentlich nur fr EGA und VGA-Karten in den 16-Farben-Modi gedacht. Aufgrund eines Bugs im Borland Graphiksystem muá die Anzahl der Paletteneintr„ge in Palette immer 16+1 betragen. Der TIGA Treiber liefert hier aus Kompatibilit„tsgrnden die Defaultpalette einer EGA/VGA-Karte zurck. Siehe auch SetPalette, SetAllPalette. InitGraph, SetGraphMode: ------------------------ Denken Sie bitte daran, daá jeder Aufruf von InitGraph oder SetGraphMode die Betriebsart des TIGA Treiber auf "CompatibilityMode" zurcksetzt. ACHTUNG: Beim Aufruf von InitGraph oder SetGraphMode findet ein Zugriff auf den TIGA Linker TIGALNK.EXE, den TIGA Graphikmanager TIGAGM.OUT, die erweiterten TIGA Primitiven EXTPRIMS.RLM und auf die BGI Primitiven BGIPRIMS.RLM statt. Alle diese Dateien mssen ordnungsgem„á installiert sein. WICHTIG: Da die TIGA Module erst zur Laufzeit des Programms geladen werden, muá freier DOS Speicher zum Aufruf des TIGA Linkers TIGALNK.EXE als Unterprozeá vorhanden sein. Die meisten Versionen von TIGALNK.EXE ben”tigen circa 48KB. In Turbo Pascal erreichen Sie dies z.B. durch Verwendung der $M Directive und Einschr„nkung des Heaps (unter der Programmier-Oberfl„che: siehe Menpunkt Options/Compiler/Memory Sizes). InstallUserDriver: ------------------ Diese Funktion tr„gt den Namen des BGI Treibers in eine interne Tabelle des Borland Graphiksystems ein. Diese Funktion ist NICHT dafr verantwortlich, den BGI Treiber zu laden, dies geschieht erst durch InitGraph (falls der BGI Treiber nicht zwischenzeitlich registriert wird). Siehe das Beispielprogramm unter "Einbinden eines Treibers". OutText, OutTextXY: ------------------- Die oberen 128 Zeichen des DefaultFont werden durch die Tabelle auf INT 1FH bestimmt (die Tabelle, die z.B. mit GRAFTABL geladen wird). Diese Zeichen k”nnen nach Initialisierung (InitGraph) des TIGA Treibers nicht mehr ge„ndert werden, da die Tabelle aus Geschwindigkeitsgrnden auf die TIGA-Karte kopiert wird. DefaultFont Zeichen ab CharSize 2 (16x16) k”nnen vom TIGA Interface nicht mehr transparent gezeichnet werden, d.h. die Zeichen werden in der aktuellen Vorder- grundfarbe auf einem Rechteck in Hintergrundfarbe gezeichnet. Diese Hinter- grundfarbe kann mit der Funktion SetBkColor eingestellt werden. RegisterBGIDriver: ------------------ Auch der TIGA Treiber kann mit RegisterBGIDriver direkt in das Programm ein- gebunden werden. Man beachte, daá TROTZDEM die Funktion InstallUserDriver benutzt werden muá, da der TIGA Treiber dem Borland Graphiksystem sonst nicht bekannt ist. Die Funktion RegisterBGIDriver muá NACH InstallUserDriver und VOR InitGraph aufgerufen werden. Die Turbo Pascal und Turbo C Referenz-Handbcher beschreiben, wie man mittels BINOBJ.EXE oder BGIOBJ.EXE eine BGI-Datei in eine OBJ-Datei umwandelt und wie man OBJ-Dateien zu einem Pascal oder C Programm hinzulinkt. Siehe das Beispielprogramm unter "Einbinden eines Treibers". ACHTUNG: Es kann nur die Datei TIGA.BGI zum Programm hinzugelinkt werden, die Datei BGIPRIMS.RLM muá vom TIGA Linker TIGALNK.EXE gesucht und gelesen werden k”nnen, daher muá sie als normale Datei vorhanden sein. Sie sollte jedoch in die TIGA Librarydirectory kopiert werden. SetActivePage, SetVisualPage: ----------------------------- Diese Funktionen werden vom TIGA BGI untersttzt, sofern mehrere Bildschirm- seiten zur Verfgung stehen. Dies ist je nach Karte und Aufl”sung verschieden. Leider gibt es keine elegante M”glichkeit festzustellen, wieviele Bildschirm- seiten vorhanden sind. Man muá es einfach ausprobieren (z.B. mit PutPixel und GetPixel). SetAllPalette (Palette): ------------------------ Diese Funktion ist eigentlich nur fr EGA und VGA-Karten in den 16-Farben-Modi gedacht. Aus Kompatibilit„tsgrnden werden Aufrufe von SetAllPalette automa- tisch intern in Aufrufe von SetRGBPalette umgewandelt. Aufgrund eines Bugs im Borland Graphiksystem muá die Anzahl der Paletteneintr„ge in Palette immer 16+1 betragen. Die Eintr„ge 0..15 „ndern dabei die unteren 16 Paletteneintr„ge. Die in Palette angegebenen Farben beziehen sich auf die 64 EGA-Standardfarben (0..63). Die TIGA Palette wird dann auf die jeweils zugeh”rigen RGB-Werte programmiert. Die Bildschirmrandfarbe (Eintrag 16) wird ignoriert, da diese ber TIGA nicht beeinfluát werden kann. Direkte EGA/VGA-BIOS-Aufrufe funktionieren nicht, da es sich nicht um eine EGA/VGA-Karte handelt. SetBkColor (Color): ------------------- Diese Funktion setzt bei einer CGA-Karte und bei manchen EGA/VGA-Karten die Bildschirmrandfarbe. Die Bildschirmrandfarbe l„át sich unter TIGA nicht beeinflussen. Vermeiden Sie bitte die Benutzung der Funktion SetBkColor. Im original EGAVGA.BGI setzt diese Funktion als Nebeneffekt den Paletten- eintrag 0 auf Color. Benutzen Sie dazu bitte stattdessen die Funktion SetPalette (0, Color). Im TIGA Treiber wird diese Function dazu benutzt, die Hintergrundfarbe fr DefaultFont Zeichen ab CharSize 2 (16x16) zu bestimmen, da diese vom TIGA Interface nicht mehr transparent gezeichnet werden k”nnen, d.h. die Zeichen werden in der aktuellen Vordergrundfarbe auf einem Rechteck in Hintergrund- farbe gezeichnet. Diese Hintergrundfarbe wird mit der Funktion SetBkColor eingestellt. SetPalette (ColorIndex, Color): ------------------------------- Diese Funktion ist eigentlich nur fr EGA und VGA-Karten in den 16-Farben-Modi gedacht. Aus Kompatibilit„tsgrnden werden Aufrufe von SetPalette automatisch intern in Aufrufe von SetRGBPalette umgewandelt. ColorIndex gibt dabei die Nummer des Paletteneintrags an, der ge„ndert werden soll. Color spezifiziert eine der 64 EGA-Standardfarben (0..63). Die TIGA Palette wird dann auf den zugeh”rigen RGB-Wert programmiert. Direkte EGA/VGA-BIOS-Aufrufe funktionieren nicht, da es sich nicht um eine EGA/VGA-Karte handelt. SetRGBPalette (ColorIndex, RedValue, GreenValue, BlueValue): ------------------------------------------------------------ Die Palette unter TIGA sollte nur mit SetRGBPalette ge„ndert werden. ColorIndex ist die Nummer des Paletteneintrags, der ge„ndert werden soll. RedValue, GreenValue und BlueValue sind die Komponenten der Farbe. Aufgrund eines Bugs im original Borland EGAVGA.BGI werden dort nur die unteren 6 bit von RedValue, GreenValue und BlueValue benutzt. Der Wertebereich ist damit auf 0..63 eingeschr„nkt. Aus Kompatibilit„tsgrnden wird im TIGA Treiber der gleiche Wertebereich benutzt. Mit dem Flag "TIGAPalette255" (siehe oben) kann der Wertebereich jedoch auf 0..255 ge„ndert werden. Direkte VGA-BIOS-Aufrufe funktionieren nicht, da es sich nicht um eine VGA-Karte handelt. SetWriteMode: ------------- Mit dieser Funktion kann der Betriebsmodus des TIGA Treibers eingestellt werden. Siehe unter "Erweiterungen".