From d75868d33d7c61f2d3902971ddd1e4b9b1494531 Mon Sep 17 00:00:00 2001 From: stephena Date: Sun, 15 Jan 2006 16:31:01 +0000 Subject: [PATCH] Make sure screen is cleared when switching modes; hopefully this will fix the problem with the GP2X port. Removed SDL_FillRect() calls in OpenGL GUI drawing, since the extra function calls are only slowing things down when we can access the pixels directly. Made return/enter key activate the currently selected button in the ROM launcher instead of always starting a ROM. This was confusing when the 'Quit' button was highlighted and pressing enter started a ROM. Now pressing enter in such a case will actually do 'quit'. git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@963 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba --- stella/src/common/FrameBufferGL.cxx | 84 +++++++++++---------------- stella/src/common/FrameBufferGL.hxx | 11 +++- stella/src/common/FrameBufferSoft.cxx | 16 +++-- stella/src/common/FrameBufferSoft.hxx | 11 +++- stella/src/emucore/FrameBuffer.cxx | 17 ++---- stella/src/emucore/FrameBuffer.hxx | 11 +++- stella/src/gui/LauncherDialog.cxx | 4 +- 7 files changed, 78 insertions(+), 76 deletions(-) diff --git a/stella/src/common/FrameBufferGL.cxx b/stella/src/common/FrameBufferGL.cxx index 4460ed830..31487fa03 100644 --- a/stella/src/common/FrameBufferGL.cxx +++ b/stella/src/common/FrameBufferGL.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: FrameBufferGL.cxx,v 1.51 2006-01-14 23:50:43 stephena Exp $ +// $Id: FrameBufferGL.cxx,v 1.52 2006-01-15 16:31:00 stephena Exp $ //============================================================================ #ifdef DISPLAY_OPENGL @@ -248,11 +248,6 @@ bool FrameBufferGL::initSubsystem() << endl; } - // Precompute the GUI palette - // We abuse the concept of 'enum' by referring directly to the integer values - for(uInt8 i = 0; i < kNumColors-256; i++) - myPalette[i+256] = mapRGB(ourGUIColors[i][0], ourGUIColors[i][1], ourGUIColors[i][2]); - return true; } @@ -306,9 +301,7 @@ bool FrameBufferGL::createScreen() // Make sure any old parts of the screen are erased // Do it for both buffers! - p_glClear(GL_COLOR_BUFFER_BIT); - SDL_GL_SwapBuffers(); - p_glClear(GL_COLOR_BUFFER_BIT); + cls(); myOSystem->eventHandler().refreshDisplay(); @@ -459,27 +452,20 @@ void FrameBufferGL::toggleFilter() // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void FrameBufferGL::hLine(uInt32 x, uInt32 y, uInt32 x2, OverlayColor color) { - SDL_Rect tmp; - - // Horizontal line - tmp.x = x; - tmp.y = y; - tmp.w = x2 - x + 1; - tmp.h = 1; - SDL_FillRect(myTexture, &tmp, myPalette[color]); + uInt16* buffer = (uInt16*) myTexture->pixels + y * myTexture->w + x; + while(x++ <= x2) + *buffer++ = (uInt16) myPalette[color]; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void FrameBufferGL::vLine(uInt32 x, uInt32 y, uInt32 y2, OverlayColor color) { - SDL_Rect tmp; - - // Vertical line - tmp.x = x; - tmp.y = y; - tmp.w = 1; - tmp.h = y2 - y + 1; - SDL_FillRect(myTexture, &tmp, myPalette[color]); + uInt16* buffer = (uInt16*) myTexture->pixels + y * myTexture->w + x; + while(y++ <= y2) + { + *buffer = (uInt16) myPalette[color]; + buffer += myTexture->w; + } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -498,7 +484,7 @@ void FrameBufferGL::fillRect(uInt32 x, uInt32 y, uInt32 w, uInt32 h, // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void FrameBufferGL::drawChar(const GUI::Font* FONT, uInt8 chr, - uInt32 xorig, uInt32 yorig, OverlayColor color) + uInt32 tx, uInt32 ty, OverlayColor color) { GUI::Font* font = (GUI::Font*) FONT; @@ -517,44 +503,36 @@ void FrameBufferGL::drawChar(const GUI::Font* FONT, uInt8 chr, const uInt16* tmp = font->desc().bits + (font->desc().offset ? font->desc().offset[chr] : (chr * h)); - SDL_Rect rect; - for(int y = 0; y < h; y++) + uInt16* buffer = (uInt16*) myTexture->pixels + ty * myTexture->w + tx; + for(int y = 0; y < h; ++y) { - const uInt16 buffer = *tmp++; + const uInt16 ptr = *tmp++; uInt16 mask = 0x8000; - for(int x = 0; x < w; x++, mask >>= 1) + for(int x = 0; x < w; ++x, mask >>= 1) { - if ((buffer & mask) != 0) - { - rect.x = x + xorig; - rect.y = y + yorig; - rect.w = rect.h = 1; - SDL_FillRect(myTexture, &rect, myPalette[color]); - } + if(ptr & mask) + buffer[x] = (uInt16) myPalette[color]; } + buffer += myTexture->w; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void FrameBufferGL::drawBitmap(uInt32* bitmap, Int32 xorig, Int32 yorig, - OverlayColor color, Int32 h) +void FrameBufferGL::drawBitmap(uInt32* bitmap, Int32 tx, Int32 ty, + OverlayColor color, Int32 h) { - SDL_Rect rect; - for(int y = 0; y < h; y++) + uInt16* buffer = (uInt16*) myTexture->pixels + ty * myTexture->w + tx; + + for(int y = 0; y < h; ++y) { uInt32 mask = 0xF0000000; - - for(int x = 0; x < 8; x++, mask >>= 4) + for(int x = 0; x < 8; ++x, mask >>= 4) { if(bitmap[y] & mask) - { - rect.x = x + xorig; - rect.y = y + yorig; - rect.w = rect.h = 1; - SDL_FillRect(myTexture, &rect, myPalette[color]); - } + buffer[x] = (uInt16) myPalette[color]; } + buffer += myTexture->w; } } @@ -583,6 +561,14 @@ void FrameBufferGL::enablePhosphor(bool enable) myPhosphorBlend = myOSystem->settings().getInt("ppblend"); } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void FrameBufferGL::cls() +{ + p_glClear(GL_COLOR_BUFFER_BIT); + SDL_GL_SwapBuffers(); + p_glClear(GL_COLOR_BUFFER_BIT); +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bool FrameBufferGL::createTextures() { diff --git a/stella/src/common/FrameBufferGL.hxx b/stella/src/common/FrameBufferGL.hxx index 777c319a0..0d156beff 100644 --- a/stella/src/common/FrameBufferGL.hxx +++ b/stella/src/common/FrameBufferGL.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: FrameBufferGL.hxx,v 1.28 2006-01-14 22:29:34 stephena Exp $ +// $Id: FrameBufferGL.hxx,v 1.29 2006-01-15 16:31:00 stephena Exp $ //============================================================================ #ifndef FRAMEBUFFER_GL_HXX @@ -37,7 +37,7 @@ class GUI::Font; This class implements an SDL OpenGL framebuffer. @author Stephen Anthony - @version $Id: FrameBufferGL.hxx,v 1.28 2006-01-14 22:29:34 stephena Exp $ + @version $Id: FrameBufferGL.hxx,v 1.29 2006-01-15 16:31:00 stephena Exp $ */ class FrameBufferGL : public FrameBuffer { @@ -198,10 +198,15 @@ class FrameBufferGL : public FrameBuffer virtual void addDirtyRect(uInt32 x, uInt32 y, uInt32 w, uInt32 h); /** - Enable/disable phosphor effect + Enable/disable phosphor effect. */ virtual void enablePhosphor(bool enable); + /** + Completely erase contents of the screen. + */ + virtual void cls(); + private: bool createTextures(); diff --git a/stella/src/common/FrameBufferSoft.cxx b/stella/src/common/FrameBufferSoft.cxx index 88064d2c1..657c8fc36 100644 --- a/stella/src/common/FrameBufferSoft.cxx +++ b/stella/src/common/FrameBufferSoft.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: FrameBufferSoft.cxx,v 1.42 2006-01-12 16:23:36 stephena Exp $ +// $Id: FrameBufferSoft.cxx,v 1.43 2006-01-15 16:31:01 stephena Exp $ //============================================================================ #include @@ -68,11 +68,6 @@ bool FrameBufferSoft::initSubsystem() if(myOSystem->settings().getBool("showinfo")) cout << "Video rendering: Software mode" << endl << endl; - // Precompute the GUI palette - // We abuse the concept of 'enum' by referring directly to the integer values - for(uInt8 i = 0; i < kNumColors-256; i++) - myPalette[i+256] = mapRGB(ourGUIColors[i][0], ourGUIColors[i][1], ourGUIColors[i][2]); - return true; } @@ -638,6 +633,15 @@ void FrameBufferSoft::enablePhosphor(bool enable) myRenderType = kSoftZoom; } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void FrameBufferSoft::cls() +{ + if(myScreen) + { + SDL_FillRect(myScreen, NULL, 0); + SDL_UpdateRect(myScreen, 0, 0, 0, 0); + } +} // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RectList::RectList(Uint32 size) diff --git a/stella/src/common/FrameBufferSoft.hxx b/stella/src/common/FrameBufferSoft.hxx index 032ab285e..e1e8bda67 100644 --- a/stella/src/common/FrameBufferSoft.hxx +++ b/stella/src/common/FrameBufferSoft.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: FrameBufferSoft.hxx,v 1.28 2006-01-12 16:23:36 stephena Exp $ +// $Id: FrameBufferSoft.hxx,v 1.29 2006-01-15 16:31:01 stephena Exp $ //============================================================================ #ifndef FRAMEBUFFER_SOFT_HXX @@ -35,7 +35,7 @@ class RectList; This class implements an SDL software framebuffer. @author Stephen Anthony - @version $Id: FrameBufferSoft.hxx,v 1.28 2006-01-12 16:23:36 stephena Exp $ + @version $Id: FrameBufferSoft.hxx,v 1.29 2006-01-15 16:31:01 stephena Exp $ */ class FrameBufferSoft : public FrameBuffer { @@ -187,10 +187,15 @@ class FrameBufferSoft : public FrameBuffer virtual void addDirtyRect(uInt32 x, uInt32 y, uInt32 w, uInt32 h); /** - Enable/disable phosphor effect + Enable/disable phosphor effect. */ virtual void enablePhosphor(bool enable); + /** + Completely erase contents of the screen. + */ + virtual void cls(); + protected: // Used in the dirty update of the SDL surface RectList* myRectList; diff --git a/stella/src/emucore/FrameBuffer.cxx b/stella/src/emucore/FrameBuffer.cxx index 42d5305e4..201055fdd 100644 --- a/stella/src/emucore/FrameBuffer.cxx +++ b/stella/src/emucore/FrameBuffer.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: FrameBuffer.cxx,v 1.75 2006-01-14 23:55:23 stephena Exp $ +// $Id: FrameBuffer.cxx,v 1.76 2006-01-15 16:31:01 stephena Exp $ //============================================================================ #include @@ -87,16 +87,7 @@ void FrameBuffer::initialize(const string& title, uInt32 width, uInt32 height, return; } setWindowIcon(); - - // Erase contents of previous screen -/* cls(); - if(myScreen) - { -cerr << "clear screen: w = " << myScreen->w << ", height = " << myScreen->h << endl; - SDL_FillRect(myScreen, NULL, 0); - SDL_UpdateRect(myScreen, 0, 0, 0, 0); - } -*/ + cls(); // Query the desktop size // This is really the job of SDL @@ -131,6 +122,10 @@ cerr << "clear screen: w = " << myScreen->w << ", height = " << myScreen->h << e // Initialize video subsystem initSubsystem(); + // Set palette for GUI + for(int i = 0; i < kNumColors-256; i++) + myPalette[i+256] = mapRGB(ourGUIColors[i][0], ourGUIColors[i][1], ourGUIColors[i][2]); + // Set emulation palette if a console exists // Used when entering/exiting debugger #ifdef DEVELOPER_SUPPORT diff --git a/stella/src/emucore/FrameBuffer.hxx b/stella/src/emucore/FrameBuffer.hxx index 6cfb910e4..6d61ff9db 100644 --- a/stella/src/emucore/FrameBuffer.hxx +++ b/stella/src/emucore/FrameBuffer.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: FrameBuffer.hxx,v 1.63 2006-01-11 13:25:20 stephena Exp $ +// $Id: FrameBuffer.hxx,v 1.64 2006-01-15 16:31:01 stephena Exp $ //============================================================================ #ifndef FRAMEBUFFER_HXX @@ -51,7 +51,7 @@ enum FrameStyle { All GUI elements (ala ScummVM) are drawn here as well. @author Stephen Anthony - @version $Id: FrameBuffer.hxx,v 1.63 2006-01-11 13:25:20 stephena Exp $ + @version $Id: FrameBuffer.hxx,v 1.64 2006-01-15 16:31:01 stephena Exp $ */ class FrameBuffer { @@ -394,10 +394,15 @@ class FrameBuffer virtual void addDirtyRect(uInt32 x, uInt32 y, uInt32 w, uInt32 h) = 0; /** - Enable/disable phosphor effect + Enable/disable phosphor effect. */ virtual void enablePhosphor(bool enable) = 0; + /** + Completely erase contents of the screen. + */ + virtual void cls() = 0; + protected: // The parent system for the framebuffer OSystem* myOSystem; diff --git a/stella/src/gui/LauncherDialog.cxx b/stella/src/gui/LauncherDialog.cxx index cc54851d0..0f8e6fde7 100644 --- a/stella/src/gui/LauncherDialog.cxx +++ b/stella/src/gui/LauncherDialog.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: LauncherDialog.cxx,v 1.37 2006-01-08 20:55:54 stephena Exp $ +// $Id: LauncherDialog.cxx,v 1.38 2006-01-15 16:31:01 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -381,6 +381,8 @@ void LauncherDialog::handleKeyDown(int ascii, int keycode, int modifiers) break; case ' ': // Used to activate currently focused button + case '\n': + case '\r': Dialog::handleKeyDown(ascii, keycode, modifiers); break;