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)
{
dr->api->end_draw(dr->handle);
}
+char *text_fallback(drawing *dr, const char *const *strings, int nstrings)
+{
+ int i;
+
+ /*
+ * If the drawing implementation provides one of these, use it.
+ */
+ if (dr && dr->api->text_fallback)
+ return dr->api->text_fallback(dr->handle, strings, nstrings);
+
+ /*
+ * Otherwise, do the simple thing and just pick the first string
+ * that fits in plain ASCII. It will then need no translation
+ * out of UTF-8.
+ */
+ for (i = 0; i < nstrings; i++) {
+ const char *p;
+
+ for (p = strings[i]; *p; p++)
+ if (*p & 0x80)
+ break;
+ if (!*p)
+ return dupstr(strings[i]);
+ }
+
+ /*
+ * The caller was responsible for making sure _some_ string in
+ * the list was in plain ASCII.
+ */
+ assert(!"Should never get here");
+ return NULL; /* placate optimiser */
+}
+
void status_bar(drawing *dr, char *text)
{
char *rewritten;