diff options
author | Bjørn Lindeijer <bjorn@lindeijer.nl> | 2005-09-24 22:34:06 +0000 |
---|---|---|
committer | Bjørn Lindeijer <bjorn@lindeijer.nl> | 2005-09-24 22:34:06 +0000 |
commit | 1a7f56901301fb8fe08f26526f3314b0974626ca (patch) | |
tree | f8c2189c5b502b5b3f610d60310db78a2043f4cd | |
parent | 0fc148affc222dd1108b6f1fc8ad2757f1fdc4f1 (diff) | |
download | mana-1a7f56901301fb8fe08f26526f3314b0974626ca.tar.gz mana-1a7f56901301fb8fe08f26526f3314b0974626ca.tar.bz2 mana-1a7f56901301fb8fe08f26526f3314b0974626ca.tar.xz mana-1a7f56901301fb8fe08f26526f3314b0974626ca.zip |
Fix crash on exit after taking screenshot in OpenGL and fix compiler warning.
-rw-r--r-- | ChangeLog | 25 | ||||
-rw-r--r-- | src/openglgraphics.cpp | 42 |
2 files changed, 46 insertions, 21 deletions
@@ -1,14 +1,21 @@ +2005-09-25 Bjørn Lindeijer <bjorn@lindeijer.nl> + + * src/openglgraphics.cpp: Fixed taking OpenGL screenshots and in + addition made it flip the image using just a line buffer instead of a + buffer for the complete image. Still needs testing on MacOS X. + 2005-09-24 Bjørn Lindeijer <bjorn@lindeijer.nl> - * src/being.cpp, src/engine.cpp, src/game.cpp, src/main.cpp, src/map.cpp, - src/sound.cpp, src/gui/char_select.cpp, src/gui/char_select.h, - src/gui/char_server.cpp, src/gui/char_server.h, src/gui/chargedialog.cpp, - src/gui/chargedialog.h, src/gui/chat.cpp, src/gui/equipmentwindow.cpp, - src/gui/login.h, src/gui/setup.cpp, src/gui/setup.h, src/gui/status.cpp, - src/gui/updatewindow.cpp, src/gui/updatewindow.h, - src/resources/iteminfo.cpp, src/resources/iteminfo.h, - src/resources/itemmanager.cpp, src/resources/itemmanager.h: Merged most - of the changes in biggeruniverse's second memory cleanup patch. + * src/being.cpp, src/engine.cpp, src/game.cpp, src/main.cpp, + src/map.cpp, src/sound.cpp, src/gui/char_select.cpp, + src/gui/char_select.h, src/gui/char_server.cpp, src/gui/char_server.h, + src/gui/chargedialog.cpp, src/gui/chargedialog.h, src/gui/chat.cpp, + src/gui/equipmentwindow.cpp, src/gui/login.h, src/gui/setup.cpp, + src/gui/setup.h, src/gui/status.cpp, src/gui/updatewindow.cpp, + src/gui/updatewindow.h, src/resources/iteminfo.cpp, + src/resources/iteminfo.h, src/resources/itemmanager.cpp, + src/resources/itemmanager.h: Merged most of the changes in + biggeruniverse's second memory cleanup patch. 2005-09-23 Duane Bailey <nayryeliab@gmail.com> diff --git a/src/openglgraphics.cpp b/src/openglgraphics.cpp index 27eefc6e..d7915256 100644 --- a/src/openglgraphics.cpp +++ b/src/openglgraphics.cpp @@ -148,23 +148,41 @@ SDL_Surface* OpenGLGraphics::getScreenshot() { int h = mScreen->h; int w = mScreen->w; - SDL_Surface *surface = SDL_CreateRGBSurface(SDL_SWSURFACE, mScreen->w, - mScreen->h, 24, 0xff0000, 0x00ff00, 0x0000ff, NULL); - glReadPixels(0, 0, w, h, GL_RGB, GL_UNSIGNED_BYTE, surface->pixels); - void *data = malloc(w * h * 3); + SDL_Surface *screenshot = SDL_CreateRGBSurface( + SDL_SWSURFACE, + w, h, 24, + 0xff0000, 0x00ff00, 0x0000ff, 0x000000); - for (int i = 0; i < h; i++) + if (SDL_MUSTLOCK(screenshot)) { + SDL_LockSurface(screenshot); + } + + // Grap the pixel buffer and write it to the SDL surface + glPixelStorei(GL_PACK_ALIGNMENT, 1); + glReadPixels(0, 0, w, h, GL_RGB, GL_UNSIGNED_BYTE, screenshot->pixels); + + // Flip the screenshot, as OpenGL has 0,0 in bottom left + unsigned int lineSize = 3 * w; + GLubyte* buf = (GLubyte*)malloc(lineSize); + + for (int i = 0; i < (h / 2); i++) { - memcpy((GLubyte*)data + 3 * w * i, - (GLubyte*)surface->pixels + 3 * w * (h - i), - 3 * w); + GLubyte *top = (GLubyte*)screenshot->pixels + lineSize * i; + GLubyte *bot = (GLubyte*)screenshot->pixels + lineSize * (h - 1 - i); + + memcpy(buf, top, lineSize); + memcpy(top, bot, lineSize); + memcpy(bot, buf, lineSize); + } + + free(buf); + + if (SDL_MUSTLOCK(screenshot)) { + SDL_UnlockSurface(screenshot); } - memcpy(surface->pixels, data, w * h * 3); - free(data); - - return surface; + return screenshot; } bool OpenGLGraphics::pushClipArea(gcn::Rectangle area) |