PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit SDL Video


Corrail
2005-02-04, 16:31:26
Hallo!

Für ein Projekt für die Arbeit muss ich mit SDL Bild darstellen. Das funktioniert soweit auch ganz gut nur sobald ich mein SDL Fenster verschiebe, es den Fokus verliert oder ich sonst irgendwas mache wird das Fenster weiß und zeigt keine aktuellen Bilder mehr an.

Der SDL Init Code:

SDL_Surface *display;

SDL_Init(SDL_INIT_EVERYTHING);
display = SDL_SetVideoMode( 640, 480, 16, SDL_SWSURFACE);

Hier der Sourcecode innerhalb der Schleife:

// Das Bild was ich bekomme is in einem 8Bit Grayscale Format welches ich zuerst mal umwandle

unsigned char * tmp = (unsigned char*)mi->getFirstPointer();
unsigned char * img_data = new unsigned char[mi->getWidth()*mi->getHeight()*4];

for (unsigned int i = 0; i < mi->getWidth()*mi->getHeight(); i++)
{
img_data[4*i+0] = img_data[4*i+1] = img_data[4*i+2] = tmp[i];
img_data[4*i+3] = 0;
}


SDL_Surface * image = SDL_CreateRGBSurfaceFrom(img_data,
mi->getWidth(),
mi->getHeight(),
32, mi->getWidth()*4,
rmask, gmask, bmask, 0);
// Bild ist fertig


SDL_Rect dest;

dest.x = 0;
dest.y = 0;
dest.w = image->w;
dest.h = image->h;

// Bild wird aufs SDL Window geblittet
SDL_BlitSurface(image, NULL, display, NULL);

// SDL Window wird upgedatet
SDL_UpdateRect(display, 0, 0, 0, 0);

// Bild wird wieder gelöscht
SDL_FreeSurface(image);

Trap
2005-02-04, 17:29:57
Du brauchst eine Eventhandling Schleife.

Corrail
2005-02-04, 17:42:45
Du brauchst eine Eventhandling Schleife.

Und wie soll ich welche Events behandeln? Ich weiß zwar wann ich den Fokus verliere oder so, aber was mach ich dagegen, dass kein er kein aktuelles Bild kommt?

Gnafoo
2005-02-05, 00:42:12
Du musst in der Eventhandling-Schleife SDL_ExposeEvent abfangen. Dieses wird immer dann gefeuert, wenn deine Anwendung einen Teil des Fensters neu zeichnen muss, weil dieser verdeckt wurde und nun wieder aufgedeckt wird.
Dort musst du dann nochmal das SDL_UpdateRect aufrufen. (ich bin mir nicht ganz sicher, aber ich glaube ein erneuter Blit ist nicht nötig)

cu DerTod

Corrail
2005-02-05, 01:24:26
Du musst in der Eventhandling-Schleife SDL_ExposeEvent abfangen. Dieses wird immer dann gefeuert, wenn deine Anwendung einen Teil des Fensters neu zeichnen muss, weil dieser verdeckt wurde und nun wieder aufgedeckt wird.
Dort musst du dann nochmal das SDL_UpdateRect aufrufen. (ich bin mir nicht ganz sicher, aber ich glaube ein erneuter Blit ist nicht nötig)

cu DerTod

Das Problem ist aber, dass ich pro Schleifendurchlauf einmal blitte und einmal das Rect update. Somit sollte ich spätestens nach einem Schleifendurchlauf wieder ein Bild haben, was aber leider nicht passiert.

Trap
2005-02-05, 12:29:22
Probier es einfach mal, ein Programm, das seine EventQueue nie abruft wird von Windows als abgestürzt betrachtet. Was das für Folgen hat weiß ich nicht genau, könnte sein, dass es daran liegt.

Wahrscheinlich behandelt SDL einige WinAPI-Events intern wenn man die EventHandling Funktionen aufruft.