Tuossa pcx-laturi, jonka uhosin joskus tekeväni. Parannettavaa on, mutta ainakin se toimii. Esimerkiksi nuo psetit kannattaa muuttaa pokeksi (en muista nyt tarkempaa ohjetta, siihen tuli jotain def seg ennen pokea...). Ja muutenkin pari kuvaa oli vielä vähän ongelmallisia, mutta 320x200 kuva pitäisi latautua normaalisti...
'******************************* PCX-laturi ******************************* '* tehnyt: Ville Kumpulainen * '************************************************************************** TYPE pcxheader manufacturer AS STRING * 1 version AS STRING * 1 encoding AS STRING * 1 bpp AS STRING * 1 x AS INTEGER y AS INTEGER width AS INTEGER height AS INTEGER bitshorizontal AS INTEGER bitsvertical AS INTEGER egapaletti AS STRING * 48 reserved AS STRING * 1 planes AS STRING * 1 bitsperline AS INTEGER palettetype AS INTEGER padding AS STRING * 58 END TYPE TYPE vari r AS STRING * 1 g AS STRING * 1 b AS STRING * 1 END TYPE DECLARE FUNCTION tuopcxkuva$ (f$, alkux!, alkuy!, loppux!, loppuy!) DECLARE FUNCTION tuopcxpaletti$ (tiedosto$, mista!, mihin!, valoisuus) SCREEN 13 ' tähän tietysti tiedosto, jonka haluat ladata... tiedosto$ = "me.pcx" d$ = tuopcxpaletti$(tiedosto$, 0, 255, 255) IF d$ <> "OK" THEN PRINT d$ d$ = tuopcxkuva$(tiedosto$, 0, 0, 320, 200) IF d$ <> "OK" THEN PRINT d$ SLEEP FUNCTION tuopcxkuva$ (f$, alkux, alkuy, loppux, loppuy) a = FREEFILE OPEN f$ FOR BINARY AS a DIM v AS STRING * 1 DIM pcx AS pcxheader GET a, , pcx SELECT CASE pcx.width MOD 4 CASE 0 lisa = 0 CASE 1 lisa = 3 CASE 2 lisa = 2 CASE 3 lisa = 1 END SELECT IF pcx.width > 320 THEN tuopcxkuva$ = "Liian leveä kuva" ELSEIF pcx.height > 200 THEN tuopcxkuva$ = "Liian korkea kuva" ELSEIF ASC(pcx.bpp) <> 8 THEN tuopcxkuva$ = "Kuvan täytyy olla 256-värinen" ELSE toistot = 1 x = pcx.x y = pcx.y DO GET a, , v IF ASC(v) >= 192 THEN toistot = ASC(v) - 192 GET a, , v END IF FOR i = 1 TO toistot IF x >= alkux AND x <= loppux AND y >= alkuy AND y <= loppuy THEN PSET (x, y), ASC(v) END IF laskuri = laskuri + 1 x = x + 1 IF x >= pcx.width + lisa THEN x = 0: y = y + 1 NEXT i toistot = 1 tuopcxkuva$ = "OK" IF x > pcx.width AND y >= pcx.height THEN EXIT DO IF laskuri >= 64000 THEN EXIT DO LOOP END IF CLOSE a END FUNCTION FUNCTION tuopcxpaletti$ (tiedosto$, mista, mihin, valoisuus) IF valoisuus > 255 OR valoisuus < 0 THEN tuopcxpaletti$ = "Valoisuus annettu väärin!" ELSE a = FREEFILE OPEN tiedosto$ FOR BINARY AS a tiedostonkoko = LOF(a) SEEK #1, tiedostonkoko - 767 DIM c AS vari FOR i = 0 TO 255 GET a, , c IF i >= mista AND i <= mihin THEN OUT &H3C6, 255 OUT &H3C8, i OUT &H3C9, ASC(c.r) / 255 * 63 / 255 * valoisuus OUT &H3C9, ASC(c.g) / 255 * 63 / 255 * valoisuus OUT &H3C9, ASC(c.b) / 255 * 63 / 255 * valoisuus END IF NEXT i tuopcxpaletti$ = "OK" END IF END FUNCTION
En suosittelisi STRING:ien käyttämistä paluuarvoina, mieluummin määrittele vaikka:
CONST OK = 1
Ja sitten palauta OK.. tietysti jos välttämättä haluat virheilmoitukset noin niin mikäs siinä..
POKEa voi käyttää niin, että ensin määrittelee QB:n käyttämään segmenttiä A000 (jossa sijaitsee näyttömuisti 320x200 -tilaan):
DEF SEG = &HA000
Sitten lasketaan offsetti y*ruudunleveys+x, ja luirastaan väri eli:
POKE y*320+x, vari
Vielä yksi asia josta voisi valittaa on ehkä liian suuri tabstoppi-arvo :)
Joo, tein tuon aika nopeasti. ( laskuri >= 64000 ) -ehto tuli tuohon sen takia, että jos se ei muuten lopetakaan kuvan lukemista ja toisekseen tein tuon pääasiassa 320x200 -kuvia varten, siitä 64000...
...poke ei ole tuossa tapauksessa paljon sen nopeampi, kun hitaus johtuu lähinnä siitä, kun kiintolevyltä luetaan samassa. Tavallisestihan se on huomattavasti nopeampi kuin pset...
hidas, mutta hyvä (voi ladata muita kun 320*200 kuvia)
Aihe on jo aika vanha, joten et voi enää vastata siihen.