fontflag[0] = fontflag[1] = fontflag[2] = 1;
static void init_fonts(int pick_width){    TEXTMETRIC tm;    int i;    int fsize[8];    HDC hdc;    int fw_dontcare, fw_bold;    int firstchar = ' ';#ifdef CHECKOEMFONT  font_messup:#endif    for (i = 0; i < 8; i++)	fonts[i] = NULL;    if (cfg.fontisbold) {	fw_dontcare = FW_BOLD;	fw_bold = FW_HEAVY;    } else {	fw_dontcare = FW_DONTCARE;	fw_bold = FW_BOLD;    }    hdc = GetDC(hwnd);    font_height = cfg.fontheight;    if (font_height > 0) {	font_height =	    -MulDiv(font_height, GetDeviceCaps(hdc, LOGPIXELSY), 72);    }    font_width = pick_width;#define f(i,c,w,u) \    fonts[i] = CreateFont (font_height, font_width, 0, 0, w, FALSE, u, FALSE, \			   c, OUT_DEFAULT_PRECIS, \		           CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, \			   FIXED_PITCH | FF_DONTCARE, cfg.font)    if (cfg.vtmode != VT_OEMONLY) {	f(FONT_NORMAL, cfg.fontcharset, fw_dontcare, FALSE);	SelectObject(hdc, fonts[FONT_NORMAL]);	GetTextMetrics(hdc, &tm);	font_height = tm.tmHeight;	font_width = tm.tmAveCharWidth;	f(FONT_UNDERLINE, cfg.fontcharset, fw_dontcare, TRUE);	/*	 * Some fonts, e.g. 9-pt Courier, draw their underlines	 * outside their character cell. We successfully prevent	 * screen corruption by clipping the text output, but then	 * we lose the underline completely. Here we try to work	 * out whether this is such a font, and if it is, we set a	 * flag that causes underlines to be drawn by hand.	 *	 * Having tried other more sophisticated approaches (such	 * as examining the TEXTMETRIC structure or requesting the	 * height of a string), I think we'll do this the brute	 * force way: we create a small bitmap, draw an underlined	 * space on it, and test to see whether any pixels are	 * foreground-coloured. (Since we expect the underline to	 * go all the way across the character cell, we only search	 * down a single column of the bitmap, half way across.)	 */	{	    HDC und_dc;	    HBITMAP und_bm, und_oldbm;	    int i, gotit;	    COLORREF c;	    und_dc = CreateCompatibleDC(hdc);	    und_bm = CreateCompatibleBitmap(hdc, font_width, font_height);	    und_oldbm = SelectObject(und_dc, und_bm);	    SelectObject(und_dc, fonts[FONT_UNDERLINE]);	    SetTextAlign(und_dc, TA_TOP | TA_LEFT | TA_NOUPDATECP);	    SetTextColor(und_dc, RGB(255, 255, 255));	    SetBkColor(und_dc, RGB(0, 0, 0));	    SetBkMode(und_dc, OPAQUE);	    ExtTextOut(und_dc, 0, 0, ETO_OPAQUE, NULL, " ", 1, NULL);	    gotit = FALSE;	    for (i = 0; i < font_height; i++) {		c = GetPixel(und_dc, font_width / 2, i);		if (c != RGB(0, 0, 0))		    gotit = TRUE;	    }	    SelectObject(und_dc, und_oldbm);	    DeleteObject(und_bm);	    DeleteDC(und_dc);	    font_needs_hand_underlining = !gotit;	}	if (bold_mode == BOLD_FONT) {	    f(FONT_BOLD, cfg.fontcharset, fw_bold, FALSE);	    f(FONT_BOLDUND, cfg.fontcharset, fw_bold, TRUE);	}	if (cfg.vtmode == VT_OEMANSI) {	    f(FONT_OEM, OEM_CHARSET, fw_dontcare, FALSE);	    f(FONT_OEMUND, OEM_CHARSET, fw_dontcare, TRUE);	    if (bold_mode == BOLD_FONT) {		f(FONT_OEMBOLD, OEM_CHARSET, fw_bold, FALSE);		f(FONT_OEMBOLDUND, OEM_CHARSET, fw_bold, TRUE);	    }	}    } else {	f(FONT_OEM, cfg.fontcharset, fw_dontcare, FALSE);	SelectObject(hdc, fonts[FONT_OEM]);	GetTextMetrics(hdc, &tm);	font_height = tm.tmHeight;	font_width = tm.tmAveCharWidth;	f(FONT_OEMUND, cfg.fontcharset, fw_dontcare, TRUE);	if (bold_mode == BOLD_FONT) {	    f(FONT_BOLD, cfg.fontcharset, fw_bold, FALSE);	    f(FONT_BOLDUND, cfg.fontcharset, fw_bold, TRUE);	}    }#undef f    descent = tm.tmAscent + 1;    if (descent >= font_height)	descent = font_height - 1;    firstchar = tm.tmFirstChar;    for (i = 0; i < 8; i++) {	if (fonts[i]) {	    if (SelectObject(hdc, fonts[i]) && GetTextMetrics(hdc, &tm))		fsize[i] = tm.tmAveCharWidth + 256 * tm.tmHeight;	    else		fsize[i] = -i;	} else	    fsize[i] = -i;    }    ReleaseDC(hwnd, hdc);    /* ... This is wrong in OEM only mode */    if (fsize[FONT_UNDERLINE] != fsize[FONT_NORMAL] ||	(bold_mode == BOLD_FONT &&	 fsize[FONT_BOLDUND] != fsize[FONT_BOLD])) {	und_mode = UND_LINE;	DeleteObject(fonts[FONT_UNDERLINE]);	if (bold_mode == BOLD_FONT)	    DeleteObject(fonts[FONT_BOLDUND]);    }    if (bold_mode == BOLD_FONT && fsize[FONT_BOLD] != fsize[FONT_NORMAL]) {	bold_mode = BOLD_SHADOW;	DeleteObject(fonts[FONT_BOLD]);	if (und_mode == UND_FONT)	    DeleteObject(fonts[FONT_BOLDUND]);    }#ifdef CHECKOEMFONT    /* With the fascist font painting it doesn't matter if the linedraw font     * isn't exactly the right size anymore so we don't have to check this.     */    if (cfg.vtmode == VT_OEMANSI && fsize[FONT_OEM] != fsize[FONT_NORMAL]) {	if (cfg.fontcharset == OEM_CHARSET) {	    MessageBox(NULL, "The OEM and ANSI versions of this font are\n"		       "different sizes. Using OEM-only mode instead",		       "Font Size Mismatch", MB_ICONINFORMATION | MB_OK);	    cfg.vtmode = VT_OEMONLY;	} else if (firstchar < ' ') {	    MessageBox(NULL, "The OEM and ANSI versions of this font are\n"		       "different sizes. Using XTerm mode instead",		       "Font Size Mismatch", MB_ICONINFORMATION | MB_OK);	    cfg.vtmode = VT_XWINDOWS;	} else {	    MessageBox(NULL, "The OEM and ANSI versions of this font are\n"		       "different sizes. Using ISO8859-1 mode instead",		       "Font Size Mismatch", MB_ICONINFORMATION | MB_OK);	    cfg.vtmode = VT_POORMAN;	}	for (i = 0; i < 8; i++)	    if (fonts[i])		DeleteObject(fonts[i]);	goto font_messup;    }#endif}