在 SDL_Surface 像素上绘制矩形
Drawing a rectangle on SDL_Surface pixels
我想弄清楚如何在 unsigned char
像素阵列上绘制一个彩色矩形,该阵列从锁定的 SDL_Surface
的 pixels
成员投射而来。
下面的函数应该做前者:
void draw_rectangle(SDL_Surface* surface, int x, int y, int width, int height)
{
SDL_LockSurface(surface);
//Make each pixel black
std::vector<uint8_t> pixels(surface->h * surface->pitch, 0);
for (int dy = y; dy < height; dy++) {
for (int dx = x; dx < width; dx++) {
pixels[dx + dy] = 0;
pixels[dx + dy + 1] = 255;
pixels[dx + dy + 2] = 0;
}
}
memcpy(surface->pixels, pixels.data(), surface->pitch * surface->h);
SDL_UnlockSurface(surface);
}
它有效,但是当通过使用 SDL_CreateTextureFromSurface
将修改后的表面转换为纹理并将纹理复制到屏幕来测试它时,它只显示一个绿色像素:
我意识到我的指针算法是错误的,我需要考虑垂直偏移,因为我正在将二维值映射到一维值。它有助于在纸上起草想法。
代码如下:
void draw_rectangle(SDL_Surface* surface, int x, int y, int width, int height)
{
SDL_LockSurface(surface);
std::vector<uint8_t> pixels(surface->h * surface->pitch, 0);
int dy, dx;
int maxwidth = width * 3;
for (dy = y; dy < height; dy++) {
for (dx = x; dx < maxwidth; dx += 3) {
pixels[dx + (dy * surface->pitch)] = 0;
pixels[dx + (dy * surface->pitch) + 1] = 255;
pixels[dx + (dy * surface->pitch) + 2] = 0;
}
}
memcpy(surface->pixels, pixels.data(), surface->pitch * surface->h);
SDL_UnlockSurface(surface);
}
我想弄清楚如何在 unsigned char
像素阵列上绘制一个彩色矩形,该阵列从锁定的 SDL_Surface
的 pixels
成员投射而来。
下面的函数应该做前者:
void draw_rectangle(SDL_Surface* surface, int x, int y, int width, int height)
{
SDL_LockSurface(surface);
//Make each pixel black
std::vector<uint8_t> pixels(surface->h * surface->pitch, 0);
for (int dy = y; dy < height; dy++) {
for (int dx = x; dx < width; dx++) {
pixels[dx + dy] = 0;
pixels[dx + dy + 1] = 255;
pixels[dx + dy + 2] = 0;
}
}
memcpy(surface->pixels, pixels.data(), surface->pitch * surface->h);
SDL_UnlockSurface(surface);
}
它有效,但是当通过使用 SDL_CreateTextureFromSurface
将修改后的表面转换为纹理并将纹理复制到屏幕来测试它时,它只显示一个绿色像素:
我意识到我的指针算法是错误的,我需要考虑垂直偏移,因为我正在将二维值映射到一维值。它有助于在纸上起草想法。
代码如下:
void draw_rectangle(SDL_Surface* surface, int x, int y, int width, int height)
{
SDL_LockSurface(surface);
std::vector<uint8_t> pixels(surface->h * surface->pitch, 0);
int dy, dx;
int maxwidth = width * 3;
for (dy = y; dy < height; dy++) {
for (dx = x; dx < maxwidth; dx += 3) {
pixels[dx + (dy * surface->pitch)] = 0;
pixels[dx + (dy * surface->pitch) + 1] = 255;
pixels[dx + (dy * surface->pitch) + 2] = 0;
}
}
memcpy(surface->pixels, pixels.data(), surface->pitch * surface->h);
SDL_UnlockSurface(surface);
}