Niinpä, minua pyydettiin tekemään ohjelma joka lukisi jollain tavalla bittikartan (4-bit) tilepalettina screen 7:lle...
Aikani tuskailin, ja päädyin tulokseen jossa lataan bittikartan suoraan get-pakkauksen ymmärtämään muotoon ja puttailen sitten siitä eri alueita. Aikansa tietenkin otti myös selvittää screen 7:n hämärä kuvanpakkaustyyli. Mutta tässä se on. Toimii ainoastaan kuvilla, joiden leveys on 16 monikerta.
Syy: Integriin lukeminen pitäisi nollata vain kun alkaa uusi rivi, mutta ohjelma ei osaa tunnistaa onko intti täynnä vai ei - siinä jollekulle hauskaa hommaa :)
Katsokaa, oppikaa ja pudistelkaa päätä :D
Oikein, bmp-kuvan latauskoodin on tehnyt alunperin Antti Laaksonen. Kiitoksia hänelle koodista.
'Tarvittavat typet
TYPE BMPFILE
TYYPPI AS STRING * 2
KOKO AS LONG
VARATTU1 AS INTEGER
VARATTU2 AS INTEGER
OFFBITIT AS LONG
END TYPE
TYPE BMPINFO
KOKO AS LONG
leveys AS LONG
korkeus AS LONG
PLANET AS INTEGER
BITIT AS INTEGER
PAKKAUS AS LONG
KUVANKOKO AS LONG
XPELSMETRI AS LONG
YPELSMETRI AS LONG
VARIMAARA AS LONG
VARIINFO AS LONG
END TYPE
'värin lataukseen
TYPE rgbpikseli
colorb AS STRING * 1
colorg AS STRING * 1
colorr AS STRING * 1
varattu AS STRING * 1
END TYPE
'$DYNAMIC 'pitää olla, jotta voidaan varata muistia (muussa tapauksessa
'Laita kommenttimerkki redim-kohtiin, ja varaa itse riittävästi muistia
'taulukoille.
'ExtractBitmap - palataulukko, tied. nimi, kuva
SUB extractbitmap (kuva() AS INTEGER, FILU AS STRING, palakuva() AS INTEGER)
'' BMP-KUVAN LATAUSKOODI BY ANTTI LAAKSONEN, SOVELLETTU
'' GET-KUVAMUODON YMMÄRTÄMÄÄN MUOTOON BY SQWIIK ALIAS TARMO KORPELA.
'' !!! KIROTTU OLKOON SCREEN 7 !!!
'' HTTP://WWW.OHJELMOINTIPUTKA.NET - KAIKILLE KAIKKEA
DIM TIEDOSTO AS BMPFILE, info AS BMPINFO, vari AS rgbpikseli
DIM a AS INTEGER, leveys AS INTEGER, pikseli AS STRING, LOPPU AS LONG, ii AS LONG
DIM aa AS INTEGER, getleveys AS INTEGER, bb AS INTEGER, cc AS INTEGER
DIM viimeinentila AS INTEGER
DIM tulos AS INTEGER, tulos2 AS LONG, maxintlast AS LONG, merkki AS STRING * 1
CONST maxint = &HFFFF 'intin max. arvo
maxintlast = 32768 'posit. &H10000
a = FREEFILE
OPEN FILU FOR BINARY AS #a
'Aloitetaan sitten ....
GET #a, , TIEDOSTO
GET #a, , info
IF TIEDOSTO.TYYPPI <> "BM" THEN EXIT SUB 'MUOTO PIELESSÄ
IF info.BITIT <> 4 THEN EXIT SUB 'VÄRIMÄÄRÄ PIELESSÄ
IF info.PAKKAUS <> 0& THEN EXIT SUB 'TUNTEMATON PAKKAUS TÄLLE VÄRIMÄÄRÄLLE
OUT &H3C8, 0 'MUOKATAAN PALETTIA KUVAN MUKAAN
FOR c = 1 TO 16
GET #a, , vari
OUT &H3C9, ASC(vari.colorr) \ 4
OUT &H3C9, ASC(vari.colorg) \ 4
OUT &H3C9, ASC(vari.colorb) \ 4
NEXT c
'PALETTI VAIHDETTU. SIIRRYTÄÄN SIIS KUVADATAAN, JA PAKATAAN SE GET:N YMMÄRTÄMÄÄN MUOTOON
leveys = INT(info.leveys / 2 + .5) 'YHDEN RIVIN DATAN PITUUS TAVUINA TIEDOSTOSSA
getleveys = (INT((info.leveys - 1) / 8) + 1) * 2'MONTAKO INTEGRIÄ VAATII YKSI KUVAN RIVI
'kuvalle tilaa
viimeinentila = 2 + (getleveys * info.korkeus) 'lasketaan, paljonko tarvitaan
REDIM kuva(1 TO viimeinentila) AS INTEGER 'Muistin varastointi
REDIM palakuva(1 TO 2 + (getleveys * info.leveys)) AS INTEGER 'yksittäisen palan vaatima muisti - oletetaan, että palat ovat neliöitä!
kuva(1) = info.leveys: kuva(2) = info.korkeus 'talletetaan koko
pikseli = SPACE$(leveys) '1 Rivin pituus tavuina...
GET #a, , pikseli
LOPPU = info.korkeus * leveys'KOKO DATAN PITUUS TAVUINA
bb = 0 'silmukkamuuttuja
cc = 0 'pitääkö vaihtaa inttiä rivissä?
FOR ii = 1 TO info.korkeus 'HAETAAN KAIKKI PIKSELIT
haettu = &H1 'mitä piks. haetaan
FOR ww = 0 TO 3 'montako pikseliä / intti eli neljä, tarkistetaan mitkä päällä
tulos2 = &H0 'nollataan
FOR bb = 1 TO leveys'käydään läpi kaikki kuvapisteet rivillä
'ensin neljä ylintä
IF ((ASC(MID$(pikseli, bb, 1)) \ 16) AND haettu) <> 0 THEN 'löytyi haettu bitti
tulos2 = (tulos2 * 2) + 1
ELSE
tulos2 = (tulos2 * 2)
END IF
'sitten tavun 4 alinta
IF (ASC(MID$(pikseli, bb, 1)) AND haettu) <> 0 THEN 'löytyi haettu bitti
tulos2 = (tulos2 * 2) + 1
ELSE 'ei päällä
tulos2 = (tulos2 * 2)
END IF
'tulos kasvaa sitä mukaa, kun bittejä kerääntyy
'luettu 16 bittiä?
IF bb MOD 8 = 0 THEN 'vaihdetaan inttiä
'sekoitetaan tulos vastaamaan pakkausta. tavut vaihtavat paikkaa...! KIROUS SCREEN 7:lle!
merkki = CHR$((tulos2 AND &HFF00) \ 256)'ylempi talteen
tulos2 = tulos2 AND &HFF'pyyhitään ylempi
tulos2 = tulos2 * 256 'siirretään alemmat ylemmäs
tulos2 = tulos2 + ASC(merkki)
IF (tulos2 AND maxintlast) <> 0 THEN 'argh... viimeisen bitin muuttuminen 1:ksi kääntää
'integrin sekaisin. Joten muokataan :)
tulos = &H8000 '1000 0000 0000 0000 (bitteinä)
tulos2 = tulos2 AND (&HFFFF - maxintlast) 'eka bitti 0:ksi
tulos = tulos2
tulos = tulos OR &H8000 'ja toimii
ELSE
tulos = (tulos2 AND maxint)
END IF
cc = cc + 1
kuva(2 + cc) = tulos
tulos2 = 0 'nollataan tulos
END IF
NEXT bb'rivi luettu haetun suhteen.
haettu = haettu * 2 '&H2, &H4, &H8
NEXT ww 'seuraava rivi
GET #a, , pikseli 'uusi jono
NEXT ii
CLOSE #a
'Sitten vielä flipataan ylösalaisin, kirottu olkoon bitmap-pakkaus...
tulos = INT((info.korkeus - 1) / 2) 'puolikorkeus
FOR bb = 0 TO tulos'ja kopsataan rivit
ii = viimeinentila - ((bb + 1) * getleveys)'viimeisen rivin eka integer
FOR cc = 1 TO getleveys
aa = kuva(2 + (bb * getleveys) + cc) 'ylempi
kuva(2 + (bb * getleveys) + cc) = kuva(ii + cc)
kuva(ii + cc) = aa
NEXT cc
NEXT bb
'Kaikki on valmista! Kuva on kokonaan muistissa!
END SUB'DrawPalette - koordinaatit(x,y), kuvan id ja source + minne kopsataan.
SUB DrawPalette (x AS INTEGER, y AS INTEGER, id AS INTEGER, kuva() AS INTEGER, setti() AS INTEGER)
'kuva = source, setti = mihin ladotaan (varattu etukäteen extract:ssa, toivottavasti)
'Muutama välimuuttuja
DIM k AS INTEGER, a AS INTEGER, B AS INTEGER, c AS INTEGER
k = (INT((kuva(1) - 1) / 8) + 1) * 2 'montako integeriä / rivi
setti(1) = kuva(1): setti(2) = kuva(1) 'oletus että ovat neliöitä
'rivi mistä aletaan
a = id * setti(2) * k
IF (id + 1) * kuva(1) > kuva(2) THEN EXIT SUB'ei ole mokomaa palaa setissä
FOR B = 0 TO setti(2) - 1'ja kopsataan rivit
FOR c = 1 TO k
setti(2 + (B * k) + c) = kuva(2 + (B * k) + c + a)
NEXT
NEXT
END SUB'Ja viimeinen - Esim. käyttö SCREEN 7 '$DYNAMIC 'annetaan aliohjelman varata muisti DIM kuva(1) AS INTEGER, piirtokuva(1) AS INTEGER 'Puretaan, ja asetetaan piirtokuvan koko vastaamana yhtä tileä extractbitmap kuva(), "koe.bmp", piirtokuva() PUT (0, 0), kuva 'tätäkin voi käyttää koko paletin puttaukseen :) 'Kopioidaan ylin 'tile' piirtokuvaan DrawPalette 116, 116, 0, kuva(), piirtokuva() PUT (100, 100), piirtokuva, PSET 'ja piirretään iloinen tile DrawPalette 116, 116, 1, kuva(), piirtokuva() 'napataan toinen PUT (200, 100), piirtokuva, PSET 'ja piirretään 2. iloinen tile
Et viittis korjata noita 'illegal function call' erroreita tohon koodiin.
ei kun ei mitään sittenkään
Mukavat kommentit:
lainaus:
'' !!! KIROTTU OLKOON SCREEN 7 !!!
'' HTTP://WWW.OHJELMOINTIPUTKA.NET - KAIKILLE KAIKKEA
Onko aivan kaikki pakko kirota? ;)
Aihe on jo aika vanha, joten et voi enää vastata siihen.