/******************************Module*Header*******************************\ * Module Name: pfeobj.hxx * * The physical font entry (PFE) user object, and memory objects. * * The physical font entry object: * ------------------------------ * * o each font "face" is associated with a physical font entry * * o stores information about where a particular font exists * * o buffers the font metrics * * o buffers the font mappings (which completely specifies the * character set) * * o provides services for the following APIs: * * o GetTextFace * * o GetTextMetrics * * Created: 25-Oct-1990 16:37:07 * Author: Gilman Wong [gilmanw] * * Copyright (c) 1990-1999 Microsoft Corporation * \**************************************************************************/ #ifndef _PFEOBJ_ #define _PFEOBJ_ /**************************************************************************\ * * enum ENUMFONTSTYLE * * When enumerating fonts via EnumFonts, Windows 3.1 assumes that there are * 4 basic variations: Regular (same as Normal or Roman), Bold, Italic, or * Bold-Italic. It doesn't understand other stylistic variations such as * Demi-bold or Extra-bold. * * This enumerated type is used to classify PFEs into one of six categories: * * EFSTYLE_REGULAR The basic four styles. * EFSTYLE_BOLD * EFSTYLE_ITALIC * EFSTYLE_BOLDITALIC * * EFSTYLE_OTHER This is a unique style that EnumFonts will treat * specially. The facename will be used as if it were * the family name. * * EFSTYLE_SKIP Ignore this font as a unique style. * \**************************************************************************/ typedef enum _ENUMFONTSTYLE { /* efsty */ EFSTYLE_REGULAR = 0, EFSTYLE_BOLD = 1, EFSTYLE_ITALIC = 2, EFSTYLE_BOLDITALIC = 3, EFSTYLE_SKIP = 4, EFSTYLE_OTHER = 5 } ENUMFONTSTYLE; #define EFSTYLE_MAX 6 #ifndef GDIFLAGS_ONLY // used for gdikdx // Alingment when allocating PFEs in PFE Collect #if defined(i386) // natural alignment for x86 is on 32 bit boundary #define NATURAL_ALIGN(x) (((x) + 3L) & ~3L) #else // for mips and alpha we want 64 bit alignment #define NATURAL_ALIGN(x) (((x) + 7L) & ~7L) #endif // The size for each PFE in PFE Collect #define SZ_PFE(cfsCharSetTable) NATURAL_ALIGN(offsetof(PFE,aiFamilyName) + cfsCharSetTable * sizeof(BYTE)) /*********************************Class************************************\ * struct EFFILTER_INFO * * Structure that tells what type of font enumeration filtering should be used. * Parameters needed for certain types of filtering are also included here. * * History: * 07-Aug-1992 -by- Gilman Wong [gilmanw] * Wrote it. \**************************************************************************/ typedef struct _EFFILTER_INFO /* effi */ { // Aspect ratio filtering -- reject font if aspect ratio does not match // devices. BOOL bAspectFilter; POINTL ptlDeviceAspect; // Non-True type filtering -- reject all TrueType fonts. BOOL bNonTrueTypeFilter; // TrueType filtering -- reject all non-TrueType fonts. BOOL bTrueTypeFilter; // EngineFiltering -- reject all engine font (for generic printer driver) BOOL bEngineFilter; // Raster filtering -- reject all raster fonts (needed if device is not // raster-capable. BOOL bRasterFilter; // Win 3.1 App compatibility // TrueType duplicate filtering -- reject all raster fonts with the same // name as an existing TrueType font // (GACF_TTIGNORERASTERDUPE flag). BOOL bTrueTypeDupeFilter; COUNT cTrueType; // Count of TrueType fonts in a list -- Used for // compatibility flag GACF_TTIGNORERASTERDUPE. This // should be set to the value from the HASHBUCKET // in the FONTHASH table being enumerated. // added to support EnumFontFamiliesEx. If lfCharSetFilter != DEFAULT_CHARSET, // only the fonts that support jCharSetFilter will be enumerated. ULONG lfCharSetFilter; } EFFILTER_INFO; #endif // GDIFLAGS_ONLY used for gdikdx /**************************************************************************\ * FONTHASHTYPE * * * * Identifies the list of PFE's to traverse. * \**************************************************************************/ typedef enum _FONTHASHTYPE { FHT_FACE = 0, FHT_FAMILY = 1, FHT_UFI = 2 } FONTHASHTYPE; /*********************************Class************************************\ * class PFE : public OBJECT * * Physical font entry object * * pPFF The pointer to the physical font file object which * represents the physical font file for this PFE. * * iFont The index of the font in either the font file (IFI) * or the driver (device managed fonts). * * bDeadState This is state information cached from the PFF. If * TRUE, then this PFE is part of a PFF that has been * marked for deletion (but deletion has been delayed). * Therefore, we should not enumerate or map to this * PFE. * * pfdg Pointer to the UNICODE to HGLYPH mapping table. This * points to memory managed by the driver. * * pifi Pointer to the IFIMETRICS. This points to memory * managed by the driver. * * History: * Wed 23-Dec-1992 00:13:00 -by- Charles Whitmer [chuckwh] * Changed most uses of HPFE to (PFE *). * * Wed 15-Apr-1992 07:10:36 by Kirk Olynyk [kirko] * Added hpfeNextFace and hpfeNextFamily * * 30-Oct-1990 -by- Gilman Wong [gilmanw] * Wrote it. \**************************************************************************/ #define PFE_DEVICEFONT 0x00000001L #define PFE_DEADSTATE 0x00000002L #define PFE_REMOTEFONT 0x00000004L #define PFE_EUDC 0x00000008L #define PFE_SBCS_SYSTEM 0x00000010L #define PFE_UFIMATCH 0x00000020L #define PFE_MEMORYFONT 0x00000040L #define PFE_DBCS_FONT 0x00000080L #define PFE_VERT_FACE 0x00000100L #ifndef GDIFLAGS_ONLY // used for gdikdx // The GISET strucutre is allocated and computed only for tt fonts // and only if truly needed, that is if ETO_GLYPHINDEX mode of ExtTextOut // is ever used on this font. This structure describes all glyph handles in // the font. typedef struct _GIRUN { USHORT giLow; // first glyph index in the run USHORT cgi; // number of indicies in the run } GIRUN; typedef struct _GISET { ULONG cgiTotal; // total number of glyph indicies, usually the same as cGlyphsSupported ULONG cGiRuns; // number of runs GIRUN agirun[1]; // array of cGiRuns GIRUN's } GISET; class PFE /* pfe */ { public: // Location of font. PPFF pPFF; // pointer to physical font file object ULONG iFont; // index of the font for IFI or device FLONG flPFE; // Font data. FD_GLYPHSET *pfdg; // ptr to wc-->hg map ULONG_PTR idfdg; // id returned by driver for FD_GLYPHSET PIFIMETRICS pifi; // pointer to ifimetrics ULONG_PTR idifi; // id returned by driver for IFIMETRICS FD_KERNINGPAIR *pkp; // pointer to kerning pairs (lazily loaded on demand) ULONG_PTR idkp; // id returned by driver for FD_KERNINGPAIR COUNT ckp; // count of kerning pairs in the FD_KERNINGPAIR arrary LONG iOrientation; // Cache IFI orientation. ULONG cjEfdwPFE; // size of enumeration data needed for this pfe // information needed to support ETO_GLYPHINDEX mode of ExtTextOut. GISET *pgiset; // initialized to NULL; // Time stamp. ULONG ulTimeStamp; // unique time stamp (smaller == older) // Universal font indentifier UNIVERSAL_FONT_ID ufi; // Unique ID for this font/face. // PID of process that created this font (used for remote fonts only) W32PID pid; PW32THREAD tid; #ifdef FE_SB // EUDC font stuff // This entry will be used for linked font. QUICKLOOKUP ql; // QUICKLOOKUP if a linked font // This entry will be used for base font. PFLENTRY pFlEntry; // Pointer to linked font list #endif // number of entries in the font substitution table such that // alternate family name is the same as the family name of THIS pfe. // Example: if this is a pfe for Arial, than if there are two entries // in the font substitution table, e.g. as below // // Arial Grk,161 = Arial,161 // Arial Trk,162 = Arial,162 // // than cAlt should be set to 2 ULONG cAlt; // cRef for pfdg ULONG cPfdgRef; BYTE aiFamilyName[1]; // aiFamilyNameg[cAltCharSets] }; #define PPFENULL ((PFE *) NULL) #define PFEOBJ_FL_STOCK 1 /*********************************Class************************************\ * class PFEOBJ * * * * User object for physical font entries. * * * * History: * * Tue 15-Dec-1992 23:55:35 -by- Charles Whitmer [chuckwh] * * Unified the Family/Face lists. Changed allocation routines. * * * * Wed 15-Apr-1992 07:14:54 by Kirk Olynyk [kirko] * * Added phpfeNextFace(), phpfeNextFamily(), pwszFaceName(), * * pwszStyleName(), pwszUniqueName(). * * * * 25-Oct-1990 -by- Gilman Wong [gilmanw] * * Wrote it. * \**************************************************************************/ // links pfe's into enumeration lists typedef struct _PFELINK { struct _PFELINK *ppfelNext; PFE *ppfe; } PFELINK; class PFEOBJ /* pfeo */ { public: // Constructor PFEOBJ(PFE *ppfe_) {ppfe = (PFE *) ppfe_;} PFEOBJ() {} // Destructor ~PFEOBJ() {} // same as constructor essentially, allows change on the fly PFE *ppfeSet(PFELINK *ppfel) { return (ppfe = ppfel->ppfe);} // bValid -- returns TRUE if lock successful. BOOL bValid() {return(ppfe != PPFENULL);} // bDelete -- deletes the PFE object. VOID vDelete(); // PFEOBJ.CXX // bDeviceFont -- Returns TRUE if a device specific font. We can only // get metrics from such fonts (no bitmaps or outlines). BOOL bDeviceFont() {return(ppfe->flPFE & PFE_DEVICEFONT);} // bEquivNames -- Returns TRUE if font has a list of equivalent names. BOOL bEquivNames() { return (ppfe->pifi->flInfo & FM_INFO_FAMILY_EQUIV); } // bDead -- Returns TRUE if the font is in a "ready to die" state. This // state is inherited from the PFF and is cached here for speed. BOOL bDead() {return(ppfe->flPFE & PFE_DEADSTATE);} #ifdef FE_SB // bEUDC -- Returns TRUE if the font has been loaded as an EUDC font. We // dont enumerate such fonts. BOOL bEUDC() {return(ppfe->flPFE & PFE_EUDC);} VOID vSetLinkedFontEntry( PFLENTRY _pFlEntry ) {ppfe->pFlEntry = _pFlEntry;} PFLENTRY pGetLinkedFontEntry() {return(ppfe->pFlEntry);} PLIST_ENTRY pGetLinkedFontList() { if(ppfe->pFlEntry != NULL ) return( &(ppfe->pFlEntry->linkedFontListHead) ); else return( &(NullListHead) ); } ULONG ulGetLinkTimeStamp() { if(ppfe->pFlEntry != NULL ) return( ppfe->pFlEntry->ulTimeStamp ); else return( 0 ); } QUICKLOOKUP *pql() {return(&(ppfe->ql));} BOOL bVerticalFace() {return(ppfe->flPFE & PFE_VERT_FACE);} BOOL bSBCSSystemFont() {return(ppfe->flPFE & PFE_SBCS_SYSTEM);} #endif // vKill -- Puts font in a "ready to die" state. This is a state inherited // from the PFF and is cached here for speed. VOID vKill() {ppfe->flPFE |= PFE_DEADSTATE;} // vRevive -- Clears the "ready to die" state. This is a state inherited // from the PFF and is cached here for speed. VOID vRevive() {ppfe->flPFE &= ~PFE_DEADSTATE; } // hpfec -- returns the handle of PFE collect object. HPFEC hpfecGet(); PFE *ppfeGet() {return(ppfe);} // pPFF -- returns the handle of the PFF representing the file from which // the font (which this PFE represents) came from. PPFF pPFF () { return(ppfe->pPFF); } // iFont -- the index or id of the font within the file. ULONG iFont () { return(ppfe->iFont); } // bSetFontXform -- calculates the font transform needed to rasterize this // physical font with the properties in the wish list. BOOL bSetFontXform ( // PFEOBJ.CXX XDCOBJ &dc, // for this device LOGFONTW *plfw, // wish list PFD_XFORM pfd_xfm, // font transform FLONG fl_, // flags FLONG flSim, POINTL* const pptlSim, IFIOBJ& ifio, BOOL bIsLinkedFont // is passed in as TRUE if the font is linked, FALSE otherwise ); // pifi -- returns a pointer to the IFIMETRICS of this font. PIFIMETRICS pifi() { return (ppfe->pifi); } // cjEfdwPFE -- returns the size of enumeration data for this font ULONG cjEfdwPFE() { return (ppfe->cjEfdwPFE); } // dpNtmi -- retruns the offset to NTMW_INTERNAL from the top of ENUMFONTDATAW ULONG dpNtmi(); // pfdg -- returns a pointer to the wchar-->hglyph map FD_GLYPHSET *pfdg(); VOID vFreepfdg(); // cKernPairs -- returns a pointer to the FD_KERNINGPAIR array for this // font and the count of kerning pairs. COUNT cKernPairs ( // PFEOBJ.CXX FD_KERNINGPAIR **ppkp ); // flFontType -- returns flags describing the type of font. FLONG flFontType (); // PFEOBJ.CXX // pwszFamilyName // pwszStyleName // pwszFaceName // pwszUniqueName -- return pointers to various font name strings. BOOL bCheckFamilyName(const WCHAR * pwszFaceName, BOOL bIgnoreVertical, BOOL *pbAliasMatch = NULL); PWSZ pwszFamilyName() { return((PWSZ)(((BYTE*) ppfe->pifi) + ppfe->pifi->dpwszFamilyName)); } PWSZ pwszFamilyNameAlias(BOOL *pbIsFamilyNameAlias) { PWSZ pFaceName; *pbIsFamilyNameAlias = FALSE; if (ppfe->pifi->flInfo & FM_INFO_FAMILY_EQUIV) { *pbIsFamilyNameAlias = TRUE; } return((PWSZ)(((BYTE*) ppfe->pifi) + ppfe->pifi->dpwszFamilyName)); } PWSZ pwszStyleName() { return((PWSZ)(((BYTE*) ppfe->pifi) + ppfe->pifi->dpwszStyleName)); } PWSZ pwszFaceName() { return((PWSZ)(((BYTE*) ppfe->pifi) + ppfe->pifi->dpwszFaceName)); } PWSZ pwszUniqueName() { return((PWSZ)(((BYTE*) ppfe->pifi) + ppfe->pifi->dpwszUniqueName)); } // efstyCompute -- return ENUMFONTSTYLE based on font properties. ENUMFONTSTYLE efstyCompute(); // PFEOBJ.CXX // bFilteredOut -- returns TRUE if font should be filtered out of the // font enumeration. BOOL bFilteredOut(EFFILTER_INFO *peffi); // PFEOBJ.CXX // bFilterNotEnum() -- return TRUE if this pfe should be filtered out for enumeration // either it is embedded font or it is loaded with FR_NOT_ENUM bit set. BOOL bFilterNotEnum(); // PFEOBJ.CXX // font stored in private PFT BOOL bPrivate(); //PFEOBJ.CXX // font embedded by the current process BOOL bEmbedOk(); // PFEOBJ.CXX // bEmbPvtOk() -- return TRUE if the process loaded the font as Embedded or Private BOOL bEmbPvtOk(); // PFEOBJ.CXX // bUFIMatchOnly() -- return TRUE if PFE_UFIMATCH bit is set. The font is added to the // public font table temporarily only for remote printing. BOOL bUFIMatchOnly() {return(ppfe->flPFE & PFE_UFIMATCH);} // iOrientation ULONG iOrientation() {return(ppfe->iOrientation);} // ulTimeStamp -- returns PFE's time stamp. ULONG ulTimeStamp() { return ppfe->ulTimeStamp; } // vUFI returns PFE's universal font identifier VOID vUFI( PUNIVERSAL_FONT_ID pufi ) { *pufi = *(&ppfe->ufi); } PUNIVERSAL_FONT_ID pUFI() { return(&ppfe->ufi); } // make sure current process is the same one that installed this remote PFE BOOL SameProccess() { return((ppfe->pid == 0) || (ppfe->pid == W32GetCurrentPID())); } BOOL SameThread() { return((ppfe->tid == 0) || (ppfe->tid == (PW32THREAD)PsGetCurrentThread())); } // Debugging code // VOID vPrint (); // PFEOBJ.CXX VOID vPrintAll (); // PFEOBJ.CXX protected: PFE *ppfe; }; /*********************************Class************************************\ * class PFEMEMOBJ : public PFEOBJ * * Memory object for physical font entries. * * Public Interface: * * PFEMEMOBJ () // alloc. default PFE size * ~PFEMEMOBJ () // destructor * * BOOL bValid () // validator * VOID vKeepIt () // preserve memory object * BOOL bInit ( // initialize PFE * * History: * 29-Oct-1990 -by- Gilman Wong [gilmanw] * Wrote it. \**************************************************************************/ #define PFEMO_KEEPIT 0x0001 class PFEMEMOBJ : public PFEOBJ /* pfemo */ { public: // Contructors -- Allocate memory for the objects and lock. PFEMEMOBJ(PFE *ppfe_) {ppfe = ppfe_;} // Destructor -- Unlock object. ~PFEMEMOBJ() {} // bValid -- Validator which returns TRUE if allocation successful. BOOL bValid() {return(ppfe != PPFENULL);} // vKeepIt -- Prevent destructor from deleting the new PFE. // bInit -- Initialize the PFE // PFEOBJ.CXX BOOL bInit ( PPFF pPFF, ULONG iFont, FD_GLYPHSET *pfdg, ULONG_PTR idfdg, PIFIMETRICS pifi, ULONG_PTR ididi, BOOL bDeviceFont, PUNIVERSAL_FONT_ID pufi // used only for remote fonts on the print server #ifdef FE_SB ,BOOL bEUDC #endif ); }; /*********************************Class************************************\ * class PFEC : public OBJECT * * PFE Collect object * * Member: * pvPFE: pointer embedded for the array of PFE * * * History: * 3-June-1999 Yung-Jen Tony Tsai [YungT] * Wrote it. \**************************************************************************/ class PFEC : public OBJECT { public: PVOID pvPFE; ULONG cjPFE; }; /*********************************Class************************************\ * class PFECOBJ * * Implementation class for PFE Collect object * * Interfaces: * // Constructor * * PFECOBJ(PFEC *ppfec_) * PFECOBJ() * * // Destructor * * ~PFECOBJ() {} * * PFE * GetPFE(ULONG iFont); * HPFEC GetHPFEC(); * * * History: * 3-June-1999 Yung-Jen Tony Tsai [YungT] * Wrote it. \**************************************************************************/ class PFECOBJ { public: // Constructor PFECOBJ(PFEC *ppfec_) {ppfec = (PFEC *) ppfec_;} PFECOBJ() {} // Destructor ~PFECOBJ() {} PFE * GetPFE(ULONG iFont); HPFEC GetHPFEC(); protected: PFEC *ppfec; }; class HPFECOBJ : public PFECOBJ { public: HPFECOBJ(HPFEC hpfec) { ppfec = (PFEC *) HmgShareLock((HOBJ)hpfec,PFE_TYPE); } ~HPFECOBJ() { if (ppfec != NULL) {DEC_SHARE_REF_CNT(ppfec);} } }; /**************************************************************************\ * FONT NAME HASHING STRUCTURES AND CONSTANTS * * \**************************************************************************/ #if DBG typedef VOID (*VPRINT) (char*,...); #endif /*********************************Class************************************\ * struct HASHBUCKET * * Members: * * ppfeEnumHead head of the font enumeration list of PFEs (stable order) * * ppfeEnumTail tail of the font enumeration list of PFEs * * Notes: * * There is a separate list for font enumeration because the shifting order * of the font mapper's list makes enumeration a little strange. A head * and tail is maintained for the font enumeration list so that the proper * order for EnumFonts() can be maintained (Win 3.1 compatibility issue); * new PFEs may have to be inserted either at the head or the tail of the * list. * * Note that the mapper and enumeration lists both link together the same * exact set of PFEs, but in different orders. * * History: * 05-Aug-1992 -by- Gilman Wong [gilmanw] * Wrote it. \**************************************************************************/ typedef struct _HTABLE /* ht */ { LONG lTooSmall; // see [1] below LONG lMin; // smallest available LONG lMax; // biggest available LONG lTooBig; // see [2] below PFE *appfe[1]; // } HTABLE; /*** NOTES on the HTABLE structure [1] If the requested font height is less than or equal to lTooSmall then none of the fonts in the list can be used. A default small font must be substituted [2] If the requested font height is greater than or equal to lTooBig then none of the fonts in the list can be used. A default big font must be substituted ***/ typedef union tagHASHUNION { WCHAR wcCapName[LF_FACESIZE]; UNIVERSAL_FONT_ID ufi; } HASHUNION; typedef struct _HASHBUCKET /* hbkt */ { struct _HASHBUCKET *pbktCollision; PFELINK *ppfelEnumHead; // head of font enumeration list PFELINK *ppfelEnumTail; // tail of font enumeration list COUNT cTrueType; // count of TrueType fonts in list COUNT cRaster; // count of Raster fonts in list FLONG fl; // misc info // Doubly linked list of buckets. This list is maintained in the order // that they were loaded. Actually, in the order that the oldest PFE in // each bucket was loaded. struct _HASHBUCKET *pbktPrev; struct _HASHBUCKET *pbktNext; ULONG ulTime; // time stamp of "oldest" PFE in bucket's list HASHUNION u; // either the face name or the UFI } HASHBUCKET; // // HASHBUCKET::fl flag constants // #define HB_HTABLE_NOT_POSSIBLE 1 #define HB_EQUIV_FAMILY 2 /*********************************Class************************************\ * struct FONTHASH * * * * Public Interface: * * * * History: * * Sun 12-Apr-1992 08:35:52 by Kirk Olynyk [kirko] * * Wrote it. * \**************************************************************************/ typedef struct _FONTHASH { UINT id; // 'HASH' FONTHASHTYPE fht; // table type UINT cBuckets; // total number of buckets UINT cUsed; // number of buckets in use UINT cCollisions; HASHBUCKET *pbktFirst; // first bucket of doubly linked list of hash // buckets maintained in order loaded into system HASHBUCKET *pbktLast; // last bucket of doubly linked list of hash // buckets maintained in order loaded into system HASHBUCKET *apbkt[1]; // array of bucket pointers. } FONTHASH; #define FONTHASH_ID 0x48534148 class EFSOBJ; /*********************************Class************************************\ * class FHOBJ * * Public Interface: * * History: * 06-Aug-1992 00:38:11 by Gilman Wong [gilmanw] * Added phpfeEnumNext(), bMapperGoNext(), bEnumGoNext(), bScanLists(). * * Sun 19-Apr-1992 09:32:23 by Kirk Olynyk [kirko] * Wrote it. \**************************************************************************/ class FHOBJ { public: FONTHASH **ppfh; FONTHASH *pfh; COUNT cLists() { return ((COUNT) pfh->cUsed); } // Search for the given string in the hash table, return the bucket // and index. HASHBUCKET *pbktSearch(const WCHAR * pwsz,UINT *pi,PUNIVERSAL_FONT_ID pufi = NULL, BOOL bIsEquiv = FALSE); // Initialize the FONTHASH. VOID vInit(FONTHASHTYPE,UINT); // Return the type. FONTHASHTYPE fht() {return(pfh->fht);} // Returns pointer to string that the PFEOBJ is hashed on. PWSZ pwszName(PFEOBJ& pfeo) { return((pfh->fht == FHT_FAMILY) ? pfeo.pwszFamilyName() : pfeo.pwszFaceName()); } // Constructors and destructors. FHOBJ() {} FHOBJ(FONTHASH **ppfh_) { ppfh = ppfh_; pfh = *ppfh; } ~FHOBJ() {}; // Insert and delete PFEs from the hash table. BOOL bInsert(PFEOBJ&); VOID vDelete(PFEOBJ&); // Add/Delete pfe link only from one hash bucket, // add/delete bucket itself when appropriate BOOL bAddPFELink(HASHBUCKET *, UINT, WCHAR *, PFEOBJ&, BOOL bEquiv); VOID vDeletePFELink(HASHBUCKET *, UINT, PFEOBJ&); // Delete the hash table. VOID vFree(); // Validate the FHOBJ. BOOL bValid() { #if DBG if (ppfh && *ppfh) { ASSERTGDI(pfh->id == FONTHASH_ID,"GDISRV::FHOBJ bad id\n"); return(TRUE); } else return(FALSE); #else return (ppfh && *ppfh); #endif } // Fill the EFOBJ with data from hash table. BOOL bScanLists(EFSOBJ *pefso, ULONG iEnumType, EFFILTER_INFO *peffi); BOOL bScanLists(EFSOBJ *pefso, PWSZ pwszName, ULONG iEnumType, EFFILTER_INFO *peffi); #if DBG VOID vPrint(VPRINT); #endif }; /*********************************Class************************************\ * class ENUMFHOBJ : public FHOBJ * * Identical to FHOBJ except that it contains methods for enumeration & of every single font on the list * * History: * Mon 08-Mar-1993 10:20:59 by Kirk Olynyk [kirko] * Wrote it. \**************************************************************************/ class ENUMFHOBJ : public FHOBJ { public: PFELINK *ppfelCur; // current font link HASHBUCKET *pbktCur; // current hash bucket ENUMFHOBJ(FONTHASH **ppfh_) : FHOBJ(ppfh_) { ppfelCur = NULL; pbktCur = (HASHBUCKET*) NULL; } ENUMFHOBJ() {}; PFE* ENUMFHOBJ::ppfeFirst() { PFE *ppfeRet = NULL; if (pbktCur = pfh->pbktFirst) { ppfelCur = pbktCur->ppfelEnumHead; } if (ppfelCur) ppfeRet = ppfelCur->ppfe; return ppfeRet; } PFE* ENUMFHOBJ::ppfeNext() { // // I know that all fonts are inserted into the FAMILY list // PFE *ppfeRet = NULL; if ((ppfelCur = ppfelCur->ppfelNext) == NULL) { if (pbktCur = pbktCur->pbktNext) { ppfelCur = pbktCur->ppfelEnumHead; } } if (ppfelCur) ppfeRet = ppfelCur->ppfe; return ppfeRet; } }; #define ASSERTPFEO(pfeo) ASSERTGDI(pfeo.bValid(),"GDISRV!FONTHASH::iSearch -- invalid PFEOBJ\n") /*********************************Class************************************\ * class FHMEMOBJ : public FHOBJ * * Public Interface: * * History: * Sun 19-Apr-1992 09:36:17 by Kirk Olynyk [kirko] * Wrote it. \**************************************************************************/ class FHMEMOBJ : public FHOBJ { public: FHMEMOBJ ( FONTHASH **ppfhNew, FONTHASHTYPE fht_, UINT count ); }; /*********************************Class************************************\ * struct EFENTRY * * Used to form a list of PFEs to enumerate. We store the real handles * rather than pointers because PFEs can disappear while processing * the enumeration callbacks. So we need to use handles to validate that * the PFEs accumulated into the EFSTATE is still valid. * * History: * 07-Aug-1992 -by- Gilman Wong [gilmanw] * Wrote it. \**************************************************************************/ #endif // GDIFLAGS_ONLY used for gdikdx #define FJ_FAMILYOVERRIDE 1 #define FJ_CHARSETOVERRIDE 2 #ifndef GDIFLAGS_ONLY // used for gdikdx typedef struct _EFENTRY /* efe */ { HPFEC hpfec; // Handle to PFE to enumerate. ULONG iFont; // Index of PFE in ENUMFONTSTYLE efsty; // style classification (used only for EnumFonts()) BYTE fjOverride; // override family and/or charset BYTE jCharSetOverride; // only used in case of EnumFontFamiliesEx USHORT iOverride;// index into substitution table } EFENTRY; /*********************************Class************************************\ * class EFSTATE : public OBJECT * * Font enumeration state. This object is used to store a list of HPFE * handles that represent the set of fonts that will be enumerated. This * object also saves state information used to "chunk" or "batch" this data * across the client-server interface. * * It is a first class engine object so that if the client crashes, the * process termination cleanup code will automatically clean up any loose * EFSTATs lying around. This is necessary because the callback mechanism * of the EnumFonts() and EnumFontFamilies() doesn't not allow us to * guarantee that the EFSTATE will always be destroyed within the context * of the API call. * * History: * 07-Aug-1992 -by- Gilman Wong [gilmanw] * Wrote it. \**************************************************************************/ class EFSTATE : public OBJECT /* efs */ { public: // This pointer is normally NULL, but if an alternate name (facename // substitution via the [FontSubstitutions] section of WIN.INI) is // used then this pointer will reference the alternate name string. // That is, if there is a line // face1,charset1=face2,charset2 // in [FontSubstitutions], font will be enumerated as face1,charset1 // even though the metrics etc returned will correspond to face2,charset2 FONTSUB * pfsubOverride; // enum type: EnumFonts, EnumFontFamilies or EnumFontFamiliesEx ULONG iEnumType; // Pointers that identify ranges of either engine font handles or // device font handles. (The handles in these ranges are actually // handles to the heads of linked lists of PFEs that are either // engine or device fonts). // [GilmanW] 07-Aug-1992 Please don't delete the comment below. // // The use of pointers here is a slight optimization. However, if the // handle manager is rewritten so that objects may move in the handle // manager's heap, then these should be replaced with either indices or // PTRDIFFS. EFENTRY *pefeDataEnd; // new EFENTRYs are inserted into ahpfe here EFENTRY *pefeBufferEnd; // end of aefe array EFENTRY *pefeEnumNext; // next EFENTRY in aefe array to be enumerated // size of all ENUMFONTDATA structures needed to enumerate all pfe's // associated with this EFSTATE ULONG cjEfdwTotal; // Array of EFENTRYs to enumerate. EFENTRY aefe[1]; }; typedef EFSTATE *PEFSTATE; #define PEFSTATENULL ((PEFSTATE) NULL) /*********************************Class************************************\ * class EFSOBJ * * User object for the EFSTATE object. * * Public Interface: * * History: * 07-Aug-1992 -by- Gilman Wong [gilmanw] * Wrote it. \**************************************************************************/ class EFSOBJ /* efo */ { friend BOOL bSetEFSTATEOwner(HEFS hefs, // PFEOBJ.CXX ULONG lPid); protected: PEFSTATE pefs; public: // Constructor -- locks EFSTATE object. EFSOBJ(HEFS hefs) {pefs = (PEFSTATE) HmgLock((HOBJ)hefs,EFSTATE_TYPE);} EFSOBJ() {} // Destructor -- unlock EFSTATE object. ~EFSOBJ() {if (pefs != PEFSTATENULL) {DEC_EXCLUSIVE_REF_CNT(pefs);}} // bValid -- returns TRUE if lock successful. BOOL bValid() { return (pefs != PEFSTATENULL); } // bDelete -- deletes the EFSTATE object. VOID vDeleteEFSOBJ(); // PFEOBJ.CXX // get the enumeration type ULONG iEnumType() {return pefs->iEnumType;} // hefs -- return the handle to the EFSTATE object. HEFS hefs() { return((HEFS) pefs->hGet()); } // cefe -- return the number of EFENTRYs in the enumeration. // Sundown truncation ULONG cefe() { return (ULONG)(pefs->pefeDataEnd - pefs->aefe); } // cjEfdw -- total size of enumeration data needed ULONG cjEfdwTotal() { return pefs->cjEfdwTotal; } // bEmpty -- return TRUE if no EFENTRYs in the enumeration. BOOL bEmpty() { return (pefs->pefeDataEnd == pefs->aefe); } // pefeEnumNext -- return next EFENTRY to enumerate (NULL if no more). EFENTRY *pefeEnumNext() { EFENTRY *pefeRet = (pefs->pefeEnumNext < pefs->pefeDataEnd) ? pefs->pefeEnumNext : (EFENTRY *) NULL; pefs->pefeEnumNext++; return pefeRet; } // vUsedAltName -- tells EFSTATE that an alternate name was used to enumerate. VOID vUsedAltName(FONTSUB *pfsub_) {pefs->pfsubOverride = pfsub_;} // pwszFamilyOverride -- returns the alternate name (NULL if there is none). PWSZ pwszFamilyOverride() { return pefs->pfsubOverride ? (PWSZ)pefs->pfsubOverride->awchOriginal : NULL; } BYTE jCharSetOverride() { return pefs->pfsubOverride ? pefs->pfsubOverride->fcsFace.jCharSet : DEFAULT_CHARSET; } // this is false if no substitution or if charset is not specified BOOL bCharSetOverride() { if (pefs->pfsubOverride && !(pefs->pfsubOverride->fcsFace.fjFlags & FJ_NOTSPECIFIED)) return TRUE; else return FALSE; } // bGrow -- expand the EFSTATE object. BOOL bGrow(COUNT cefeMinIncrement); // PFEOBJ.CXX // bAdd -- add new entries to the font enumeration // few flags added to indicate which font need to be added in enumeration // FL_ENUMFAMILIES flag is set to indicate that all names from // [FontSubstitutes] section of the registry whose alternate name is equal // to the family name of this physical font should be added to enumeration. // This supports new multilingual behavior of EnumFontFamilies when no family // name is passed to the funciton #define FL_ENUMFAMILIES 1 // added to support the new win95 api EnumFontFamiliesEx. If FL_ENUMFAMILIESEX // flag is set and lfCharSet == DEFAULT_CHARSET, // the same physical font should be added to enumeration // as many times as there are multiple charsets supported in this font. // However, if lfCharSet != DEFAULT_CHARSET, the font should be added // to enumeration iff it supports this particular charset. #define FL_ENUMFAMILIESEX 2 BOOL bAdd ( // PFEOBJ.CXX PFE *ppfe, ENUMFONTSTYLE efsty, FLONG fl=0, ULONG lfCharSet = DEFAULT_CHARSET ); }; /*********************************Class************************************\ * class EFSMEMOBJ : public EFSOBJ * * Memory object for physical font entries. * * Public Interface: * * EFSMEMOBJ (COUNT chpfe); // allocate EFSTATE * ~EFSMEMOBJ () // destructor * * BOOL bValid () // validator * VOID vKeepIt () // preserve memory object * VOID vInit () // initialize EFSTATE * * History: * 29-Oct-1990 -by- Gilman Wong [gilmanw] * Wrote it. \**************************************************************************/ #define EFSMO_KEEPIT 0x0002 class EFSMEMOBJ : public EFSOBJ /* efsmo */ { public: // Contructors -- Allocate memory for the objects and lock. EFSMEMOBJ (COUNT cefe, ULONG iEnumType_); // PFEOBJ.CXX // Destructor -- Unlock object. ~EFSMEMOBJ (); // PFEOBJ.CXX // vKeepIt -- Prevent destructor from deleting PFT. VOID vKeepIt () { fs |= EFSMO_KEEPIT; } // vInit -- Initialize the EFSTATE. VOID vInit (COUNT cefe, ULONG iEnumType_); // PFEOBJ.CXX // vXerox -- copy the aefe table. VOID vXerox(EFSTATE *pefsSrc); // PFEOBJ.CXX private: FSHORT fs; }; PFE *ppfeGetPFEFromUFI ( PUNIVERSAL_FONT_ID pufi, BOOL bPrivate, BOOL bCheckProccess); #endif // GDIFLAGS_ONLY used for gdikdx #endif