使用SDL_BlitScaled创建表面的缩放副本

时间:2014-09-01 22:21:17

标签: c graphics sdl sdl-2

所以我正在研究一些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(我确实看到了另一个关于此的问题,但解决方案还不清楚)。

1 个答案:

答案 0 :(得分: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;
    }
};
相关问题