link
Udostępniam konwerter do animacji typu hash. Co to? Za starych czasów Martin Hash (dziś programy na PC) stworzył cały zestaw programów do generowania animacji (Apprentice, Rotoscope itd.). Jednocześnie Martin był członkiem grupy opracowującej format IFF-ANIM. Jednak do swoich programów zastosował odmianą bardziej przydatną w przypadku renderowania. Składa się ona z katalogu obrazków delta o rozszerzeniu: *.PAC, *.SPAC32L czy *.FPAC16H. Nie znacie? Nie szkodzi, animacji stworzonych tymi programami jest naprawdę mało i są raczej kiepskie.
Program powstał w wyniku poszukiwań animacji z opcode=4. Jest mnóstwo animacji z opcode=3 oraz 5, a gdzie są czwórki. Przeszukałem bardzo dużo starych animacji i programów, no i prawie nic. Programy do tworzenia i odtwarzania jednak były. Znalazły się też 2 animacje z opcode=l (małe L). Główny twórca formatu iff-anim Gary Bonham napisał playera showanim i jego najstarsza publiczna wersja to 3.0. Odtwarza ona tylko 2 rodzaje opcode: 2 i 3. Wersja 4.0 odtwarza opcode: 2,3,4,5 i l. Brakującym ogniwem w ewolucji okazała się wersja 3.5, która była dołączona do owych animacji z opcode=l. Animacje te wystawiono na jeden z konkursów. Analiza kodu showanim 3.5 wykazała, że animl to tak naprawdę anim4 sprzed standaryzacji. Showanim 3.5 zawiera eksperymentalne procedury:
Check cmp.w #2,d0
beq.s _SetDLTA
cmp.w #3,d0
beq.w _SetDLTAshort
cmp.w #4,d0
beq.w _SetDLTAshort4
cmp.w #$64,d0 ; 'd'
beq.w _SetDLTAshort5
cmp.w #$65,d0 ; 'e'
beq.w _SetDLTAshort5
cmp.w #$67,d0 ; 'g'
beq.w _SetDLTAshort7
cmp.w #$6B,d0 ; 'k'
beq.w _SetDLTAshort7
cmp.w #$6C,d0 ; 'l'
beq.w _SetDLTAshort9
rts
Do programu dolinkowana jest jeszcze _SetDLTAshort6, ale opcode jest nieznany. W tej wersji programu opcode=4 nie jest tożsame z oficjalnym opcode=4. Większość tych algorytmów to właśnie różne rodzaje czwórki. Wszystko (oprócz animl) zostaje usunięte w późniejszych wersjach showanim. Dlatego w starych animach nie pola flags. Tutaj przykładowy stary animhdr:
typedef struct {
UBYTE operation; /* =0 for set, =1 for XOR, =2 long dlta, =3 short dlta */
UBYTE mask; /* mask,w,h,x,y used for XOR mode only */
UWORD w,h;
WORD x,y;
ULONG abstime; /* for timing w.r.t. start of anim file in jiffies - unused */
ULONG reltime; /* for timing w.r.t. last frame in jiffies */
UBYTE interleave; /* =0 for XORing to two frames back, =1 for last frame */
UBYTE pad[21]; /* reserved for Jim Kent for an op array and plane destination.
Actually Jims use will only be 16 bytes probably - other
five are for general future use */
} X_ANHD;
Martin Hash napisał własny player: display (wersja 1 jest fish disk 96). Odgrywa on hash anim, anim 3 i anim 4. Analiza kodu pokazuje dziwną zbieżność kodowania hash anim z anim 4. No i faktyczne tak jest. Tyle, że hash anim używa opcode=5. Jego Display jest dość ograniczony i nie odtwarza wszystkich rodzajów anim4. Już nie pamiętam, ale jak zmieniłem w animacji opcode l na 4 to działało. Po prostu jego anim4 nie uwzględnia pola flags oraz offsety nie mogą być zerowe.
Mój konwerter tworzy poprawne anim4xor poprzez połączenie klatek animacji hash w jeden plik. Może też przekodować na zwykłe anim4set lub standardowe anim5. Animacje hash anim mogą zawierać także klatki iff, więc faktycznie można stworzyć animację niekoniecznie stworzoną programami hash. Hash napisał oczywiście własne konwertery (flipper), ale ta obsługa w 1.3 to tragedia jest. Program skompilowałem na 020 i wymaga reqtools.