📄 fontfile.c
字号:
FontScalablePtr vals; fsRange *ranges; int nranges; int *max;{ int i; FontScalableRec zeroVals, tmpVals; for (i = 0; i < scaleNames->nnames; i++) { char nameChars[MAXFONTNAMELEN]; if (!*max) return; FontParseXLFDName (scaleNames->names[i], &zeroVals, FONT_XLFD_REPLACE_NONE); tmpVals = *vals; if (FontFileCompleteXLFD (&tmpVals, &zeroVals)) { --*max; strcpy (nameChars, scaleNames->names[i]); if ((vals->values_supplied & PIXELSIZE_MASK) || !(vals->values_supplied & PIXELSIZE_WILDCARD) || vals->y == 0) { tmpVals.values_supplied = (tmpVals.values_supplied & ~PIXELSIZE_MASK) | (vals->values_supplied & PIXELSIZE_MASK); tmpVals.pixel_matrix[0] = vals->pixel_matrix[0]; tmpVals.pixel_matrix[1] = vals->pixel_matrix[1]; tmpVals.pixel_matrix[2] = vals->pixel_matrix[2]; tmpVals.pixel_matrix[3] = vals->pixel_matrix[3]; } if ((vals->values_supplied & POINTSIZE_MASK) || !(vals->values_supplied & POINTSIZE_WILDCARD) || vals->y == 0) { tmpVals.values_supplied = (tmpVals.values_supplied & ~POINTSIZE_MASK) | (vals->values_supplied & POINTSIZE_MASK); tmpVals.point_matrix[0] = vals->point_matrix[0]; tmpVals.point_matrix[1] = vals->point_matrix[1]; tmpVals.point_matrix[2] = vals->point_matrix[2]; tmpVals.point_matrix[3] = vals->point_matrix[3]; } if (vals->width <= 0) tmpVals.width = 0; if (vals->x == 0) tmpVals.x = 0; if (vals->y == 0) tmpVals.y = 0; tmpVals.ranges = ranges; tmpVals.nranges = nranges; FontParseXLFDName (nameChars, &tmpVals, FONT_XLFD_REPLACE_VALUE); /* If we're marking aliases with negative lengths, we need to concoct a valid target name to follow it. Otherwise we're done. */ if (scaleNames->length[i] >= 0) { (void) AddFontNamesName (names, nameChars, strlen (nameChars)); /* If our original pattern matches the name from the table and that name doesn't duplicate what we just added, add the name from the table */ if (strcmp(nameChars, scaleNames->names[i]) && FontFileMatchName(scaleNames->names[i], scaleNames->length[i], nameptr) && *max) { --*max; (void) AddFontNamesName (names, scaleNames->names[i], scaleNames->length[i]); } } else { char *aliasName; vals->ranges = ranges; vals->nranges = nranges; if (transfer_values_to_alias(zeroChars, strlen(zeroChars), scaleNames->names[++i], &aliasName, vals)) { (void) AddFontNamesName (names, nameChars, strlen (nameChars)); names->length[names->nnames - 1] = -names->length[names->nnames - 1]; (void) AddFontNamesName (names, aliasName, strlen (aliasName)); /* If our original pattern matches the name from the table and that name doesn't duplicate what we just added, add the name from the table */ if (strcmp(nameChars, scaleNames->names[i - 1]) && FontFileMatchName(scaleNames->names[i - 1], -scaleNames->length[i - 1], nameptr) && *max) { --*max; (void) AddFontNamesName (names, scaleNames->names[i - 1], -scaleNames->length[i - 1]); names->length[names->nnames - 1] = -names->length[names->nnames - 1]; (void) AddFontNamesName (names, aliasName, strlen (aliasName)); } } } } }}/* ARGSUSED */static int_FontFileListFonts (client, fpe, pat, len, max, names, mark_aliases) pointer client; FontPathElementPtr fpe; char *pat; int len; int max; FontNamesPtr names; int mark_aliases;{ FontDirectoryPtr dir; char lowerChars[MAXFONTNAMELEN], zeroChars[MAXFONTNAMELEN]; FontNameRec lowerName; FontNameRec zeroName; FontNamesPtr scaleNames; FontScalableRec vals; int i; fsRange *ranges; int nranges; int result = BadFontName; if (len >= MAXFONTNAMELEN) return AllocError; dir = (FontDirectoryPtr) fpe->private; CopyISOLatin1Lowered (lowerChars, pat, len); lowerChars[len] = '\0'; lowerName.name = lowerChars; lowerName.length = len; lowerName.ndashes = FontFileCountDashes (lowerChars, len); /* Match XLFD patterns */ strcpy (zeroChars, lowerChars); if (lowerName.ndashes == 14 && FontParseXLFDName (zeroChars, &vals, FONT_XLFD_REPLACE_ZERO)) { ranges = FontParseRanges(lowerChars, &nranges); result = FontFileFindNamesInScalableDir (&dir->nonScalable, &lowerName, max, names, (FontScalablePtr)0, (mark_aliases ? LIST_ALIASES_AND_TARGET_NAMES : NORMAL_ALIAS_BEHAVIOR) | IGNORE_SCALABLE_ALIASES, &max); zeroName.name = zeroChars; zeroName.length = strlen (zeroChars); zeroName.ndashes = lowerName.ndashes; /* Look for scalable names and aliases, adding scaled instances of them to the output */ /* Scalable names... */ scaleNames = MakeFontNamesRecord (0); if (!scaleNames) { if (ranges) xfree(ranges); return AllocError; } FontFileFindNamesInScalableDir (&dir->scalable, &zeroName, max, scaleNames, &vals, mark_aliases ? LIST_ALIASES_AND_TARGET_NAMES : NORMAL_ALIAS_BEHAVIOR, (int *)0); _FontFileAddScalableNames(names, scaleNames, &lowerName, zeroChars, &vals, ranges, nranges, &max); FreeFontNames (scaleNames); /* Scalable aliases... */ scaleNames = MakeFontNamesRecord (0); if (!scaleNames) { if (ranges) xfree(ranges); return AllocError; } FontFileFindNamesInScalableDir (&dir->nonScalable, &zeroName, max, scaleNames, &vals, mark_aliases ? LIST_ALIASES_AND_TARGET_NAMES : NORMAL_ALIAS_BEHAVIOR, (int *)0); _FontFileAddScalableNames(names, scaleNames, &lowerName, zeroChars, &vals, ranges, nranges, &max); FreeFontNames (scaleNames); if (ranges) xfree(ranges); } else { result = FontFileFindNamesInScalableDir (&dir->nonScalable, &lowerName, max, names, (FontScalablePtr)0, mark_aliases ? LIST_ALIASES_AND_TARGET_NAMES : NORMAL_ALIAS_BEHAVIOR, &max); if (result == Successful) result = FontFileFindNamesInScalableDir (&dir->scalable, &lowerName, max, names, (FontScalablePtr)0, mark_aliases ? LIST_ALIASES_AND_TARGET_NAMES : NORMAL_ALIAS_BEHAVIOR, (int *)0); } return result;}typedef struct _LFWIData { FontNamesPtr names; int current;} LFWIDataRec, *LFWIDataPtr;FontFileListFonts (client, fpe, pat, len, max, names) pointer client; FontPathElementPtr fpe; char *pat; int len; int max; FontNamesPtr names;{ return _FontFileListFonts (client, fpe, pat, len, max, names, 0);}FontFileStartListFontsWithInfo(client, fpe, pat, len, max, privatep) pointer client; FontPathElementPtr fpe; char *pat; int len; int max; pointer *privatep;{ LFWIDataPtr data; int ret; data = (LFWIDataPtr) xalloc (sizeof *data); if (!data) return AllocError; data->names = MakeFontNamesRecord (0); if (!data->names) { xfree (data); return AllocError; } ret = FontFileListFonts (client, fpe, pat, len, max, data->names); if (ret != Successful) { FreeFontNames (data->names); xfree (data); return ret; } data->current = 0; *privatep = (pointer) data; return Successful;}/* ARGSUSED */static intFontFileListOneFontWithInfo (client, fpe, namep, namelenp, pFontInfo) pointer client; FontPathElementPtr fpe; char **namep; int *namelenp; FontInfoPtr *pFontInfo;{ FontDirectoryPtr dir; char lowerName[MAXFONTNAMELEN]; char fileName[MAXFONTFILENAMELEN*2 + 1]; FontNameRec tmpName; FontEntryPtr entry; FontScalableRec vals; FontScalableEntryPtr scalable; FontScaledPtr scaled; FontBitmapEntryPtr bitmap; FontAliasEntryPtr alias; int ret; char *name = *namep; int namelen = *namelenp; Bool noSpecificSize; if (namelen >= MAXFONTNAMELEN) return AllocError; dir = (FontDirectoryPtr) fpe->private; CopyISOLatin1Lowered (lowerName, name, namelen); lowerName[namelen] = '\0'; tmpName.name = lowerName; tmpName.length = namelen; tmpName.ndashes = FontFileCountDashes (lowerName, namelen); /* Match XLFD patterns */ if (tmpName.ndashes == 14 && FontParseXLFDName (lowerName, &vals, FONT_XLFD_REPLACE_ZERO)) { tmpName.length = strlen (lowerName); entry = FontFileFindNameInScalableDir (&dir->scalable, &tmpName, &vals); noSpecificSize = FALSE; /* TRUE breaks XLFD enhancements */ if (entry && entry->type == FONT_ENTRY_SCALABLE && FontFileCompleteXLFD (&vals, &entry->u.scalable.extra->defaults)) { scalable = &entry->u.scalable; scaled = FontFileFindScaledInstance (entry, &vals, noSpecificSize); /* * A scaled instance can occur one of two ways: * * Either the font has been scaled to this * size already, in which case scaled->pFont * will point at that font. * * Or a bitmap instance in this size exists, * which is handled as if we got a pattern * matching the bitmap font name. */ if (scaled) { if (scaled->pFont) { *pFontInfo = &scaled->pFont->info; ret = Successful; } else if (scaled->bitmap) { entry = scaled->bitmap; bitmap = &entry->u.bitmap; if (bitmap->pFont) { *pFontInfo = &bitmap->pFont->info; ret = Successful; } else { ret = FontFileGetInfoBitmap (fpe, *pFontInfo, entry); } } else /* "cannot" happen */ { ret = BadFontName; } } else {#ifdef NOTDEF /* no special case yet */ ret = FontFileMatchBitmapSource (fpe, pFont, flags, entry, &vals, format, fmask, noSpecificSize); if (ret != Successful)#endif { char origName[MAXFONTNAMELEN]; fsRange *ranges; CopyISOLatin1Lowered (origName, name, namelen); origName[namelen] = '\0'; vals.xlfdName = origName; vals.ranges = FontParseRanges(origName, &vals.nranges); ranges = vals.ranges; /* Make a new scaled instance */ strcpy (fileName, dir->directory); strcat (fileName, scalable->fileName); ret = (*scalable->renderer->GetInfoScalable) (fpe, *pFontInfo, entry, &tmpName, fileName, &vals); if (ranges) xfree(ranges); } } if (ret == Successful) return ret; } CopyISOLatin1Lowered (lowerName, name, namelen); tmpName.length = namelen; } /* Match non XLFD pattern */ if (entry = FontFileFindNameInDir (&dir->nonScalable, &tmpName)) { switch (entry->type) { case FONT_ENTRY_BITMAP: bitmap = &entry->u.bitmap; if (bitmap->pFont) { *pFontInfo = &bitmap->pFont->info; ret = Successful; } else { ret = FontFileGetInfoBitmap (fpe, *pFontInfo, entry); } break; case FONT_ENTRY_ALIAS: alias = &entry->u.alias; *(char **)pFontInfo = name; *namelenp = strlen (*namep = alias->resolved); ret = FontNameAlias; break;#ifdef NOTYET case FONT_ENTRY_BC: /* no LFWI for this yet */ bc = &entry->u.bc; entry = bc->entry; /* Make a new scaled instance */ strcpy (fileName, dir->directory); strcat (fileName, scalable->fileName); ret = (*scalable->renderer->GetInfoScalable) (fpe, *pFontInfo, entry, tmpName, fileName, &bc->vals); break;#endif default: ret = BadFontName; } } else { ret = BadFontName; } return ret;}FontFileListNextFontWithInfo(client, fpe, namep, namelenp, pFontInfo, numFonts, private) pointer client; FontPathElementPtr fpe; char **namep; int *namelenp; FontInfoPtr *pFontInfo; int *numFonts; pointer private;{ LFWIDataPtr data = (LFWIDataPtr) private; int ret; char *name; int namelen; if (data->current == data->names->nnames) { FreeFontNames (data->names); xfree (data); return BadFontName; } name = data->names->names[data->current]; namelen = data->names->length[data->current]; ret = FontFileListOneFontWithInfo (client, fpe, &name, &namelen, pFontInfo); if (ret == BadFontName) ret = AllocError; *namep = name; *namelenp = namelen; ++data->current; *numFonts = data->names->nnames - data->current; return ret;}intFontFileStartListFontsAndAliases(client, fpe, pat, len, max, privatep) pointer client; FontPathElementPtr fpe; char *pat; int len; int max; pointer *privatep;{ LFWIDataPtr data; int ret; data = (LFWIDataPtr) xalloc (sizeof *data); if (!data) return AllocError; data->names = MakeFontNamesRecord (0); if (!data->names) { xfree (data); return AllocError; } ret = _FontFileListFonts (client, fpe, pat, len, max, data->names, 1); if (ret != Successful) { FreeFontNames (data->names); xfree (data); return ret; } data->current = 0; *privatep = (pointer) data; return Successful;}intFontFileListNextFontOrAlias(client, fpe, namep, namelenp, resolvedp, resolvedlenp, private) pointer client; FontPathElementPtr fpe; char **namep; int *namelenp; char **resolvedp; int *resolvedlenp; pointer private;{ LFWIDataPtr data = (LFWIDataPtr) private; int ret; char *name; int namelen; if (data->current == data->names->nnames) { FreeFontNames (data->names); xfree (data); return BadFontName; } name = data->names->names[data->current]; namelen = data->names->length[data->current]; /* If this is a real font name... */ if (namelen >= 0) { *namep = name; *namelenp = namelen; ret = Successful; } /* Else if an alias */ else { /* Tell the caller that this is an alias... let him resolve it to see if it's valid */ *namep = name; *namelenp = -namelen; *resolvedp = data->names->names[++data->current]; *resolvedlenp = data->names->length[data->current]; ret = FontNameAlias; } ++data->current; return ret;}extern void FontFileEmptyBitmapSource();typedef int (*IntFunc) ();static int font_file_type;FontFileRegisterLocalFpeFunctions (){ font_file_type = RegisterFPEFunctions(FontFileNameCheck, FontFileInitFPE, FontFileFreeFPE, FontFileResetFPE, FontFileOpenFont, FontFileCloseFont, FontFileListFonts, FontFileStartListFontsWithInfo, FontFileListNextFontWithInfo, (IntFunc) 0, (IntFunc) 0, (IntFunc) 0, FontFileStartListFontsAndAliases, FontFileListNextFontOrAlias, FontFileEmptyBitmapSource);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -