From bbs@floyd.upol.czMon Jan 29 18:10:41 1996 Date: Mon, 29 Jan 1996 18:09:13 +0100 From: BBS Floyd To: hubicka@limax.paru.cas.cz Subject: Skolicka #17-svgalib (fwd) *** Forwarded file follows *** Posted By: kotelnik (kotelnik) on 'Linux' Title: Skolicka #17-svgalib Date: Tue Jan 23 13:06:02 1996 Tak jsem se konecne uvolil napsat neco o grafice jak po me chcete.. Zacnu od svgalib ne proto,ze je nejlepsi ale proto ze je jednoducha a vejde se sem. Svgalib je takova sporna knihovna-je to vlastne takovej kousek dosu v linuxovi-leze prima na hardware,je neprenosna na ostatni osyje mozne s ni riznout pocitac, ma problemy z ne-root uzivatelama-vyzaduje rootovska prava(suid) a ma klasicky dosove orientovany funkce. Na druhou stranu v ni jdou psat hry pekne site na pc hardware,ktere vypadaji stejne pekne jako pod dosem,muzou bez problemu bezet ve vysich rozlisenich - ne jako normalne kde v Xwoknech na doomovsky okno 320x200 potrebujete lupu abyste neco videli. Proto se mi moje jedina hra pro linux-koulesy psaly celkem pekne. Stejne jsem ji ale nakonec muset prepsat na xwokna ale to slo kupodivu prekvapive snadno. Svgalib podporuje vetsinu svga karet, mysi a primy pristup na klavesnici. Kazdemu doporucuju upgardnout na 1.2.9 protoze ta je mnohem odolnejsi vuci chybam. Vlastni knihovna toho moc neumi-nahodi vam videorezim umi cekat na refreshe,nastavavovat palety atd..proste to,co se bezne dela biosem. Na kresleni car atd musite vetsinou pouzit neco jinyho-je tam sice funkce na kresleni-vga_line ale ne ze by toho tam bylo moc a je to pomaly. Na to je uz v zakladni distribuci pridana vgagl knihovna. To je jednoducha framebufferova knihovna, ktera uz umi kreslit bitmapy,ctverecky,kolecka,cary,delat framebuffering(obrazovku v pameti a potom ji kopirovat na obrazovku) a dalsi srandicky. Je celkem trubo a jednoducha. Neni az tak spatna. A ted zacnem od zacatku. Popisu jen ty uplne nejzakladnejsi funkce: inicializace: vga_mousesupport(1/0) zapne podporu mysi-je treba zapnout pred vga_init vga_init() nazhavi svgalibku-osaha hardware atd.. vga_hasmode(mode) zjisti jestli je mod mode mozny. To je treba delat pred jakymkoliv nazhavovanim grafiky! protoze kdyz mod nejde svgalib ho stejne nazhavi a rizne masinu. Promena mode je konstant typu G640x480x256 vga_setmode(mode) nazhavi mod keyboard_init() nazhavi tvrdy pristup na klavesnici-muzete potom testovat pekne vsechny klavesy prez scancody jako v dosu keyboard_translatekeys(1/0) zapne/vypne mapovani sipek na keypad ukonceni: keyboard_close() zapne normalni mod klavesnice-je treba volat pred udzhavenim grafiky jinak vam klavesnice zustane blbnout vga_setmode(TEXT) nazhavi textovy rezim a muzete spokojene ukoncit ostatni: vga_waitretrace() ceka na retrace vga_setpalette() na paletky Je tu fura dalsich funkci-treba jako jestli se program ma zastavit pri prepnuti konzily rozdelovani obrazovky,scrolling atd..proste se kouknete do hacka input/output: klavesnice: keyboard_pressed(scancode) zjisti jestli klavesa scancode je zmackla keyboard_update() updatne tabulku zmacknutych klaves do aktualniho stavu-je treba volat pred keyboard_pressed mys: mouse_update() jako u klavesnice mouse_getbutton() mapa zmacknutych buttonu mouse_getx() mouse_gety()..co asi Na psani her je celkem vyhodne pouzivat knihovny vgagl. Protoze podporuje framebuffering,je celkem rychla, je kratka ale na hry staci umi priblizne: vsechno kresleni probiha na kontextu. Je tu nekolik funkci na prepinani kontextu: gl_setcontextvga(mod) nastavi kontext na mod(mod je treba G320x200x256 na obrazovce..tedy co budete to tohodle kontextu kreslit objevi se. nevim co to bude delat kdyz mod nebude mod obrazovky...asi binec gl_setcontextvgavirtual(mod) udela kontext v pameti,kde si muzete neco nakreslit a potom to pekne okopirovat na obrazovku. Tohle vytvareni kontextu je jednak pomale a taky treba vytvareni virtualnich kontextu udela vzdycky novej-proto je treba je ukladat funkcema: gl_getcontext(&na GraphicsContext) ulozi aktualni kontext do prom. gl_setcontext(&context) prepne na urceny kontext barvicky: gl_setpalette(ukazatel na strukturu Palette) kresleni: gl_setpixel,gl_line,gl_fillbox,gl_hline atd.. clipane se zapina/vypina pomoci gl_enableclipping/gl_disableclipping Bitmapky: umi pracovat z normalnima,pruhlednejma-0 je pruhledna a ty umi zkompilovat trochu je zapakuje tim ze uklada vzdycky ze je n pruhlednych a n nepruhlednych a vykreslovani je rychlejsi protoze to pak uz nemusi prohlizet a jednoduse memcopi to ale nefunguje jinde nez normal 256 kompilovani: gl_compileboxmasksize(x,y,char *bitmap) zjisti kolik musite naalikovat na zapakovanou bitmapku gl_compileboxmask(x,y,char *bitmap, char *cbitmap) zapakuje bitmap do cbitmap kresleni: gl_putbox(x,y,w,h,char *bitmap) vykresli bitmapku gl_putboxmask(stejny) vykresli pruhlednou bitmapku gl_putboxmaskcompiles(stejny) vykresli pruhlednou zkompilovanout bitmapku a na stejnym principu ma jeste part na kresleni pouze casti: gl_putboxpart(x,y,wcasti,hcasti,w,h,bitmap,x v bitmape,y v bitmape) taky ma gl_copybox na kopirovani ctverce: gl_copybox(x,y,w,h,x1,y1) gl_copyboxtocontext(x,y,w,h,context,x1,y1) na kopirovani do jinyho kontextu- hodi se na obnovovani obrazovky z framebufferu gl_copyboxfromcontext(context,x,y,w,h,x1,y1) zkopiruje z jineho kontextu Prace z framebufferem: gl_copyscreen(context) zkopiruje kontext na obrazovku. Zaroven udela prepinani stranek kdyz je zapnuto takze se obraz objevi na obrazovce gl_enableflippeng(flipping) zapne double/triplebuffering na obrazovce- musi se potom obnovovat pomoci copy_screen a nenasel jsem jinou cestu proste zadna jina funkce neprepne stranku a tak se kresli naprazdno ostatni: gl_clearscreen(color) smaze obrazovku pyxelem cislo color gl_scalobox(w1,h1,zdroj,w2,h2,cil) resizne bitmapku zdroj na cil gl_setclippingwindow(x1,y1,x2,y2) okenko na clipani Pak ma jeste funkce na psani: pouziti vypada asi takhle: font=malloc(256*8*8) gl_expandfont(8,8,barva,gl_font8x8,font) a pak muzete vesele psat: gl_setfont(8,8,font) gl_write(0,0,"Cau") To je asi vsechno co budete potrebovat... Kotelnik ......a ten nejkotlivejsi......