FLI

Tento formát patrí k formátom, ktoré sú schopné ukladať animácie. Existujú dve verzie. Staršie, súbor má príponu FLI, má obmedzenie pre maximálne rozlíšenie animácie na 320x200 bodov pri 64 farbách. Novšia verzia, súbor má príponu FLC, má rozlišovaciu schopnosť 64Kx64K bodov pri 256 farbách.

Organizácia súboru

Animácia je vlastne postupnosť statických snímkov (frame). Rýchlosť prehrávania určuje veľkosť oneskorenia medzi jednotlivými snímkami.

Dáta v každom snímku sú vždy indexom do palety. Aj keď FLI formát má obmedzenie na zobrazenie 256 farieb súčasne, má každý bod 24-bitovú farebnú hĺbku, teda je bo možno vybrať z viac ako 16 milióna farieb.

Pri kompresii snímky je použitých niekoľko typov kompresie. Každý snímok animácie je komprimovaný medzisnímkovým delta kódovacím schématom (kódujú sa iba rozdiely medzi susednými snímkami). Prvý snímok je komprimovaný jednoduchou prúdovou šifrou. Pokiaľ by pri kompresii malo dôjsť k negatívnemu účinku, potom je snímok uložený v nekomprimovanej podobe.

Hlavička

Hlavička má veľkosť 128 bajtov. Prvý deväť údajov (22 bajtov) je rovnakých pre obe verzie. Zvyšných desať údajov je platných iba pre FLC formát, FLI formát tam obsahuje hodnotu 00h

typedef struct _FlicHeader {
	DWORD	FileSize;	/* celková veľkosť súboru */
	WORD	FileId;		/* identifikátor typu súboru */
	WORD	NumberOfFrames;	/* celkový počet snímkov */
	WORD	Width;		/* šírka obrazu v bodoch */
	WORD	Height;		/* výška obrazu v bodoch */
	WORD	PixelDepth;	/* počet bitov na bod */
	WORD	Flags;		/* vždy 03h */
	DWORD	FrameDelay;	/* pauza medzi snímkami*/
	WORD	Reserved1;	/* vyhradené */
	// zvyšok je platný iba pre FLC verziu
	DWORD	DateCreated;	/* čas a dátum vytvorenia */
	DWORD	CreaterSN;	/* sériové číslo programu, ktorý súbor vytvoril */
	DWORD	LastUpdated;	/* čas a dátum poslednej zmeny */
	DWORD	UpdaterSN;	/* sériové číslo programu, ktorý zmenu spravil */
	WORD	XAspect;	/* vzhľad v smere osi X */
	WORD	YAspect;	/* vzhľad v smere osi Y */
	BYTE	Reserved2[38];	/* vyhradené */
	DWORD	Frame1Offset;	/* umiestnenie prvého snímku */
	DWORD	Frame2Offset;	/* umiestnenie druhého snímku */
	BYTE	Reserved3[40];	/* vyhradené */
} FLICHEADER;
	
FileSize
obsahuje celkovú veľkosť v bajtoch
FileId
určuje typ súboru. Hodnota AF11h označuje FLI súbor, AF12h označuje FLC súbor.
NumberOfFrames
je celkový počet snímkov. FLC súbor môže obsahovať maximálne 40000 snímkov
Width, Height
určujú veľkosť obrazu v bodoch
PixelDepth
označuje počet bitov na bod. Táto hodnota je vždy 08h.
Flags
je vždy nastavený na 03h. Označuje to , že súbor je správne aktualizovaný.
FrameDelay
určuje veľkosť pauzy medzi jednotlivými snímkami a tým určuje aj rýchlosť animácie. Pre FLI súbory je t násobok 1/70 sekundy, pre FLC je to násobok 1/100 sekundy.
DateCreated, LastUpdated
je časová známka, ktorá indikuje dátum vytvorenia/zmeny FLI súboru. Je udávaná v sekundách od polnoci 1. januára 1970.
CreatorSN, UpdaterSN
obsahujú sériové číslo programu, ktorý daný súbor vytvoril, prípadne naposledy modifikoval.
XAspect, YAspect
udávajú pomer strán displeja použitého na vytvorenie animácie. Pre rozlíšenie 320x200 je to 6:5, pre ostatné rozlíšenia 1:1.
Frame1Offset, Frame2Offset
obsahujú ofset prvého a druhého snímku v súbore od jeho začiatku. Offset prvého súboru označuje začiatok, ofset druhého sa používa ako počiatočný bod, keď animácia skončí má začína od začiatku.

Bloky (chunks)

Všetky údaje sú usporiadané do blokov. Každý blok začína hlavičkou, za ktorou nasleduje dátový blok. Bloky tiež môžu obsahovať subbloky. Pokiaľ dekóder narazí na blok, ktorý nevie rozoznať, jednoducho ho môže preskočiť.

