/* * Microsoft Confidential * Copyright (C) Microsoft Corporation 1992,1993 * All Rights Reserved. * * * PIFFNTP.H * Private PIFMGR include file * * History: * Created 22-Mar-1993 2:58pm by Jeff Parsons (from vmdosapp\fontutil.h) */ #define PREVIEW_BORDER 1 #define DY_TTBITMAP 12 /* * These parameters control how fast the fdiCache should grow. */ #define FDI_TABLE_START 20 /* Number of entries to start */ #define FDI_TABLE_INC 10 /* Increment in number of slots */ typedef struct tagDISPLAYPARAMETERS { /* dp */ INT dpHorzSize; INT dpVertSize; INT dpHorzRes; INT dpVertRes; INT dpLogPixelsX; INT dpLogPixelsY; INT dpAspectX; INT dpAspectY; INT dpBitsPerPixel; TCHAR szTTFace[2][LF_FACESIZE]; } DISPLAYPARAMETERS; //#define BACKGROUND 0x000000FF /* bright blue */ //#define BACKGROUNDSEL 0x00FF00FF /* bright magenta */ //#define BUTTONFACE 0x00C0C0C0 /* bright grey */ //#define BUTTONSHADOW 0x00808080 /* dark grey */ #define FNTFLAGSFROMID(id) ((id - IDC_RASTERFONTS + 1) << FNT_FONTMASKBITS) #define IDFROMFNTFLAGS(fl) (IDC_RASTERFONTS - 1 + (((fl) & FNT_FONTMASK) >> FNT_FONTMASKBITS)) #if FNTFLAGSFROMID(IDC_RASTERFONTS) != FNT_RASTERFONTS || \ IDFROMFNTFLAGS(FNT_RASTERFONTS) != IDC_RASTERFONTS || \ FNTFLAGSFROMID(IDC_TTFONTS) != FNT_TTFONTS || \ IDFROMFNTFLAGS(FNT_TTFONTS) != IDC_TTFONTS || \ FNTFLAGSFROMID(IDC_BOTHFONTS) != FNT_BOTHFONTS || \ IDFROMFNTFLAGS(FNT_BOTHFONTS) != IDC_BOTHFONTS #error Dialog control IDs and FNT flags values are not compatible #endif /* * IsDlgError * * To simplify error checking, we assume that all *_ERR values are -1 * and all *_ERRSPACE values are -2. * * This also assumes a two's complement number system. * * Entry: * * A return code from a list box or combo box. * * Exit: * * Nonzero if the return code indicated an error of some sort. * Zero if the return code indiated no error. * */ #define B_ERR (-1) #if LB_ERR != B_ERR || LB_ERRSPACE != -2 || \ CB_ERR != B_ERR || CB_ERRSPACE != -2 #error Problem with manifest constants. #endif #define IsDlgError(dw) ((DWORD)(dw) >= (DWORD)(-2)) /* * Low-level macros * * BPFDIFROMREF(lParam) * * These three macros pack and unpack list box reference data. * * bpfdi = based pointer into segCache describing the list box entry * fTrueType = nonzero if the font is a TrueType font * lParam = the reference data * */ #define BPFDIFROMREF(lParam) (BPFDI)(lParam) /* * High-level macros * * These macros handle the SendMessages that go to/from list boxes * and combo boxes. * * The "lcb" prefix stands for "list or combo box". * * Basically, we're providing mnemonic names for what would otherwise * look like a whole slew of confusing SendMessage's. * */ #define lcbFindStringExact(hwnd, fListBox, lpsz) \ (DWORD)SendMessage(hwnd, fListBox ? LB_FINDSTRINGEXACT : CB_FINDSTRINGEXACT, \ (WPARAM)-1, (LPARAM)(LPTSTR)lpsz) #define lcbAddString(hwnd, fListBox, lpsz) \ (DWORD)SendMessage(hwnd, fListBox ? LB_ADDSTRING : CB_ADDSTRING, \ 0, (LPARAM)(LPTSTR)lpsz) #define lcbSetItemDataPair(hwnd, fListBox, w, bpfdi, fIsTrueType) \ if (!IsSpecialBpfdi((BPFDI)bpfdi)) \ ((BPFDI)bpfdi)->bTT = fIsTrueType; \ (DWORD)SendMessage(hwnd, fListBox ? LB_SETITEMDATA : CB_SETITEMDATA, \ (WPARAM)w, (LPARAM)bpfdi) #define lcbGetCount(hwnd, fListBox) \ (DWORD)SendMessage(hwnd, fListBox ? LB_GETCOUNT : CB_GETCOUNT, (WPARAM)0, (LPARAM)0) #define lcbGetCurSel(hwnd, fListBox) \ (DWORD)SendMessage(hwnd, fListBox ? LB_GETCURSEL : CB_GETCURSEL, (WPARAM)0, (LPARAM)0) #define lcbSetCurSel(hwnd, fListBox, w) \ (DWORD)SendMessage(hwnd, fListBox ? LB_SETCURSEL : CB_SETCURSEL, (WPARAM)w, (LPARAM)0) #define lcbGetItemDataPair(hwnd, fListBox, w) \ (DWORD_PTR)SendMessage(hwnd, fListBox ? LB_GETITEMDATA : CB_GETITEMDATA, (WPARAM)w, (LPARAM)0) #define lcbGetBpfdi(hwnd, fListBox, w) \ BPFDIFROMREF(lcbGetItemDataPair(hwnd, fListBox, w)) #define lcbInsertString(hwnd, fListBox, lpsz, i) \ (DWORD)SendMessage(hwnd, fListBox ? LB_INSERTSTRING : CB_INSERTSTRING, \ (WPARAM)i, (LPARAM)(LPTSTR)lpsz) /* * the listbox/combox strings are stored as follows. we use the tabs * to do TabbedTextOut(). The padding is used to keep the sorting right. * TT fonts are distinguished by the hiword of the item data * * String: \t%2d\tx\t%2d * wd ht * * The "Auto" entry is stored as... * * String: \1Auto * * The first character is \1 so that Auto sorts at the top of the list. * (The \1 is not actually displayed.) * */ /* * FONTDIMENINFO * * The distinction between the requested and returned font dimensions is * important in the case of TrueType fonts, in which there is no guarantee * that what you ask for is what you will get. * * Note that the correspondence between "Requested" and "Actual" is broken * whenever the user changes his display driver, because GDI uses driver * parameters to control the font rasterization. * * The fdiHeightReq and fdiWidthReq fields are both zero if the font is * a raster font. * */ typedef struct tagFONTDIMENINFO { /* fdi */ UINT fdiWidthReq; /* Font width requested */ UINT fdiHeightReq; /* Font height requested */ UINT fdiWidthActual; /* Font width returned */ UINT fdiHeightActual; /* Font height returned */ BOOL bTT; /* Font is TT? */ INT Index; /* Index into listbox */ } FONTDIMENINFO, *LPFONTDIMENINFO, *LPFDI; typedef FONTDIMENINFO *BPFDI; typedef UINT CFDI; typedef UINT IFDI; // BILINGUAL stuff #define CLIP_DFA_OVERRIDE 0x40 /* Disable Font Association */ extern CFDI cfdiCache[]; /* # used entries in fdi cache */ extern CFDI cfdiCacheActual[]; /* Total # entries in fdi cache */ /* * BPFDI_CANCEL must be 0xFFFF because that is what DialogBox returns on * failure. */ #define BPFDI_CANCEL (BPFDI)(INT_PTR)(-1) #define BPFDI_AUTO (BPFDI)(INT_PTR)(-2) #define BPFDI_IGNORE (BPFDI)(INT_PTR)(-3) #define IsSpecialBpfdi(bpfdi) ((bpfdi) >= BPFDI_IGNORE) /* This is the maximum size font we will create. */ #define MAX_FONT_HEIGHT 72 /* 72pt = 1inch */ typedef INT PENALTY; /* pnl */ /* * Penalty structures * * Do NOT change these structure definitions unless you know what you're * doing, because the relative order of the values is crucial for proper * reading and writing of the INI file in which they are stored. */ typedef struct tagPENALTYPAIR { /* pnlp */ PENALTY pnlInitial; PENALTY pnlScale; } PENALTYPAIR, *PPENALTYPAIR; typedef struct tagPENALTYLIST { /* pnll */ PENALTYPAIR pnlpOvershoot; PENALTYPAIR pnlpShortfall; } PENALTYLIST, *PPENALTYLIST; #define MINPENALTY (-5000) #define MAXPENALTY 5000 #define SENTINELPENALTY MAXLONG /* Must exceed any legitimate penalty */ #define NUMPENALTIES (SIZEOF(rgpnlPenalties) / SIZEOF(INT)) #define NUMINITIALTTHEIGHTS (SIZEOF(rgwInitialTtHeights) / SIZEOF(WORD)) #define pnllX ((PPENALTYLIST)rgpnlPenalties)[0] #define pnllY ((PPENALTYLIST)rgpnlPenalties)[1] #define pnlTrueType (rgpnlPenalties[8]) /* * These values for FindFontMatch's third argument are magical. * WindowInit uses the funky values (with the exception of FFM_PERFECT) */ #define FFM_BOTHFONTS 0x00000000 #define FFM_RESTRICTED 0x00000001 #define FFM_RASTERFONTS 0x00000001 #define FFM_TTFONTS 0x80000001 #define FFM_PERFECT 0xFFFFFFFF /* * Last but not least, per-dialog data (aka roll-your-own DLL instance data) */ typedef struct FNTINFO { /* fi */ PPROPLINK ppl; // ppl must ALWAYS be the first field BPFDI bpfdi; PROPFNT fntProposed; // The properties to use if the user selects OK PROPWIN winOriginal; // For window preview and auto font selection HFONT hFontPreview; // Used in font preview window BOOL fMax; // Should window preview show as maximized? POINT ptCorner; // Upper-left corner of window UINT uDefaultCp; // System default code page } FNTINFO; typedef FNTINFO *PFNTINFO; /* pfi */ /* * for Font Enumlation */ typedef struct FNTENUMINFO { HWND hwndList; BOOL fListBox; INT CodePage; } FNTENUMINFO; typedef FNTENUMINFO *LPFNTENUMINFO; /* * Internal function prototypes */ BOOL_PTR CALLBACK DlgFntProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); VOID InitFntDlg(HWND hDlg, PFNTINFO pfi); VOID ApplyFntDlg(HWND hDlg, PFNTINFO pfi); BOOL LoadGlobalFontData(void); BOOL LoadGlobalFontEditData(void); VOID FreeGlobalFontEditData(void); VOID CheckDisplayParameters(void); HBITMAP LoadBitmaps(INT id); DWORD GetFlippedSysColor(INT nDispElement); VOID PreviewInit(HWND hDlg, PFNTINFO pfi); VOID PreviewUpdate(HWND hwndList, PFNTINFO pfi); LRESULT WndPreviewWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); VOID WndPreviewPaint(HWND hDlg, HWND hwnd); LRESULT FontPreviewWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); INT WINAPI CreateFontList(HWND hwndList, BOOL fListBox, LPPROPFNT lpFnt); VOID WINAPI DrawItemFontList(BOOL fListBox, const LPDRAWITEMSTRUCT lpdis); BOOL WINAPI MatchCurrentFont(HWND hwndList, BOOL fListBox, LPPROPFNT lpFnt); LONG WINAPI MeasureItemFontList(LPMEASUREITEMSTRUCT lpmi); VOID WINAPI UpdateTTBitmap(void); BOOL AddRasterFontsToFontListA(HWND hwndList, BOOL fListBox, LPCSTR lpszRasterFaceName, INT CodePage); INT CALLBACK RasterFontEnum(ENUMLOGFONTA *lpelf, NEWTEXTMETRICA *lpntm, INT nFontType, LPARAM lParam); BPFDI AddToFontListCache(HWND hwndList, BOOL fListBox, UINT uHeightReq, UINT uWidthReq, UINT uHeightActual, UINT uWidthActual, UINT uCodePage); BOOL AddTrueTypeFontsToFontListA(HWND hwndList, BOOL fListBox, LPSTR lpszTTFaceName, INT CodePage); BPFDI AddOneNewTrueTypeFontToFontListA(HWND hwndList, BOOL fListBox, UINT uWidth, UINT uHeight, LPSTR lpszTTFaceName, INT CodePage); DWORD_PTR GetFont(HWND hwndList, BOOL fListBox, PFNTINFO pfi); void SetFont(LPPROPFNT lpFnt, BPFDI bpfdi); #define AspectScale(n1,n2,m) (UINT)(((UINT)n1*(UINT)m)/(UINT)n2) VOID AspectPoint(LPRECT lprectPreview, LPPOINT lppt); VOID AspectRect(LPRECT lprectPreview, LPRECT lprc); HFONT CreateFontFromBpfdi(BPFDI bpfdi, PFNTINFO pfi); void FontSelInit(void); BPFDI GetTrueTypeFontTrueDimensions(UINT dxWidth, UINT dyHeight, INT CodePage); BPFDI FindFontMatch(UINT dxWidth, UINT dyHeight, LPINT lpfl, INT CodePage); PENALTY ComputePenaltyFromPair(PPENALTYPAIR ppnlp, UINT dSmaller, UINT dLarger); PENALTY ComputePenaltyFromList(PPENALTYLIST ppnll, UINT dActual, UINT dDesired); PENALTY ComputePenalty(UINT cxCells, UINT cyCells, UINT dxClient, UINT dyClient, UINT dxFont, UINT dyFont); BPFDI ChooseBestFont(UINT cxCells, UINT cyCells, UINT dxClient, UINT dyClient, INT fl, INT CodePage);