diff options
| author | Simon Tatham <anakin@pobox.com> | 2010-05-29 15:43:46 +0000 |
|---|---|---|
| committer | Simon Tatham <anakin@pobox.com> | 2010-05-29 15:43:46 +0000 |
| commit | 9cd182ffa92e97609d562883a1c8e74949963ba0 (patch) | |
| tree | 43f35c00ac8d248209c3c40ebb9ac9d1a3e5e302 /drawing.c | |
| parent | ef6e78c6ac804a197cfc6002c5866885321626c5 (diff) | |
| download | puzzles-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.c | 28 |
1 files changed, 28 insertions, 0 deletions
@@ -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) { |