for(i=0; i<len; i++) IpDx[i] = font_width; }  x *= font_width;
for(i=0; i<IpDxLEN; i++) IpDx[i] = fnt_width; }  x *= fnt_width;
void do_text (Context ctx, int x, int y, char *text, int len,	      unsigned long attr) {    int lattr = 0;	/* Will be arg later for line attribute type */    COLORREF fg, bg, t;    int nfg, nbg, nfont;    HDC hdc = ctx;    RECT line_box;    int force_manual_underline = 0;static int *IpDx = 0, IpDxLEN = 0;;    if (len>IpDxLEN || IpDx[0] != font_width*(1+!lattr)) {	int i;	if (len>IpDxLEN) {	    sfree(IpDx);	    IpDx = smalloc((len+16)*sizeof(int));	    IpDxLEN = (len+16);	}	for(i=0; i<len; i++)	    IpDx[i] = font_width;    }    x *= font_width;    y *= font_height;    if (lattr) x *= 2;    if (attr & ATTR_ACTCURS) {	attr &= (bold_mode == BOLD_COLOURS ? 0x200 : 0x300);	attr ^= ATTR_CUR_XOR;    }    nfont = 0;    if (cfg.vtmode == VT_OEMONLY)	nfont |= FONT_OEM;    /*     * Map high-half characters in order to approximate ISO using     * OEM character set. No characters are missing if the OEM codepage     * is CP850.     */    if (nfont & FONT_OEM) {	int i;	for (i=0; i<len; i++)	    if (text[i] >= '\xA0' && text[i] <= '\xFF') {#if 0		/* This is CP850 ... perfect translation */		static const char oemhighhalf[] =		    "\x20\xAD\xBD\x9C\xCF\xBE\xDD\xF5" /* A0-A7 */		    "\xF9\xB8\xA6\xAE\xAA\xF0\xA9\xEE" /* A8-AF */		    "\xF8\xF1\xFD\xFC\xEF\xE6\xF4\xFA" /* B0-B7 */		    "\xF7\xFB\xA7\xAF\xAC\xAB\xF3\xA8" /* B8-BF */		    "\xB7\xB5\xB6\xC7\x8E\x8F\x92\x80" /* C0-C7 */		    "\xD4\x90\xD2\xD3\xDE\xD6\xD7\xD8" /* C8-CF */		    "\xD1\xA5\xE3\xE0\xE2\xE5\x99\x9E" /* D0-D7 */		    "\x9D\xEB\xE9\xEA\x9A\xED\xE8\xE1" /* D8-DF */		    "\x85\xA0\x83\xC6\x84\x86\x91\x87" /* E0-E7 */		    "\x8A\x82\x88\x89\x8D\xA1\x8C\x8B" /* E8-EF */		    "\xD0\xA4\x95\xA2\x93\xE4\x94\xF6" /* F0-F7 */		    "\x9B\x97\xA3\x96\x81\xEC\xE7\x98" /* F8-FF */		    ;#endif		/* This is CP437 ... junk translation */		static const unsigned char oemhighhalf[] = {		    0xff, 0xad, 0x9b, 0x9c, 0x6f, 0x9d, 0x7c, 0x15,		    0x22, 0x43, 0xa6, 0xae, 0xaa, 0x2d, 0x52, 0xc4,		    0xf8, 0xf1, 0xfd, 0x33, 0x27, 0xe6, 0x14, 0xfa,		    0x2c, 0x31, 0xa7, 0xaf, 0xac, 0xab, 0x2f, 0xa8,		    0x41, 0x41, 0x41, 0x41, 0x8e, 0x8f, 0x92, 0x80,		    0x45, 0x90, 0x45, 0x45, 0x49, 0x49, 0x49, 0x49,		    0x44, 0xa5, 0x4f, 0x4f, 0x4f, 0x4f, 0x99, 0x78,		    0xed, 0x55, 0x55, 0x55, 0x9a, 0x59, 0x50, 0xe1,		    0x85, 0xa0, 0x83, 0x61, 0x84, 0x86, 0x91, 0x87,		    0x8a, 0x82, 0x88, 0x89, 0x8d, 0xa1, 0x8c, 0x8b,		    0x0b, 0xa4, 0x95, 0xa2, 0x93, 0x6f, 0x94, 0xf6,		    0xed, 0x97, 0xa3, 0x96, 0x81, 0x79, 0x70, 0x98		};		text[i] = oemhighhalf[(unsigned char)text[i] - 0xA0];	    }    }    if (attr & ATTR_GBCHR) {	int i;	/*	 * GB mapping: map # to pound, and everything else stays	 * normal.	 */	for (i=0; i<len; i++)	    if (text[i] == '#')		text[i] = cfg.vtmode == VT_OEMONLY ? '\x9C' : '\xA3';    } else if (attr & ATTR_LINEDRW) {	int i;	/* ISO 8859-1 */	static const char poorman[] =	    "*#****\xB0\xB1**+++++-----++++|****\xA3\xB7";	/* CP437 */	static const char oemmap_437[] =	    "\x04\xB1****\xF8\xF1**\xD9\xBF\xDA\xC0\xC5"	    "\xC4\xC4\xC4\xC4\xC4\xC3\xB4\xC1\xC2\xB3\xF3\xF2\xE3*\x9C\xFA";	/* CP850 */	static const char oemmap_850[] =	    "\x04\xB1****\xF8\xF1**\xD9\xBF\xDA\xC0\xC5"	    "\xC4\xC4\xC4\xC4\xC4\xC3\xB4\xC1\xC2\xB3****\x9C\xFA";	/* Poor windows font ... eg: windows courier */	static const char oemmap[] =	    "*\xB1****\xF8\xF1**\xD9\xBF\xDA\xC0\xC5"	    "\xC4\xC4\xC4\xC4\xC4\xC3\xB4\xC1\xC2\xB3****\x9C\xFA";	/*	 * Line drawing mapping: map ` thru ~ (0x60 thru 0x7E) to	 * VT100 line drawing chars; everything else stays normal.	 */	switch (cfg.vtmode) {	  case VT_XWINDOWS:	    for (i=0; i<len; i++)		if (text[i] >= '\x60' && text[i] <= '\x7E')		    text[i] += '\x01' - '\x60';	    break;	  case VT_OEMANSI:	    /* Make sure we actually have an OEM font */	    if (fonts[nfont|FONT_OEM]) { 	  case VT_OEMONLY:	        nfont |= FONT_OEM;	        for (i=0; i<len; i++)		    if (text[i] >= '\x60' && text[i] <= '\x7E')		        text[i] = oemmap[(unsigned char)text[i] - 0x60];	        break;	    }	  case VT_POORMAN:	    for (i=0; i<len; i++)		if (text[i] >= '\x60' && text[i] <= '\x7E')		    text[i] = poorman[(unsigned char)text[i] - 0x60];	    break;	}    }    nfg = 2 * ((attr & ATTR_FGMASK) >> ATTR_FGSHIFT);    nbg = 2 * ((attr & ATTR_BGMASK) >> ATTR_BGSHIFT);    if (bold_mode == BOLD_FONT && (attr & ATTR_BOLD))	nfont |= FONT_BOLD;    if (und_mode == UND_FONT && (attr & ATTR_UNDER))	nfont |= FONT_UNDERLINE;    if (!fonts[nfont])     {	if (nfont&FONT_UNDERLINE)	    force_manual_underline = 1;	/* Don't do the same for manual bold, it could be bad news. */	nfont &= ~(FONT_BOLD|FONT_UNDERLINE);    }    if (attr & ATTR_REVERSE) {	t = nfg; nfg = nbg; nbg = t;    }    if (bold_mode == BOLD_COLOURS && (attr & ATTR_BOLD))	nfg++;    if (bold_mode == BOLD_COLOURS && (attr & ATTR_BLINK))	nbg++;    fg = colours[nfg];    bg = colours[nbg];    SelectObject (hdc, fonts[nfont]);    SetTextColor (hdc, fg);    SetBkColor (hdc, bg);    SetBkMode (hdc, OPAQUE);    line_box.left   = x;    line_box.top    = y;    line_box.right  = x+font_width*len;    line_box.bottom = y+font_height;    ExtTextOut (hdc, x, y, ETO_CLIPPED|ETO_OPAQUE, &line_box, text, len, IpDx);    if (bold_mode == BOLD_SHADOW && (attr & ATTR_BOLD)) {	SetBkMode (hdc, TRANSPARENT);       /* GRR: This draws the character outside it's box and can leave	* 'droppings' even with the clip box! I suppose I could loop it	* one character at a time ... yuk. */        ExtTextOut (hdc, x-1, y, ETO_CLIPPED, &line_box, text, len, IpDx);    }    if (force_manual_underline || 	    (und_mode == UND_LINE && (attr & ATTR_UNDER))) {        HPEN oldpen;	oldpen = SelectObject (hdc, CreatePen(PS_SOLID, 0, fg));	MoveToEx (hdc, x, y+descent, NULL);	LineTo (hdc, x+len*font_width, y+descent);        oldpen = SelectObject (hdc, oldpen);        DeleteObject (oldpen);    }    if (attr & ATTR_PASCURS) {	POINT pts[5];        HPEN oldpen;	pts[0].x = pts[1].x = pts[4].x = x;	pts[2].x = pts[3].x = x+font_width-1;	pts[0].y = pts[3].y = pts[4].y = y;	pts[1].y = pts[2].y = y+font_height-1;	oldpen = SelectObject (hdc, CreatePen(PS_SOLID, 0, colours[23]));	Polyline (hdc, pts, 5);        oldpen = SelectObject (hdc, oldpen);        DeleteObject (oldpen);    }}