📄 fontdir.c
字号:
char *n; n = (char *) xalloc (strlen (s) + 1); if (!n) return 0; strcpy (n, s); return n;}FontEntryPtrFontFileFindNameInScalableDir(table, pat, vals) FontTablePtr table; FontNamePtr pat; FontScalablePtr vals;{ int i, start, stop, res, private; FontNamePtr name; if ((i = SetupWildMatch(table, pat, &start, &stop, &private)) >= 0) return &table->entries[i]; for (i = start; i < stop; i++) { name = &table->entries[i].name; res = PatternMatch(pat->name, private, name->name, name->ndashes); if (res > 0) { /* Check to see if enhancements requested are available */ if (vals) { int vs = vals->values_supplied; int cap; if (table->entries[i].type == FONT_ENTRY_SCALABLE) cap = table->entries[i].u.scalable.renderer->capabilities; else if (table->entries[i].type == FONT_ENTRY_ALIAS) cap = ~0; /* Calling code will have to see if true */ else cap = 0; if (((vs & PIXELSIZE_MASK) == PIXELSIZE_ARRAY || (vs & POINTSIZE_MASK) == POINTSIZE_ARRAY) && !(cap & CAP_MATRIX) || (vs & CHARSUBSET_SPECIFIED) && !(cap & CAP_CHARSUBSETTING)) continue; } return &table->entries[i]; } if (res < 0) break; } return (FontEntryPtr)0;}FontEntryPtrFontFileFindNameInDir(table, pat) FontTablePtr table; FontNamePtr pat;{ return FontFileFindNameInScalableDir(table, pat, (FontScalablePtr)0);}FontFileFindNamesInScalableDir(table, pat, max, names, vals, alias_behavior, newmax) FontTablePtr table; FontNamePtr pat; int max; FontNamesPtr names; FontScalablePtr vals; int alias_behavior; int *newmax;{ int i, start, stop, res, private; int ret = Successful; FontEntryPtr fname; FontNamePtr name; if (max <= 0) return Successful; if ((i = SetupWildMatch(table, pat, &start, &stop, &private)) >= 0) { if (alias_behavior == NORMAL_ALIAS_BEHAVIOR || table->entries[i].type != FONT_ENTRY_ALIAS) { name = &table->entries[i].name; if (newmax) *newmax = max - 1; return AddFontNamesName(names, name->name, name->length); } start = i; stop = i + 1; } for (i = start, fname = &table->entries[start]; i < stop; i++, fname++) { res = PatternMatch(pat->name, private, fname->name.name, fname->name.ndashes); if (res > 0) { if (vals) { int vs = vals->values_supplied; int cap; if (fname->type == FONT_ENTRY_SCALABLE) cap = fname->u.scalable.renderer->capabilities; else if (fname->type == FONT_ENTRY_ALIAS) cap = ~0; /* Calling code will have to see if true */ else cap = 0; if (((vs & PIXELSIZE_MASK) == PIXELSIZE_ARRAY || (vs & POINTSIZE_MASK) == POINTSIZE_ARRAY) && !(cap & CAP_MATRIX) || (vs & CHARSUBSET_SPECIFIED) && !(cap & CAP_CHARSUBSETTING)) continue; } if ((alias_behavior & IGNORE_SCALABLE_ALIASES) && fname->type == FONT_ENTRY_ALIAS) { FontScalableRec tmpvals; if (FontParseXLFDName (fname->name.name, &tmpvals, FONT_XLFD_REPLACE_NONE) && !(tmpvals.values_supplied & SIZE_SPECIFY_MASK)) continue; } ret = AddFontNamesName(names, fname->name.name, fname->name.length); if (ret != Successful) goto bail; /* If alias_behavior is LIST_ALIASES_AND_TARGET_NAMES, mark this entry as an alias by negating its length and follow it by the resolved name */ if ((alias_behavior & LIST_ALIASES_AND_TARGET_NAMES) && fname->type == FONT_ENTRY_ALIAS) { names->length[names->nnames - 1] = -names->length[names->nnames - 1]; ret = AddFontNamesName(names, fname->u.alias.resolved, strlen(fname->u.alias.resolved)); if (ret != Successful) goto bail; } if (--max <= 0) break; } else if (res < 0) break; } bail: ; if (newmax) *newmax = max; return ret;}intFontFileFindNamesInDir(table, pat, max, names) FontTablePtr table; FontNamePtr pat; int max; FontNamesPtr names;{ return FontFileFindNamesInScalableDir(table, pat, max, names, (FontScalablePtr)0, NORMAL_ALIAS_BEHAVIOR, (int *)0);}BoolFontFileMatchName(name, length, pat) char *name; int length; FontNamePtr pat;{ /* Perform a fontfile-type name match on a single name */ FontTableRec table; FontEntryRec entries[1]; /* Dummy up a table */ table.used = 1; table.size = 1; table.sorted = TRUE; table.entries = entries; entries[0].name.name = name; entries[0].name.length = length; entries[0].name.ndashes = FontFileCountDashes(name, length); return FontFileFindNameInDir(&table, pat) != (FontEntryPtr)0;}/* * Add a font file to a directory. This handles bitmap and * scalable names both */BoolFontFileAddFontFile (dir, fontName, fileName) FontDirectoryPtr dir; char *fontName; char *fileName;{ FontEntryRec entry; FontScalableRec vals, zeroVals; FontRendererPtr renderer; FontEntryPtr existing; FontScalableExtraPtr extra; FontEntryPtr bitmap, scalable; Bool isscale; renderer = FontFileMatchRenderer (fileName); if (!renderer) return FALSE; entry.name.length = strlen (fontName); if (entry.name.length > MAXFONTNAMELEN) entry.name.length = MAXFONTNAMELEN; entry.name.name = fontName; CopyISOLatin1Lowered (entry.name.name, fontName, entry.name.length); entry.name.ndashes = FontFileCountDashes (entry.name.name, entry.name.length); entry.name.name[entry.name.length] = '\0'; /* * Add a bitmap name if the incoming name isn't an XLFD name, or * if it isn't a scalable name (i.e. non-zero scalable fields) * * If name of bitmapped font contains XLFD enhancements, do not add * a scalable version of the name... this can lead to confusion and * ambiguity between the font name and the field enhancements. */ isscale = entry.name.ndashes == 14 && FontParseXLFDName(entry.name.name, &vals, FONT_XLFD_REPLACE_NONE) && (vals.values_supplied & PIXELSIZE_MASK) != PIXELSIZE_ARRAY && (vals.values_supplied & POINTSIZE_MASK) != POINTSIZE_ARRAY && !(vals.values_supplied & ENHANCEMENT_SPECIFY_MASK);#ifdef FONTDIRATTRIB#define UNSCALED_ATTRIB "unscaled" /* For scalable fonts, check if the "unscaled" attribute is present */ if (isscale && dir->attributes && dir->attributes[0] == ':') { char *ptr1 = dir->attributes + 1; char *ptr2; int length; int uslength = strlen(UNSCALED_ATTRIB); do { ptr2 = strchr(ptr1, ':'); if (ptr2) length = ptr2 - ptr1; else length = dir->attributes + strlen(dir->attributes) - ptr1; if (length == uslength && !strncmp(ptr1, UNSCALED_ATTRIB, uslength)) isscale = FALSE; if (ptr2) ptr1 = ptr2 + 1; } while (ptr2); }#endif if (!isscale || (vals.values_supplied & SIZE_SPECIFY_MASK)) { /* If the fontname says it is nonScalable, make sure that the * renderer supports OpenBitmap and GetInfoBitmap. */ if (renderer->OpenBitmap && renderer->GetInfoBitmap) { entry.type = FONT_ENTRY_BITMAP; entry.u.bitmap.renderer = renderer; entry.u.bitmap.pFont = NullFont; if (!(entry.u.bitmap.fileName = FontFileSaveString (fileName))) return FALSE; if (!(bitmap = FontFileAddEntry (&dir->nonScalable, &entry))) { xfree (entry.u.bitmap.fileName); return FALSE; } } } /* * Parse out scalable fields from XLFD names - a scalable name * just gets inserted, a scaled name has more things to do. */ if (isscale) { /* If the fontname says it is scalable, make sure that the * renderer supports OpenScalable and GetInfoScalable. */ if (renderer->OpenScalable && renderer->GetInfoScalable) { if (vals.values_supplied & SIZE_SPECIFY_MASK) { bzero((char *)&zeroVals, sizeof(zeroVals)); zeroVals.x = vals.x; zeroVals.y = vals.y; zeroVals.values_supplied = PIXELSIZE_SCALAR | POINTSIZE_SCALAR; FontParseXLFDName (entry.name.name, &zeroVals, FONT_XLFD_REPLACE_VALUE); entry.name.length = strlen (entry.name.name); existing = FontFileFindNameInDir (&dir->scalable, &entry.name); if (existing) { if ((vals.values_supplied & POINTSIZE_MASK) == POINTSIZE_SCALAR && (int)(vals.point_matrix[3] * 10) == GetDefaultPointSize()) { existing->u.scalable.extra->defaults = vals; xfree (existing->u.scalable.fileName); if (!(existing->u.scalable.fileName = FontFileSaveString (fileName))) return FALSE; } FontFileCompleteXLFD(&vals, &vals); FontFileAddScaledInstance (existing, &vals, NullFont, bitmap->name.name); return TRUE; } } if (!(entry.u.scalable.fileName = FontFileSaveString (fileName))) return FALSE; extra = (FontScalableExtraPtr) xalloc (sizeof (FontScalableExtraRec)); if (!extra) { xfree (entry.u.scalable.fileName); return FALSE; } bzero((char *)&extra->defaults, sizeof(extra->defaults)); if ((vals.values_supplied & POINTSIZE_MASK) == POINTSIZE_SCALAR && (int)(vals.point_matrix[3] * 10) == GetDefaultPointSize()) extra->defaults = vals; else { FontResolutionPtr resolution; int num; extra->defaults.point_matrix[0] = extra->defaults.point_matrix[3] = (double)GetDefaultPointSize() / 10.0; extra->defaults.point_matrix[1] = extra->defaults.point_matrix[2] = 0.0; extra->defaults.values_supplied = POINTSIZE_SCALAR | PIXELSIZE_UNDEFINED; extra->defaults.width = -1; if (vals.x <= 0 || vals.y <= 0) { resolution = GetClientResolutions (&num); if (resolution && num > 0) { extra->defaults.x = resolution->x_resolution; extra->defaults.y = resolution->y_resolution; } else { extra->defaults.x = 75; extra->defaults.y = 75; } } else { extra->defaults.x = vals.x; extra->defaults.y = vals.y; } FontFileCompleteXLFD (&extra->defaults, &extra->defaults); } extra->numScaled = 0; extra->sizeScaled = 0; extra->scaled = 0; extra->private = 0; entry.type = FONT_ENTRY_SCALABLE; entry.u.scalable.renderer = renderer; entry.u.scalable.extra = extra; if (!(scalable = FontFileAddEntry (&dir->scalable, &entry))) { xfree (extra); xfree (entry.u.scalable.fileName); return FALSE; } if (vals.values_supplied & SIZE_SPECIFY_MASK) { FontFileCompleteXLFD(&vals, &vals); FontFileAddScaledInstance (scalable, &vals, NullFont, bitmap->name.name); } } } return TRUE;}BoolFontFileAddFontAlias (dir, aliasName, fontName) FontDirectoryPtr dir; char *aliasName; char *fontName;{ FontEntryRec entry; entry.name.length = strlen (aliasName); CopyISOLatin1Lowered (aliasName, aliasName, entry.name.length); entry.name.name = aliasName; entry.name.ndashes = FontFileCountDashes (entry.name.name, entry.name.length); entry.type = FONT_ENTRY_ALIAS; if (!(entry.u.alias.resolved = FontFileSaveString (fontName))) return FALSE; if (!FontFileAddEntry (&dir->nonScalable, &entry)) { xfree (entry.u.alias.resolved); return FALSE; } return TRUE;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -