Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

717 lines
23 KiB

  1. /******************************Module*Header*******************************\
  2. * Module Name: pffobj.hxx
  3. *
  4. * The physical font file (PFF) user object, and memory objects.
  5. *
  6. * The physical font file object:
  7. * ------------------------------
  8. *
  9. * o represents the IFI font file
  10. *
  11. * o stores UNICODE filename of the font
  12. *
  13. * o stores the HFF used by the IFI driver to identify a font file
  14. *
  15. * o a single PFF is used to represent each device and its fonts
  16. * (treated as if all device fonts were in a single file)
  17. *
  18. * o caches the driver used to access the file
  19. *
  20. * o HFDEV for IFI fonts
  21. *
  22. * o HLDEV for device fonts
  23. *
  24. * o has counts of total RFONTs using this PFF
  25. *
  26. * o needed when deleting a font
  27. *
  28. * o all the RFONTs must be inactive (i.e., not mapped to any
  29. * logical font currently selected into a DC) for deletion
  30. *
  31. * o provides the PFTOBJ with methods to support loading and removing
  32. * fonts as well as enumeration
  33. *
  34. * if private font tables are added to the system, a count of
  35. * PFTs should be added to this
  36. *
  37. * Created: 11-Dec-1990 09:29:58
  38. * Author: Gilman Wong [gilmanw]
  39. *
  40. * Copyright (c) 1990-1999 Microsoft Corporation
  41. *
  42. \**************************************************************************/
  43. #ifndef _PFFOBJ_
  44. #define _PFFOBJ_
  45. #ifndef GDIFLAGS_ONLY // used for gdikdx
  46. /*********************************Class************************************\
  47. * REGHASHBKT
  48. *
  49. * Used to contsruct a hash table that contains all the registry font entries.
  50. * At logoff time we can quickly determine whether a font is permanent or
  51. * not by looking it up in the hash table.
  52. *
  53. *
  54. * History:
  55. * 07-Jul-1994 -by- Gerrit van Wingerden [gerritv]
  56. * Wrote it.
  57. \**************************************************************************/
  58. #if 0
  59. typedef struct tagRHB
  60. {
  61. LPWSTR pwszPath; // complete path (if it exists) of file in this bucket
  62. LPWSTR pwszBareName; // bare file name of file in this bucket
  63. tagRHB *pRHB; // next bucket in this slot (for collisions)
  64. } REGHASHBKT;
  65. #endif
  66. /*********************************Class************************************\
  67. * class PFFCLEANUP
  68. *
  69. * Resources associated with a font file that need to be released or unloaded
  70. * when removing a font file from the system. We've got this stuff stored
  71. * here because we need to call the driver to release these things outside
  72. * of the semaphore used to protect PFF deletion.
  73. *
  74. * History:
  75. * 08-Mar-1993 -by- Gilman Wong [gilmanw]
  76. * Wrote it.
  77. \**************************************************************************/
  78. class PFFCLEANUP /* pffc */
  79. {
  80. public:
  81. HDEV hdev;
  82. HFF hff;
  83. PFF *pPFFClone;
  84. };
  85. #endif // GDIFLAGS_ONLY used for gdikdx
  86. // following flags are defined in wingdi.h
  87. //#define FR_PRIVATE 0x10
  88. //#define FR_NOT_ENUM 0x20
  89. // FR_PRINT_EMB_FONT is used internally to indicate that the current process
  90. // has used the private/embedded font for local printing
  91. #define FR_PRINT_EMB_FONT 0x40
  92. #ifndef GDIFLAGS_ONLY // used for gdikdx
  93. // Data used for private font list
  94. typedef struct tagPvtData
  95. {
  96. COUNT cPrivate; // private load count
  97. COUNT cNotEnum; // cound for FR_PRIVATE | FR_NOT_ENUM
  98. ULONG fl; // FR_PRIVATE, FR_PRIVATE | FR_NOT_ENUM, FRW_EMB_PID, FRW_EMB_TID, FR_PRINT_EMB_FONT (local printing only)
  99. DWORD dwID; // PID or TID
  100. struct tagPvtData *pPvtDataNext; // next data
  101. }PVTDATA, PPVTDATA;
  102. #endif // GDIFLAGS_ONLY used for gdikdx
  103. // GS_EXTENDED is used only for device symbol font
  104. // if its glyphset doesn't contain unicode range [f020, f0ff]
  105. #define GS_EXTENDED 0X00000010
  106. /*********************************Class************************************\
  107. * class PFF
  108. *
  109. * Physical font file (PFF) object
  110. *
  111. * flState Represents state of font file.
  112. *
  113. * State Descriptipn
  114. * =======================================================
  115. * PFF_STATE_READY2DIE
  116. * set if this file has been
  117. * unloaded from the API point of
  118. * view (i.e., cLoaded has been
  119. * decremented to 0), but some
  120. * one is still using a realization
  121. * of a font from this file.
  122. *
  123. * PFF_STATE_PERMANENT_FONT
  124. * this is either a stock font or a console font or
  125. * a font which is not a remote font (see below) and is
  126. * listed in the registry.
  127. * These fonts should not be removed at logoff time,
  128. *
  129. * PFF_STATE_NETREMOTE_FONT
  130. * this font is somewhere on the net, or to be precise
  131. * on one of the drives that do not have permanent drive
  132. * letter assignments. That is, different users may refer
  133. * to those drives by a different drive letters.
  134. *
  135. * PFF_STATE_MEMORY_FONT
  136. * this font is added to the system through a pointer,
  137. * font should be removed when the process terminates.
  138. *
  139. * PFF_STATE_DCREMOTE_FONT
  140. * added temporarily via AddRemoteFontToDC for during the
  141. * print job, different from PFF_STATE_REMOTE_FONT
  142. * this font is always associated with particular DC
  143. *
  144. * cLoaded Count of the number of times the engine has been
  145. * requested to load the font file
  146. *
  147. * cNotEnum Count of the number of times that engine has been requested
  148. * to load the font file as "Don't Enumerate"
  149. *
  150. * cRFONT The total number of RFONTs using this physical font file.
  151. *
  152. * ufd Union which represents the driver used to access the font.
  153. * If the font is an IFI font, then ufd is an HFDEV.
  154. * If the font is a device font, then ufd is an HLDEV.
  155. *
  156. * Along with lhFont, this is enough to make glyph queries.
  157. *
  158. * hff The handle by which the font driver identifies a loaded
  159. * font file.
  160. *
  161. * hdev This is 0 if PFF represents an IFI font file.
  162. * If it is not 0, then this is the physical
  163. * device handle and the PFF encapsulates the device fonts
  164. * of this physical device.
  165. *
  166. * dhpdev Device handle of the physical device for which this PFF
  167. * was created. Only used with device fonts
  168. *
  169. * cFonts Number of fonts (i.e., HPFEs) stored in the data buffer.
  170. *
  171. * aulData Data buffer used to store a table of HPFEs representing
  172. * the fonts in this font file, and the font file's
  173. * UNICODE pathname (path + filename).
  174. *
  175. * ___________________
  176. * | |
  177. * | |
  178. * | HPFE table |
  179. * | |
  180. * |_________________|
  181. * | | <-- (PWSZ) &(aulData[cFonts])
  182. * | |
  183. * | Pathname |
  184. * | |
  185. * | (NULL |
  186. * | terminated) |
  187. * | |
  188. * |_________________|
  189. * | |
  190. * | DesignVector |
  191. * | (if present) | // only there for mm instances
  192. * |_________________|
  193. *
  194. *
  195. * History:
  196. * Tue 09-Nov-1993 -by- Patrick Haluptzok [patrickh]
  197. * Remove from handle manager
  198. *
  199. * 10-Dec-1990 -by- Gilman Wong [gilmanw]
  200. * Wrote it.
  201. \**************************************************************************/
  202. #define PFF_STATE_READY2DIE 0x01
  203. #define PFF_STATE_PERMANENT_FONT 0x02
  204. #define PFF_STATE_NETREMOTE_FONT 0x04
  205. #define PFF_STATE_EUDC_FONT 0x08
  206. #define PFF_STATE_MEMORY_FONT 0x10
  207. #define PFF_STATE_DCREMOTE_FONT 0x20
  208. #define PFF_STATE_SYNTH_FONT 0x40
  209. #ifndef GDIFLAGS_ONLY // used for gdikdx
  210. class PFT;
  211. extern PFT *gpPFTPrivate;
  212. class PFF
  213. {
  214. public:
  215. SIZE_T sizeofThis;
  216. // connects PFF's sharing the same hash bucket
  217. PFF *pPFFNext;
  218. PFF *pPFFPrev;
  219. // pwszPathname_ points to the Unicode upper case path
  220. // name of the associated font file which is stored at the
  221. // end of the data structure.
  222. PWSZ pwszPathname_;
  223. ULONG cwc; // total for all strings
  224. ULONG cFiles; // # of files associated with this font
  225. DESIGNVECTOR *pdv_; // if present at all stored after pathname
  226. ULONG cjDV_; // sizeof DESIGNVECTOR, somewhat redundant
  227. // state
  228. FLONG flState; // state (ready to die?)
  229. COUNT cLoaded; // load count
  230. COUNT cNotEnum; // load count for "not enum"
  231. COUNT cRFONT; // total number of RFONTs
  232. // RFONT list
  233. RFONT *prfntList; // pointer to head of doubly linked list
  234. // driver information
  235. HFF hff; // font driver handle to font file
  236. HDEV hdev; // physical device handle
  237. DHPDEV dhpdev; // device handle of PDEV
  238. FONTHASH *pfhFace; // face name hash table for this device
  239. FONTHASH *pfhFamily; // face name hash table for this device
  240. FONTHASH *pfhUFI; // UFI hash table for this device
  241. PFT *pPFT; // pointer to the PFT that contains this entry
  242. ULONG ulCheckSum; // checksum info used for UFI's
  243. #ifdef LANGPACK
  244. UINT uUniqueness;
  245. #endif
  246. // fonts in this file (and filename slimed in)
  247. COUNT cFonts; // number of fonts (same as chpfe)
  248. PFONTFILEVIEW *ppfv; // array of cFiles pointers to FILEVIEW structures
  249. // embeding information
  250. PVTDATA *pPvtDataHead; // private font data link list
  251. PFF *pPFFClone;
  252. // collection of PFE
  253. PFEC *pPFEC;
  254. ULONG_PTR aulData[1]; // data buffer for HPFE and filename
  255. };
  256. /*********************************Class************************************\
  257. * class PFFOBJ
  258. *
  259. * User object for physical font files.
  260. *
  261. * History:
  262. * Tue 09-Nov-1993 -by- Patrick Haluptzok [patrickh]
  263. * Remove from handle manager
  264. *
  265. * 11-Dec-1990 -by- Gilman Wong [gilmanw]
  266. * Wrote it.
  267. \**************************************************************************/
  268. class PUBLIC_PFTOBJ;
  269. class PFFOBJ /* pffo */
  270. {
  271. #ifdef LANGPACK
  272. // system wide uniqueness value
  273. static UINT uGlobalUniqueness;
  274. #endif
  275. friend PFE *ppfeGetAMatch // FONTMAP.CXX
  276. (
  277. XDCOBJ& dco ,
  278. ENUMLOGFONTEXDVW *pelfwWishSrc ,
  279. PWSZ pwszFaceName ,
  280. ULONG ulMaxPenalty ,
  281. FLONG fl ,
  282. FLONG *pflSim ,
  283. POINTL *pptlSim ,
  284. FLONG *pflAboutMatch
  285. );
  286. friend class MAPPER;
  287. friend HEFS hefsDeviceAndEngine (
  288. PWSZ pwszName,
  289. BOOL bEnumFonts,
  290. EFFILTER_INFO *peffi,
  291. PUBLIC_PFTOBJ &pfto,
  292. PFFOBJ &pffoDevice,
  293. PDEVOBJ &pdo,
  294. ULONG *pulCount
  295. );
  296. public:
  297. PFF *pPFF; // pointer to PFF object
  298. PFFOBJ(PFF *pPFFNew) {pPFF = pPFFNew;}
  299. PFFOBJ() {}
  300. ~PFFOBJ() {}
  301. // bValid -- Returns TRUE if lock successful.
  302. BOOL bValid () { return(pPFF != NULL); }
  303. // bDeleteLoadRef -- Decrements the load count and returns TRUE if caller
  304. // should delete PFF.
  305. BOOL bDeleteLoadRef (ULONG fl, PVTDATA *pPvtData, BOOL *pbWrongFlags); // PFFOBJ.CXX
  306. // bDeleteRFONTRef -- Decrements the RFONT count and, if RFONT count reaches
  307. // zero and PFF in READY2DIE state, calls bDelete.
  308. BOOL bDeleteRFONTRef (); // PFFOBJ.CXX
  309. // bAddHash -- Adds the PFF's set of PFEs to the font hash tables
  310. // (used for font mapping and enumeration).
  311. BOOL bAddHash(BOOL bEUDC); // PFFOBJ.CXX
  312. // vRemoveHash -- Removes the PFF's set of PFEs from the font hash tables.
  313. VOID vRemoveHash(); // PFFOBJ.CXX
  314. // vPFFC_Delete -- Deletes the PFF and PFEs, while preserving the information
  315. // that must be passed to the driver to complete the font file
  316. // unload (saved in PFFCLEANUP structure).
  317. //
  318. // Changed so that it does not return a pointer to a PFFCLEANUP
  319. // structure. Instead, it takes a pointer to a PFFCLEANUP
  320. // structure as an argument. Thus, the caller must allocate
  321. // and free the memory to the PFFCLEANUP structure. [dchinn 11/24/98]
  322. VOID vPFFC_Delete(PFFCLEANUP *pPFFC); // PFFOBJ.CXX
  323. // vPFFC_DeleteAndCleanup -- Functionally, this method does what vPFFC_Delete does,
  324. // except that if there are more than CFONTS_PFFCLEANUP fonts in the
  325. // font file, the PFFCLEANUP structure is declared as a local
  326. // variable (so that the memory is on the stack). Also, it calls
  327. // vCleanupFontFile. [dchinn 11/24/98]
  328. VOID vPFFC_DeleteAndCleanup (); // PFFOBJ.CXX
  329. PFF *pPFFGet() { return(pPFF); }
  330. // bDeviceFonts -- Returns TRUE is this is a PFF that encapsulates a set of
  331. // device specific fonts. We can only get glyph metrics from
  332. // such fonts.
  333. BOOL bDeviceFonts () { return(pPFF->hff == HFF_INVALID); }
  334. // bDead -- Returns TRUE if the font is in a READY2DIE state.
  335. BOOL bDead () { return(pPFF->flState & PFF_STATE_READY2DIE); }
  336. // determines if the font should stay loaded after logoff and before logon
  337. BOOL bPermanent();
  338. // returns TRUE if remote font
  339. BOOL bNetRemote() { return(pPFF->flState & PFF_STATE_NETREMOTE_FONT); }
  340. // return true if the font is added temporarily for printing purposes
  341. BOOL bDCRemote() { return(pPFF->flState & PFF_STATE_DCREMOTE_FONT); }
  342. // returns TRUE if the font is loaded to the system through a pointer
  343. BOOL bMemFont() { return(pPFF->flState & PFF_STATE_MEMORY_FONT); }
  344. // Return the checksum for this font file.
  345. ULONG ulCheckSum() { return(pPFF->ulCheckSum); }
  346. // vKill -- Puts font in a "ready to die" state.
  347. // vRevive -- Clears the "ready to die" state.
  348. VOID vKill (); // PFFOBJ.CXX
  349. VOID vRevive (); // PFFOBJ.CXX
  350. #ifdef FE_SB
  351. // bEUDC -- Returns TRUE if font was loaded as an EUDC font or FALSE otherwise.
  352. BOOL bEUDC () { return(pPFF->flState & PFF_STATE_EUDC_FONT); }
  353. // vSetEUDC -- Mark this font as EUDC font.
  354. VOID vSetEUDC () { pPFF->flState |= PFF_STATE_EUDC_FONT; }
  355. // ppfeEUDCGet() -- Gets EUDC pfes (for Normal and Vertical face)
  356. VOID vGetEUDC (PEUDCLOAD pEudcLoadData); // flinkgdi.cxx
  357. #endif
  358. // hff -- Return IFI font file handle (NULL for device fonts).
  359. HFF hff () { return(pPFF->hff); }
  360. // hpdev -- Return HPDEV (NULL for IFI font files)
  361. HDEV hdev () { return(pPFF->hdev); }
  362. // dhpdev -- Return DHPDEV (NULL for IFI font files)
  363. DHPDEV dhpdev () { return pPFF->dhpdev; }
  364. // ppfe -- Return an HPFE handle from the table by index.
  365. PFE *ppfe (ULONG iFont) { return(((PFE **) (pPFF->aulData))[iFont]); }
  366. // Return internal PFE table statistics.
  367. COUNT cFonts () { return(pPFF->cFonts); }
  368. COUNT cLoaded () { return(pPFF->cLoaded); }
  369. VOID vSet_cLoaded(COUNT c) { pPFF->cLoaded = c; }
  370. COUNT cNotEnum() { return(pPFF->cNotEnum); }
  371. VOID vSet_cNotEnum(COUNT c) { pPFF->cNotEnum = c; }
  372. FONTFILEVIEW **ppfvGet() { return pPFF->ppfv; }
  373. // vLoadIncr -- Increment the load count.
  374. VOID vLoadIncr (ULONG flEmbed)
  375. {
  376. (flEmbed & FR_NOT_ENUM) ? pPFF->cNotEnum++ : pPFF->cLoaded++;
  377. // May be neccessary to resurrect PFF if it had previously been in a ready
  378. // to die state.
  379. vRevive();
  380. }
  381. // design vector
  382. DESIGNVECTOR *pdv() {return pPFF->pdv_;}
  383. ULONG cjDV() {return pPFF->cjDV_;}
  384. // bInPrivatePFT() -- PFF in Private or Public PFT
  385. BOOL bInPrivatePFT() { return(pPFF->pPFT == gpPFTPrivate); }
  386. // pPvtDataHeadGet() -- Get the pPvtDataHead pointer
  387. PVTDATA *pPvtDataHeadGet() { return(pPFF->pPvtDataHead); }
  388. // ppPvtDataMatch() -- Used to find whether the current process has a PvtData
  389. PVTDATA *pPvtDataMatch(); //PFFOBJ.CXX
  390. // bAddPvtData -- Add PvtData block to the pPvtDataHead link list
  391. BOOL bAddPvtData(ULONG flEmbed); //PFFOBJ.CXX
  392. // bRemovePvtData -- Remove the PvtData block when cPrivate== 0
  393. BOOL bRemovePvtData(PVTDATA *pPvtData); //PFFOBJ.CXX
  394. // vAddRefFromRFONT -- Increment the RFONT count.
  395. VOID vAddRFONTRef () { pPFF->cRFONT++; }
  396. // cRFONT -- Return the RFONT count.
  397. COUNT cRFONT() { return pPFF->cRFONT; }
  398. // pwszPathname -- Return a pointer to the font file's pathname (UNICODE).
  399. PWSZ pwszPathname() {return(pPFF->pwszPathname_);}
  400. PWSZ pwszCalcPathname() { return((PWSZ) &(((PFE **) pPFF->aulData)[pPFF->cFonts])); }
  401. // cNumFiles -- return the count of files associated with this font
  402. COUNT cNumFiles() {return(pPFF->cFiles);}
  403. COUNT cSizeofPaths() {return(pPFF->cwc);} // size of path in WCHARS includes
  404. // NULL terminators
  405. // prfntList -- Return/set head of RFONT list.
  406. RFONT *prfntList() { return(pPFF->prfntList); }
  407. RFONT *prfntList(RFONT *prfntNew) { return(pPFF->prfntList = prfntNew); }
  408. // pfhFace -- Return face name font hash table.
  409. FONTHASH *pfhFace() { return pPFF->pfhFace; }
  410. // pfhFamily -- Return family name font hash table.
  411. FONTHASH *pfhFamily() { return pPFF->pfhFamily; }
  412. #ifdef LANGPACK
  413. // uUniqueness -- return uniqueness value for the PFF obj
  414. UINT uUniqueness() { return(pPFF->uUniqueness); }
  415. // vSetUniqueness -- set uniqueness assumes this call is being
  416. // protected by a global semaphore
  417. void vSetUniqueness() {pPFF->uUniqueness = PFFOBJ::uGlobalUniqueness++;}
  418. #endif
  419. // vGetHPFE, bCreateHPFE and vDeleteHPFE
  420. BOOL bCreatePFEC(ULONG cFonts);
  421. VOID vDeletePFEC(PVOID *ppvPFE);
  422. PFEC * pfec() {return (pPFF->pPFEC);}
  423. // vDump -- Print internals for debugging.
  424. VOID vDump (); // PFFOBJ.CXX
  425. };
  426. typedef PFFOBJ *PPFFOBJ;
  427. /******************************Class***************************************\
  428. * PFFREFOBJ *
  429. * *
  430. * Holds up a reference to a PFF while the global PFT semaphore is not *
  431. * being held. Keeps the reference only if told to. *
  432. * *
  433. * Sun 27-Dec-1992 10:40:48 -by- Charles Whitmer [chuckwh] *
  434. * Wrote it. *
  435. \**************************************************************************/
  436. class PFFREFOBJ : public PFFOBJ
  437. {
  438. public:
  439. BOOL bKeepIt;
  440. PFFREFOBJ() {pPFF = (PFF *) NULL;}
  441. void vInitRef(PFF *pPFFNew)
  442. {
  443. // Caller must hold the ghsemPublicPFT which protects the ref. counts.
  444. pPFF = (PFF *) pPFFNew;
  445. vAddRFONTRef();
  446. bKeepIt = FALSE;
  447. }
  448. ~PFFREFOBJ()
  449. {
  450. if ((pPFF != (PFF *) NULL) && !bKeepIt)
  451. bDeleteRFONTRef();
  452. }
  453. void vKeepIt() {bKeepIt = TRUE;}
  454. };
  455. /*********************************Class************************************\
  456. * class PFFMEMOBJ : public PFFOBJ
  457. *
  458. * Memory object for physical font tables.
  459. *
  460. * Public Interface:
  461. *
  462. * PFFMEMOBJ () // allocate default size PFF
  463. * PFFMEMOBJ (SIZE cjSize); // allocate non-default size PFF
  464. * ~PFFMEMOBJ () // destructor
  465. *
  466. * BOOL bValid () // validator
  467. * VOID vKeepIt () // preserve memory object
  468. * VOID vInit ( // initialize object
  469. * BOOL bLoadFontFileTable ( // load up the PFF table
  470. * BOOL bLoadDeviceFontTable ( // load up the PFF table with device
  471. * BOOL bAddEntry ( // add PFE entry to table
  472. *
  473. * History:
  474. * Tue 09-Nov-1993 -by- Patrick Haluptzok [patrickh]
  475. * Remove from handle manager
  476. *
  477. * 11-Dec-1990 -by- Gilman Wong [gilmanw]
  478. * Wrote it.
  479. \**************************************************************************/
  480. #define PFFMO_KEEPIT 0x0002
  481. class PDEVOBJ;
  482. class PFFMEMOBJ : public PFFOBJ /* pffmo */
  483. {
  484. public:
  485. // Constructors -- Allocate memory for PFF objects and lock.
  486. PFFMEMOBJ ();
  487. PFFMEMOBJ(
  488. unsigned cFonts
  489. , PWSZ pwszUpperCasePath
  490. , ULONG cwc
  491. , ULONG cFiles
  492. , DESIGNVECTOR *pdv
  493. , ULONG cjDV
  494. , HFF hffFontFile
  495. , HDEV hdevDevice
  496. , DHPDEV dhpdevDevice
  497. , PFT *ppftParent
  498. , FLONG fl
  499. , FLONG flEmbed
  500. , PFNTCHECKSUM pCheckSum
  501. , PFONTFILEVIEW *ppfv
  502. , PUNIVERSAL_FONT_ID pufi // This can only be !NULL for remote printing
  503. );
  504. PFFMEMOBJ(PFF *pPFF, FLONG fl, FLONG flEmbed, PFT *ppftParent);
  505. // Destructor -- Unlocks PFF object.
  506. ~PFFMEMOBJ (); // PFFOBJ.CXX
  507. // bValid -- Validator which returns TRUE if lock successful.
  508. BOOL bValid () { return(pPFF != NULL); }
  509. // vKeepIt -- Prevent destructor from deleting RFONT.
  510. VOID vKeepIt () { fs |= PFFMO_KEEPIT; }
  511. // bLoadFontFileTable -- Load fonts from font file into table.
  512. BOOL bLoadFontFileTable (
  513. PWSZ pwszPathname
  514. , COUNT cFontsToLoad
  515. , HANDLE hdc
  516. , PUNIVERSAL_FONT_ID pufi // used to indicate PFE_UFIMATCH fonts
  517. #ifdef FE_SB
  518. , PEUDCLOAD pEudcLoadData = (PEUDCLOAD) NULL
  519. #endif
  520. );
  521. // bLoadDeviceFontTable -- Load device fonts into table.
  522. BOOL bLoadDeviceFontTable (PDEVOBJ *ppdo);
  523. // bAddEntry -- Add a PFE handle to the PFF's table.
  524. BOOL bAddEntry (
  525. ULONG iFont
  526. , FD_GLYPHSET *pfdg
  527. , ULONG_PTR idfdg
  528. , PIFIMETRICS pifi
  529. , ULONG_PTR idifi
  530. , HANDLE hdc
  531. , PUNIVERSAL_FONT_ID pufi
  532. #ifdef FE_SB
  533. , PEUDCLOAD pEudcLoadData = (PEUDCLOAD) NULL
  534. #endif
  535. );
  536. FSHORT fs;
  537. };
  538. extern VOID vCleanupFontFile(PFFCLEANUP *pPFFc);
  539. #endif // GDIFLAGS_ONLY used for gdikdx
  540. #endif