+ * This is a wrapper to ExtTextOut() to force Windows to display
+ * the precise glyphs we give it. Otherwise it would do its own
+ * bidi and Arabic shaping, and we would end up uncertain which
+ * characters it had put where.
+ */
+static void exact_textout(HDC hdc, int x, int y, CONST RECT *lprc,
+ unsigned short *lpString, UINT cbCount,
+ CONST INT *lpDx)
+{
+
+ GCP_RESULTSW gcpr;
+ char *buffer = snewn(cbCount*2+2, char);
+ char *classbuffer = snewn(cbCount, char);
+ memset(&gcpr, 0, sizeof(gcpr));
+ memset(buffer, 0, cbCount*2+2);
+ memset(classbuffer, GCPCLASS_NEUTRAL, cbCount);
+
+ gcpr.lStructSize = sizeof(gcpr);
+ gcpr.lpGlyphs = (void *)buffer;
+ gcpr.lpClass = classbuffer;
+ gcpr.nGlyphs = cbCount;
+
+ GetCharacterPlacementW(hdc, lpString, cbCount, 0, &gcpr,
+ FLI_MASK | GCP_CLASSIN);
+
+ ExtTextOut(hdc, x, y, ETO_GLYPH_INDEX | ETO_CLIPPED | ETO_OPAQUE, lprc,
+ buffer, cbCount, lpDx);
+}
+
+/*