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.