BasicC/Obrazy

 W SDL obrazy występują w postaci tzw. powierzchni (surface) lub tekstury (texture). W Basic C powierzchnie prawie nie są stosowane, gdyż nie mają wspomagania sprzętowego, wiec zwykle obraz (Img) to tekstura - przypisany do zmiennej typu wskaźnik na SDL_Texture (nazwa zmiennej poprzedzona * w deklaracji).
Obraz do wyświetlenia tworzy się na projektorze (renderer) rysując np. punkty, linie lub wstawiając (kopiując) obrazy. Wyświetlenie na ekranie (w oknie) następuje po komendzie ShowPage. Można zmienić miejsce docelowe tworzenia obrazów (target) komendą Target i rysować na wskazanym obrazie (teksturze) zmieniając jego zawartość. Można stworzyć nowy obraz o danych wymiarach, wyczyścić go i rysować na nim jak na wirtualnym ekranie. By wyświetlić zawartość obrazu należy przywrócić projektor jako target komendą Target(NULL), wstawić do niego obraz i wywołać ShowPage.
Tryby dostępu do tekstur:

SDL_TEXTUREACCESS_STATIC rzadka zmiana treści, nieblokowalna
SDL_TEXTUREACCESS_STREAMING częsta zmiana treści, blokowalna
SDL_TEXTUREACCESS_TARGET może być stosowana jako tekstura docelowa do tworzenia grafiki

 Jeśli to możliwe należy używać trybu STATIC, inne tryby mogą powodować niespodzianki, np. obrazy w trybie TARGET mogą być kasowane w wyniku zmiany wielkości okna.

ColorKey(surface,R,G,B)Edytuj

Ustawia kolor o składowych RGB dla powierzchni surface jako całkowicie przeźroczysty. surface jest strukturą typu SDL_Surface. Wykonuje SDL_SetColorKey(surface,1,SDL_MapRGB(surface->format,R,G,B));

CopyImg(T1,X,Y,W,H,T2)Edytuj

Kopiuje fragment obrazu T1, od pozycji X,Y i wymiarach W,H, tworząc z niego obraz T2 w trybie TARGET. Zmienna wskazująca na obraz (teksturę) T2 musi zostać wcześniej zadeklarowana (SDL_Texture*T2=NULL;). Dokładnie wykonywane są następujące czynności:

  • if(T2) SDL_DestroyTexture(T2); usunięcie T2, jeśli istnieje
  • T2=SDL_CreateTexture(SDLRenderer,SDL_PIXELFORMAT_RGBA32,SDL_TEXTUREACCESS_TARGET,W,H); utworzenie nowego obrazu T2
  • SDL_SetRenderTarget(SDLRenderer,T2); ustawienie "targetu" na T2
  • SDL_SetRenderDrawColor(SDLRenderer,0,0,0,0); wybranie czarnego koloru
  • SDL_RenderClear(SDLRenderer); wypełnienie T2 na czarno
  • SRC.x=X;SRC.y=Y;SRC.w=W;SRC.h=H;SDL_RenderCopy(SDLRenderer,T1,&SRC,NULL); skopiowanie fragmentu T1 do T2
  • SDL_SetRenderTarget(SDLRenderer,NULL); ustawienie targetu na projektor

CreateImg(T,w,h)Edytuj

Utworzenie nowego obrazu w trybie TARGET o wymiarach w,h przypisanego do zmiennej T, która musi być zadeklarowana. Wykonuje T=SDL_CreateTexture(SDLRenderer,SDL_PIXELFORMAT_RGBA32,SDL_TEXTUREACCESS_TARGET,w,h);

CreateImgBitmap(T,P,w,h)Edytuj

Utworzenie nowego obrazu o wymiarach w,h, przypisanego do zmiennej T, wypełnionego danymi z pamięci o adresie wskazanym przez P. Wykonuje {T=SDL_CreateTexture(SDLRenderer,SDL_PIXELFORMAT_RGBA32,SDL_TEXTUREACCESS_STATIC,w,h);SDL_UpdateTexture(T,NULL,P,w*4);}

DeleteImg(T)Edytuj

Usuwa obraz T. Wykonuje {SDL_DestroyTexture(T);T=NULL;}

GetBitmap(X,Y,W,H,pixels)Edytuj

Kopiuje fragment obrazu z targetu od pozycji X,Y i wymiarach W,H do pamięci od adresu wskazywanego przez pixels. Wykonuje {SRC.x=X;SRC.y=Y;SRC.w=W;SRC.h=H;SDL_RenderReadPixels(SDLRenderer,&SRC,SDL_PIXELFORMAT_RGBA32,pixels,W*4);}
W niektórych systemach, np. Android, może powodować krytyczny błąd.

GetImg(X,Y,W,H,T)Edytuj

