#include "SDL.h"
int SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect);
它會執行從源平面到目標平面的快速圖塊傳送。
僅僅使用dstrect的位置成員(寬度和高度成員被忽略)。
若srcrect或dstrect為NULL,則整個平面(src或dst)都被復制。
所有的裁剪都被執行後,最終傳送的矩形圖塊將被保存于dstrect。
不應在已鎖定的平面上調用圖塊傳送函數。
圖塊傳送操作的結果很大程度上依賴于是否設置SDL_SRCALPHA。參考SDL_SetAlpha以取得這會如何影響你的結果的解析。平面圖塊傳送時,色鍵和alpha亦相互影響,如下的偽代碼應該會有助于解釋:
if (源平面已經設置SDL_SRCALPHA) { if (源平面存在alpha通道(即format->Amask != 0)) 圖塊傳送使用基于像素的alpha,而忽略任何色鍵 else { if (源平面已經設置SDL_SRCCOLORKEY) 圖塊傳送使用色鍵 & 基于像素的alpha值 else 圖塊傳送使用基于平面的alpha值 } } else { if (源平面已經設置SDL_SRCCOLORKEY) 圖塊傳送使用色鍵 else 普通的不通明矩形圖塊傳送 }
若圖塊傳送成功,則返回0;否則,返回-1。
若兩個平面都存在于顯存,且圖塊傳送返回-2,則其在顯存中的內容會丟失。因此,應該巧妙地重載它,並重新傳送:
while ( SDL_BlitSurface(image, imgrect, screen, dstrect) == -2 ) { while ( SDL_LockSurface(image)) < 0 ) Sleep(10); -- 向image->pixels寫入白色像素 -- SDL_UnlockSurface(image); }
這會在使用DirectX 5.0且系統換出你的全屏應用程序時發生。鎖定系統亦會失敗,直至你再次訪問顯存。
SDL_LockSurface、SDL_FillRect、SDL_Surface、SDL_Rect
2010年2月16日