Opis ekranu logicznego
Zaraz po nagłówku idzie 7 bajtów opisujących "ekran logiczny": obszar, na którym rysuje się wszystkie obrazy z pliku. Ten blok mówi też, czy plik ma paletę globalną i jak jest duża.
Budowa
| Bajty | Pole | Przykład |
|---|---|---|
| 0-1 | szerokość ekranu (little-endian) | 04 00 = 4 |
| 2-3 | wysokość ekranu | 02 00 = 2 |
| 4 | flagi | F1 |
| 5 | indeks koloru tła | 00 |
| 6 | proporcje pikseli | 00 |
Bajt flag
| N | Kolorów | Bajtów palety | Minimalna długość kodu LZW |
|---|---|---|---|
| 0 | 2 | 6 | 2 |
| 1 | 4 | 12 | 2 |
| 2 | 8 | 24 | 3 |
| 3 | 16 | 48 | 4 |
| 7 | 256 | 768 | 8 |
Paleta ma zawsze potęgę dwójki pozycji. Obraz w 5 kolorach musi mieć paletę 8-kolorową, a 3 pozycje zostają nieużywane. Ostatnia kolumna dotyczy bloku obrazu: dla palet 2-kolorowych minimalna długość kodu i tak wynosi 2, bo GIF nie pozwala na 1.
Pole rozdzielczości kolorów (bity 6-4) jest informacyjne i praktycznie nieużywane (zob. rozdzielczość kolorów). Flaga sortowania pomagała kiedyś dekoderom z mniejszą liczbą kolorów wybrać najważniejsze.
Kolor tła i proporcje
Kolor tła to numer z palety globalnej, którym należy wypełnić ekran tam, gdzie żaden obraz nie sięga. Przeglądarki internetowe zwykle go ignorują i pokazują w tych miejscach przezroczystość.
Proporcje pikseli: 0 oznacza "nie podano", inna wartość N daje (N + 15) / 64. Opisuje to strona o proporcjach punktów.
Paleta globalna
Jeśli bit 7 jest ustawiony, zaraz za opisem ekranu idą kolory palety: po 3 bajty (R, G, B) na kolor, bez żadnych separatorów. W przykładzie 4 kolory zajmują 12 bajtów:
Paleta globalna obowiązuje dla każdego obrazu, który nie ma własnej palety lokalnej. Wartości są zapisane bez informacji o przestrzeni barw, więc w praktyce traktuje się je jako sRGB.
function readScreen(b, pos) { // pos: zaraz po nagłówku
const w = b[pos] | (b[pos + 1] << 8), h = b[pos + 2] | (b[pos + 3] << 8);
const flags = b[pos + 4];
const hasGct = (flags & 0x80) !== 0;
const gctSize = 2 << (flags & 0x07); // 2^(N+1)
return { w, h, hasGct, gctSize, bg: b[pos + 5], aspect: b[pos + 6] };
}