Kopiuje fragment obrazu z targetu od pozycji X,Y i wymiarach W,H do tekstury T. Wywołuje GetBitmap do bufora tymczasowego, a nastepnie ImgBitmap. Jeśli T wskazuje na NULL tworzony jest nowy obraz przypisany do T.

ImgBitmap(T,P,W)Edytuj

Wypełnia obraz T danymi z pamięci wskazywanymi przez P. W to ilość pikseli w wierszu (szerokość obrazu). Wykonuje SDL_UpdateTexture(T,NULL,P,w*4);

InvertImg(S,T)Edytuj

Kopiuje obraz (teksturę) S do T z odwróconymi kolorami w trybie TARGET. Tekstura musi być zadeklarowana.
Uwaga! Dodatkowo powoduje:

  • zmianę trybu mieszania kolorów tekstury S
  • ustawienie targetu na projektor
  • zmianę koloru rysowania na biały

InvertImgBitmap(T,pixels,W,H)Edytuj

Jak ImgBitmap, ale tworzony jest nowy obraz o wymiarach W,H, kolory zostają odwrócone (negatyw), a obraz jest w trybie STREAMING.

InvertImgSurface(S,T)Edytuj

Kopiuje powierzchnię S w odwróconych kolorach do tekstury T w trybie STREAMING tworząc negatyw. Dokładnie wykonuje:

  • SDL_Surface* CS=SDL_ConvertSurfaceFormat(S,SDL_PIXELFORMAT_RGBA32,0); tworzy powierzchnie CS zawierającą kopie S o formacie kolorów RGBA32
  • SDL_DestroyTexture(*T); usuwa teksturę T
  • *T=SDL_CreateTexture(SDLRenderer,SDL_PIXELFORMAT_RGBA32,SDL_TEXTUREACCESS_STREAMING,CS->w,CS->h); tworzy teksturę T o wymiarach powierzchni S
  • SDL_LockTexture(*T,NULL,&Pixels,&Pitch); "blokuje" T, do zmiennej Pixels zapisuje adres danych T, do Pitch ilość bajtów w wierszu T (szerokość*4)
  • Uint32* pix=(Uint32*)Pixels; tworzy wskaźnik pix na 4-bajtowy obszar i przypisuje mu adres Pixels
  • Uint32* spix=(Uint32*)CS->pixels; spix wskazuje na CS
  • for(int i=0;i<CS->w*CS->h;++i) pix[i]=~spix[i]; kopiuje zanegowane (odwrócone) dane z CS do T
  • SDL_UnlockTexture(*T); odblokowuje T
  • SDL_FreeSurface(CS); usuwa CS

ImgAlphaMod(texture,alpha)Edytuj

Ustawia modulator alfa obrazu texture dla kopiowania. Docelowa wartość alfa kopiowanego (rysowanego) obrazu będzie wynosiła: alfa obrazu*(alpha/255). Wynika z tego, że alpha=255 nie da żadnego efektu. Wykonuje SDL_SetTextureAlphaMod(texture,alpha);

ImgBlendMode(texture,blend)Edytuj

Ustawia tryb mieszania obrazu texture. Wykonuje SDL_SetTextureBlendMode(texture,blend);

ImgColorMod(texture,r,g,b)Edytuj

Ustawia modulator składowych kolorów dla obrazu texture przy kopiowaniu. Docelowa wartość składnika koloru będzie wynosić: składnik koloru*(color/255), gdzie color to wartość danego składnika modulatora koloru. Np. części obrazu w kolorze białym otrzymają kolor modulatora, części czarne pozostaną czarne, inne kolory otrzymają kolor pośredni. Wywołuje SDL_SetTextureColorMod(texture,r,g,b);

ImgSDLColorMod(texture,SDLColor)Edytuj

J. w., ale kolor podajemy za pomocą zmiennej typu SDL_Color.

ImgSize(T)Edytuj

Odczytuje rozmiar obrazu T. Wynik zapisuje do pól w i h zmiennych SRC i DST. Wykonuje {SDL_QueryTexture(T,NULL,NULL,&DST.w,&DST.h);SRC.w=DST.w;SRC.h=DST.h;}

InsertImg(T)Edytuj

Kopiuje obraz T do miejsca docelowego (targetu, domyślnie projektora) wypełniając całą jego zawartość. Wywołuje SDL_RenderCopy(SDLRenderer,T,NULL,NULL);

LoadImg(T,N)Edytuj

Ładuje obraz T z pliku o nazwie N. T musi być zadeklarowane. Wykonuje:

  • SDL_FreeSurface(SDLSurface); usuwa zawartość SDLSurface
  • ifdef SDL_IMAGE_H_

