diff options
| author | Vicent Marti | 2008-07-10 15:50:44 +0000 |
|---|---|---|
| committer | Vicent Marti | 2008-07-10 15:50:44 +0000 |
| commit | ccf9368c533110a5c72df3607466a16651ec6497 (patch) | |
| tree | 7b4d08bb75a897e39f476f9e571fd701585c2209 /gui | |
| parent | 24a8fb1820ab27c050ff65f8447f3680d9e8064a (diff) | |
| download | scummvm-rg350-ccf9368c533110a5c72df3607466a16651ec6497.tar.gz scummvm-rg350-ccf9368c533110a5c72df3607466a16651ec6497.tar.bz2 scummvm-rg350-ccf9368c533110a5c72df3607466a16651ec6497.zip | |
Added support for Text Steps in the Vector Renderer.
svn-id: r32991
Diffstat (limited to 'gui')
| -rw-r--r-- | gui/ThemeDefaultXML.cpp | 3 | ||||
| -rw-r--r-- | gui/ThemeParser.cpp | 53 | ||||
| -rw-r--r-- | gui/ThemeParser.h | 1 | ||||
| -rw-r--r-- | gui/ThemeRenderer.cpp | 32 | ||||
| -rw-r--r-- | gui/ThemeRenderer.h | 7 |
5 files changed, 90 insertions, 6 deletions
diff --git a/gui/ThemeDefaultXML.cpp b/gui/ThemeDefaultXML.cpp index fe14fbb403..3793fcc82b 100644 --- a/gui/ThemeDefaultXML.cpp +++ b/gui/ThemeDefaultXML.cpp @@ -51,14 +51,17 @@ bool ThemeRenderer::loadDefaultXML() { "</drawdata>" "<drawdata id = 'button_idle' cache = false>" + "<text align = 'center' color = '255, 0, 0' />" "<drawstep func = 'roundedsq' radius = '8' stroke = 0 fill = 'gradient' gradient_start = '206, 121, 99' gradient_end = '173, 40, 8' size = 'auto' shadow = 3 />" "</drawdata>" "<drawdata id = 'button_hover' cache = false>" + "<text align = 'center' color = '255, 0, 0' />" "<drawstep func = 'roundedsq' radius = '8' fill = 'gradient' gradient_start = '206, 121, 99' gradient_end = '173, 40, 8' size = 'auto' shadow = 3 />" "</drawdata>" "<drawdata id = 'checkbox_disabled' cache = false>" + "<text align = 'center' color = '255, 0, 0' />" "<drawstep func = 'square' fill = 'gradient' gradient_start = '206, 121, 99' gradient_end = '173, 40, 8' size = 'auto' shadow = 0 />" "</drawdata>" diff --git a/gui/ThemeParser.cpp b/gui/ThemeParser.cpp index 463e8c81ea..eae131af50 100644 --- a/gui/ThemeParser.cpp +++ b/gui/ThemeParser.cpp @@ -48,7 +48,8 @@ ThemeParser::ThemeParser(ThemeRenderer *parent) : XMLParser() { _callbacks["render_info"] = &ThemeParser::parserCallback_renderInfo; _callbacks["layout_info"] = &ThemeParser::parserCallback_layoutInfo; _callbacks["default"] = &ThemeParser::parserCallback_defaultSet; - + _callbacks["text"] = &ThemeParser::parserCallback_text; + _drawFunctions["circle"] = &Graphics::VectorRenderer::drawCallback_CIRCLE; _drawFunctions["square"] = &Graphics::VectorRenderer::drawCallback_SQUARE; _drawFunctions["roundedsq"] = &Graphics::VectorRenderer::drawCallback_ROUNDSQ; @@ -136,6 +137,56 @@ bool ThemeParser::parserCallback_defaultSet() { return parseDrawStep(defNode, step, false); } +bool ThemeParser::parserCallback_text() { + ParserNode *tNode = getActiveNode(); + ParserNode *parentNode = getParentNode(tNode); + + if (parentNode == 0 || parentNode->name != "drawdata") + return parserError("Text Steps must be contained inside <drawdata> keys."); + + Graphics::TextStep step; + + if (tNode->values.contains("align") == false) + return parserError("Text inside widgets requires an alignement key."); + + if (tNode->values["align"] == "left") + step.align = GUI::Theme::kTextAlignLeft; + else if (tNode->values["align"] == "right") + step.align = GUI::Theme::kTextAlignRight; + else if (tNode->values["align"] == "center") + step.align = GUI::Theme::kTextAlignCenter; + else return parserError("Invalid value for text alignment."); + + + if (tNode->values.contains("color")) { + int red, green, blue; + + if (parseIntegerKey(tNode->values["color"].c_str(), 3, &red, &green, &blue) == false || + red < 0 || red > 255 || green < 0 || green > 255 || blue < 0 || blue > 255) + return parserError("Error when parsing color value for text definition"); + + step.color.r = red; + step.color.g = green; + step.color.b = blue; + step.color.set = true; + } else if (_defaultStepLocal && _defaultStepLocal->fgColor.set) { + step.color.r = _defaultStepLocal->fgColor.r; + step.color.g = _defaultStepLocal->fgColor.g; + step.color.b = _defaultStepLocal->fgColor.b; + step.color.set = true; + } else if (_defaultStepGlobal && _defaultStepGlobal->fgColor.set) { + step.color.r = _defaultStepGlobal->fgColor.r; + step.color.g = _defaultStepGlobal->fgColor.g; + step.color.b = _defaultStepGlobal->fgColor.b; + step.color.set = true; + } else { + return parserError("Cannot assign color for text drawing."); + } + + _theme->addTextStep(parentNode->values["id"], step); + return true; +} + bool ThemeParser::parserCallback_renderInfo() { ParserNode *infoNode = getActiveNode(); diff --git a/gui/ThemeParser.h b/gui/ThemeParser.h index cddb91b21e..778158bff0 100644 --- a/gui/ThemeParser.h +++ b/gui/ThemeParser.h @@ -328,6 +328,7 @@ protected: bool parserCallback_renderInfo(); bool parserCallback_layoutInfo(); bool parserCallback_defaultSet(); + bool parserCallback_text(); void cleanup(); diff --git a/gui/ThemeRenderer.cpp b/gui/ThemeRenderer.cpp index bf481fabb8..71943e2586 100644 --- a/gui/ThemeRenderer.cpp +++ b/gui/ThemeRenderer.cpp @@ -180,6 +180,19 @@ void ThemeRenderer::addDrawStep(Common::String &drawDataId, Graphics::DrawStep s _widgets[id]->_steps.push_back(step); } +bool ThemeRenderer::addTextStep(Common::String &drawDataId, Graphics::TextStep step) { + DrawData id = getDrawDataId(drawDataId); + + assert(_widgets[id] != 0); + if (_widgets[id]->_hasText == true) + return false; + + _widgets[id]->_textStep = step; + _widgets[id]->_hasText = true; + + return true; +} + bool ThemeRenderer::addDrawData(DrawData data_id, bool cached) { assert(data_id >= 0 && data_id < kDrawDataMAX); @@ -189,6 +202,7 @@ bool ThemeRenderer::addDrawData(DrawData data_id, bool cached) { _widgets[data_id] = new WidgetDrawData; _widgets[data_id]->_cached = cached; _widgets[data_id]->_surfaceCache = 0; + _widgets[data_id]->_hasText = false; return true; } @@ -252,9 +266,12 @@ void ThemeRenderer::drawCached(DrawData type, const Common::Rect &r) { } void ThemeRenderer::drawDD(DrawData type, const Common::Rect &r) { + if (_widgets[type] == 0) + return; + if (isWidgetCached(type, r)) { drawCached(type, r); - } else if (_widgets[type] != 0) { + } else { for (Common::List<Graphics::DrawStep>::const_iterator step = _widgets[type]->_steps.begin(); step != _widgets[type]->_steps.end(); ++step) _vectorRenderer->drawStep(r, *step); @@ -264,15 +281,20 @@ void ThemeRenderer::drawDD(DrawData type, const Common::Rect &r) { void ThemeRenderer::drawButton(const Common::Rect &r, const Common::String &str, WidgetStateInfo state, uint16 hints) { if (!ready()) return; + + DrawData dd; if (state == kStateEnabled) - drawDD(kDDButtonIdle, r); + dd = kDDButtonIdle; else if (state == kStateHighlight) - drawDD(kDDButtonHover, r); + dd = kDDButtonHover; else if (state == kStateDisabled) - drawDD(kDDButtonDisabled, r); + dd = kDDButtonDisabled; - // TODO: Add text drawing. + drawDD(dd, r); + if (hasWidgetText(dd)) + _vectorRenderer->textStep(str, r, _widgets[dd]->_textStep); + addDirtyRect(r); debugWidgetPosition(r); diff --git a/gui/ThemeRenderer.h b/gui/ThemeRenderer.h index 9450186b34..74225d035c 100644 --- a/gui/ThemeRenderer.h +++ b/gui/ThemeRenderer.h @@ -43,6 +43,8 @@ struct WidgetDrawData; struct WidgetDrawData { Common::List<Graphics::DrawStep> _steps; + Graphics::TextStep _textStep; + bool _hasText; bool _cached; Graphics::Surface *_surfaceCache; @@ -175,6 +177,7 @@ public: void addDrawStep(Common::String &drawDataId, Graphics::DrawStep step); bool addDrawData(DrawData data_id, bool cached); + bool addTextStep(Common::String &drawDataId, Graphics::TextStep step); ThemeParser *parser() { return _parser; @@ -227,6 +230,10 @@ protected: void redrawDialogStack(); + bool hasWidgetText(DrawData type) { + return (_widgets[type] != 0 && _widgets[type]->_hasText); + } + bool isWidgetCached(DrawData type, const Common::Rect &r); void drawCached(DrawData type, const Common::Rect &r); |
