SDL_PixelFormat

章節:SDL API 參考 (3)
更新:2001年9月11日 星期二 23:01
索引
 

名稱

SDL_PixelFormat - 存儲平面的格式信息。  

結構體的定義

typedef struct SDL_PixelFormat {
  SDL_Palette *palette;
  Uint8  BitsPerPixel;
  Uint8  BytesPerPixel;
  Uint8  Rloss, Gloss, Bloss, Aloss;
  Uint8  Rshift, Gshift, Bshift, Ashift;
  Uint32 Rmask, Gmask, Bmask, Amask;
  Uint32 colorkey;
  Uint8  alpha;
} SDL_PixelFormat;

 

結構體的內容

palette
若每像素位寬大于8,則為NULL;否則,是一個指向調色板的指針。
BitsPerPixel
用于表示平面中每像素的位寬。通常為8、16、24或32。
BytesPerPixel
用于表示平面中每像素的字節數。通常為1至4。
[RGBA]mask
用于找回單個顏色值的二進制掩碼。
[RGBA]loss
每個顏色分量的精度損失(2^[RGBA]loss)。
[RGBA]shift
像素值中的每個顏色分量的二進制左移量。
colorkey
透明像素的像素值。
alpha
總平面的alpha值。
 

描述

SDL_PixelFormat用于描述存儲于SDL_Surface像素區域中的像素數據的格式。每個平面都在格式區域中存儲一個SDL_PixelFormat。

若你想在平面上進行像素級的修改,則弄明SDL如何存儲其顏色信息是必需的。

8位的像素格式最為易懂。因為它是8位的格式,所以我們備有8BitsPerPixel和1BytesPerPixel的成員。因為BytesPerPixel為1,所以所有像素都可用一個用于表示SDL_Palette的下標的Uint8來表示。因此,為了檢測8位平面中的一個像素的顏色,我們可以從surface->pixels中讀出顏色的下標,並通過它來查閱SDL_Color結構體:surface->format->palette->colors。如下所示:

SDL_Surface *surface;
SDL_PixelFormat *fmt;
SDL_Color *color;
Uint8 index;

.
.

/* 創建平面 */
.
.
fmt=surface->format;

/* 檢測平面的位深 */
if(fmt->BitsPerPixel != 8){
  fprintf(stderr, "不是8位的平面。");
  return(-1);
}

/* 鎖定平面 */
SDL_LockSurface(surface);

/* 獲取左上角像素值 */
index=*(Uint8 *)surface->pixels;
color=fmt->palette->colors[index];

/* 為平面解除鎖定 */
SDL_UnlockSurface(surface);
printf("像素顏色->紅色: %d, 綠色: %d, 藍色: %d。 下標: %d",
          color->r, color->g, color->b, index);
.
.

8位以上的像素格式的情況是完全不同的。它們被認為是"真彩色"格式,並且顏色信息存儲于像素本身,而非調色板。mask、shift、loss域告訴我們顏色信息昌如何編碼的。mask域允許我們析取出每種顏色分量,shift域告訴我們像素值中的每種分量離右邊的位數,而loss域告訴我們保存像素中的8位顏色分量時,每種分量損失的位數。

/* 從31位顏色值中提取出顏色分量 */
SDL_PixelFormat *fmt;
SDL_Surface *surface;
Uint32 temp, pixel;
Uint8 red, green, blue, alpha;
.
.
.
fmt=surface->format;
SDL_LockSurface(surface);
pixel=*((Uint32*)surface->pixels);
SDL_UnlockSurface(surface);

/* 提取紅色分量 */
temp=pixel&fmt->Rmask; /* 析取出紅色分量 */
temp=temp>>fmt->Rshift;/* 右移為8位 */
temp=temp<<fmt->Rloss; /* 擴展為全8位數 */
red=(Uint8)temp;

/* 提取綠色分量 */
temp=pixel&fmt->Gmask; /* 析取出綠色分量 */
temp=temp>>fmt->Gshift;/* 右移為8位 */
temp=temp<<fmt->Gloss; /* 擴展為全8位數 */
green=(Uint8)temp;

/* 提取藍色分量 */
temp=pixel&fmt->Bmask; /* 析取出藍色分量 */
temp=temp>>fmt->Bshift;/* 右移為8位 */
temp=temp<<fmt->Bloss; /* 擴展為全8位數 */
blue=(Uint8)temp;

/* 提取出Alpha分量 */
temp=pixel&fmt->Amask; /* 析取出alpha分量 */
temp=temp>>fmt->Ashift;/* 右移為8位 */
temp=temp<<fmt->Aloss; /* 擴展為全8位數 */
alpha=(Uint8)temp;

printf("像素顏色 -> R: %d,  G: %d,  B: %d,  A: %d",
        red, green, blue, alpha);
.
.
.

 

另見

SDL_Surface、SDL_MapRGB  

譯者

石仔<guoshimin57@gmail.com>  

中文版主頁

http://guoshimin.users.sf.net  

中文版最後更新時間

2010年2月15日


 

索引

名稱
結構體的定義
結構體的內容
描述
另見
譯者
中文版主頁
中文版最後更新時間