Вот мой код:
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
до необходимой ширины и высоты?