在 SDL_Surface 像素上绘制矩形

Drawing a rectangle on SDL_Surface pixels

我想弄清楚如何在 unsigned char 像素阵列上绘制一个彩色矩形,该阵列从锁定的 SDL_Surfacepixels 成员投射而来。

下面的函数应该做前者:

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);
}