windows-nt/Source/XPSP1/NT/shell/shell32/piffntp.h
2020-09-26 16:20:57 +08:00

360 lines
12 KiB
C

/*
* 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);
VOID FreeGlobalFontData(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);
INT WINAPI GetItemFontInfo(HWND hwndFontList, BOOL fListBox, HANDLE hProps, LPPROPFNT lpFnt);
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);