aboutsummaryrefslogtreecommitdiff
path: root/drawing.c
diff options
context:
space:
mode:
authorSimon Tatham <anakin@pobox.com>2010-05-29 15:43:46 +0000
committerSimon Tatham <anakin@pobox.com>2010-05-29 15:43:46 +0000
commit9cd182ffa92e97609d562883a1c8e74949963ba0 (patch)
tree43f35c00ac8d248209c3c40ebb9ac9d1a3e5e302 /drawing.c
parentef6e78c6ac804a197cfc6002c5866885321626c5 (diff)
downloadpuzzles-9cd182ffa92e97609d562883a1c8e74949963ba0.zip
puzzles-9cd182ffa92e97609d562883a1c8e74949963ba0.tar.gz
puzzles-9cd182ffa92e97609d562883a1c8e74949963ba0.tar.bz2
puzzles-9cd182ffa92e97609d562883a1c8e74949963ba0.tar.xz
Patch from Mark Wooding to introduce a draw_thick_line() function in
the drawing API, for use by Loopy. It's optional: drawing.c will construct an acceptable alternative using a filled polygon if the front end doesn't provide it. Net and Netslide previously had static functions called draw_thick_line(), whose claim to the name is less justified and so they've been renamed. [originally from svn r8962]
Diffstat (limited to 'drawing.c')
-rw-r--r--drawing.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/drawing.c b/drawing.c
index 4cbb46d..7f4a6cf 100644
--- a/drawing.c
+++ b/drawing.c
@@ -87,6 +87,34 @@ void draw_line(drawing *dr, int x1, int y1, int x2, int y2, int colour)
dr->api->draw_line(dr->handle, x1, y1, x2, y2, colour);
}
+void draw_thick_line(drawing *dr, float thickness,
+ float x1, float y1, float x2, float y2, int colour)
+{
+ if (dr->api->draw_thick_line) {
+ dr->api->draw_thick_line(dr->handle, thickness,
+ x1, y1, x2, y2, colour);
+ } else {
+ /* We'll fake it up with a filled polygon. The tweak to the
+ * thickness empirically compensates for rounding errors, because
+ * polygon rendering uses integer coordinates.
+ */
+ float len = sqrt((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1));
+ float tvhatx = (x2 - x1)/len * (thickness/2 - 0.2);
+ float tvhaty = (y2 - y1)/len * (thickness/2 - 0.2);
+ int p[8];
+
+ p[0] = x1 - tvhaty;
+ p[1] = y1 + tvhatx;
+ p[2] = x2 - tvhaty;
+ p[3] = y2 + tvhatx;
+ p[4] = x2 + tvhaty;
+ p[5] = y2 - tvhatx;
+ p[6] = x1 + tvhaty;
+ p[7] = y1 - tvhatx;
+ dr->api->draw_polygon(dr->handle, p, 4, colour, colour);
+ }
+}
+
void draw_polygon(drawing *dr, int *coords, int npoints,
int fillcolour, int outlinecolour)
{