diff options
Diffstat (limited to 'graphics')
-rw-r--r-- | graphics/primitives.cpp | 55 | ||||
-rw-r--r-- | graphics/primitives.h | 1 |
2 files changed, 56 insertions, 0 deletions
diff --git a/graphics/primitives.cpp b/graphics/primitives.cpp index 9fdcb13b7b..85a0383ea9 100644 --- a/graphics/primitives.cpp +++ b/graphics/primitives.cpp @@ -64,4 +64,59 @@ void drawLine(int x0, int y0, int x1, int y1, int color, void (*plotProc)(int, i } } + +// FIXME: This is a limited version of thick line drawing +// it draws striped lines at some angles. Better algorithm could +// be found here: +// +// http://homepages.enterprise.net/murphy/thickline/index.html +// +// Feel free to replace it with better implementation +void drawThickLine(int x0, int y0, int x1, int y1, int thickness, int color, void (*plotProc)(int, int, int, void *), void *data) { + const bool steep = ABS(y1 - y0) > ABS(x1 - x0); + + if (steep) { + SWAP(x0, y0); + SWAP(x1, y1); + } + + float dx = x1 - x0; + float dy = y1 - y0; + float d = sqrtf(dx * dx + dy * dy); + + if (!d) + return; + + int thickX = (int)((float)thickness * dy / d / 2); + int thickY = (int)((float)thickness * dx / d / 2); + + const int delta_x = ABS(x1 - x0); + const int delta_y = ABS(y1 - y0); + const int delta_err = delta_y; + int x = x0; + int y = y0; + int err = 0; + + const int x_step = (x0 < x1) ? 1 : -1; + const int y_step = (y0 < y1) ? 1 : -1; + + if (steep) + drawLine(y - thickY, x + thickX, y + thickY, x - thickX, color, plotProc, data); + else + drawLine(x - thickX, y + thickY, x + thickX, y - thickY, color, plotProc, data); + + while (x != x1) { + x += x_step; + err += delta_err; + if (2 * err > delta_x) { + y += y_step; + err -= delta_x; + } + if (steep) + drawLine(y - thickY, x + thickX, y + thickY, x - thickX, color, plotProc, data); + else + drawLine(x - thickX, y + thickY, x + thickX, y - thickY, color, plotProc, data); + } +} + } // End of namespace Graphics diff --git a/graphics/primitives.h b/graphics/primitives.h index 2bc44d6644..0c96c1545a 100644 --- a/graphics/primitives.h +++ b/graphics/primitives.h @@ -28,6 +28,7 @@ namespace Graphics { void drawLine(int x0, int y0, int x1, int y1, int color, void (*plotProc)(int, int, int, void *), void *data); +void drawThickLine(int x0, int y0, int x1, int y1, int thickness, int color, void (*plotProc)(int, int, int, void *), void *data); } // End of namespace Graphics |