Menenpä suoraan asiaan eli ongelmani on se, että en jostain syystä kykene käsittelemään graafisesti SDL:n grafiikkapintaa (SDL_Surface) joka on luotu SDL_CreateRGBSurface-komennolla. Lisäksi sille luontivaiheessa määrittelemäni liput eivät "mene päälle". Luon grafiikkapinnan seuraavalla koodilla:
SDL_Surface dbl_buffer;
...
/* r,g,b ja t ovat maski (0xFF alenevassa järjestyksessä, BIG_ENDIAN). */
screen = SDL_SetVideoMode (ScrW, ScrH, ScrBB, SDL_SWSURFACE | SDL_DOUBLEBUF);
dbl_buffer = SDL_CreateRBGSurface(SDL_SWSURFACE, ScrW, ScrH, ScrBB,
r, g, b, t);Huomasin että en pysty blittaamaan mitään tuohon grafiikkapintaan (ainakaan mitään ei näy), mutta SDL_BlitSurface ei palauta virhekoodia eli se 'onnistuu'. Olen myös tarkistanut, että muistin varaus pinnalle onnistuu. Tietääkö kukaan, mistä tällainen voisi johtua? Pelkälle screen:lle piirtäminen kyllä onnistuu.
Ei antamassasi pätkässä pitäisi olla mitään vikaa(paitsi pari typoa: RBG->RGB ja dbl_surface->*dbl_surface :P).
Kokeile toimiiko alla oleva koodi. Itselläni se aikankin kääntyi ja toimi(Dev-cpp v4.9.8.0 & MinGW).
Ja muista laittaa se kuva sinne c:n juureen!
#include <SDL/SDL.h>
#define rmask 0xff000000
#define gmask 0x00ff0000
#define bmask 0x0000ff00
#define amask 0x000000ff
const int ScrW = 800;
const int ScrH = 600;
const int ScrBB = 32;
int DSprite(SDL_Surface *Picture, SDL_Surface *Screen, int x, int y) {
SDL_Rect Area;
Area.x = x;
Area.y = y;
SDL_BlitSurface(Picture, NULL, Screen, &Area);
return 0;
}
int main (int argc, char *argv[]) {
SDL_Surface *dbl_buffer;
SDL_Surface *screen;
SDL_Surface *load;
screen = SDL_SetVideoMode (ScrW, ScrH, ScrBB, SDL_SWSURFACE | SDL_DOUBLEBUF);
dbl_buffer = SDL_CreateRGBSurface(SDL_SWSURFACE, ScrW, ScrH, ScrBB, rmask, gmask, bmask, amask);
load = SDL_LoadBMP("c:\\kuva.bmp");
DSprite(load, dbl_buffer, 0, 0);
DSprite(dbl_buffer, screen, 0, 0);
//DSprite(load, screen, 0, 0);
SDL_Flip(screen);
SDL_Delay(2000);
SDL_Quit();
return 0;
}Gaxx: koodisi kääntyy ja toimii muuten, mutta ruutu pysyy tyhjänä -_-. Jos tuosta jättää tuon tuplapuskuriin piirron välistä pois niin toimii (eli piirretään suoraan screen-pintaan).
Joo-o... Sitten en kyllä osaa sanoa, mikä on vialla. Itselläni kun kuva näkyy miten päin vain.
Hmm. Sain kuvan osittain näkyviin, kun laitoin alphamaskin 0:ksi, mutta sininen väri ei tällöin näy?
Muoks: käytössä olikin small-endian, mutta ongelma ei miksikään ole muuttunut.
Muoks 2: Ongelma ratkesi, kun laitoin puskurin värisyvyydeksi 32. 16 oli ilmeisesti kestämätön 32-bittisille väreille ^^
Krhmm... Muokkasit siis koodiani? Toimiiko se nyt(32-bittisenä) tuollaisenaan, vai mitä muutoksia teit? Vaihdoitko kenties värisyvyyttä? :D
En käyttänyt sinun koodiasi, vaan muokkasin omaani...
Putkan kaistan säästämiseksi vastaan allaolevaan viestiin tässä:
koodisikin toimii, kun käytän värisyvyytenä 32. Se oli alunperin 16, sillä sen käyttäminen on nopeampaa kuin 32-bittisen.
Tarkoitin lähinnä sitä, kun testasit tuota koodia. Ajoitko sen tuollaisenaan? Tuli vain mieleen kun sait omasi toimimaan vaihtamalla värisyvyyden 32-bittiseksi. Omassani kun se on 32-bittinen.
Mutta samapa tuo. Pääasia on, että sait toimimaan.
Aihe on jo aika vanha, joten et voi enää vastata siihen.