for (i = 0; i <= len; i++) gwcs[i] = wcs[i]; gdk_draw_text_wc(inst->pixmap, inst->fonts[fontid], gc, x*inst->font_width+inst->cfg.window_border, y*inst->font_height+inst->cfg.window_border+inst->fonts[0]->ascent, gwcs, len*2); if (shadow)
for (combining = 0; combining < ncombining; combining++) { for (i = 0; i <= len; i++) gwcs[i] = wcs[i + combining];
void do_text_internal(Context ctx, int x, int y, wchar_t *text, int len,		      unsigned long attr, int lattr){    struct draw_ctx *dctx = (struct draw_ctx *)ctx;    struct gui_data *inst = dctx->inst;    GdkGC *gc = dctx->gc;    int nfg, nbg, t, fontid, shadow, rlen, widefactor;    nfg = ((attr & ATTR_FGMASK) >> ATTR_FGSHIFT);    nfg = 2 * (nfg & 0xF) + (nfg & 0x10 ? 1 : 0);    nbg = ((attr & ATTR_BGMASK) >> ATTR_BGSHIFT);    nbg = 2 * (nbg & 0xF) + (nbg & 0x10 ? 1 : 0);    if (attr & ATTR_REVERSE) {	t = nfg;	nfg = nbg;	nbg = t;    }    if (inst->cfg.bold_colour && (attr & ATTR_BOLD))	nfg |= 1;    if (inst->cfg.bold_colour && (attr & ATTR_BLINK))	nbg |= 1;    if (attr & TATTR_ACTCURS) {	nfg = NCOLOURS-2;	nbg = NCOLOURS-1;    }    fontid = shadow = 0;    if (attr & ATTR_WIDE) {	widefactor = 2;	fontid |= 2;    } else {	widefactor = 1;    }    if ((attr & ATTR_BOLD) && !inst->cfg.bold_colour) {	if (inst->fonts[fontid | 1])	    fontid |= 1;	else	    shadow = 1;    }    if ((lattr & LATTR_MODE) != LATTR_NORM) {	x *= 2;	if (x >= inst->term->cols)	    return;	if (x + len*2*widefactor > inst->term->cols)	    len = (inst->term->cols-x)/2/widefactor;/* trim to LH half */	rlen = len * 2;    } else	rlen = len;    {	GdkRectangle r;	r.x = x*inst->font_width+inst->cfg.window_border;	r.y = y*inst->font_height+inst->cfg.window_border;	r.width = rlen*widefactor*inst->font_width;	r.height = inst->font_height;	gdk_gc_set_clip_rectangle(gc, &r);    }    gdk_gc_set_foreground(gc, &inst->cols[nbg]);    gdk_draw_rectangle(inst->pixmap, gc, 1,		       x*inst->font_width+inst->cfg.window_border,		       y*inst->font_height+inst->cfg.window_border,		       rlen*widefactor*inst->font_width, inst->font_height);    gdk_gc_set_foreground(gc, &inst->cols[nfg]);    {	GdkWChar *gwcs;	gchar *gcs;	wchar_t *wcs;	int i;	wcs = snewn(len+1, wchar_t);	for (i = 0; i < len; i++) {	    wcs[i] = text[i];	}	if (inst->fonts[fontid] == NULL) {	    /*	     * The font for this contingency does not exist.	     * Typically this means we've been given ATTR_WIDE	     * character and have no wide font. So we display	     * nothing at all; such is life.	     */	} else if (inst->fontinfo[fontid].is_wide) {	    /*	     * At least one version of gdk_draw_text_wc() has a	     * weird bug whereby it reads `len' elements of the	     * input string, but only draws `len/2'. Hence I'm	     * going to make its input array twice as long as it	     * theoretically needs to be, and pass in twice the	     * actual number of characters. If a fixed gdk actually	     * takes the doubled length seriously, then (a) the	     * array will stand scrutiny up to the full length, (b)	     * the spare elements of the array are full of zeroes	     * which will probably be an empty glyph in the font,	     * and (c) the clip rectangle should prevent it causing	     * trouble anyway.	     */	    gwcs = snewn(len*2+1, GdkWChar);	    memset(gwcs, 0, sizeof(GdkWChar) * (len*2+1));	    /*	     * FIXME: when we have a wide-char equivalent of	     * from_unicode, use it instead of this.	     */	    for (i = 0; i <= len; i++)		gwcs[i] = wcs[i];	    gdk_draw_text_wc(inst->pixmap, inst->fonts[fontid], gc,			     x*inst->font_width+inst->cfg.window_border,			     y*inst->font_height+inst->cfg.window_border+inst->fonts[0]->ascent,			     gwcs, len*2);	    if (shadow)		gdk_draw_text_wc(inst->pixmap, inst->fonts[fontid], gc,				 x*inst->font_width+inst->cfg.window_border+inst->cfg.shadowboldoffset,				 y*inst->font_height+inst->cfg.window_border+inst->fonts[0]->ascent,				 gwcs, len*2);	    sfree(gwcs);	} else {	    gcs = snewn(len+1, gchar);	    wc_to_mb(inst->fontinfo[fontid].charset, 0,		     wcs, len, gcs, len, ".", NULL, NULL);	    gdk_draw_text(inst->pixmap, inst->fonts[fontid], gc,			  x*inst->font_width+inst->cfg.window_border,			  y*inst->font_height+inst->cfg.window_border+inst->fonts[0]->ascent,			  gcs, len);	    if (shadow)		gdk_draw_text(inst->pixmap, inst->fonts[fontid], gc,			      x*inst->font_width+inst->cfg.window_border+inst->cfg.shadowboldoffset,			      y*inst->font_height+inst->cfg.window_border+inst->fonts[0]->ascent,			      gcs, len);	    sfree(gcs);	}	sfree(wcs);    }    if (attr & ATTR_UNDER) {	int uheight = inst->fonts[0]->ascent + 1;	if (uheight >= inst->font_height)	    uheight = inst->font_height - 1;	gdk_draw_line(inst->pixmap, gc, x*inst->font_width+inst->cfg.window_border,		      y*inst->font_height + uheight + inst->cfg.window_border,		      (x+len)*widefactor*inst->font_width-1+inst->cfg.window_border,		      y*inst->font_height + uheight + inst->cfg.window_border);    }    if ((lattr & LATTR_MODE) != LATTR_NORM) {	/*	 * I can't find any plausible StretchBlt equivalent in the	 * X server, so I'm going to do this the slow and painful	 * way. This will involve repeated calls to	 * gdk_draw_pixmap() to stretch the text horizontally. It's	 * O(N^2) in time and O(N) in network bandwidth, but you	 * try thinking of a better way. :-(	 */	int i;	for (i = 0; i < len * widefactor * inst->font_width; i++) {	    gdk_draw_pixmap(inst->pixmap, gc, inst->pixmap,			    x*inst->font_width+inst->cfg.window_border + 2*i,			    y*inst->font_height+inst->cfg.window_border,			    x*inst->font_width+inst->cfg.window_border + 2*i+1,			    y*inst->font_height+inst->cfg.window_border,			    len * inst->font_width - i, inst->font_height);	}	len *= 2;	if ((lattr & LATTR_MODE) != LATTR_WIDE) {	    int dt, db;	    /* Now stretch vertically, in the same way. */	    if ((lattr & LATTR_MODE) == LATTR_BOT)		dt = 0, db = 1;	    else		dt = 1, db = 0;	    for (i = 0; i < inst->font_height; i+=2) {		gdk_draw_pixmap(inst->pixmap, gc, inst->pixmap,				x*inst->font_width+inst->cfg.window_border,				y*inst->font_height+inst->cfg.window_border+dt*i+db,				x*widefactor*inst->font_width+inst->cfg.window_border,				y*inst->font_height+inst->cfg.window_border+dt*(i+1),				len * inst->font_width, inst->font_height-i-1);	    }	}    }}