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;
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); . . .
2010年2月15日