使用SDL_SetWindowIcon无法正常工作

时间:2016-12-19 17:41:24

标签: c++ icons game-engine sdl-2

我正在尝试使用SDL编程游戏引擎并使用picoPNG作为图像加载器。我试图建立一个系统来设置我的Window类窗口的图标,发生了一些奇怪的事情。看起来这个图标适用于某些图像而且对其他图像没有用。我几乎不知道SDL_Surface是如何工作的,所以我用了一些网站来查找一些信息。 (我无法发布指向他们的链接,因为我只有八分之八的必需信誉)

我的代码:

void Window::setWindowIcon(const std::string& filePath) {

    //read file
    std::vector<unsigned char> in;
    std::vector<unsigned char> out;

    unsigned long width, height;

    //Use my file loading class to read the image file
    if (DPE::IOManager::readFileToBuffer(filePath, in) == false) {
        fatalError("Failed to open " + filePath);
    }

    int errorCode = DPE::decodePNG(out, width, height, &(in[0]), in.size());
    if (errorCode != 0) {
        fatalError("Failed to decode png file!");
    }

    Uint32 rmask = 0x000000ff;
    Uint32 gmask = 0x0000ff00;
    Uint32 bmask = 0x00ff0000;
    Uint32 amask = 0xff000000;

    _sdlSurface = SDL_CreateRGBSurfaceFrom((void*)&out[0], width, height, 32, width * 4, rmask, gmask, bmask, amask);

    if (_sdlSurface == NULL) {
        std::cout << SDL_GetError() << std::endl;
        fatalError("Failed to create surface!");
    }

    SDL_SetWindowIcon(_sdlWindow, _sdlSurface);

    SDL_FreeSurface(_sdlSurface);
}

最后,这是两个png文件 This one Worked. This one didn't.

通过代码的迭代显示一切都很好,唯一的错误通知是图标没有改变。

修改:我已将颜色遮罩更改为跨端兼容

#if SDL_BYTEORDER == SDL_BIG_ENDIAN
                int shift = 0;
                rmask = 0xff000000 >> shift;
                gmask = 0x00ff0000 >> shift;
                bmask = 0x0000ff00 >> shift;
                amask = 0x000000ff >> shift;
        #else // little endian, like x86
                rmask = 0x000000ff;
                gmask = 0x0000ff00;
                bmask = 0x00ff0000;
                amask = 0xff000000;
        #endif

1 个答案:

答案 0 :(得分:0)

我想我找到了答案。看来,当我使用alpha像素时,它占用了8个bpp,所以我将文件大小减小到75x75并且图像工作。