Odczyt lub zapis obrazu w formacie KOALA
Format PIC opisany między innymi tutaj jest bardzo interesujący w uwagi na możliwości zapisania w nim różnych typów plików graficznych. W czasach świetności naszego pupila sporo programów graficznych potrafiło zapisywać grafiki w tym formacie stąd prawdopodobnie liczba plików typu PIC należy do najliczniejszej grupy plików graficznych na Atari. Najbardziej cenną zaletą formatu KOALA jest możliwość zapisania obrazu skompresowanego co miało kolosalne znaczenie biorąc pod uwagę pojemności dyskietek.
Ciekawym jest że twórcy formatu uwzględnili możliwość zapisania tylko części obrazu – (np. ikony, wycinka) o prawie dowolnych wymiarach, co prawda wyrównanych do bajta ale biorąc pod uwagę metody kompresji finalnie obrazek może być naprawdę mały.
Niestety w chwili tworzenia tego wpisu nie potrafię podać przykładu procedury obsługującej prawidłowo proces zapisu i odczytu plików w formacie KOALA, dlatego posłużę się przykładem zaczerpniętym z czasopisma Moje Atari nr 6 z 1991 roku.
Opisana w artykule ze strony 20 i 21 procedura zapisu niestety obsługuje tylko jedną z wielu możliwości a konkretnie zapisuje nagłówek KOALA oraz zawartość pamięci ekranu w kompresji pionowej wraz z danymi z rejestrów kolorów od 708 do 712. Poniżej nieco skrócona wersja listingu.
0 DATA 160,0,177,203,72,24,165,203,105,80,133,203,144,2,230,204,198,207,208,43
1 DATA 169,96,133,207,165,209,240,20,198,209,230,205,208,2,230,206,165,205,133,203
2 DATA 165,206,133,204,198,208,208,15,230,209,24,165,205,105,40,133,203,165,206,105
3 DATA 0,133,204,104,96,133,217,166,218,169,217,157,68,3,169,0,157,69,3,169
4 DATA 1,157,72,3,169,0,157,73,3,169,11,157,66,3,32,86,228,48,1,96
5 DATA 132,212,169,0,133,213,166,220,154,96,230,212,208,2,230,213,96,166,214,208
6 DATA 3,76,110,6,76,65,6,192,0,40,0,14,1,1,0,26,199,201,128,255
7 DATA 104,186,232,232,134,220,165,212,24,105,21,170,165,213,105,0,72,138,72,24
8 DATA 144,96,104,104,133,218,169,1,133,214,169,12,133,219,166,219,189,127,6,32
9 DATA 117,6,198,219,16,244,230,219,166,219,189,196,2,224,3,208,2,41,0,32
10 DATA 117,6,230,219,165,219,201,5,208,234,165,212,56,233,1,8,32,117,6,165
11 DATA 213,40,233,0,32,117,6,169,0,32,117,6,169,0,32,117,6,169,4,133
12 DATA 219,169,155,32,117,6,198,219,208,247,169,162,32,117,6,24,144,8,169,0
13 DATA 133,212,133,213,133,214,169,0,133,209,169,96,133,207,169,40,133,208,165,88
14 DATA 133,203,133,205,165,89,133,204,133,206,32,0,6,133,216,169,1,133,215,165
15 DATA 208,240,111,32,0,6,197,216,208,37,230,215,48,29,165,208,240,96,32,0
16 DATA 6,197,216,240,241,166,216,133,216,138,72,165,215,32,117,6,104,32,117,6
17 DATA 24,144,208,198,215,208,239,72,166,216,133,216,138,72,162,6,181,203,72,202
18 DATA 16,250,230,215,48,17,165,208,240,11,32,0,6,197,216,8,133,216,40,208
19 DATA 237,162,0,104,149,203,232,224,7,208,248,165,215,24,105,127,32,117,6,104
20 DATA 32,117,6,166,215,104,224,2,240,33,208,4,208,137,240,35,32,117,6,198
21 DATA 215,198,215,198,215,165,215,240,11,32,0,6,32,117,6,198,215,24,144,241
22 DATA 32,0,6,133,216,165,208,208,219,240,10,165,215,32,117,6,165,216,32,117
23 DATA 6,165,214,240,7,162,1,134,212,202,134,213,96,0,83,77,65,82,75,0
24 FOR X=1 TO 140:READ A:POKE 1535+X,A:NEXT X
25 DIM K$(340):FOR X=1 TO 340:READ A:K$(X)=CHR$(A):NEXT X
Wywołanie procedury zapisu wygląda następująco:
X = USR ( ADR ( K$ ) , kanał * 16 )
gdzie kanał to numer kanału otwartego do zapisu danych w pliku
Procedura odczytu poprawnie odczytuje format z kompresją pionową i to w zasadzie tyle co potrafi.
0 DATA 160,0,145,203,24,165,203,105,80,133,203,144,2,230,204,198,207,208,47,169
1 DATA 96,133,207,165,209,240,24,198,209,230,205,208,2,230,206,165,205,133,203,165
2 DATA 206,133,204,198,208,208,19,160,1,208,43,230,209,24,165,205,105,40,133,203
3 DATA 165,206,105,0,133,204,96,166,214,169,0,157,72,3,157,73,3,169,7,157
4 DATA 66,3,32,86,228,48,1,96,192,136,208,2,160,1,132,212,169,0,133,213
5 DATA 166,215,154,96,1,0,26,199,201,128,255,83,77,65,82,75,83,111,102,116
6 DATA 104,104,104,133,214,104,104,133,219,186,134,215,169,0,133,209,169,96,133,207
7 DATA 169,40,133,208,165,88,133,203,133,205,165,89,133,204,133,206,169,6,133,218
8 DATA 32,67,6,166,218,221,104,6,240,5,160,255,76,94,6,198,218,16,237,32
9 DATA 67,6,201,1,240,4,160,254,208,238,160,10,165,219,240,2,160,5,132,218
10 DATA 32,67,6,198,218,208,249,165,219,240,18,169,0,133,218,32,67,6,166,218
11 DATA 157,196,2,230,218,224,4,208,242,169,9,133,218,32,67,6,198,218,208,249
12 DATA 32,67,6,133,220,41,127,240,10,170,202,134,216,169,0,133,217,240,17,32
13 DATA 67,6,56,233,1,133,216,8,32,67,6,40,233,0,133,217,32,67,6,72
14 DATA 104,72,32,0,6,165,220,16,5,104,32,67,6,72,165,216,240,5,198,216
15 DATA 24,144,233,5,217,240,6,198,217,198,216,208,223,165,220,48,4,104,24,144
16 DATA 175,104,24,144,174,83,77,65,82,75,45,83,111,102,116,0,49,57,57,48
17 FOR T=1 TO 120:READ A:POKE 1535+T,A:NEXT T
18 DIM K$(220):FOR T=1 TO 220:READ A:K$(T)=CHR$(A):NEXT T
Wywołanie procedury odczytu wygląda następująco:
X = USR ( ADR ( K$ ) , kanał * 16 )
gdzie kanał to numer kanału otwartego do odczytu danych z pliku
Należy pamiętać że obydwie procedury działają poprawnie w trybach graficznych 8 i 15 czyli w zasadzie takich, które mogą najbardziej interesować i wykorzystują szóstą stronę pamięci. Po zakończonym wywołaniu zmiennej X przyjmuje wartości:
- 255 jeśli plik nie jest zbiorem KOALA
- 254 jeśli nie jest zapisany w kompresji pionowej
- >1 jeśli przy odczycie wystąpił błąd
Dla języka Action! istnieje procedura KPicLoad() o której pisałem tutaj.