semmixkolor i percepcja

Bloki rozszerzeń ($21)

GIF89a dodał do formatu rozszerzenia: bloki, które nie zawierają pikseli, ale mówią, jak je pokazać, albo przechowują dodatkowe dane. Wszystkie mają tę samą budowę, więc dekoder może pominąć każde, którego nie zna.

Wspólna budowa

21 wprowadzenie rozszerzenia ("!") xx etykieta: rodzaj rozszerzenia [n ...n bajtów] blok stały (nie każde rozszerzenie go ma) [n ...n bajtów] podbloki danych, ile trzeba 00 terminator

Formalnie blok stały to po prostu pierwszy podblok. Specyfikacja wyróżnia go, bo ma z góry ustaloną długość i znaczenie bajtów.

Cztery standardowe rozszerzenia

EtykietaNazwaDo czegoUżywane?
F9sterowanie grafikąprzezroczystość, opóźnienie klatki, sposób usuwaniabardzo często, w każdej animacji
FFrozszerzenie aplikacjidane programu, np. liczba powtórzeń animacjiczęsto (NETSCAPE2.0)
FEkomentarztekst niewidoczny na obrazieczasem
01tekst graficznytekst rysowany na obrazieprawie nigdy

Etykiety 00-7F są przeznaczone na rozszerzenia, które coś rysują, 80-F9 na sterujące, FA-FF na specjalne. W praktyce nigdy nie dodano nowych oficjalnych etykiet. Nowe zastosowania (XMP, profile ICC) korzystają z rozszerzenia aplikacji $FF z własnym identyfikatorem.

Pomijanie nieznanego rozszerzenia

// pos wskazuje bajt 21; zwraca pozycję za terminatorem
function skipExtension(b, pos) {
  pos += 2;                                  // 21 i etykieta
  for (let n = b[pos++]; n !== 0; n = b[pos++]) pos += n;
  return pos;
}

Ta jedna funkcja wystarczy, żeby dekoder nie zatrzymał się na rozszerzeniu, którego nie rozumie. Dlatego stare przeglądarki z lat 90. poprawnie wyświetlały GIF-y z blokami dodanymi długo po ich wydaniu.

W przykładowym pliku

21 FE 09 73 65 6D 6D 69 78 2E 70 6C 00 komentarz "semmix.pl" 21 F9 04 00 00 00 00 00 sterowanie grafiką

Cały plik jest rozpisany we wstępie.