Hlavní navigace

SVGAlib: kopírování dat ze systémové paměti do video paměti

Jakub Matys

V dnešním dílu se podíváme na funkce pro kopírování dat ze systémové paměti do video paměti, na funkce nastavující uživatelskou paletu barev a začneme rozebírat používání myši.

Tyto funkce slouží ke kopírování dat ze systémové paměti do video paměti.

void vga_copytopla­nar256(unsigned char *virtual, int pitch, int voffset, int vpitch, int w, int h);

Kopíruje část obrazovky v systémové paměti na adrese *virtual do video paměti (Mode X). pitch je logická šířka virtuální obrazovky (v pixelech), voffset je adresový offset videopaměti,vpitch je šířka řádku obrazovky. h a w jsou šířka a výška pole, které se má kopírovat (v pixelech; w musí být násobkem čtyř).

void vga_copytopla­nar16(unsigned char *virtual, int pitch, int voffset, int vpitch, int w, int h);

Podobně jako vga_copytopla­nar256, ale pro módy s 16 barvami.

void vga_copytopla­ne(unsigned char *virtual, int pitch, int voffset, int vpitch, int w, int h, int plane);

Podobně jako předchozí dvě. Kopíruje však pouze podmnožinu čtyř úrovní 16barevných módů. plane by mělo být v rozsahu 0–15, bity v něm nastavené ukazují, která ze čtyř úrovní módu má být modifikována.

Následující funkce se používají k nastavení uživatelské palety barev.

void vga_setpalette(int index, int r, int g, int b);

Nastaví barvu s indexem index na RGB hodnotu proměnných r, g a b(všechny by měly být v rozsahu 0–63; nebo 0–255, pokud je nastavena volba VGA_CLUT8). Tato funkce má smysl pouze u módů s 16 nebo 256 barvami.

void vga_getpalette(int index, int *r, int *g, int *b);

Funkce získá hodnotu RGB z barvy s indexem index a uloží ji do proměnných *r, *g a *b(s rozsahem 0–63 nebo 0–255 – viz výše). Tato funkce je také použitelná jen v módech s 16 nebo 256 barvami.

int vga_getpalvec(int start, int num, int *pal);

Získá num barev, které začínají indexem start z tabulky barev a uloží jejich RGB hodnoty do pal. Velikost *pal musí být 3num integerů, protože ke každé barvě náleží tři položky z pole. Platí zde stejná omezení jako u dvou výše popsaných.

int vga_setpalvec(int start, int num, int *pal);

Nastaví num barev začínajících indexem start na RGB hodnoty v poli *pal. U této funkce platí stejná pravidla jako u její sestry.

Následující funkce slouží k práci s myší. První funkce používá hlavičkový soubor vga.h, další pak ještě vgamouse.h.

void vga_setmousesup­port(int stat);

Nastaví podporu myši – 0 zakazuje její použití (defaultně), 1 pak povoluje. Funkci musíte volat až po nastavení grafického módu, aby bylo nastaveno správné rozlišení kurzoru atd. Poté je možné použít další funkce pro práci s myší, a to s předponou mouse_. Je možné použít také funkci mouse_init, kde je možné nastavit další parametry myši. Tato funkce používá konfigurační soubor knihovny pro zjištění důležitých informací o zařízení.

int mouse_init(char *dev, int type, int samplerate);

int mouse_init_re­turn_fd(char *dev, int type, int samplerate);

Tyto funkce mohou být použity k explicitnímu „spuštění“ myši, ignorujícímu typ nebo zařízení myši, která jsou specifikována v konfiguračním souboru knihovny.

dev je jméno zařízení myši (defaultně je použito /dev_mouse).

samplerate může být MOUSE_DEFAULTSAM­PLERATE(150) nebo nějaká jiná hodnota v Hz specifikující obnovovací frekveni myši.

type je jeden z typů myší, které jsou předávany funkcí vga_getmousety­pe(3).

Pokud jsou tyto funkce použity, není nutné volat vga_setmousesup­port. Je však lepší používat funkci vga_setmousesup­port, protože nemůžete dopředu vědět, že „ten a ten“ počítač bude používat „ten a ten“ typ myši. Tyto informace jsou uloženy v konfiguračním souboru svgalib a je potom jen na uživateli, jak si knihovnu nakonfiguruje.

Verze funkce s return_fd vrací deskriptor souboru myši. Druhá verze vrací 0, pokud proběhla úspěšně, jinak –1.

void mouse_close(void);

Uzavírá zařízení myši. Funkce by měla být volána na konci programu (pokud myš používáte), protože se pokusí obnovit originální stav myši, jestliže byl změněn. Sekvence mouse_init(), mouse_close() a zase mouse_init() nebude korektně pracovat.

To by bylo pro dnešek vše. V příštím dílu si práci s myší doděláme.

Našli jste v článku chybu?