static void GetTkFontAttributes( XftFont *ftFont, TkFontAttributes *faPtr) { const char *family = "Unknown"; const char *const *familyPtr = &family; int weight, slant, size, pxsize; double ptsize; (void) XftPatternGetString(ftFont->pattern, XFT_FAMILY, 0, familyPtr); if (XftPatternGetDouble(ftFont->pattern, XFT_SIZE, 0, &ptsize) == XftResultMatch) { size = (int) ptsize; } else if (XftPatternGetInteger(ftFont->pattern, XFT_PIXEL_SIZE, 0, &pxsize) == XftResultMatch) { size = -pxsize; } else { size = 12; } if (XftPatternGetInteger(ftFont->pattern, XFT_WEIGHT, 0, &weight) != XftResultMatch) { weight = XFT_WEIGHT_MEDIUM; } if (XftPatternGetInteger(ftFont->pattern, XFT_SLANT, 0, &slant) != XftResultMatch) { slant = XFT_SLANT_ROMAN; } #if DEBUG_FONTSEL printf("family %s size %d weight %d slant %d\n", family, size, weight, slant); #endif /* DEBUG_FONTSEL */ faPtr->family = Tk_GetUid(family); faPtr->size = size; faPtr->weight = (weight > XFT_WEIGHT_MEDIUM) ? TK_FW_BOLD : TK_FW_NORMAL; faPtr->slant = (slant > XFT_SLANT_ROMAN) ? TK_FS_ITALIC : TK_FS_ROMAN; faPtr->underline = 0; faPtr->overstrike = 0; }
static void GetTkFontMetrics( XftFont *ftFont, TkFontMetrics *fmPtr) { int spacing; if (XftPatternGetInteger(ftFont->pattern, XFT_SPACING, 0, &spacing) != XftResultMatch) { spacing = XFT_PROPORTIONAL; } fmPtr->ascent = ftFont->ascent; fmPtr->descent = ftFont->descent; fmPtr->maxWidth = ftFont->max_advance_width; fmPtr->fixed = spacing != XFT_PROPORTIONAL; }
void nr_type_xft_build_def (NRTypeFaceDefFT2 *dft2, const gchar *name, const gchar *family) { XftPattern *pat; pat = (XftPattern *)g_hash_table_lookup (NRXftNamedict, name); if (pat) { char *file; int index; XftPatternGetString (pat, XFT_FILE, 0, &file); XftPatternGetInteger (pat, XFT_INDEX, 0, &index); if (file) { nr_type_ft2_build_def (dft2, name, family, file, index); } } }
JFontStyle JXFontManager::GetFontStyles ( const JCharacter* name, const JSize size ) const { JFontStyle style(kJFalse, kJFalse, 0, kJTrue); #ifdef _J_USE_XFT double raw_size = size; XftFontSet* fs = XftListFonts(*itsDisplay, DefaultScreen((Display*)*itsDisplay), XFT_FAMILY, XftTypeString, name, XFT_SIZE, XftTypeDouble, raw_size, 0, XFT_SLANT, XFT_WEIGHT, 0); if (fs->nfont == 0) { return style; } for (int i=0; i<fs->nfont; i++) { int raw_slant; if (XftPatternGetInteger(fs->fonts[i], XFT_SLANT, 0, &raw_slant) == XftResultMatch) { if (raw_slant == XFT_SLANT_ITALIC) style.italic = kJTrue; } int raw_weight; if (XftPatternGetInteger(fs->fonts[i], XFT_WEIGHT, 0, &raw_weight) == XftResultMatch) { if (raw_weight == XFT_WEIGHT_BOLD) style.bold = kJTrue; } } XftFontSetDestroy(fs); #else JString xFontName, charSet; if (!ConvertToXFontName(name, &xFontName, &charSet)) { charSet = "*-*"; } const JString regexStr = "-*-" + xFontName + "-*-*-*-*-*-" + JString(10*size, 0, JString::kForceNoExponent) + "-75-75-*-*-" + charSet; int nameCount; char** nameList = XListFonts(*itsDisplay, regexStr, INT_MAX, &nameCount); if (nameList == NULL) { return style; } JString weight, slant; for (int i=0; i<nameCount; i++) { const std::string s(nameList[i], strlen(nameList[i])); std::istringstream input(s); input.ignore(); // initial dash JIgnoreUntil(input, '-'); // foundry name JIgnoreUntil(input, '-'); // font name weight = JReadUntil(input, '-'); // medium/bold slant = JReadUntil(input, '-'); // roman/oblique/italic if (weight == "bold") { style.bold = kJTrue; } if (slant == "o" || slant == "i") { style.italic = kJTrue; } } XFreeFontNames(nameList); #endif return style; }
static void nr_type_xft_init (void) { XftFontSet *fs; const char *debugenv; int debug, ret; int i, pos, fpos; debugenv = getenv ("INKSCAPE_DEBUG_XFT"); debug = (debugenv && *debugenv && (*debugenv != '0')); ret = XftInit (NULL); if (debug) { fprintf (stderr, "XftInit result %d\n", ret); fprintf (stderr, "Reading Xft font database...\n"); } /* Get family list */ fs = XftListFonts (GDK_DISPLAY (), 0, XFT_SCALABLE, XftTypeBool, 1, XFT_OUTLINE, XftTypeBool, 1, 0, XFT_FAMILY, 0); NRXftFamilies.length = fs->nfont; NRXftFamilies.names = nr_new (gchar *, NRXftFamilies.length); NRXftFamilies.destructor = NULL; XftFontSetDestroy (fs); if (debug) { fprintf (stderr, "Read %lu families\n", NRXftFamilies.length); } /* Get typeface list */ NRXftPatterns = XftListFonts (GDK_DISPLAY (), 0, XFT_SCALABLE, XftTypeBool, 1, XFT_OUTLINE, XftTypeBool, 1, 0, XFT_FAMILY, XFT_WEIGHT, XFT_SLANT, XFT_FILE, XFT_INDEX, 0); NRXftTypefaces.length = NRXftPatterns->nfont; NRXftTypefaces.names = nr_new (gchar *, NRXftTypefaces.length); NRXftTypefaces.destructor = NULL; NRXftNamedict = g_hash_table_new (g_str_hash, g_str_equal); NRXftFamilydict = g_hash_table_new (g_str_hash, g_str_equal); if (debug) { fprintf (stderr, "Read %lu fonts\n", NRXftTypefaces.length); } pos = 0; fpos = 0; for (i = 0; i < NRXftPatterns->nfont; i++) { char *name, *file; XftPatternGetString (NRXftPatterns->fonts[i], XFT_FAMILY, 0, &name); if (debug) { fprintf (stderr, "Typeface %s\n", name); } XftPatternGetString (NRXftPatterns->fonts[i], XFT_FILE, 0, &file); if (file) { int len; if (debug) { fprintf (stderr, "Got filename %s\n", file); } len = strlen (file); /* fixme: This is silly and evil */ /* But Freetype just does not load pfa reliably (Lauris) */ /* Changed to exclude pfa, better for OSX */ if ((len > 4) && /* (!strcmp (file + len - 4, ".ttf") || !strcmp (file + len - 4, ".TTF") || !strcmp (file + len - 4, ".ttc") || !strcmp (file + len - 4, ".TTC") || !strcmp (file + len - 4, ".otf") || !strcmp (file + len - 4, ".OTF") || !strcmp (file + len - 4, ".pfb") || !strcmp (file + len - 4, ".PFB"))) { */ strcmp (file + len - 4, ".pfa") && strcmp (file + len - 4, ".PFA")) { char *fn, *wn, *sn, *name; int weight; int slant; if (debug) { fprintf (stderr, "Seems valid\n"); } XftPatternGetString (NRXftPatterns->fonts[i], XFT_FAMILY, 0, &fn); XftPatternGetInteger (NRXftPatterns->fonts[i], XFT_WEIGHT, 0, &weight); XftPatternGetInteger (NRXftPatterns->fonts[i], XFT_SLANT, 0, &slant); switch (weight) { case XFT_WEIGHT_LIGHT: wn = "Light"; break; case XFT_WEIGHT_MEDIUM: wn = "Book"; break; case XFT_WEIGHT_DEMIBOLD: wn = "Demibold"; break; case XFT_WEIGHT_BOLD: wn = "Bold"; break; case XFT_WEIGHT_BLACK: wn = "Black"; break; default: wn = "Normal"; break; } switch (slant) { case XFT_SLANT_ROMAN: sn = "Roman"; break; case XFT_SLANT_ITALIC: sn = "Italic"; break; case XFT_SLANT_OBLIQUE: sn = "Oblique"; break; default: sn = "Normal"; break; } name = g_strdup_printf ("%s %s %s", fn, wn, sn); if (!g_hash_table_lookup (NRXftNamedict, name)) { if (!g_hash_table_lookup (NRXftFamilydict, fn)) { NRXftFamilies.names[fpos] = g_strdup (fn); g_hash_table_insert (NRXftFamilydict, NRXftFamilies.names[fpos++], (void *) TRUE); } NRXftTypefaces.names[pos++] = name; g_hash_table_insert (NRXftNamedict, name, NRXftPatterns->fonts[i]); } else { g_free (name); } } } } NRXftTypefaces.length = pos; NRXftFamilies.length = fpos; nrxfti = TRUE; }