|
||||||||||||||||||||||||||||||||||||
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 Organizácia súboruAnimá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
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;
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é */
}
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 DELTA_FLI blokTento 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;
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 DELTA_FLC blokTento 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 blokTý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 blokToto 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 blokPSTAMP 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;
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
typedef struct _BlackChunk{
CHUNKHEADER Header; /* hlavička pre tento blok */
} BLACKCHUNK;
COLOR_64 a COLOR_256 blokTento 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;
|
||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||