Changes to rendering pipeline. WIP.

svn-id: r32837
This commit is contained in:
Vicent Marti 2008-06-29 12:08:53 +00:00
parent 0e4cd6fc8e
commit f1173f52a2
3 changed files with 52 additions and 51 deletions

View file

@ -406,7 +406,7 @@ public:
* *
* @param sys Pointer to the global System class * @param sys Pointer to the global System class
*/ */
virtual void copyFrame(OSystem *sys) = 0; virtual void copyFrame(OSystem *sys, Common::Rect &r) = 0;
/** /**
* Blits a given graphics surface on top of the current drawing surface. * Blits a given graphics surface on top of the current drawing surface.
@ -533,15 +533,14 @@ public:
/** /**
* @see VectorRenderer::copyFrame() * @see VectorRenderer::copyFrame()
*/ */
virtual void copyFrame(OSystem *sys) { virtual void copyFrame(OSystem *sys, Common::Rect &r) {
#ifdef OVERLAY_MULTIPLE_DEPTHS #ifdef OVERLAY_MULTIPLE_DEPTHS // TODO: change OSystem to support templated copyRectToOverlay
sys->copyRectToOverlay((const PixelType*)_activeSurface->getBasePtr(0, 0), sys->copyRectToOverlay((const PixelType*)_activeSurface->pixels,
_activeSurface->w, 0, 0, _activeSurface->w, _activeSurface->w); _activeSurface->pitch, r.top, r.left, r.width(), r.height());
#else #else
sys->copyRectToOverlay((const OverlayColor*)_activeSurface->getBasePtr(0, 0), sys->copyRectToOverlay((const OverlayColor*)_activeSurface->pixels,
_activeSurface->w, 0, 0, _activeSurface->w, _activeSurface->w); _activeSurface->pitch, r.top, r.left, r.width(), r.height());
#endif #endif
sys->updateScreen();
} }
/** /**

View file

@ -81,9 +81,6 @@ InterfaceManager::InterfaceManager() :
_graphicsMode = kGfxAntialias16bit; // default GFX mode _graphicsMode = kGfxAntialias16bit; // default GFX mode
// TODO: load this from a config file // TODO: load this from a config file
// setGraphicsMode(kGfxStandard16bit);
// printf("Singleton init!");
} }
template<typename PixelType> template<typename PixelType>
@ -96,6 +93,15 @@ void InterfaceManager::screenInit() {
} }
void InterfaceManager::setGraphicsMode(Graphics_Mode mode) { void InterfaceManager::setGraphicsMode(Graphics_Mode mode) {
// FIXME: reload theme everytime we change resolution...
// what if we change the renderer too?
// ...We may need to reload it to re-cache the widget
// surfaces
if (_system->getOverlayWidth() != _screen->w ||
_system->getOverlayHeight() != _screen->h)
_needThemeLoad = true;
switch (mode) { switch (mode) {
case kGfxStandard16bit: case kGfxStandard16bit:
case kGfxAntialias16bit: case kGfxAntialias16bit:
@ -132,6 +138,8 @@ bool InterfaceManager::addDrawData(DrawData data_id, bool cached) {
} }
bool InterfaceManager::loadTheme(Common::String themeName) { bool InterfaceManager::loadTheme(Common::String themeName) {
unloadTheme();
if (!loadThemeXML(themeName)) { if (!loadThemeXML(themeName)) {
warning("Could not parse custom theme '%s'.\nFalling back to default theme", themeName.c_str()); warning("Could not parse custom theme '%s'.\nFalling back to default theme", themeName.c_str());
@ -150,6 +158,7 @@ bool InterfaceManager::loadTheme(Common::String themeName) {
} }
} }
_needThemeLoad = false;
_themeOk = true; _themeOk = true;
return true; return true;
} }
@ -260,38 +269,52 @@ void InterfaceManager::drawScrollbar(const Common::Rect &r, int sliderY, int sli
return; return;
} }
void InterfaceManager::redrawDialogStack() {
_vectorRenderer->clearSurface();
for (int i = 0; i < _dialogStack.size(); ++i)
_dialogStack[i]->draw();
}
int InterfaceManager::runGUI() { int InterfaceManager::runGUI() {
init();
if (!ready()) if (!ready())
return 0; return 0;
Common::EventManager *eventMan = _system->getEventManager(); Common::EventManager *eventMan = _system->getEventManager();
Dialog *activeDialog = getTopDialog(); Dialog *activeDialog = getTopDialog();
Dialog *lastDialog = 0;
if (!activeDialog) if (!activeDialog)
return 0; return 0;
bool didSaveState = false; bool didSaveState = false;
bool running = true; bool stackChange = true;
int button; int button;
uint32 time; uint32 time;
while (!_dialogStack.empty() && activeDialog == getTopDialog()) { // draw!! _system->showOverlay();
drawDD(kDDMainDialogBackground, Common::Rect()); while (activeDialog) { // draw!!
drawDD(kDDButtonIdle, Common::Rect(32, 32, 128, 128)); stackChange = (activeDialog != lastDialog);
lastDialog = activeDialog;
_vectorRenderer->copyFrame(_system); if (stackChange || needRedraw())
redrawDialogStack();
if (!_dirtyScreen.empty()) {
for (uint i = 0; i < _dirtyScreen.size(); ++i)
_vectorRenderer->copyFrame(_system, _dirtyScreen[i]);
_system->updateScreen();
_dirtyScreen.clear();
}
Common::Event event; Common::Event event;
_system->delayMillis(100);
while (eventMan->pollEvent(event)) { while (eventMan->pollEvent(event)) {
activeDialog->handleTickle();
if (activeDialog != getTopDialog() &&
event.type != Common::EVENT_QUIT &&
event.type != Common::EVENT_SCREEN_CHANGED)
continue;
Common::Point mouse(event.mouse.x - activeDialog->_x, event.mouse.y - activeDialog->_y); Common::Point mouse(event.mouse.x - activeDialog->_x, event.mouse.y - activeDialog->_y);
@ -352,6 +375,7 @@ int InterfaceManager::runGUI() {
} }
} }
activeDialog = getTopDialog();
_system->delayMillis(10); _system->delayMillis(10);
} }

View file

@ -220,33 +220,6 @@ public:
return _initOk && _themeOk; return _initOk && _themeOk;
} }
void refresh() {
init();
if (_enabled) {
_system->showOverlay();
// CursorMan.replaceCursorPalette(_cursorPal, 0, MAX_CURS_COLORS);
// CursorMan.replaceCursor(_cursor, _cursorWidth, _cursorHeight, _cursorHotspotX, _cursorHotspotY, 255, _cursorTargetScale);
}
}
void enable() {
init();
_system->showOverlay();
_enabled = true;
}
void disable() {
_system->hideOverlay();
_enabled = false;
}
void deinit() {
if (_initOk) {
_system->hideOverlay();
_initOk = false;
}
}
bool loadTheme() { bool loadTheme() {
ConfMan.registerDefault("gui_theme", "default"); ConfMan.registerDefault("gui_theme", "default");
Common::String style(ConfMan.get("gui_theme")); Common::String style(ConfMan.get("gui_theme"));
@ -300,6 +273,11 @@ protected:
return (_themeOk == false || _needThemeLoad == true); return (_themeOk == false || _needThemeLoad == true);
} }
bool needRedraw() {
return true;
}
void redrawDialogStack();
bool isWidgetCached(DrawData type, const Common::Rect &r); bool isWidgetCached(DrawData type, const Common::Rect &r);
void drawCached(DrawData type, const Common::Rect &r); void drawCached(DrawData type, const Common::Rect &r);
@ -307,7 +285,7 @@ protected:
inline void drawDD(DrawData type, const Common::Rect &r); inline void drawDD(DrawData type, const Common::Rect &r);
void addDirtyRect(const Common::Rect &r) { void addDirtyRect(const Common::Rect &r) {
_dirtyScreen.extend(r); _dirtyScreen.push_back(r);
} }
OSystem *_system; OSystem *_system;
@ -325,7 +303,7 @@ protected:
WidgetDrawData *_widgets[kDrawDataMAX]; WidgetDrawData *_widgets[kDrawDataMAX];
Common::FixedStack<Dialog *, kMaxDialogDepth> _dialogStack; Common::FixedStack<Dialog *, kMaxDialogDepth> _dialogStack;
Common::Rect _dirtyScreen; Common::Array<Common::Rect> _dirtyScreen;
bool _initOk; bool _initOk;
bool _themeOk; bool _themeOk;