Использование SDL_BlitScaled для создания масштабированных копий поверхностей

Итак, я работаю над некоторыми вещами SDL2 Wrapper и пытаюсь использовать SDL_BlitScaled для копирования данных с поверхности src на поверхность назначения, которую я уже создал, например так

SDL_Surface *loaded = IMG_Load("test.png");
SDL_SetSurfaceBlendMode(loaded, SDL_BLENDMODE_NONE);
SDL_Surface *out = SDL_CreateRGBSurface(0, 100, 100, loaded->format->BitsPerPixel, 
                                        loaded->format->Rmask, loaded->format->Gmask, loaded->format->Bmask, loaded->format->Amask);
SDL_BlitScaled(loaded, NULL, out, NULL);
SDL_Texture *tex = SDL_CreateTextureFromSurface(ren, out);
SDL_Rect rec = {10, 10, 110, 110};
SDL_RenderCopy(ren, tex, NULL, &rec);

Не беспокойтесь о моем рендерере или окне и т. д. Я изолировал проблему где-то в этом коде. Изображение не появляется на экране, однако оно появляется, если я создаю текстуру из загруженной поверхности. Мысли? Я предполагаю, что неправильно использую CreateRGBSurface или BlitScaled (я видел еще один вопрос по этому поводу, однако решение было неясным).


person bathtub    schedule 01.09.2014    source источник
comment
В чем проблема?   -  person Jongware    schedule 02.09.2014
comment
Ничего не произошло. Ой, как я мог забыть это   -  person bathtub    schedule 02.09.2014


Ответы (1)


Для меня я должен был сделать:

SDL_SetSurfaceBlendMode(loaded , SDL_BLENDMODE_NONE);
SDL_SetSurfaceBlendMode(out, SDL_BLENDMODE_NONE);

Чтобы это работало, иначе происходит какое-то странное смешивание.

На странице документации для этой функции говорится:

Чтобы скопировать поверхность на другую поверхность (или текстуру) без смешивания с существующими данными, режим наложения поверхности SOURCE должен быть установлен на «SDL_BLENDMODE_NONE».

Таким образом, загруженных настроек, вероятно, достаточно.

Редактировать: В конце концов я придумал это:

struct FreeSurface_Functor
{
    void operator() (SDL_Surface* pSurface) const
    {
        if (pSurface)
        {
            SDL_FreeSurface(pSurface);
        }
    }
};

typedef std::unique_ptr<SDL_Surface, FreeSurface_Functor> SDL_SurfacePtr;

class SDLHelpers
{
public:
    SDLHelpers() = delete;

    static SDL_SurfacePtr ScaledCopy(SDL_Surface* src, SDL_Rect* dstSize)
    {
        SDL_SurfacePtr scaledCopy(SDL_CreateRGBSurface(0, 
            dstSize->w, dstSize->h, 
            src->format->BitsPerPixel, 
            src->format->Rmask, src->format->Gmask, src->format->Bmask, src->format->Amask));

        // Get the old mode
        SDL_BlendMode oldBlendMode;
        SDL_GetSurfaceBlendMode(src, &oldBlendMode);

        // Set the new mode so copying the source won't change the source
        SDL_SetSurfaceBlendMode(src, SDL_BLENDMODE_NONE);

        // Do the copy
        if (SDL_BlitScaled(src, NULL, scaledCopy.get(), dstSize) != 0)
        {
            scaledCopy.reset();
        }

        // Restore the original blending mode
        SDL_SetSurfaceBlendMode(src, oldBlendMode);
        return scaledCopy;
    }
};
person paulm    schedule 11.06.2016