我需要使用this page中的以下功能。 SDL_Surface structure定义为
typedef struct SDL_Surface {
Uint32 flags; /* Read-only */
SDL_PixelFormat *format; /* Read-only */
int w, h; /* Read-only */
Uint16 pitch; /* Read-only */
void *pixels; /* Read-write */
SDL_Rect clip_rect; /* Read-only */
int refcount; /* Read-mostly */
} SDL_Surface;
该函数是:
void set_pixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
{
Uint8 *target_pixel = (Uint8 *)surface->pixels + y * surface->pitch + x * 4;
*(Uint32 *)target_pixel = pixel;
}
在这里我几乎没有疑问,可能是由于缺乏真实的画面。
surface->pitch
与y
相乘,而x
与4
相乘? target_pixel
声明为8-bit integer pointer
,然后再将其转换为32-bit integer pointer
的必要性是什么? target_pixel
函数返回后,pixel
如何保留set_pixel
值? 最佳答案
Uint32
值的像素),所以计算是在Uint8
中进行的。 4
难看,请参阅下文。 由于表面的
pitch
字段以字节为单位,因此计算必须以字节为单位。这是一次重写(比我最初的尝试更具侵略性):
void set_pixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
{
Uint32 * const target_pixel = (Uint32 *) ((Uint8 *) surface->pixels
+ y * surface->pitch
+ x * surface->format->BytesPerPixel);
*target_pixel = pixel;
}
注意我们如何使用surface->format->BytesPerPixel
分解出4
。魔术常数不是一个好主意。另请注意,以上内容假设表面确实使用了32位像素。关于c++ - 如何在SDL_surface中设置像素?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20070155/