Hei kaikille.
Mistä johtuu, ettei alla oleva koodi toimi? Tarkoituksena on kopioida bmp-kuva Uint32-muuttujiin muistiin ja piirtää se niiden avulla ruudulle.
/* getpixel- ja putpixel-rutiinit on lainattu pekin "tuli -efekti"-koodivinkistä */
void _fastcall putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
{
int bpp = surface->format->BytesPerPixel;
// p on osoitin pikseliin, jonka haluamme asettaa
Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
switch(bpp) {
case 1:
*p = pixel;
break;
case 2:
*(Uint16 *)p = pixel;
break;
case 3:
if(SDL_BYTEORDER == SDL_BIG_ENDIAN) {
p[0] = (pixel >> 16) & 0xff;
p[1] = (pixel >> 8) & 0xff;
p[2] = pixel & 0xff;
} else {
p[0] = pixel & 0xff;
p[1] = (pixel >> 8) & 0xff;
p[2] = (pixel >> 16) & 0xff;
}
break;
case 4:
*(Uint32 *)p = pixel;
break;
}
}
Uint32 _fastcall getpixel(SDL_Surface *surface, int x, int y)
{
int bpp = surface->format->BytesPerPixel;
// p on osoitin pikseliin, jonka haluamme kopioida
Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
switch(bpp) {
case 1:
return *p;
case 2:
return *(Uint16 *)p;
case 3:
if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
return p[0] << 16 | p[1] << 8 | p[2];
else
return p[0] | p[1] << 8 | p[2] << 16;
case 4:
return *(Uint32 *)p;
default:
return 0; // ei pitäisi tapahtua.
}
}
/* Tämä funktio poimii pikselien väriarvot (?) kuvasta */
void haePikselit(SDL_Surface *kuva, Uint32 *varit) {
int x, y;
for (y = 0; y < kuva->h; y++) {
for (x = 0; x < kuva->w; x++) {
varit[kuva->w * y + x] = getpixel(kuva, x, y);
}
}
}
void piirraKuva(void) {
SDL_Surface *kuva = SDL_LoadBMP("kuva.bmp");
Uint32 *varit;
int x, y;
if ((varit = (Uint32 *)malloc(kuva->w * kuva->h)) == NULL)
exit(1);
haePikselit(kuva, varit);
for (y = 0; y < kuva->h; y++) {
for (x = 0; x < kuva->w; x++) {
/* ruutu on globaali muuttuja, johon on alustettu SDL_SetVideoMode SWSURFACE-lipulla */
putpixel(ruutu, x + 100, y + 100, varit[kuva->w * y + x]);
}
}
SDL_Flip(ruutu);
SDL_Delay(2000);
}Ohjelma vilahtaa nopeasti ja sulkeutuu tuottamatta haluttua tulosta. Jäljitin vian haePikselit-funktioon, jossa varit-taulukkoa täytetään getpixel-arvoilla. Kirjoitin rivin printf("%3i, %3i\n", x, y); ennen getpixeliä ja stdout.txt paljastaa, että ohjelma kaatuu kohdassa 97, 77. Kuva on mitoiltaan 278x284.
Jännä juttu kuitenkin on se, että ohjelma toimii, jos Uint32-tyypin vaihtaa muotoon Uint8, mutta ei kuitenkaan täydellisesti, sillä kuva tulostuu sävyiltään sinisenä. Tämä taitaa johtua Uint8:n rajoista?
Varaat muistia w*h tavua, kun sitä pitäisi varata w*h*sizeof(Uint32) tavua eli nelinkertainen määrä. Et tarkista myöskään ikkunan kokoa, joten saatat vahingossa kirjoittaa senkin muistialueen yli. Lisäksi olet unohtanut vapauttaa varaamasi muistin free-funktiolla.
Ups, tosiaan. Olen kuitenkin omassa koodissani vapauttanut muistin free-funktiolla. Unohdin vain kopioida sen tähän.
Kiitos avusta.
Aihe on jo aika vanha, joten et voi enää vastata siihen.