Как использовать memset для добавления цветов в массив пикселей?

У меня есть программа на C и SDL2 с массивом пикселей:

Uint32 *pixels = NULL;
pixels = (Uint32 *) malloc (sizeof(Uint32)*(Uint32)windowWidth*(Uint32)windowHeight);
memset(pixels, 255, (Uint32)windowWidth*(Uint32)windowHeight*sizeof(Uint32));

С помощью memset установка второго параметра «255» устанавливает все пиксели в белый цвет. Каждое другое число ниже этого устанавливает для пикселей оттенок серого. Как установить для этих пикселей реальный цвет?

Я использую этот массив пикселей, чтобы установить цвет экрана с помощью текстуры, среди прочего. Текстура имеет формат пикселей ARGB8888, поэтому шестнадцатеричное значение четырех цветовых каналов должно работать, не так ли?

SDL_UpdateTexture(texture, NULL, pixels, (int)((Uint32)windowWidth * sizeof(Uint32)));

Я пытался использовать шестнадцатеричный код, такой как 0xFFCC00FF, но это просто устанавливает его в белый цвет.


person User.Flynn    schedule 27.07.2018    source источник


Ответы (3)


Проблема с memset заключается в том, что он копирует одно и то же значение в каждый байт. Вы хотите использовать memcpy в цикле с 4-байтовым значением.

Uint32 numPixels = (Uint32)windowWidth * (Uint32)windowHeight;
Uint32 color = (Uint32)0xFFCC00FF;
for (Uint32 i = 0; i < numPixels; ++i)
{
    memcpy(pixels + i * sizeof(Uint32), &color, sizeof(color));
}
person Banex    schedule 27.07.2018
comment
Я действительно не понимаю, почему, но это создало тонкие цветные линии поверх текстуры, а не однотонную текстуру. Я использовал ваш ответ в качестве отправной точки, так что спасибо. - person User.Flynn; 27.07.2018

Используйте цикл for:

Uint32 *pixels = NULL;
size_t nPixels = windowWidth * windowHeight;
pixels = malloc (sizeof (Uint32) * nPixels);
for (size_t c = 0; c < nPixels; c++) {
    pixels[c] = color;
}
person Antti Haapala    schedule 27.07.2018

Это не использует memset, но благодаря @Banex я смог придумать что-то, что сработало.

Uint32 colour = (Uint32)0xFFCC00FF;
int i,j;
for(i=0;i<windowWidth;i++)
{
    for(j=0;j<windowHeight;j++)
    {
        pixels[i+j*windowWidth]=colour;
    }
}
person User.Flynn    schedule 27.07.2018