semmixkolor i percepcja

Sterowanie grafiką ($F9)

Ten krótki blok stoi przed obrazem i mówi, jak go pokazać: który kolor ma być przezroczysty, ile czekać przed następną klatką i co zrobić z obrazem, zanim pojawi się kolejny. Bez niego nie byłoby animowanych GIF-ów ani przezroczystości.

Budowa

BajtyPole
0-121 F9
2długość bloku: zawsze 04
3flagi
4-5opóźnienie w setnych częściach sekundy (little-endian)
6indeks koloru przezroczystego
7terminator 00

Bajt flag

bity 7-5 zarezerwowane (0) bity 4-2 sposób usuwania klatki (disposal method) bit 1 czekać na reakcję użytkownika bit 0 włączony kolor przezroczysty
UsuwanieZnaczenie
0nie określono, dekoder robi to samo co przy 1
1zostaw obraz, następna klatka rysuje się na nim
2przywróć tło: wyczyść prostokąt klatki
3przywróć to, co było przed narysowaniem klatki

Sposób 1 pozwala w kolejnych klatkach zapisywać tylko zmiany. Sposób 2 jest potrzebny, gdy przezroczysty obiekt porusza się po tle. Sposób 3 jest najrzadziej używany i najtrudniejszy dla dekodera, bo wymaga zapamiętania fragmentu ekranu.

Przykłady

21 F9 04 00 00 00 00 00 │ └─┬─┘ │ │ │ └─ indeks przezroczysty: 0 (nieużywany, bo bit 0 = 0) │ └───── opóźnienie: 0 └────────── flagi 00: bez przezroczystości, usuwanie 0 tak jest w przykładowym pliku: blok niczego nie zmienia
21 F9 04 05 32 00 01 00 │ └─┬─┘ │ │ │ └─ kolor przezroczysty: indeks 1 (biel) │ └───── opóźnienie 0x0032 = 50 → 0,5 s └────────── flagi 05 = 00000101: usuwanie 1, przezroczystość włączona

Gdyby w przykładowym pliku zamienić blok na drugą wersję, białe piksele stałyby się przezroczyste.

Opóźnienie w praktyce

Opóźnienie liczy się w setnych sekundy, więc najkrótsze możliwe to 0,01 s. Przeglądarki traktują jednak bardzo małe wartości (0 i 1, czyli 0-0,01 s) jak 0,1 s, żeby stare GIF-y z zerowym opóźnieniem nie migały zbyt szybko. Płynna animacja w GIF to w praktyce 2-6 setnych na klatkę, czyli około 17-50 klatek na sekundę.

Blok dotyczy tylko jednego, najbliższego następnego obrazu (albo tekstu graficznego). Każda klatka animacji ma własny blok $F9 (zob. kolejność bloków).