Кодирование загрузчика X-Bitmap в SDL? - PullRequest
0 голосов
/ 26 января 2012

Вот мой код:

template<typename G, typename N> void load_xbm(G* g,N w, N h,unsigned char* data)
{
    Uint32 rmask, gmask, bmask, amask;

        /* SDL interprets each pixel as a 32-bit number, so our masks must depend
           on the endianness (byte order) of the machine */
    #if SDL_BYTEORDER == SDL_BIG_ENDIAN
        rmask = 0xff000000;
        gmask = 0x00ff0000;
        bmask = 0x0000ff00;
        amask = 0x000000ff;
    #else
        rmask = 0x000000ff;
        gmask = 0x0000ff00;
        bmask = 0x00ff0000;
        amask = 0xff000000;
    #endif

    SDL_Surface* s = g->backend_surface();
    s = SDL_CreateRGBSurface(SDL_HWSURFACE,w,h,16,rmask,gmask,bmask,amask);
    g->backend_surface( s );

    for (N x = 0; x < w; x++)
    {
        for(N y = 0; y < h; y++)
        {
            g->put_pixel(x,y,data[y*x]);
        }
    }

    SDL_Flip( s );
}

g->backend_surface() просто возвращает SDL_Surface* член в G. w - это ширина растрового изображения xbm, h - это высота, data - это массив unsigned char s, содержащий цвета каждого пикселя.

g->put_pixel() представляет собой простую обертку метода putpixel в Документы SDL , который использует backend_surface в качестве первого параметра для примера функции putpixel.

Теперь, когда я ее выполняю, программа завершается с 0x3. Отладив код, который я обнаружил, он завершается при вызове метода putpixel, обратите внимание, что метод putpixel отлично работает в других местах. Я также обнаружил, что он завершается только тогда, когда аргументы x и y для putpixel больше, чем исходная ширина и высота поверхности , но я не изменил размер поверхности используя SDL_CreateRGBSurface до необходимой ширины и высоты?

1 Ответ

1 голос
/ 26 января 2012

Догадываясь здесь, в дикой природе ...

Этот учебный пример SDL (пункт 2.5) говорит, что Surface должен быть заблокирован перед вызовом этой функции.Твой?

...