typedef struct {
	DWORD	ChunkSize;	/* celková veľkosť bloku */
	WORD	ChunkType;	/* identifikátor bloku */
	WORD	NumberOfChunks;	/* počet subblokov */
	BYTE	Reserved[8];	/* vyhradené */
}
	
ChunkSize
je veľkosť bloku v bajtoch vrátane tejto hlavičky a subblokov.
ChunkType
je identifikačná hlavička určujúca typ bloku.
Tabuľka: Typy a popis blokov
hodnotanázov blokupopis
04hCOLOR_256256 farebná paleta (iba FLC)
07hDELTA_FLCdelta komprimované snímkové dáta (iba FLC)
0BhCOLOR_6464 farebná paleta (iba FLI)
0ChDELTA_FLIdelta komprimované snímkové dáta (iba FLI)
0DhBLACKdáta čierneho snímku
0FhBYTE_RUNRLE komprimované dáta
10hFLI_COPYnekomprimované snímkové dáta
12hPSTAMPpredloha poštovej známky (iba FLC)
NumberOfChunks
určuje počet subblokov v danom bloku.
Súbor FLC môže za touto hlavičkou obsahovať tzv. sekundárnu hlavičku. jej označenie je F100h a môže sa preskočiť, pretože neobsahuje žiadne dáta potrebné pre animáciu.

Ďalej nasleduje séria snímkových blokov. Každý snímkový blok obsahuje dáta pre jeden snímok. ChunkType je vtedy F1FAh. Ak je NumberOfChunks nastavený na 0, potom je snímok rovnaký ako predchádzajúci.

DELTA_FLI blok

Tento blok obsahuje dáta, ktoré sú delta komprimované, teda obsahuje iba bodové hodnoty, ktoré sa od predchádzajúceho snímku zmenili.

typedef struct _DeltaFliChunk{
	CHUNKHEADER	Header;			/**/
	WORD		LinesToSkip;		/**/
	WORD		NumberOfLines;		/**/
	struct _Line {
		BYTE	NumberOfPackets;	/**/
		BYTE	LineSkipCount;		/**/
		struct _Packet {
			BYTE	SkipCount;	/**/
			BYTE	PacketType;	/**/
			BYTE	PixelData[]	/**/
		} Packet[NumberOfPackets];
	} Lines[NumberOfLines];
} DELTAFLICHUNK;
	
LinesToSkip
je počet riadkov, počítaných od vrchu, ktoré sa nelíšia od predchádzajúceho snímku.
NumberOfLines
udáva počet všetkých riadkov, ktoré sa zmenili.
NumberOfPackets
udáva počet paketov, ktoré boli použité na kódovanie daného skanovacieho riadku.
LineSkipCount
je počet riadkov, ktoré je treba preskočiť, aby sme sa dostali na ďalší kódovaný riadok

Každý paket obsahuje dve hodnoty. SkipCount označuje pozíciu bodových hodnôt, ktoré sú v tomto paketu kódované. PacketType určuje typ kódovania v tomto pakete. Kladná hodnota znamená, PacketData obsahuje jednu hodnotu a tá má byť "PacketType"-krát skopírovaná na výstup. Záporná hodnota znamená, že PacketData obsahuje abs(PacketType) hodnôt, ktoré sa majú skopírovať na výstup.

DELTA_FLC blok

Tento blok má podobnú štruktúru ako jeho predchodca.

typedef struct {
	CHUNKHEADER	Header;			/**/
	WORD		NumberOfLines;		/**/
	struct _Line {
		WORD	PacketCount;		/**/
		// tu sa môžu nachádzať aj ďalšie hodnoty typu WORD
		struct _Paket {
			BYTE	SkipCount;	/**/
			BYTE	PacketType;	/**/
			WORD	PixelData[];	/**/
		} Packet[NumberOfPackets]
	} Lines[NumberOfLines];
} DELTAFLCCHUNK;
	
Počet položiek nachádzajúcich sa medzi PacketCount a prvým paketom je závislý na hodnote v položke PacketCount. Presnejšie povedané, dva najvýznamnejšie bity určujú interpretáciu tejto hodnoty. Ak sú oba bity nulové. potom táto hodnota predstavuje počet paketov na tomto riadku. Ak ich hodnota je 1,0 má byť nižší bajt tohto slova uložený do posledného bajtu v tomto riadku. Za touto hodnotou nasleduje WORD položka, obsahujúca počet paketov v tomto riadku. Pokiaľ sú oba bity nastavené na 1, znamená to počet preskočení na ďalší kódovaný riadok. Za týmto údajom môžu nasledovať ďalšie WORD hodnoty obsahujúce počet paketov, preskočení alebo posledné bajtové hodnoty.

BYTE_RUN blok

Týmto blokom bývajú normálne kódované dáta iba prvého snímku.

typedef struct _ButeRunChunk {
	CHUNKHEADER	Header;		/* hlavička tohto bloku */
	BYTE		PixelData[];	/* RLE kódované dáta */
} BYTERUNCHUNK;
	
