VESAGU 2.1 02/12/2004 VESAGU je grafická khihovna určená pro pascal. Obsah: Předmluva Požadavky Psaním grafiky pod pascalem Složení VesaGU2 Popis snadartních funkcí Předmluva: Knihovnu jsem naprogramoval kvůli tomu, že se knihovny pro 16 bitový pascal těžko shánějí.za dlouhou dobu mého hledání jsem jich našel velice málo.je to zapříčiněno tím, že grafika psaná v 16 bitovém compilátoru jako je pascal je pomalejší než pod 32 bitovými jako Delphi,TMT Pascal, Free Pascal nebo i C++. Vidíte tedy, že hru vysokých grafických požadavků pomocí VESAGU nenaprogramujete.ale VESAGU je zaručeně lepší než knihovny BGI z Pascalu. VESAGU2 je teprve druhá verze takže jestli budete mít zájem o přidělání nějakých dalších funkcí nebo budete mít problémy s obsluhou tak určitě napište. Honza.Pofider@seznam.cz Knihovna VESAGU podporuje rozlišení: 640x480x256 barev 800x600x256 1024x768x256 320x200x65536 640x480x65536 800x600x65536 1024x768x65536 Dále jsem přiložil knihovnu BMPGU pro prací s BMP ( pracuje pouze v kombinaci s VESAGU ) Požadavky: Hardware: -VESA VBE 1.1 or later ( toto by měl mít snad každý počítat) -386 nebo lepší počítač Software: -Turbo Pascal nebo Borland Pascal compiler Psaní grafiky pod Pascalem: Myslím si, že bude dobré seznámit vás s nějakými termíny a trochu se pokusit popsat jak to vlastně všechno funguje. Ještě
bych chtěl upozornit, že nejsem nějaký profík, tak že následující text může obsahovat nějaké ( asi hodně ) chyby. Co je to vlastně VESA? VESA ( Video electronic standard asociation ) vznikla iniciativou výrobců SVGA karet jako odezva na nepřehlednou situaci v práci a inicializaci grafických módů. S vesou se dá pracovat jak pomocí 32 tak 16 bitového compilátoru. Jak jste asi uhodli tak s 32 bitovým je to rychlejší.této metodě se říká lfb ( linear frame buffer ), její výhoda je v tom, že zde je jiný systém adresace takže se dá vytvořit potřebně velké pole do kterého se vejde každá barva pixelu. V 16 bitovém compilátoru je způsob adresace takový, že 16 bitů je určeno pro část zvanou segment a část zvanou offset. Jelikož offset muže být velký maximálně 65536 bytů ( 2 na 16) tak můžeme přistupovat k paměti nebo poli velkém pouze 65536. Co ale s tím když máme rozlišení třeba 640x480x8bpp a potřebuje přistupovat k paměti velké 312 320 ( 640x480 )? Je jediná možnost požít funkce VESA. Ta se dá volat pomocí přerušení, ale to je asi 5 krát pomalejší než s voláním na far adresu vrácenou VESOU při inicializaci. Tak,že se nám jakoby video paměť ( vram 0a000h) rozdělí na části po 65536 bytech zvané banky.jednotlivé pixely by se tedy zapisovaly tak, že by se nejprve zavolala procedura na změnění banku a pak by se zapsala barva na adresu (MaxX*Y+X). No je to sice pěkné ale násobení je pomalé tak že je lepší použít bitových rotací shl a shr.to má ale zase nevýhodu, že se výpočty mění při každém rozlišení.teď by jsme měli hotové pokládání pixelů. Dále je důležité do knihovny zařadit stránkování ( page fliping ). To slouží hlavně pro tvorbu her a animací ( je to opravdu nezbytné ). Když třeba zkusíte napsat nějaký cyklus kde stále mažete obrazovku a něco vykreslujete tak vám obraz stále bliká což není nejhezčí. Musí se proto požít další funkci VESY.Pracuje se s tím tak, že vždy zapisujete do jedné části vram a zobrazujete jinou a na konci cyklu třeba příkazem ShowPage tyto stránky přehodíte. To by byl tak ten základ. Je tu ještě ale pár urychlení. Tak třeba když vykreslujete horizontální čáru tak stále zvyšujete ( nebo snižujete offset ) a ptáte se jestli jsme nevstoupily do jiného banku protože, protože přechody banků nejsou vždy na konci řádku ale klidně i uprostřed, což není moc efektivní a zpomaluje to.je na to taková finta. Pomocí další funkce VESA si nastavíme logickou délku řádku na 1024 ( jako kdyby MaxX bylo 1024, ale pouze pro výpočet adresy a banku a ne zobrazování ). Pak bude každá banka obsahovat 64 řádků, takže se už při kresbě horizontální čáry nemusíme starat jestli jsme nepřekročily banku. A dále je dobré, že při jakémkoliv rozlišení se adresa pixelu vypočítá stejně ( 1024*Y+X) a adresa banku ( 1024*Y /64, nebo spíš shr 6 ). Složení VESAGU2 VesaGU2.pdf - tento soubor VesaGu2.pas zdrojový kód knihovny BMPGu.pas zdrojový kód knihovny pro načítání BMP textures adresář s texturama pro některé examply fonts adresář s fonty pro některé examply examples adresář s příklady
Popis standartních funkcí Knihovna VesaGU InitGraf( mode:word) Inicializuje grafický mód. mode-číslo graf. modu použitelné konstanty: _640x480x8bpp _800x600x8bpp _1024x768x8bpp _320x200x16bpp _640x480x16bpp _800x600x16bpp _1024x768x16bpp (-----------------------------------------------) InitText Vrátí se zpět do textového režimu. (-----------------------------------------------) InitVirtual Aktivuje virtuální stránku pro stránkováni. Stránkování viz. EXAMPLES (------------------------------------------------) ShowPage Zobrazí virtuální stránku (-------------------------------------------------) SetViewPort( X1,Y1,X2,Y2:Integer) Nastaví zobrazovanou část plochy. X1,Y1-souřadnice levého horního rohu X2,Y2-souřadnice pravého dolního rohu K sořadnicím se dá také přistupovat pomocí proměné VievPort (-------------------------------------------------) NastavPosuv ( XPos,YPos:Word ) Změní souřadnice zobrazované části ve vram. (----------------------------------------------------)
PutPixel(X,Y:integer;Col:Byte) Položí pixel na X,Y. Funguje pouze pod 8bpp. (--------------------------------------------------) PutPixelRGB(X,Y:integer;r,g,b:byte) Položí pixel na X,Y o složkách barvy r,g,b. Funguje pouze pod 16bpp. (---------------------------------------------------) Toto bude snad jasné ( když tak napište ). Příkazy (mimi Move_To) které obsahujou "RGB" pracujou při 16bpp.Ostatní jsou 8bpp. Line(x1, y1, x2, y2 : integer; color : byte); LineRGB(x1, y1, x2, y2 : integer;r,g,b:byte); Move_To(X,Y:Integer); Line_To(X,Y:Integer;Col:Byte); Line_ToRGB(X,Y:Integer;R,G,B:Byte); Circle(x,y,r : integer; color : byte); CircleRGB(x,y,r : integer; CR,G,B: byte); Elipsa(xs,ys,r,procent:word;color:byte); ElipsaRGB(xs,ys,r,procent:word;CR,G,B:byte); Bar(X1,Y1,X2,Y2:Integer;Col:Byte); BarRGB(X1,Y1,X2,Y2:Integer;R,G,B:Byte); HLine(X1,X2,Y:Integer;Col:Byte); HLineRGB(X1,X2,Y:Integer;R,G,B:Byte); Polygon(X1,Y1,X2,Y2,X3,Y3,X4,Y4 : integer;color:word); PolygonRGB(X1,Y1,X2,Y2,X3,Y3,X4,Y4 : integer;r,g,b:byte); SetPal(Col,r,g,b:byte) Nastaví barvu v paletě ze složek r,g,b. Funguje pouze pro 8bpp. GetPal(Col:byte;var r,g,b:byte) Získá složky barvy col s palety. SavePal(Var Pal:TPalete) Uloží aktuální paletu do "Pal" RestorePal(Pal:TPalete) Nastaví "Pal" jako aktuální.
BlackPal Nastaví všechny barvy palety na černou. ( používá se v kombimaci s FadeUp. FadeDown(Speed:Byte) Potsupně zatmí obrazovku. "Speed":čím větší, tím pomalej FadeUp(Pal:TPalete;Speed:Byte) Postupně rozetmí obrazovku do palety "Pal". SetBasicPal Nastaví základní paletu jako aktuální. SetTextStyle(Font : string;smer,vel:byte) Nastaví jako aktuální font "Font". Můžete využít konstant: TriplexFont : string[8] = 'trip.chr'; SmallFont : string[8] = 'litt.chr'; SansSerifFont : string[8] = 'sans.chr'; GothicFont : string[8] = 'goth.chr'; SetTextJustify(horiz,vert : word) Nastaví směr textu. Můžete využít těchto konstnt: HorizDir : byte = 0; VertiDir : byte = 1; LeftText : byte = 0; CenterText : byte = 1; RightText : byte = 2; BottomText : byte = 0; TopText : byte = 2; (-----------------------------------------------------------) InitMouse Inicializuje myš. (-----------------------------------------------------------) DoneMouse Zruší dynamickou proměnou pro cursor myši.
(-----------------------------------------------------------) SetMPos(X,Y:Word) Nastaví pozici myši na obrazovce. (-----------------------------------------------------------) MPhase; Překreslí myš a zisti její stav. Informace ulozi do: tlac:integer; curorx,cursor:integer; SetMSens(Speed:Integer) Nastaví citlivos myši. (-------------------------------------------------------------) SetMArea(X1,Y1,X2,Y2) Nastaví oblast myši z které nemůže ven. (-------------------------------------------------------------) IsMInArea(X1,Y1,X2,Y2):Byte Zeptá se jestli myš je v oblasti X1,Y1 X2,Y2 a v jakém stavu. 0:není 1:je ale tlačitko není stisknuté 2:je i s levým tlačitkem 3:je i s pravým tlačitkem (--------------------------------------------------------------) Knihovna BMPGu (--------------------------------------------------------------) Load_BMP(Name:String;x,y:integer) Načte ze souboru 8 bitové BMP a zobrazí ho na obrazovku. (-----------------------------------------------------------------) Load_BMPRGB(Name:String;x,y:integer) Načte ze souboro 24 bitove BMP a zobrazí ho. (-----------------------------------------------------------------) Get_BMPRGB(Name:String:Word):Word; Načte ze souboru 24 bitové BMP a data uloží na segment touto funkcí vrácený.
(----------------------------------------------------------------) Show_BMPRGB(BMPSeg:Word;x,y:integer) Načte BMP ze segmentu vráceného předchozí funkcí -BMPSeg a zobrazího na monitor. (---------------------------------------------------------------) Get_BMP(Name:String):Word Nacte 8bitové BMP ze souboru a uloží jej na segment který vrací. (---------------------------------------------------------------------) Set_BMPPal(BMPSeg:Word;Colors:Byte) Nastaví paletu nactenou předchozí funkcí a spotřebuje colors barev. (---------------------------------------------------------------------) Show_BMP(BMPSeg;x,y:integer) Načte BMP ze segmentu vráceneho funkcí Get_BMP a zobrazí ho. (---------------------------------------------------------------------) Pofider