Serwis Edukacyjny Nauczycieli w I-LO w Tarnowie ![]() Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej
Autor artykułu: mgr Jerzy
Wałaszek |
©2023 mgr Jerzy Wałaszek
|
SDL_PixelFormat
SPIS TREŚCI |
Rozdział jest tłumaczeniem oryginalnej instrukcji dla biblioteki SDL2.
Struktura zawiera informację o formacie pikseli.
Uint32 | format | jedna z wartości SDL_PixelFormatEnum. |
SDL_Palette* | palette | struktura SDL_Palette skojarzona z tym formatem pikseli lub NULL, jeśli format nie posiada palety. |
Uint8 | BitsPerPixel | liczba znaczących bitów w wartości piksela, np.: 8, 15, 16, 24, 32. |
Uint8 | BytesPerPixel | liczba bajtów na przechowywanie wartości piksela, np.: 1, 2, 3, 4; zobacz do Uwag. |
Uint32 | Rmask | maska reprezentująca położenie składowej czerwonej w pikselu. |
Uint32 | Gmask | maska reprezentująca położenie składowej zielonej w pikselu. |
Uint32 | Bmask | maska reprezentująca położenie składowej niebieskiej w pikselu. |
Uint32 | Amask | maska reprezentująca położenie składowej alfa w pikselu lub 0, jeśli format pikseli nie posiada informacji o przezroczystości. |
Uint8 | Rloss | (użytek wewnętrzny). |
Uint8 | Gloss | (użytek wewnętrzny). |
Uint8 | Bloss | (użytek wewnętrzny). |
Uint8 | Aloss | (użytek wewnętrzny). |
Uint8 | Rshift | (użytek wewnętrzny). |
Uint8 | Gshift | (użytek wewnętrzny). |
Uint8 | Bshift | (użytek wewnętrzny). |
Uint8 | Ashift | (użytek wewnętrzny). |
int | refcount | (użytek wewnętrzny). |
SDL_PixelFormat* | next | (użytek wewnętrzny). |
Najłatwiejsze do zrozumienia są 8-bitowe formaty pikseli. Ponieważ jest to format 8-bitowy, pole BitsPerPixel ma wartość 8, a BytesPerPixel ma wartość 1. Ponieważ BytesPerPixel wynosi 1, wszystkie piksele są reprezentowane przez typ Uint8, który zawiera indeks w tablicy palette->colors. Zatem, aby określić kolor piksela na 8-bitowej powierzchni, odczytujemy indeks koloru z surface->pixels i uzywamy tego indeksu do odczytu struktury SDL_Color z surface->format->palette->colors. Na przykład tak:
SDL_Surface *surface; SDL_PixelFormat *fmt; SDL_Color *color; Uint8 index; . . /* Utwórz powierzchnię */ . . fmt=surface->format; /* Sprawdź głębię bitową powierzchni */ if(fmt->BitsPerPixel!=8){ fprintf(stderr, "Not an 8-bit surface.\n"); return(-1); } /* Zablokuj powierzchnię */ SDL_LockSurface(surface); /* Pobierz górny lewy piksel */ index=*(Uint8 *)surface->pixels; color=&fmt->palette->colors[index]; /* Odblokuj powierzchnię */ SDL_UnlockSurface(surface); printf("Pixel Color-> Red: %d, Green: %d, Blue: %d. Index: %d\n", color->r, color->g, color->b, index); . . |
Formaty pikseli powyżej 8 bitów są zupełnie inne. Traktuje się je jako formaty "TrueColor", a informacja o kolorze przechowywana jest w samych pikselach, a nie w palecie. Pola mask, shift i loss informują nas o sposobie kodowania kolorów. Pola mask pozwalają na wyodrębnienie każdej ze składowych kolorów, pola shift informują nas o liczbie bitów na prawo od kazdej składowej w wartości piksela, a pola loss informują nas o liczbie bitów traconych z każdej składowej, przy umieszczaniu 8-bitowej składowej koloru w kodzie piksela.
/* Wydobywanie składowych koloru z 32-bitowej wartości koloru */ SDL_PixelFormat *fmt; SDL_Surface *surface; Uint32 temp, pixel; Uint8 red, green, blue, alpha; . . . fmt = surface->format; SDL_LockSurface(surface); pixel = *((Uint32*)surface->pixels); SDL_UnlockSurface(surface); /* Pobierz składową czerwoną */ temp = pixel & fmt->Rmask; /* Wyodrębnij składową czerwoną */ temp = temp >> fmt->Rshift; /* przesuń ją w dół do 8 bitów */ temp = temp << fmt->Rloss; /* Poszerz na pełną 8-bitową liczbę */ red = (Uint8)temp; /* Pobierz składową zieloną */ temp = pixel & fmt->Gmask; /* Wyodrębnij składową zieloną */ temp = temp >> fmt->Gshift; /* przesuń ją w dół do 8 bitów */ temp = temp << fmt->Gloss; /* Poszerz na pełną 8-bitową liczbę */ green = (Uint8)temp; /* Pobierz składową niebieską */ temp = pixel & fmt->Bmask; /* Wyodrębnij składową niebieską */ temp = temp >> fmt->Bshift; /* przesuń ją w dół do 8 bitów */ temp = temp << fmt->Bloss; /* Poszerz na pełną 8-bitową liczbę */ blue = (Uint8)temp; /* Pobierz składową alfa */ temp = pixel & fmt->Amask; /* Wyodrębnij składową alfa */ temp = temp >> fmt->Ashift; /* przesuń ją w dół do 8 bitów */ temp = temp << fmt->Aloss; /* Poszerz na pełną 8-bitową liczbę */ alpha = (Uint8)temp; printf("Pixel Color -> R: %d, G: %d, B: %d, A: %d\n", red, green, blue, alpha); . . . |
Format pikseli posiada albo paletę, albo maski. Jeśli jest używana paleta, pola Rmask, Gmask, Bmask i Amask będą miały wartość 0.
Typy danych dla pikseli są następujące:
Bajty na piksel | Powiązany typ danych |
1 | Uint8 |
2 | Uint16 |
3 | krotka wartości RGB Uint8 |
4 | Uint32 |
Struktura SDL_PixelFormat opisuje format danych pikseli przechowywanych w polu pixels struktury SDL_Surface. Każda powierzchnia przechowuje strukturę SDL_PixelFormat w polu format.
Jeśli zamierzasz dokonywać manipulacji na pikselach powierzchni graficznej, to niezbędne staje się zrozumienie, w jaki sposób SDL przechowuje informacje o ich kolorach. Zobacz na przykładowe kody przedstawione powyżej.
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2023 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.