Každý riadok je kódovaný osobitne do série minimálne jedného paketu. V pôvodnom FLI formátu predstavoval prvý bajt každého kódovaného riadku počet paketov, ktorý obsahuje. Formát FLC pracuje s oveľa dlhšími riadkami, teda počet paketov môže presiahnuť 255. Preto by sa mal prvý bajt každého kódovaného riadku ignorovať a dekóder by si mal sám kontrolovať počet dekódovaných bodov, aby zistil, kedy narazil na koniec riadku.

Prvý bajt každého paketu je tzv. typový a určuje spôsob interpretácie ďalších údajov. Kladná hodnota znamená, nasledujúci bajt má byť "typ"-krát zapísaný na výstup. Záporná hodnota je potom prevedená na kladnú a nasledujúcich "typ" bajtov má byť zapísaných na výstup.

FLI_COPY blok

Toto je jediný blok, ktorý neobsahuje komprimované dáta.

typedef struct _CopyChunk {
	CHUNKHEADER	Header;		/* hlavička tohto bloku */
	BYTE 		PixelData[];	/* nekomprimované údaje */
} COPYCHUNK;
	
Počet bodov v tomto bloku je zhodný s výsledkom vynásobenia hodnôt polí Width a Height v hlavičke súboru.

PSTAMP blok

PSTAMP blok je poštová známka animácie. Nachádza sa iba vo formáte FLC a t iba v prvom snímkovom bloku. Môžeme ju brať ako ikonu, alebo titulnú stranu animácie.

PSTAMP blok obsahuje CHUNKHEADER a dva subbloky:

typedef struct _PstampChunk {
	DWORD		ChynkSize;	/* celková veľkosť bloku */
	WORD		ChunkType;	/* identifikátor bloku */
	WORD 		Height;		/* výška známky v bodoch */
	WORD		Width;		/* šírka známky v bodoch */
	WORD		ColorType;	/* typ palety */
	BYTERUNCHUNK	PixelData;	/* vlastné dáta známky */
} PSTAMPCHUNK;
	
ChunkSize
je celková veľkosť PSTAMP bloku
ChunkType
môže nadobúdať hodnoty 0Fh, 10h alebo 12h
Tabuľka: Popis položky ChunkType v bloku PSTAMP
hodnotapopis
0Fhprúdové kódovanie (BYTE_RUN blok)
10hnekomprimované dáta (FLI_COPY)
12hfarebná prevodná tabuľka vychádzajúca zo šesťhranu
Height, Width
určujú veľkosť známky
ColorType
určuje typ farebného priestoru, ktorý poštová známka používa

BLACK blok

Tento blok označuje, že všetky body sa majú nastaviť na hodnotu farby pozadia. To značí, že sa ich hodnota má zmeniť na 0.

typedef struct _BlackChunk{
	CHUNKHEADER	Header; /* hlavička pre tento blok */
} BLACKCHUNK;
	

COLOR_64 a COLOR_256 blok

Tento blok je rovnaký pre obidve verzie tohto formátu.

typedef struct _ColormapChunk {
	CHUNKHEADER	Header;			/* hlavička tohto bloku */
	WORD		NumberOfElements;	/* počet farebných elementov */
	struct _ColorElement {
		BYTE	SkipCount;		/* počítadlo preskočenia */
		BYTE	ColorCount;		/* počet farieb v tomto elemente */
		struct _ColorComponent {
			BYTE	Red;		/* červená zložka */
			BYTE	Green;		/* zelená zložka */
			BYTE	Blue;		/* modrá zložka */
		} ColorComponents[Colorount];
	} ColorElements[NumberOfElements];
} COLORMAPCHUNK;
	
ChunkSize
v hlavičke sa mení podľa počtu prvkov vo farebnej mape.
má hodnotu 04h pre COLOR_256, 0Bh pre COLOR_64.
NumberOfChunks
má hodnotu vždy 00h, teda tento blok nemá žiadne podbloky.
NumberOfElements
označuje počet štruktúr ColorElements. Každá takáto štruktúra obsahuje minimálne dve položky a jednu štruktúru ColorComponent.
ColorCount
určuje počet štruktúr ColorComponent, ktorá má veľkosť tri bajty.
SkipCount
určuje počet farieb, ktoré treba preskočiť, aby sme sa nachádzali na správnom mieste v palete.
Red, Green, Blue
obsahujú úplnú informáciu o farbe. Rozsah týchto hodnôt je 0-63 pre formát FLI a 0-255 pre FLC.
Pre prvý snímok animácie je vždy definovaná celá farebná mapa. Poväčšine to býva aj jediná v celej animácii, ale návrh toho súboru dovoľuje pre každý snímok vlastnú farebnú mapu. Tiež štruktúra umožňuje kódovať iba rozdiely dvoch farebných paliet. Postup je podobný ako v DELTA_FLI bloku.