diff options
author | Vicent Marti | 2008-07-17 21:58:43 +0000 |
---|---|---|
committer | Vicent Marti | 2008-07-17 21:58:43 +0000 |
commit | 4645e706a8c62fb291efb987dca9fa82394139ee (patch) | |
tree | 8155832408c5b2297f3459a617c9460c27eac248 /gui/ThemeRenderer.cpp | |
parent | 6214815e6eff5b91887e5e1dd4d6463c2000f024 (diff) | |
download | scummvm-rg350-4645e706a8c62fb291efb987dca9fa82394139ee.tar.gz scummvm-rg350-4645e706a8c62fb291efb987dca9fa82394139ee.tar.bz2 scummvm-rg350-4645e706a8c62fb291efb987dca9fa82394139ee.zip |
Rendering pipeline (almost) fixed. This time for real.
svn-id: r33092
Diffstat (limited to 'gui/ThemeRenderer.cpp')
-rw-r--r-- | gui/ThemeRenderer.cpp | 81 |
1 files changed, 62 insertions, 19 deletions
diff --git a/gui/ThemeRenderer.cpp b/gui/ThemeRenderer.cpp index 7b64baba11..9b3d115576 100644 --- a/gui/ThemeRenderer.cpp +++ b/gui/ThemeRenderer.cpp @@ -76,7 +76,8 @@ const char *ThemeRenderer::kDrawDataStrings[] = { ThemeRenderer::ThemeRenderer(Common::String themeName, GraphicsMode mode) : _vectorRenderer(0), _system(0), _graphicsMode(kGfxDisabled), - _screen(0), _backBuffer(0), _bytesPerPixel(0), _initOk(false), _themeOk(false), _enabled(false) { + _screen(0), _backBuffer(0), _bytesPerPixel(0), _initOk(false), + _themeOk(false), _enabled(false), _dialogCount(0), _cachedDialog(0) { _system = g_system; _parser = new ThemeParser(this); @@ -238,8 +239,11 @@ bool ThemeRenderer::loadTheme(Common::String themeName) { warning("Error when parsing custom theme '%s': Missing data assets.", themeName.c_str()); return false; #endif - } else if (_widgets[i]->_cached) { - // draw the cached widget to the cache surface + } else { + calcBackgroundOffset((DrawData)i); + + // TODO: draw the cached widget to the cache surface + if (_widgets[i]->_cached) {} } } @@ -293,6 +297,14 @@ void ThemeRenderer::drawCached(DrawData type, const Common::Rect &r) { void ThemeRenderer::drawDD(DrawData type, const Common::Rect &r, uint32 dynamicData) { if (_widgets[type] == 0) return; + + Common::Rect extendedRect = r; + extendedRect.grow(kDirtyRectangleThreshold); + extendedRect.right += _widgets[type]->_backgroundOffset; + extendedRect.bottom += _widgets[type]->_backgroundOffset; + + restoreBackground(extendedRect); + addDirtyRect(extendedRect); if (isWidgetCached(type, r)) { drawCached(type, r); @@ -312,6 +324,33 @@ void ThemeRenderer::drawDDText(DrawData type, const Common::Rect &r, const Commo } } +void ThemeRenderer::calcBackgroundOffset(DrawData type) { + uint maxShadow = 0; + for (Common::List<Graphics::DrawStep>::const_iterator step = _widgets[type]->_steps.begin(); + step != _widgets[type]->_steps.end(); ++step) { + if (((*step).autoWidth || (*step).autoHeight) && (*step).shadow > maxShadow) + maxShadow = (*step).shadow; + } + + _widgets[type]->_backgroundOffset = maxShadow; +} + +void ThemeRenderer::restoreBackground(Common::Rect r, bool special) { +/* const OverlayColor *src = (const OverlayColor*)_backBuffer->getBasePtr(r.left, r.top); + OverlayColor *dst = (OverlayColor*)_screen->getBasePtr(r.left, r.top); + + int h = r.height(); + int w = r.width(); + while (h--) { + memcpy(dst, src, w * sizeof(OverlayColor)); + src += _backBuffer->w; + dst += _screen->w; + }*/ + + debugWidgetPosition("", r); + printf(" BG_RESTORE "); +} + void ThemeRenderer::drawButton(const Common::Rect &r, const Common::String &str, WidgetStateInfo state, uint16 hints) { if (!ready()) return; @@ -327,8 +366,6 @@ void ThemeRenderer::drawButton(const Common::Rect &r, const Common::String &str, drawDD(dd, r); drawDDText(dd, r, str); - - addDirtyRect(r); } void ThemeRenderer::drawLineSeparator(const Common::Rect &r, WidgetStateInfo state) { @@ -336,7 +373,6 @@ void ThemeRenderer::drawLineSeparator(const Common::Rect &r, WidgetStateInfo sta return; drawDD(kDDSeparator, r); - addDirtyRect(r); } void ThemeRenderer::drawCheckbox(const Common::Rect &r, const Common::String &str, bool checked, WidgetStateInfo state) { @@ -355,8 +391,6 @@ void ThemeRenderer::drawCheckbox(const Common::Rect &r, const Common::String &st r2.right = r.right; drawDDText(checked ? kDDCheckboxEnabled : kDDCheckboxDisabled, r2, str); - - addDirtyRect(r); } void ThemeRenderer::drawSlider(const Common::Rect &r, int width, WidgetStateInfo state) { @@ -369,8 +403,6 @@ void ThemeRenderer::drawSlider(const Common::Rect &r, int width, WidgetStateInfo r2.setWidth(MIN((int16)width, r.width())); drawDD(kDDSliderFull, r2); - - addDirtyRect(r); } void ThemeRenderer::drawScrollbar(const Common::Rect &r, int sliderY, int sliderHeight, ScrollbarState sb_state, WidgetStateInfo state) { @@ -379,8 +411,6 @@ void ThemeRenderer::drawScrollbar(const Common::Rect &r, int sliderY, int slider drawDD(kDDScrollbarBase, r); // TODO: Need to find a scrollbar in the GUI for testing... :p - - addDirtyRect(r); } void ThemeRenderer::drawDialogBackground(const Common::Rect &r, uint16 hints, WidgetStateInfo state) { @@ -396,8 +426,6 @@ void ThemeRenderer::drawDialogBackground(const Common::Rect &r, uint16 hints, Wi } else { drawDD(kDDDefaultBackground, r); } - - addDirtyRect(r); } void ThemeRenderer::drawCaret(const Common::Rect &r, bool erase, WidgetStateInfo state) { @@ -405,7 +433,6 @@ void ThemeRenderer::drawCaret(const Common::Rect &r, bool erase, WidgetStateInfo return; debugWidgetPosition("Caret", r); - addDirtyRect(r); } void ThemeRenderer::drawPopUpWidget(const Common::Rect &r, const Common::String &sel, int deltax, WidgetStateInfo state, TextAlign align) { @@ -420,8 +447,6 @@ void ThemeRenderer::drawPopUpWidget(const Common::Rect &r, const Common::String Common::Rect text(r.left, r.top, r.right - 16, r.bottom); drawDDText(dd, text, sel); } - - addDirtyRect(r); } void ThemeRenderer::drawSurface(const Common::Rect &r, const Graphics::Surface &surface, WidgetStateInfo state, int alpha, bool themeTrans) { @@ -452,8 +477,6 @@ void ThemeRenderer::drawWidgetBackground(const Common::Rect &r, uint16 hints, Wi drawDD(kDDWidgetBackgroundDefault, r); break; } - - addDirtyRect(r); } void ThemeRenderer::drawTab(const Common::Rect &r, int tabHeight, int tabWidth, const Common::Array<Common::String> &tabs, int active, uint16 hints, int titleVPad, WidgetStateInfo state) { @@ -514,4 +537,24 @@ void ThemeRenderer::renderDirtyScreen() { _dirtyScreen.clear(); } +void ThemeRenderer::openDialog(bool top) { + if (_dialogCount++ == 0) + return; + + _cachedDialog = _dialogCount - 1; + memcpy(_backBuffer->pixels, _screen->pixels, _screen->w * _screen->h * _screen->bytesPerPixel); +} + +bool ThemeRenderer::closeDialog() { + assert(_dialogCount); + + _dialogCount--; + + if (_dialogCount != _cachedDialog) + return false; + + memcpy(_screen->pixels, _backBuffer->pixels, _screen->w * _screen->h * _screen->bytesPerPixel); + return true; +} + } // end of namespace GUI. |