Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Opracował: kamillo121
Udoskonalił: Piotr DejaVu Szawdyński
Biblioteki C/C++

SDL_BlitSurface

[funkcja] Kopiuje wycinek obrazu z jednej powierzchni na drugą.

Składnia

C/C++
#include <sdl/SDL.h>

int SDL_BlitSurface( SDL_Surface * src, SDL_Rect * srcrect, SDL_Surface * dst, SDL_Rect * dstrect );

Argumenty

TypOpis
SDL_Surface* src Adres powierzchni źródłowej.
SDL_Rect* srcrectAdres na strukturę » SDL 1.2SDL_Rect, określający wycinek obrazu, który ma zostać skopiowany z powierzchni źródłowej.
SDL_Surface* dst Adres powierzchni docelowej.
SDL_Rect* dstrectAdres na strukturę » SDL 1.2SDL_Rect, określający pozycję oraz maksymalne wymiary obszaru w którym ma zostać umieszczony kopiowany wycinek obrazu.

Zwracana wartość

Funkcja SDL_BlitSurface zwraca wartość 0 gdy operacja powiedzie się, w przeciwnym wypadku zwraca wartość różną od zera. Zazwyczaj zwracaną wartością jest -1.

Jeżeli obie powierzchnie były w pamięci karty graficznej i funkcja SDL_BlitSurface zwróci wartość -2 oznaczać to będzie, że zawartość pamięci karty graficznej uległa utracie i powinna ona zostać załadowana ponownie.

Powyższa sytuacja ma miejsce dla DirectX 5.0, gdy Twoja aplikacja wychodzi z trybu pełnoekranowego. Blokowanie powierzchni również nie zadziała dopóki nie odzyskasz ponownie dostępu do pamięci karty graficznej. W związku z powyższym sugeruje się zastosowanie następującego rozwiązania:
C/C++
while( SDL_BlitSurface( image, imgrect, screen, dstrect ) == - 2 ) {
    while( SDL_LockSurface( image ) < 0 )
         SDL_Delay( 10 );
    // Odtworzenie zawartości powierzchni
    SDL_UnlockSurface( image );
}

Opis szczegółowy

Funkcja służy do kopiowania wycinka obrazu z jednej powierzchni na drugą. Fragment obrazu, który będzie kopiowany do powierzchni dst określa argument srcrect. Jeżeli argument srcrect będzie równy NULL to zawartość całego obrazka źródłowego zostanie skopiowana.

Jeżeli dstrect jest równy NULL to wycinek obrazu źródłowego zostanie umieszczony na powierzchni docelowej od pozycji (0,0), która stanowi lewy górny róg powierzchni.

Jeżeli argument dstrect jest różny od NULL to kopiowany obraz zostanie przycięty do wymiarów określonych przez wspomniany argument. Powierzchnia źródłowa nie ulega jednak żadnym modyfikacjom.

Operacja kopiowania nie powinna odbywać się na zablokowanych powierzchniach. W przypadku własnych funkcji rysujących może być wymagane założenie blokady, niemniej jednak wymóg ten nie dotyczy funkcji SDL_BlitSurface.

Uwaga!
Pamiętaj, że nie należy wykorzystywać niniejszej funkcji w połączeniu z OpenGL'em.

Dodatkowe informacje

Funkcja SDL_BlitSurface nie potrafi przeskalowywać powierzchni. Sugeruje się zastosowanie własnych mechanizmów, bądź wykorzystać bibliotekę SDL_gfx.

Jeżeli wykonujesz operację kopiowania na dwóch powierzchniach posiadających kanał alfa to zazwyczaj kanał alfa powierzchni docelowej zachowuje się jak maska. Jeżeli chcesz wykonać zwykłą kopię obrazu, która nie uwzględnia mieszania kolorów to musisz wyłączyć kanał alfa dla powierzchni źródłowej za pomocą flagi SDL_SRCALPHA.

Pamiętaj, że zachowanie niniejszej funkcji jest de'facto nieprzewidywalne w przypadku, gdy łączysz dwie powierzchnie, posiadające włączony kanał alfa i obie powierzchnie posiadają przeźroczyste tło.

Przykład

C/C++
SDL_Init( SDL_INIT_VIDEO );
SDL_Surface * ekran = SDL_SetVideoMode( 640, 480, 32, SDL_SWSURFACE );

SDL_Surface * obazek = SDL_LoadBMP( "picture.bmp" );

//INFO: miejsce docelowe obrazu na powierzchni 'ekran'
SDL_Rect destRect;
destRect.w = picture->w;
destRect.h = picture->h;
destRect.x = 20;
destRect.y = 30;

SDL_BlitSurface( obazek, NULL, ekran, & destRect );
SDL_Flip( ekran );

SDL_FreeSurface( obazek );
SDL_Quit();

Linki zewnętrzne