影像例子

預置影像展示

    screen_:PSDL_Surface;

//預置SDL圖書館
如果(SDL_Init((SDL_INIT_VIDEO)<0)那時
開始
MessageBox 0,PChar格式化Couldn t預置SDL:%s'[,SDL_GetError'],錯誤,MB_OK或者MB_ICONHAND;
SDL_Quit;
使(1)停下來;
末端;

//預置在一640x480 8位palettized方式中展示
screen_:=SDL_SetVideoMode((640,480,8,SDL_SWSURFACE);
如果那時(screen_=)
開始
MessageBox 0,PChar格式化Couldn t設定640x480x8影像方式:%s'[,SDL_GetError'],錯誤,MB_OK或者MB_ICONHAND;
SDL_Quit;
使(1)停下來;
末端;

預置最好的影像方式

    //偏愛8位但是接受任何深度
screen_:=SDL_SetVideoMode((640,480,8,SDL_SWSURFACE或者SDL_ANYFORMAT);
如果那時(screen_=)
開始
MessageBox 0,PChar格式化Couldn t設定640x480x8影像方式:%s'[,SDL_GetError'],錯誤,MB_OK或者MB_ICONHAND;
SDL_Quit;
使(1)停下來;
末端;
MessageBox 0,PChar格式化'使640x480根據映像點方式'%d小塊.[screen_.format.BitsPerPixel]',錯誤',MB_OK或者MB_ICONHAND;

裝載和展示一BMP檔案

  過程LoadBmp FileName:繩子;

