diff options
author | Vicent Marti | 2008-07-15 18:53:22 +0000 |
---|---|---|
committer | Vicent Marti | 2008-07-15 18:53:22 +0000 |
commit | 47119ee8b136184c39cc6ce1a4b7248702f4c16f (patch) | |
tree | 09b85ea7e88329a34fec74d717527e9ce616349d | |
parent | b44b37d4ca4f0bbfe2b578dc72d84ba71286cc92 (diff) | |
download | scummvm-rg350-47119ee8b136184c39cc6ce1a4b7248702f4c16f.tar.gz scummvm-rg350-47119ee8b136184c39cc6ce1a4b7248702f4c16f.tar.bz2 scummvm-rg350-47119ee8b136184c39cc6ce1a4b7248702f4c16f.zip |
Tab widget / tab drawing for the renderer. Improved text handling.
svn-id: r33076
-rw-r--r-- | graphics/VectorRenderer.cpp | 71 | ||||
-rw-r--r-- | graphics/VectorRenderer.h | 25 | ||||
-rw-r--r-- | gui/ThemeDefaultXML.cpp | 18 | ||||
-rw-r--r-- | gui/ThemeParser.cpp | 5 | ||||
-rw-r--r-- | gui/ThemeRenderer.cpp | 46 | ||||
-rw-r--r-- | gui/ThemeRenderer.h | 3 |
6 files changed, 146 insertions, 22 deletions
diff --git a/graphics/VectorRenderer.cpp b/graphics/VectorRenderer.cpp index b5722c2f64..a95564789e 100644 --- a/graphics/VectorRenderer.cpp +++ b/graphics/VectorRenderer.cpp @@ -352,7 +352,7 @@ template<typename PixelType, typename PixelFormat> void VectorRendererSpec<PixelType, PixelFormat>:: drawRoundedSquare(int x, int y, int r, int w, int h) { if (x + w > Base::_activeSurface->w || y + h > Base::_activeSurface->h || - w <= 0 || h <= 0 || x < 0 || y < 0 || r <= 0 || r > 128 || (r << 1) > w || (r << 1) > h) + w <= 0 || h <= 0 || x < 0 || y < 0 || (r << 1) > w || (r << 1) > h) return; if (Base::_fillMode != kFillDisabled && Base::_shadowOffset @@ -392,6 +392,25 @@ drawRoundedSquare(int x, int y, int r, int w, int h) { template<typename PixelType, typename PixelFormat> void VectorRendererSpec<PixelType, PixelFormat>:: +drawTab(int x, int y, int r, int w, int h) { + if (x + w > Base::_activeSurface->w || y + h > Base::_activeSurface->h || + w <= 0 || h <= 0 || x < 0 || y < 0 || (r << 1) > w || (r << 1) > h) + return; + + switch (Base::_fillMode) { + case kFillDisabled: + return; + + case kFillGradient: + case kFillForeground: + case kFillBackground: + drawTabAlg(x, y, w, h, r, (Base::_fillMode == kFillBackground) ? _bgColor : _fgColor, Base::_fillMode); + break; + } +} + +template<typename PixelType, typename PixelFormat> +void VectorRendererSpec<PixelType, PixelFormat>:: drawTriangle(int x, int y, int w, int h, TriangleOrientation orient) { // Awesome hack: the AA messes up the last pixel triangles if their width is even // ...fix the width instead of fixing the AA :p @@ -421,7 +440,7 @@ drawTriangle(int x, int y, int w, int h, TriangleOrientation orient) { #ifdef VECTOR_RENDERER_FAST_TRIANGLES if (w == h) drawTriangleFast(x, y, w, (orient == kTriangleDown), color, Base::_fillMode); - else + else #endif drawTriangleVertAlg(x, y, w, h, (orient == kTriangleDown), color, Base::_fillMode); break; @@ -445,6 +464,54 @@ drawTriangle(int x, int y, int w, int h, TriangleOrientation orient) { /******************************************************************** * Aliased Primitive drawing ALGORITHMS - VectorRendererSpec ********************************************************************/ +/** TAB ALGORITHM - NON AA */ +template<typename PixelType, typename PixelFormat> +void VectorRendererSpec<PixelType, PixelFormat>:: +drawTabAlg(int x1, int y1, int w, int h, int r, PixelType color, VectorRenderer::FillMode fill_m) { + int f, ddF_x, ddF_y; + int x, y, px, py; + int pitch = Base::surfacePitch(); + + PixelType *ptr_tl = (PixelType *)Base::_activeSurface->getBasePtr(x1 + r, y1 + r); + PixelType *ptr_tr = (PixelType *)Base::_activeSurface->getBasePtr(x1 + w - r, y1 + r); + PixelType *ptr_fill = (PixelType *)Base::_activeSurface->getBasePtr(x1, y1); + + int real_radius = r; + int short_h = h - (r) + 2; + int long_h = h; + + __BE_RESET(); + PixelType color1, color2; + + if (fill_m == kFillForeground || fill_m == kFillBackground) + color1 = color2 = color; + + while (x++ < y) { + __BE_ALGORITHM(); + + if (fill_m == kFillGradient) { + color1 = calcGradient(real_radius - x, long_h); + color2 = calcGradient(real_radius - y, long_h); + } + + colorFill(ptr_tl - x - py, ptr_tr + x - py, color2); + colorFill(ptr_tl - y - px, ptr_tr + y - px, color1); + + *(ptr_tr + (y) - (px)) = color; + *(ptr_tr + (x) - (py)) = color; + *(ptr_tl - (x) - (py)) = color; + *(ptr_tl - (y) - (px)) = color; + } + + ptr_fill += pitch * r; + while (short_h--) { + if (fill_m == kFillGradient) + color = calcGradient(real_radius++, long_h); + colorFill(ptr_fill, ptr_fill + w + 1, color); + ptr_fill += pitch; + } +} + /** SQUARE ALGORITHM **/ template<typename PixelType, typename PixelFormat> void VectorRendererSpec<PixelType, PixelFormat>:: diff --git a/graphics/VectorRenderer.h b/graphics/VectorRenderer.h index f1009ea2de..60cc20ac5a 100644 --- a/graphics/VectorRenderer.h +++ b/graphics/VectorRenderer.h @@ -192,6 +192,19 @@ public: * @param bevel Amount of bevel. Must be positive. */ virtual void drawBeveledSquare(int x, int y, int w, int h, int bevel) = 0; + + /** + * Draws a tab-like shape, specially thought for the Tab widget. + * If a radius is given, the tab will have rounded corners. Otherwise, + * the tab will be squared. + * + * @param x Horizontal (X) coordinate for the tab + * @param y Vertical (Y) coordinate for the tab + * @param w Width of the tab + * @param h Height of the tab + * @param r Radius of the corners of the tab (0 for squared tabs). + */ + virtual void drawTab(int x, int y, int r, int w, int h) = 0; /** * Gets the pixel pitch for the current drawing surface. @@ -460,6 +473,12 @@ public: stepGetPositions(step, area, x, y, w, h); drawBeveledSquare(x, y, w, h, step.extraData); } + + void drawCallback_TAB(const Common::Rect &area, const DrawStep &step) { + uint16 x, y, w, h; + stepGetPositions(step, area, x, y, w, h); + drawTab(x, y, stepGetRadius(step, area), w, h); + } void drawCallback_VOID(const Common::Rect &area, const DrawStep &step) {} @@ -553,6 +572,11 @@ public: * @see VectorRenderer::drawTriangle() */ void drawTriangle(int x, int y, int base, int height, TriangleOrientation orient); + + /** + * @see VectorRenderer::drawTab() + */ + void drawTab(int x, int y, int r, int w, int h); void drawBeveledSquare(int x, int y, int w, int h, int bevel) { drawBevelSquareAlg(x, y, w, h, bevel, _fgColor, _bgColor); @@ -739,6 +763,7 @@ protected: virtual void drawTriangleVertAlg(int x, int y, int w, int h, bool inverted, PixelType color, FillMode fill_m); virtual void drawTriangleFast(int x, int y, int size, bool inverted, PixelType color, FillMode fill_m); virtual void drawBevelSquareAlg(int x, int y, int w, int h, int bevel, PixelType top_color, PixelType bottom_color); + virtual void drawTabAlg(int x, int y, int w, int h, int r, PixelType color, VectorRenderer::FillMode fill_m); /** * SHADOW DRAWING ALGORITHMS diff --git a/gui/ThemeDefaultXML.cpp b/gui/ThemeDefaultXML.cpp index db01adb7c3..0561f4b8d1 100644 --- a/gui/ThemeDefaultXML.cpp +++ b/gui/ThemeDefaultXML.cpp @@ -61,6 +61,24 @@ bool ThemeRenderer::loadDefaultXML() { "<drawstep func = 'roundedsq' stroke = 1 radius = 4 fill = 'none' fg_color = '255, 255, 255' />" "</drawdata>" + "<drawdata id = 'tab_active' cache = false>" + "<text vertical_align = 'center' horizontal_align = 'center' color = '255, 255, 255' />" + "<drawstep func = 'tab' radius = '8' stroke = '0' fill = 'gradient' gradient_start = '206, 121, 99' gradient_end = '173, 40, 8' shadow = 3 />" + "</drawdata>" + + "<drawdata id = 'tab_inactive' cache = false>" + "<text vertical_align = 'center' horizontal_align = 'center' color = '255, 255, 255' />" + "<drawstep func = 'tab' radius = '8' stroke = '0' fill = 'foreground' fg_color = '206, 121, 99' shadow = 3 />" + "</drawdata>" + + "<drawdata id = 'slider_empty' cache = false>" + "<drawstep func = 'roundedsq' stroke = 1 radius = 8 fill = 'none' fg_color = '0, 0, 0' />" + "</drawdata>" + + "<drawdata id = 'slider_full' cache = false>" + "<drawstep func = 'roundedsq' stroke = 1 radius = 8 fill = 'gradient' fg_color = '0, 0, 0' gradient_start = '214, 113, 8' gradient_end = '240, 200, 25' />" + "</drawdata>" + "<drawdata id = 'popup_idle' cache = false>" "<drawstep func = 'square' stroke = 0 fg_color = '0, 0, 0' fill = 'gradient' gradient_start = '214, 113, 8' gradient_end = '240, 200, 25' shadow = 3 />" "<drawstep func = 'triangle' fg_color = '0, 0, 0' fill = 'foreground' width = '12' height = '12' xpos = '-16' ypos = 'center' orientation = 'bottom' />" diff --git a/gui/ThemeParser.cpp b/gui/ThemeParser.cpp index fda291fb04..014ed1fce9 100644 --- a/gui/ThemeParser.cpp +++ b/gui/ThemeParser.cpp @@ -57,6 +57,7 @@ ThemeParser::ThemeParser(ThemeRenderer *parent) : XMLParser() { _drawFunctions["line"] = &Graphics::VectorRenderer::drawCallback_LINE; _drawFunctions["triangle"] = &Graphics::VectorRenderer::drawCallback_TRIANGLE; _drawFunctions["fill"] = &Graphics::VectorRenderer::drawCallback_FILLSURFACE; + _drawFunctions["tab"] = &Graphics::VectorRenderer::drawCallback_TAB; _drawFunctions["void"] = &Graphics::VectorRenderer::drawCallback_VOID; _defaultStepGlobal = defaultDrawStep(); @@ -199,7 +200,7 @@ bool ThemeParser::parserCallback_text() { step.color.g = green; step.color.b = blue; step.color.set = true; - + _theme->addTextStep(parentNode->values["id"], step); return true; } @@ -407,7 +408,7 @@ bool ThemeParser::parseDrawStep(ParserNode *stepNode, Graphics::DrawStep *drawst assert(stepNode->values.contains("func")); Common::String functionName = stepNode->values["func"]; - if (functionName == "roundedsq" || functionName == "circle") { + if (functionName == "roundedsq" || functionName == "circle" || functionName == "tab") { if (stepNode->values.contains("radius") && stepNode->values["radius"] == "auto") { drawstep->radius = 0xFF; } else { diff --git a/gui/ThemeRenderer.cpp b/gui/ThemeRenderer.cpp index 0b3fbe1064..7995c34a40 100644 --- a/gui/ThemeRenderer.cpp +++ b/gui/ThemeRenderer.cpp @@ -60,7 +60,8 @@ const char *ThemeRenderer::kDrawDataStrings[] = { "checkbox_enabled", "checkbox_disabled", - "tab", + "tab_active", + "tab_inactive", "scrollbar_base", "scrollbar_handle", @@ -322,7 +323,6 @@ void ThemeRenderer::drawButton(const Common::Rect &r, const Common::String &str, drawDDText(dd, r, str); addDirtyRect(r); - debugWidgetPosition("BTN", r); } void ThemeRenderer::drawLineSeparator(const Common::Rect &r, WidgetStateInfo state) { @@ -331,8 +331,6 @@ void ThemeRenderer::drawLineSeparator(const Common::Rect &r, WidgetStateInfo sta drawDD(kDDSeparator, r); addDirtyRect(r); - - debugWidgetPosition("Separator", r); } void ThemeRenderer::drawCheckbox(const Common::Rect &r, const Common::String &str, bool checked, WidgetStateInfo state) { @@ -353,7 +351,6 @@ void ThemeRenderer::drawCheckbox(const Common::Rect &r, const Common::String &st drawDDText(checked ? kDDCheckboxEnabled : kDDCheckboxDisabled, r2, str); addDirtyRect(r); - debugWidgetPosition("Checkbox", r); } void ThemeRenderer::drawSlider(const Common::Rect &r, int width, WidgetStateInfo state) { @@ -368,7 +365,6 @@ void ThemeRenderer::drawSlider(const Common::Rect &r, int width, WidgetStateInfo drawDD(kDDSliderFull, r2); addDirtyRect(r); - debugWidgetPosition("Slider", r); } void ThemeRenderer::drawScrollbar(const Common::Rect &r, int sliderY, int sliderHeight, ScrollbarState sb_state, WidgetStateInfo state) { @@ -376,9 +372,9 @@ void ThemeRenderer::drawScrollbar(const Common::Rect &r, int sliderY, int slider return; drawDD(kDDScrollbarBase, r); + // TODO: Need to find a scrollbar in the GUI for testing... :p - - debugWidgetPosition("SCB", r); + addDirtyRect(r); } void ThemeRenderer::drawDialogBackground(const Common::Rect &r, uint16 hints, WidgetStateInfo state) { @@ -395,7 +391,7 @@ void ThemeRenderer::drawDialogBackground(const Common::Rect &r, uint16 hints, Wi drawDD(kDDDefaultBackground, r); } - debugWidgetPosition("Background", r); + addDirtyRect(r); } void ThemeRenderer::drawCaret(const Common::Rect &r, bool erase, WidgetStateInfo state) { @@ -403,6 +399,7 @@ 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) { @@ -418,7 +415,7 @@ void ThemeRenderer::drawPopUpWidget(const Common::Rect &r, const Common::String drawDDText(dd, text, sel); } - debugWidgetPosition("Popup Widget", r); + addDirtyRect(r); } void ThemeRenderer::drawSurface(const Common::Rect &r, const Graphics::Surface &surface, WidgetStateInfo state, int alpha, bool themeTrans) { @@ -450,14 +447,29 @@ void ThemeRenderer::drawWidgetBackground(const Common::Rect &r, uint16 hints, Wi break; } - debugWidgetPosition("Widget Background", r); + 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) { if (!ready()) return; + + const int tabOffset = 1; + + for (int i = 0; i < (int)tabs.size(); ++i) { + if (i == active) + continue; - debugWidgetPosition("Tab widget", r); + Common::Rect tabRect(r.left + i * (tabWidth + tabOffset), r.top, r.left + i * (tabWidth + tabOffset) + tabWidth, r.top + tabHeight); + drawDD(kDDTabInactive, tabRect); + drawDDText(kDDTabInactive, tabRect, tabs[i]); + } + + if (active >= 0) { + Common::Rect tabRect(r.left + active * (tabWidth + tabOffset), r.top, r.left + active * (tabWidth + tabOffset) + tabWidth, r.top + tabHeight); + drawDD(kDDTabActive, tabRect); + drawDDText(kDDTabActive, tabRect, tabs[active]); + } } void ThemeRenderer::drawText(const Common::Rect &r, const Common::String &str, WidgetStateInfo state, TextAlign align, bool inverted, int deltax, bool useEllipsis, FontStyle font) { @@ -470,11 +482,11 @@ void ThemeRenderer::drawText(const Common::Rect &r, const Common::String &str, W void ThemeRenderer::debugWidgetPosition(const char *name, const Common::Rect &r) { - // _font->drawString(_screen, name, r.left, r.top, r.width(), 0xFFFF, Graphics::kTextAlignRight, 0, true); - // _screen->hLine(r.left, r.top, r.right, 0xFFFF); - // _screen->hLine(r.left, r.bottom, r.right, 0xFFFF); - // _screen->vLine(r.left, r.top, r.bottom, 0xFFFF); - // _screen->vLine(r.right, r.top, r.bottom, 0xFFFF); + _font->drawString(_screen, name, r.left, r.top, r.width(), 0xFFFF, Graphics::kTextAlignRight, 0, true); + _screen->hLine(r.left, r.top, r.right, 0xFFFF); + _screen->hLine(r.left, r.bottom, r.right, 0xFFFF); + _screen->vLine(r.left, r.top, r.bottom, 0xFFFF); + _screen->vLine(r.right, r.top, r.bottom, 0xFFFF); } void ThemeRenderer::updateScreen() { diff --git a/gui/ThemeRenderer.h b/gui/ThemeRenderer.h index ba6cf633b0..3addda17a7 100644 --- a/gui/ThemeRenderer.h +++ b/gui/ThemeRenderer.h @@ -102,7 +102,8 @@ public: kDDCheckboxEnabled, kDDCheckboxDisabled, - kDDTab, + kDDTabActive, + kDDTabInactive, kDDScrollbarBase, kDDScrollbarHandle, |