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 /graphics | |
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
Diffstat (limited to 'graphics')
-rw-r--r-- | graphics/VectorRenderer.cpp | 71 | ||||
-rw-r--r-- | graphics/VectorRenderer.h | 25 |
2 files changed, 94 insertions, 2 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 |