Serwis Edukacyjny
Nauczycieli
w I-LO w Tarnowie

obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

Autor artykułu: mgr Jerzy Wałaszek
Uaktualniono: 31.07.2022

©2023 mgr Jerzy Wałaszek
I LO w Tarnowie

Interfejs SDL2:

SDL_PixelFormat

SPIS TREŚCI

Rozdział jest tłumaczeniem oryginalnej instrukcji dla biblioteki SDL2.

SDL_PixelFormat

Struktura zawiera informację o formacie pikseli.

Pola danych

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).

Przykładowy kod

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);
.
.
.

Uwagi

Wszystko w strukturze formatu pikseli jest tylko do odczytu.

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.

Powiązane struktury

Powiązane funkcje

Na początek:  podrozdziału   strony 

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.