Как сохранить первоначальную форму поверхности назначения при блиттинге? - PullRequest
0 голосов
/ 13 октября 2019

Посмотрите на скриншот ниже. Отображаются три тонкие поверхности SDL 2.0, все более или менее прямоугольные.

Размытие изображения 1 на изображение 2 - получить изображение 3

Первая поверхность (коричневатая бумагаone) is Image 1 Белый под ним с пропущенными двумя углами: Image 2

Я хотел бы выполнить SDL_BlitSurface так, чтобы изображение 1 было перетащено наИзображение 2, но с формой изображения 2 (другими словами, конечный результат должен выглядеть как коричневая бумага, но пропущены два его угла.

Чтобы сделать это, я пытаюсь:

SDL_BlitSurface(Image1, NULL, Image2, NULL);

Но вместо желаемого результата я получаю третью поверхность на изображении (Изображение 3), которая аналогична изображению 1


ОБНОВЛЕНИЕ


Итак, по совету keltar, я заменил свой вызов функции blit вызовом специальной функции, которая, я надеюсь, копирует альфа-канал для каждого пикселя с изображения 1 на изображение 2

copy_alpha(Image1, Image2);
void IMAGETOOL::copy_alpha(SDL_Surface * src, SDL_Surface * dst)
{
    int w = src->w,
        h = src->h;

    Uint32 opixel, npixel;
    Uint8 r, g, b, a;

    if (SDL_MUSTLOCK(src)) SDL_LockSurface(src);
    if (SDL_MUSTLOCK(dst)) SDL_LockSurface(dst);

    Uint8 srcAlpha = 0;
    for (int y = 0; y < h; y++)
        for (int x = 0; x < w; x++)
        {
            opixel = get_pixel(src, x, y);
            SDL_GetRGBA(opixel, src->format, &r, &g, &b, &a);
            srcAlpha = a;
            opixel = get_pixel(dst, x, y);
            SDL_GetRGBA(opixel, dst->format, &r, &g, &b, &a);
            a = srcAlpha;
            npixel = SDL_MapRGBA(dst->format, r, g, b, a);
            put_pixel(dst, x, y, npixel);
        }

    if (SDL_MUSTLOCK(src)) SDL_UnlockSurface(src);
    if (SDL_MUSTLOCK(dst)) SDL_UnlockSurface(dst);
}

. результирующая поверхность изменилась. но не так, как я надеялся.

Копирование альфа с изображения 1 на изображение 2 - получить изображение 3

Не знаете, что с этим делать - есть идеи?

1 Ответ

0 голосов
/ 20 октября 2019

Проблема решена. В моем последнем обновлении я пытался скопировать альфа с изображения 1 на изображение 2 - неправильно!

Но когда я использую ту же функцию, чтобы скопировать альфа с изображения 2 на изображение 1 (я предполагаю, чтоэто то, что Келтар хотел для меня).

copy_alpha(Image2, Image1);

модифицированное изображение 1 дает желаемый результат.

Копирование альфы с изображения 2 на изображение 1 - получение изображения 3

Спасибо за помощь keltar!

...