bool x86UNIXFont::create(const char *name, U32 size, U32 charset) { Display *display = XOpenDisplay(getenv("DISPLAY")); if (display == NULL) AssertFatal(false, "createFont: cannot connect to X server"); XftFont *font = loadFont(name, size, display); if (!font) { Con::errorf("Error: Could not load font -%s-", name); return false; } char xfontname[1024]; XftNameUnparse(font->pattern, xfontname, 1024); #ifdef DEBUG Con::printf("CreateFont: request for %s %d, using %s", name, size, xfontname); #endif // store some info about the font baseline = font->ascent; height = font->height; mFontName = StringTable->insert(xfontname); XftFontClose (display, font); // DISPLAY XCloseDisplay(display); return true; }
status ws_create_font(FontObj f, DisplayObj d) { XpceFontInfo xref; DisplayWsXref r = d->ws_ref; XftFont *xft = NULL; if ( !instanceOfObject(f->x_name, ClassCharArray) || !isstrA(&f->x_name->data) ) /* HACK */ { XftPattern *p = XftPatternCreate(); XftPattern *match; FcResult fcrc; int i; char *fam; int mono = FALSE; Real scale = getClassVariableValueObject(f, NAME_scale); double fscale = (scale ? valReal(scale) : 1.0); if ( f->family == NAME_screen ) { fam = "monospace"; mono = TRUE; } else fam = strName(f->family); XftPatternAddString(p, XFT_FAMILY, fam); XftPatternAddDouble(p, XFT_PIXEL_SIZE, (double)valInt(f->points)*fscale); if ( f->style == NAME_italic ) XftPatternAddInteger(p, XFT_SLANT, XFT_SLANT_ITALIC); else if ( f->style == NAME_roman ) XftPatternAddInteger(p, XFT_SLANT, XFT_SLANT_ROMAN); else if ( f->style == NAME_bold ) XftPatternAddInteger(p, XFT_WEIGHT, XFT_WEIGHT_BOLD); if ( mono ) { DEBUG(NAME_font, Cprintf("Asking for fixed\n")); XftPatternAddInteger(p, XFT_SPACING, XFT_MONO); } if ( !(match = XftFontMatch(r->display_xref, r->screen, p, &fcrc)) ) { DEBUG(NAME_font, Cprintf("XftFontMatch() failed. Calling replaceFont()\n")); return replaceFont(f, d); } #ifdef HAVE_XFTNAMEUNPARSE DEBUG(NAME_font, { char buf[1024]; XftNameUnparse(match, buf, sizeof(buf)); Cprintf("Match = '%s'\n", buf); });
XftFont *loadFont(const char *name, S32 size, Display *display) { XftFont *fontInfo = NULL; char* fontname = const_cast<char*>(name); if (dStrlen(fontname)==0) fontname = "arial"; else if (stristr(const_cast<char*>(name), "arial") != NULL) fontname = "arial"; else if (stristr(const_cast<char*>(name), "lucida console") != NULL) fontname = "lucida console"; char* weight = "medium"; char* slant = "roman"; // no slant if (stristr(const_cast<char*>(name), "bold") != NULL) weight = "bold"; if (stristr(const_cast<char*>(name), "italic") != NULL) slant = "italic"; int mSize = size - 2 - (int)((float)size * 0.1); char xfontName[512]; // We specify a lower DPI to get 'correct' looking fonts, if we go with the // native DPI the fonts are to big and don't fit the widgets. dSprintf(xfontName, 512, "%s-%d:%s:slant=%s:dpi=76", fontname, mSize, weight, slant); // Lets see if Xft can get a font for us. char xftname[1024]; fontInfo = XftFontOpenName(display, DefaultScreen(display), xfontName); // Cant find a suitabke font, default to a known font (6x10) if ( !fontInfo ) { dSprintf(xfontName, 512, "6x10-%d:%s:slant=%s:dpi=76", mSize, weight, slant); fontInfo = XftFontOpenName(display, DefaultScreen(display), xfontName); } XftNameUnparse(fontInfo->pattern, xftname, 1024); #ifdef DEBUG Con::printf("Font '%s %d' mapped to '%s'\n", name, size, xftname); #endif return fontInfo; }