Hlavní navigace

SVGAlib: jemnější nastavení

20. 8. 2004
Doba čtení: 3 minuty

Sdílet

Dnešní článek se bude zabývat funkcemi, které nám umožní další "jemnějsí" nastavení, potřebná k práci s svgalib.
 void vga_disabledriverreport(void);

Knihovna svgalib tiskne jméno detekovaného hardwaru, grafický mód a další informace na výstup. Tyto zprávy by mohly rušit „atmosféru“ programu, proto je můžete touto funkcí zakázat.

 int vga_claimvideomemory(int m);

Tato funkce nastaví množství videopaměti v bytech, která má být uložena, když program dočasně přejde do textového módu. Funkce je využitelná, pokud používáte více než jednu obrazovku (screen) videopaměti. Vrací nenulovou hodnotu, pokud není požadované množství paměti k dispozici.

 void vga_safety_fork(void (*shutdown_routine));

V případě havárie programu se může stát, že nebude správně obnoven textový mód. Chcete-li tomuto problému zamezit, zavolejte funkci jako první vga_ funkci (funkce sama spustí grafický režim). Jedinou nevýhodou funkce je, že aby pracovala korektně, musí zvýšit iopl level na 3.

 void vga_setchipsetandfeatures(int chipset, int par1, int par2); 

Nastaví čipset a nepoviné parametry (jako přesný typ čipsetu a množství instalované video paměti). Funkce pracuje podobně jako vga_setchipset().

void vga_setdisplaystat(int a);

Nastaví počáteční adresu paměti pro aktuální obrazovku na a. Adresa je hodnota offsetu pixelů od počátku videopaměti (jiný případ jsou highcolor a truecolor módy, jejichž jednotka je 1 byte.). Funkce může být použito pro page-flipping a virtual desktop scrolling. Funkce však nepracuje s 16barevnými módy.

void vga_setlogicalwidth(int l);

Nastaví šířku řádky scanline na l bytů. Předávaná hodnota musí být násobkem 8.

int vga_setlinearaddressing(void);

Přepne do lineárního adresovacího módu. Funkce vrací velikost mapovaného framebufferu, pokud dopadla úspěšně, jinak –1.

void vga_setmodeX(void);

Pokusí se nastavit uspořádání paměti jako u X. Používá se pro módy s 256 barvami, které používají více než 256 KB paměti (např. 320×200×256 nebo 640×400×256). Obvyklejší módy, 320×240×256 atd., jsou defaultně Mode X-like (tj. paměť je již uspořádána a nemusíte na tuto funkci ani pomyslet).

Paměťové uspořádání „X-like“ znamená, že paměť je organizována do čtyř stránek a že nejvyšší pixely 0, 1, 2, 3 jsou uloženy jako první do stránek 0, 1, 2, 3. Pixely 4, 5, 6, 7 jsou uloženy až na druhém místě ve stránkách 0, 1, 2, 3.

Jiné módy mají pixely 0, 1, 2, 3 uloženy ve stránce 0 a používají další stránky pouze v případě, kdy je první přeplněna. Mnoho SVGA módů pracuje tímto způsobem.

int vga_screenoff(void);
int vga_screenon(void);

Funkce zapínají nebo vypínají generování videosignálu. Na některých grafických deskách SVGA je paměťový přístup rychlejší, pokud není signál generován. Ne všechny desky umožňují vypnutí signálu. VŽDY je vrácena návratová hodnota 0.

int vga_getmousetype(void);

Vrací typ myši nakonfigurovaný v /etc/vga/libvga­.conf. Vrácenou hodnotu vymaskujte s hodnotou MOUSE_TYPE_MASK, získáte tak typ myši, který je nastaven v konfiguračním souboru. Všechny důležité proměnné a konstanty jsou uloženy v hlavičkovém souboru<vgamou­se.h>.

int vga_getcurrentchipset(void);

Funkce zjistí aktuálně nastavený čipset (ať je nastaven implicitně při inicializaci knihovny, nebo explicitně programátorem).

UX DAy - tip 2

int vga_getmonitortype(void);

Někdy je také důležité vědět, kolik toho ještě monitor unese. Tato funkce vrací typ monitoru nastavený v souboru /etc/vga/libvga­.config. Funkce může vrátit jednu z následujících hodnot:

  • MON640_60 – standardní VGA – 640×480 na 60Hz
  • MON800_56 – zastaralé SVGA – 800×600 na 56Hz
  • MON1024_43I – low-end SVGA – 1024×768 na 43Hz
  • MON800_60 – SVGA – 800×600 na 60Hz
  • MON1024_60 – SVGA non-interlaced – 1024×768 na 60Hz
  • MON1024_70 – SVGA high frequency – 1024×768 na 70Hz
  • MON1024_72 – 1024×768 na 72Hz a vyšších frekvencích

To by bylo pro dnešek vše. Příště se podíváme na další zajímavou funkci, která nám umožní „pokročilé“ nastavení grafického subsystému.

Byl pro vás článek přínosný?