形象:PSDL_Surface;
dest:TSDL_Rect;
ncolors,i:整數;
顏色:PSDL_Color;
r,g,b:整數;
開始
//把BMP檔案裝入一表面
想像:=SDL_LoadBMP((PChar((FileName));
如果那時(想像=)
開始
MessageBox 0,PChar格式化Couldn t負擔點陣圖:%s'[,FileName'],錯誤,MB_OK或者MB_ICONHAND;
出口;
末端;

設定展示顏色--SDL_SetColors僅做點事在上
palettized在HiColor上展示但是它不傷害任何事情或者
TrueColor作炫耀行為.
如果展示顏色已經被設定,這步能是
蹦跳和圖書館將自動繪製形象的地圖向
目前展示顏色.
}
如果(image.format.palette>0)那時
開始
ncolors:=image.format.palette.ncolors;
給:=著色(SDL_Color*)malloc((ncolors*sizeof((SDL_Color));
移動((image.format.palette.colors,顏色,ncolors);
末端
其他
開始
//256分配彩色的調色盤
ncolors:=256;
SetLength((顏色,ncolors*sizeof((SDL_Color));

//設定一3,3,2彩色的方塊
可以替代r:=07
開始
可以替代g:=07
開始
可以替代b:=03
開始
i:=(((r shl5)或者(g shl2)或者b);
給[i].r:=r shl著色5;
給[i].g:=g shl著色5;
給[i].b:=b shl著色6;
末端;
末端;
末端;
*筆記:一較好分配調色盤的方式是力量是
為了計算在形象中顏色的頻率
和建立一塊基於那資訊的調色盤.
*
末端;
//裝置colormap設法爭取所有的顏色但是不擔心它
SDL_SetColors((銀幕,顏色,0,ncolors);
免費(顏色);

到銀幕表面上面//Blit
dest.x:=0;
dest.y:=0;
dest.w:=image.w;
dest.h:=image.h;
SDL_BlitSurface((形象,,screen_,@dest);

SDL_UpdateRects((screen_,1,@dest);

//自由分配BMP表面是
SDL_FreeSurface((形象);
末端;

向展示直接拉

  
//代碼,在銀幕的中心部署一黃色映像點
未知數,Y:Sint32;
映像點:Uint32;
小塊:PUint8;
bpp,r,g,b:Uint8;
.
.
.
(*把彩色的黃色映射到這展示(R=0xFF,G=0xFF,B=0x00)
筆記:如果展示是palettized,你必須首先固定調色盤.
*
映像點:=SDL_MapRGB((screen_.format,$FF,$FF,$00);

//計算銀幕的中心的framebuffer補償
如果(SDL_MUSTLOCK((screen_)>0)那時
開始
如果(SDL_LockSurface((screen_)<0)那時
出口;
末端;
bpp:=screen_.format.BytesPerPixel;
未知數:=screen_.w div2;
Y:=screen_.h div2;
小塊:=((PUint8((screen_.pixels))+Y*screen_.pitch+未知數*bpp;

//設定映像點
bpp裝入盒子
1:
開始
PUint8((小塊)^:=Uint8((映像點);
末端;

2:
開始
PUint16((小塊)^:=Uint16((映像點);
末端;

3:
開始//格式/endian有獨到見解的人

r:=(映像點shr screen_.format.Rshift)$FF;
g:=(映像點shr screen_.format.Gshift)$FF;
b:=(映像點shr screen_.format.Bshift)$FF;
bits^+(screen_.format.Rshift div8):=r;
bits^+(screen_.format.Gshift div8):=g;
bits^+(screen_.format.Bshift div8):=b;
末端;

4:
開始
PUInt32((小塊)^:=Uint32((映像點);
末端;
末端;

//更新展示
如果(SDL_MUSTLOCK((screen_)>0)那時
開始
SDL_UnlockSurface((screen_);
末端;
SDL_UpdateRect((screen_,未知數,Y,1,1);

最快可能表面blit

有三種不同你能向銀幕吸引一形象的方式:

一表面1.Create和向blit使用 SDL_BlitSurface 向銀幕它
影像在系統記憶和呼叫 SDL_UpdateRect 中處理2.Create的表面的
影像在顯示內存和呼叫 SDL_LockSurface 中處理3.Create的表面的

最好的做這個的方式是要合併方法:
使用 
SDL;

過程ComplainAndExit;
開始
MessageBox 0,PChar格式化問題:%s'[,SDL_GetError'],錯誤,MB_OK或者MB_ICONHAND;
SQL_Quit;
停止((1);
末端;


fmtg:TSDL_PixelFormat;
screen_鎖上:PSDL_Surface;
imagebmp,形象:PSDL_Surface;
dstrect:TSDL_Rect;
i:整數;
緩衝記憶體:PUint8;
開始
//預置SDL
如果(SDL_Init((SDL_INIT_VIDEO)<0)那時
開始
ComplainAndExit;
末端;

//把一BMP形象裝入一表面
imagebmp:=SDL_LoadBMP('(image.bmp)';
如果那時(imagebmp=)
開始
ComplainAndExit;
末端;

//設定影像方式((在故土深度)640x480
screen_:=SDL_SetVideoMode((640,480,0,SDL_HWSURFACE或者SDL_FULLSCREEN);
如果那時(screen_=)
開始
ComplainAndExit;
末端;

//設定影像colormap
如果那時(imagebmp.format.palette<>)
開始
SDL_SetColors((screen_,@imagebmp.format.palette.colors,0,imagebmp.format.palette.ncolors);
末端;

//向影像格式((地圖顏色)兌換形象
想像:=SDL_DisplayFormat((imagebmp);
SDL_FreeSurface((imagebmp);
如果那時(想像=)
開始
ComplainAndExit;
末端;

在未加工表面上顏色的//拔取樂隊
如果(SDL_MUSTLOCK((screen_)>0)那時
開始
如果(SDL_LockSurface((screen_)<0)那時
ComplainAndExit;
末端;

當:=PUnit8((screen_.pixels)緩衝;
screen_.h 1可以替代i:=0
開始
memset((緩衝記憶體(,i*255)/screen_.h,screen_.w*screen_.format.BytesPerPixel);
當:=緩衝記憶體+screen_.pitch緩衝;
末端;

如果(SDL_MUSTLOCK((screen_)>0)那時
開始
SDL_UnlockSurface((screen_);
末端;

//Blit去中心銀幕的形象
dstrect.x:=(screen_.w image.w)div 2;
dstrect.y:=(screen_.h image.h)div 2;
dstrect.w:=image.w;
dstrect.h:=image.h;

如果(SDL_BlitSurface((形象,,screen_,@dstrect)<0)那時
開始
SDL_FreeSurface((形象);
ComplainAndExit;
末端;

SDL_FreeSurface((形象);

//更新銀幕
SDL_UpdateRects((screen_,1,@dstrect);

SDL_Delay((5000);//等待5次品
末端;