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 |
©2025 mgr Jerzy Wałaszek
|
SDL_CreateRGBSurfaceFrom
SPIS TREŚCI |
Rozdział jest tłumaczeniem oryginalnej instrukcji dla biblioteki SDL2.
Użyj tej funkcji do przydzielenia nowej powierzchni RGB z istniejącymi danymi pikseli.
SDL_Surface* SDL_CreateRGBSurfaceFrom(void* pixels, int width, int height, int depth, int pitch, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask) |
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. |
// 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); |
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.
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2025 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:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.