SDLSurface=IMG_Load(N); jeśli załączono SDL_image załaduj obraz do SDLSurface else SDLSurface=SDL_LoadBMP(N); jeśli nie - załaduj obraz komendą SDL_LoadBMP endif

  • if(!SDLSurface) SDL_Log(SDL_GetError()); jeśli SDLSurface=NULL wypisz komunikat
  • T=SDL_CreateTextureFromSurface(SDLRenderer,SDLSurface); tworzy teksturę T z SDLSurface

LoadImgKey(T,N,K)Edytuj

Jak LoadImg, ale dodatkowo ustala kolor K przeźroczystym komendą {Color.BAS=K;SDL_SetColorKey(SDLSurface,1,SDL_MapRGB(SDLSurface->format,Color.SDL.r,Color.SDL.g,Color.SDL.b));}

PutImg(T,X,Y)Edytuj

Wstawia obraz T do targetu w pozycji X,Y. Wykonuje {SDL_QueryTexture(T,NULL,NULL,&DST.w,&DST.h);DST.x=X;DST.y=Y;SDL_RenderCopy(SDLRenderer,T,NULL,&DST);}

PutImgScale(T,X,Y,SW,SH)Edytuj

Wstawia obraz T do targetu w pozycji X,Y mnożąc szerokość i wysokość przez SW i SH. Wykonuje {SDL_QueryTexture(T,NULL,NULL,&DST.w,&DST.h);DST.x=X;DST.y=Y;DST.w*=SW;DST.h*=SH;SDL_RenderCopy(SDLRenderer,T,NULL,&DST);}

PutImgSize(T,X,Y,W,H)Edytuj

Wstawia obraz T do targetu w pozycji X,Y zmieniając jego wymiary na W,H. Wykonuje {DST.x=X;DST.y=Y;DST.w=W;DST.h=H;SDL_RenderCopy(SDLRenderer,T,NULL,&DST);}

PutImgRect(T,S,D)Edytuj

Wstawia część obrazu T wskazaną w S do targetu w pozycji i wymiarach wskazywanych przez D. S i D to zmienne typu SDL_Rect, można zadeklarowac własne lub wykorzystać zadeklarowane przez BasicSDL o nazwach SRC i DST. Wywołuje SDL_RenderCopy(SDLRenderer,T,&S,&D);

PutImgRotoFlip(T,X,Y,R,F)Edytuj

Wstawia obraz T do targetu w pozycji X,Y obrócony o R stopni względem środka i odbity zgodnie z F przyjmujące: SDL_FLIP_NONE - brak odbicia, SDL_FLIP_HORIZONTAL - odbicie w poziomie, SDL_FLIP_VERTICAL - odbicie w pionie, SDL_FLIP_HORIZONTAL | SDL_FLIP_VERTICAL - w pionie i poziomie. Wykonuje {SDL_QueryTexture(T,NULL,NULL,&DST.w,&DST.h);DST.x=X;DST.y=Y;SDL_RenderCopyEx(SDLRenderer,T,NULL,&DST,R,NULL,F);}

PutImgREF(T,S,D,R,F)Edytuj

Jak PutImgRect ale obrócony o R stopni względem środka i odbity zgodnie z F. Wywołuje SDL_RenderCopyEx(SDLRenderer,T,&S,&D,R,NULL,F);

PutImgREX(T,S,D,R,C,F)Edytuj

Jak PutImgRect ale obrócony o R stopni względem punktu C i odbity zgodnie z F, gdzie C jest zmienną typu SDL_Point. Wywołuje SDL_RenderCopyEx(SDLRenderer,T,&S,&D,R,&C,F);

SaveBMP(X,Y,W,H,N)Edytuj

Zapisuję fragment obrazu z targetu od pozycji X,Y i wymiarach W,H do pliku o nazwie N w formacie .bmp.

Target(texture)Edytuj

Ustala obraz texture miejscem docelowym operacji graficznych zamiast domyślnego projektora, dzięki czemu można rysować na danym obrazie zmieniając jego zawartość. Wpisanie NULL w miejsce texture powoduje ustawienie targetu na projektor. Wywołuje SDL_SetRenderTarget(SDLRenderer,texture);

Przykład:

#include "BasicSDL.h"
Uint8 dane[200*200*4];
SDL_Texture *obraz;
SDL_Point c={100,100};
MAIN
  SDLOpen(0)
  Color(-255)
  Circle(100,100,100)
  Box(50,50,100,150)
  GetBitmap(0,0,200,200,dane)
  ImgBitmap(obraz,dane,200)
  SRC(0,0,200,200) DST(300,100,300,200)
  PutImgREX(obraz,SRC,DST,39,c,0)
  InvertImgBitmap(obraz,dane,200,200)
  PutImg(obraz,200,0)
  ShowPage
  WaitInKey
  SDLQuit
ENDMAIN