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

©2022 mgr Jerzy Wałaszek
I LO w Tarnowie

Interfejs SDL2:

SDL_CreateRGBSurfaceFrom

SPIS TREŚCI

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

SDL_CreateRGBSurfaceFrom

Użyj tej funkcji do przydzielenia nowej powierzchni RGB z istniejącymi danymi pikseli.

Składnia

SDL_Surface* SDL_CreateRGBSurfaceFrom(void*  pixels,
                                      int    width,
                                      int    height,
                                      int    depth,
                                      int    pitch,
                                      Uint32 Rmask,
                                      Uint32 Gmask,
                                      Uint32 Bmask,
                                      Uint32 Amask)

Parametry funkcji

pixels wskaźnik do istniejących danych pikseli
width szerokość powierzchni
height wysokość powierzchni
depth głębokość koloru w bitach; zobacz do Uwag.
pitch długość wiersza pikseli w bajtach
Rmask czerwona maska dla pikseli.
Gmask zielona maska dla pikseli.
Bmask niebieska maska dla pikseli.
Amask maska przezroczystości alfa dla pikseli.

Wartość zwracana

Zwraca nową strukturę SDL_Surface, która jest tworzona, lub NULL przy błędzie; wywołaj funkcję SDL_GetError(), aby otrzymać więcej informacji na temat błędu.

Przykładowy kod

// Ten przykład pokazuje sposób utworzenia SDL_Surface* danymi załadowanymi
// z pliku graficznego przy pomocy biblioteki stb_image.h (https://github.com/nothings/stb/)

int req_format = STBI_rgb_alpha;
int width, height, orig_format;
unsigned char* data = stbi_load("./test.png", &width, &height, &orig_format, req_format);
if(data == NULL)
{
  SDL_Log("Loading image failed: %s", stbi_failure_reason());
  exit(1);
}

// Ustaw maski koloru formatu pikseli dla tablicy bajtów RGB(A).
// Tutaj są wspierane tylko STBI_rgb (3) i STBI_rgb_alpha (4)!
Uint32 rmask, gmask, bmask, amask;
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
  int shift = (req_format == STBI_rgb) ? 8 : 0;
  rmask = 0xff000000 >> shift;
  gmask = 0x00ff0000 >> shift;
  bmask = 0x0000ff00 >> shift;
  amask = 0x000000ff >> shift;
#else // maszyna o porządku cienkokońcowym, np. x86
  rmask = 0x000000ff;
  gmask = 0x0000ff00;
  bmask = 0x00ff0000;
  amask = (req_format == STBI_rgb) ? 0 : 0xff000000;
#endif

int depth, pitch;
if (req_format == STBI_rgb)
{
  depth = 24;
  pitch = 3*width; // 3 bajty na piksel * liczba pikseli na wiersz
}
else
{ // STBI_rgb_alpha (RGBA)
  depth = 32;
  pitch = 4*width;
}

SDL_Surface* surf = SDL_CreateRGBSurfaceFrom((void*)data, width, height, depth, pitch,
                                             rmask, gmask, bmask, amask);

if (surf == NULL)
{
  SDL_Log("Creating surface failed: %s", SDL_GetError());
  stbi_image_free(data);
  exit(1);
}

// ... zrób coś użytecznego z tą powierzchnią ...
// ...

// jeśli jej już nie potrzebujesz, zwolnij ją ...
SDL_FreeSurface(surf);
// .. wraz z danymi używanymi przez tę powierzchnię!
stbi_image_free(data);

Uwagi

Jeśli głębokość koloru wynosi 4 lub 8 bitów, przydzielana jest pusta paleta dla powierzchni. Jeśli głębokość jest większa niż 8 bitów, ustawiony zostaje format pikseli przy użyciu parametrów [RGBA]mask.

Parametry [RGBA]mask są maskami bitowymi używanymi do wydobywania koloru z piksela. Na przykład maska Rmask o wartości FF000000 oznacza, że składowa czerwona jest przechowywana w najbardziej znaczącym bajcie. Uzycie zer dla masek RGB ustawia standardową wartość opartą na głębokości koloru. (np. SDL_CreateRGBSurface(0,w,h,32,0,0,0,0);) Jednakże użycie zera dla Amask powoduje ustawienie Amask na 0.

Standardowo powierzchnie z maską alfa są ustawiane do wtapiania tak, jak z

SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_BLEND);

Możesz to zmienić przez wywołanie SDL_SetSurfaceBlendMode() i wybranie innego trybu wtapiania blendMode.

Dane pikseli nie są kopiowane oraz nie są zarządzane automatycznie. Musisz zwolnić powierzchnię przed zwolnieniem danych pikseli.

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
©2022 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.