ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2009年9月4日 星期五

SDL programming - draw pixel

SDL library 裝完後,就可以試試SDL。 先從 SDL 手動繪圖 (描點) 來看 : 參考的是 Linux Journal : a crash course in SDL 還有 SDL Wiki 看起來 SDL 的用發跟 DirectDraw 類似。 也是以 Surface 為操作主體。 在使用之前,要 作 initialize: 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`

沒有留言:

標籤

網誌存檔