diff options
-rw-r--r-- | graphics/VectorRenderer.cpp | 4 | ||||
-rw-r--r-- | graphics/VectorRenderer.h | 91 | ||||
-rw-r--r-- | gui/InterfaceManager.cpp | 22 |
3 files changed, 93 insertions, 24 deletions
diff --git a/graphics/VectorRenderer.cpp b/graphics/VectorRenderer.cpp index 109ae24f03..2c50ddd0ec 100644 --- a/graphics/VectorRenderer.cpp +++ b/graphics/VectorRenderer.cpp @@ -54,7 +54,7 @@ VectorRenderer *createRenderer(int mode) { void VectorRenderer::drawStep(Common::Rect area, DrawStep *step) { if (step->flags & DrawStep::kStepCallbackOnly) { - (this->*(step->drawing_call))(&area, step->extra_data); + (this->*(step->drawing_call))(&area, step); return; } @@ -83,7 +83,7 @@ void VectorRenderer::drawStep(Common::Rect area, DrawStep *step) { if (step->flags & DrawStep::kStepSettingsOnly) return; - (this->*(step->drawing_call))(&area, step->extra_data); + (this->*(step->drawing_call))(&area, step); } /******************************************************************** diff --git a/graphics/VectorRenderer.h b/graphics/VectorRenderer.h index 9958714df6..3a2d98a376 100644 --- a/graphics/VectorRenderer.h +++ b/graphics/VectorRenderer.h @@ -47,12 +47,24 @@ struct DrawStep { color1, /** Foreground color/gradient start */ color2; /** Background color/gradient end */ - uint8 shadow, stroke, factor; /** Misc options... */ + bool fill_area; /** If enabled, the draw step occupies the whole drawing area */ - int fill_mode; /** active fill mode */ - int extra_data; /** Generic parameter for extra options (radius/orientation/bevel) */ + struct { + uint16 pos; + bool relative; + } x, y; /** Horizontal and vertical coordinates. Relative specifies if they are + measured from the opposite direction of the drawing area */ - void (VectorRenderer::*drawing_call)(Common::Rect*, int); /** Pointer to drawing function */ + uint16 w, h; /** width and height */ + + uint8 shadow, stroke, factor, radius; /** Misc options... */ + + uint8 fill_mode; /** active fill mode */ + uint8 extra_data; /** Generic parameter for extra options (orientation/bevel) */ + + uint32 scale; /** scale of all the coordinates in FIXED POINT with 16 bits mantissa */ + + void (VectorRenderer::*drawing_call)(Common::Rect*, DrawStep*); /** Pointer to drawing function */ enum DrawStepFlags { kStepCallbackOnly = (1 << 0), @@ -65,6 +77,38 @@ struct DrawStep { kStepSetStroke = (1 << 7), kStepSetFillMode = (1 << 8) }; + + void getPositions(Common::Rect *area, uint16 &in_x, uint16 &in_y, uint16 &in_w, uint16 &in_h) { + if (fill_area) { + in_x = area->left; + in_y = area->top; + in_w = area->width(); + in_h = area->height(); + } else { + if (!x.relative) in_x = area->left + x.pos; + else in_x = area->left + area->width() - x.pos; + + if (!y.relative) in_y = area->top + y.pos; + else in_y = area->top + area->height() - y.pos; + + if (in_x + w > area->right) in_w = area->right - in_x; + else in_w = w; + + if (in_y + h > area->bottom) in_h = area->bottom - in_y; + else in_h = h; + } + + if (scale != (1 << 16) && scale != 0) { + in_x = (in_x * scale) >> 16; + in_y = (in_y * scale) >> 16; + in_w = (in_w * scale) >> 16; + in_h = (in_h * scale) >> 16; + } + } + + uint8 getRadius() { + return (((uint32)radius * scale) >> 16); + } }; VectorRenderer *createRenderer(int mode); @@ -319,32 +363,45 @@ public: /** * DrawStep callback functions for each drawing feature */ - void drawCallback_CIRCLE(Common::Rect *area, int data) { - drawCircle(area->left + data, area->top + data, data); + void drawCallback_CIRCLE(Common::Rect *area, DrawStep *step) { + uint16 x, y, w, h; + step->getPositions(area, x, y, w, h); + drawCircle(x, y, step->getRadius()); } - void drawCallback_SQUARE(Common::Rect *area, int data) { - drawSquare(area->left, area->top, area->width(), area->height()); + void drawCallback_SQUARE(Common::Rect *area, DrawStep *step) { + uint16 x, y, w, h; + step->getPositions(area, x, y, w, h); + drawSquare(x, y, w, h); } - void drawCallback_LINE(Common::Rect *area, int data) { - drawLine(area->left, area->top, area->right, area->bottom); + void drawCallback_LINE(Common::Rect *area, DrawStep *step) { + uint16 x, y, w, h; + step->getPositions(area, x, y, w, h); + drawLine(x, y, x + w, y + w); } - void drawCallback_ROUNDSQ(Common::Rect *area, int data) { - drawRoundedSquare(area->left, area->top, data, area->width(), area->height()); + void drawCallback_ROUNDSQ(Common::Rect *area, DrawStep *step) { + uint16 x, y, w, h; + step->getPositions(area, x, y, w, h); + /* HACK! Radius of the rounded squares isn't scaled */ + drawRoundedSquare(x, y, step->radius, w, h); } - void drawCallback_FILLSURFACE(Common::Rect *area, int data) { + void drawCallback_FILLSURFACE(Common::Rect *area, DrawStep *step) { fillSurface(); } - void drawCallback_TRIANGLE(Common::Rect *area, int data) { - drawTriangle(area->top, area->left, area->width(), area->height(), (TriangleOrientation)data); + void drawCallback_TRIANGLE(Common::Rect *area, DrawStep *step) { + uint16 x, y, w, h; + step->getPositions(area, x, y, w, h); + drawTriangle(x, y, w, h, (TriangleOrientation)step->extra_data); } - void drawCallback_BEVELSQ(Common::Rect *area, int data) { - drawBeveledSquare(area->left, area->top, area->width(), area->height(), data); + void drawCallback_BEVELSQ(Common::Rect *area, DrawStep *step) { + uint16 x, y, w, h; + step->getPositions(area, x, y, w, h); + drawBeveledSquare(x, y, w, h, step->extra_data); } /** diff --git a/gui/InterfaceManager.cpp b/gui/InterfaceManager.cpp index ef7fa31a46..613a445fa3 100644 --- a/gui/InterfaceManager.cpp +++ b/gui/InterfaceManager.cpp @@ -103,23 +103,35 @@ int InterfaceManager::runGUI() { steps[1].color2.r = 173; steps[1].color2.g = 40; steps[1].color2.b = 8; - steps[1].extra_data = 8; // radius + steps[1].radius = 8; // radius + steps[1].fill_area = true; steps[1].drawing_call = &VectorRenderer::drawCallback_ROUNDSQ; steps[1].flags = DrawStep::kStepSetGradient; - - steps[2].extra_data = 8; // radius + steps[1].scale = (1 << 16); + + steps[2].radius = 8; // radius + steps[2].fill_area = false; + steps[2].x.relative = true; + steps[2].x.pos = 32; + steps[2].y.relative = false; + steps[2].y.pos = 32; + steps[2].w = 128; + steps[2].h = 32; steps[2].drawing_call = &VectorRenderer::drawCallback_ROUNDSQ; steps[2].flags = DrawStep::kStepCallbackOnly; + steps[2].scale = (1 << 16); steps[3].drawing_call = &VectorRenderer::drawCallback_ROUNDSQ; steps[3].flags = DrawStep::kStepCallbackOnly; + Common::Rect area = Common::Rect(32, 32, 256, 256); + bool running = true; while (running) { // draw!! _vectorRenderer->drawStep(Common::Rect(), &steps[0]); - _vectorRenderer->drawStep(Common::Rect(32, 32, 256, 256), &steps[1]); - _vectorRenderer->drawStep(Common::Rect(128, 128, 512, 190), &steps[2]); + _vectorRenderer->drawStep(area, &steps[1]); + _vectorRenderer->drawStep(area, &steps[2]); // _vectorRenderer->drawStep(Common::Rect(32, 32, 256, 256), &steps[3]); _vectorRenderer->copyFrame(_system); |