SDL_Init(SDL_INIT_VIDEO);
然後create 一個你要的 surface,可以任意指定這個 video surface 的 format (color depth, color space(?), dimension):
SDL_Surface *screen;
screen = SDL_SetVideoMode(640,480,16,SDL_FULL_SCREEN);
接下來就跟 DirectDraw 很像..
surface 的 structure 中包含 surface 的 raw data arrary (就像是 framebuffer一樣),可以直接作read/write pixel 的動作。
但是在操作之前,要lock surface,操作完後 unlock:
Uint16 *raw_pixels;
SDL_LockSurface(screen);
raw_pixels = (Uint16 *)screen->pixels;
要"填寫" raw pixel value,可以利用 screen structure 中另一個資訊:format。
format 包涵 color bit 的 有效bit和 bit 位置的資料:
在 example program 可以看出來:
Uint value;
value = ((red >>fmt->Rloss) <<fmt->Rshift) +
....
R.G.B 三色分別有對應的無效 bit 數 (Xloss) 和位置(Xshift)
還有 raw_pixels[] array 的 x, y 對應,可以依照 screen structure 的 pitch 的資料。
pitch 代表 一條 y line 的 byte 數。
example code 中,填寫 (x,y) 點的 offset 是:
screen->pitch/2 * y + 1-- 因為 raw_pixels 是 Uint16,所以要/2。 畫完圖後SDL_Unlock(screen)。 再call SDL_UpdateRect(screen,0,0,0,0) 把 surface update 到真正的螢幕上。
完整code:
#include "SDL.h"
Uint16 CreateHicolorPixel(SDL_PixelFormat *fmt, Uint8 red, Uint8 green, Uint8 blue)
{
Uint16 value;
value = ((red >>fmt->Rloss) << fmt->Rshift) +
((green>>fmt->Gloss) << fmt->Gshift) +
((blue >>fmt->Bloss) << fmt->Bshift);
return value;
}
int main(int argc,char* argv[])
{
SDL_Surface *screen;
Uint16 *raw_pixels;
int x,y;
SDL_Init(SDL_INIT_VIDEO);
atexit(SDL_Quit);
screen = SDL_SetVideoMode(640,480,16,SDL_FULLSCREEN);
SDL_LockSurface(screen);
raw_pixels = (Uint16*)screen->pixels;
for(x=0;x<256;x++){
for(y=0;y<256;y++){
Uint16 pixel_color;
int offset;
pixel_color=CreateHicolorPixel(screen->format,x,0,y);
offset=(screen->pitch/2 *y+x);
raw_pixels[offset]=pixel_color;
}
}
SDL_UnlockSurface(screen);
SDL_UpdateRect(screen,0,0,0,0);
SDL_Delay(3000);
return 0;
}
build command 可以利用 sdl-config 吐出 build optin:
gcc sdl1.c -o sdl1 `sdl-config --cflags --libs`
沒有留言:
張貼留言