windows-nt/Source/XPSP1/NT/enduser/netmeeting/as/h/fh.h
2020-09-26 16:20:57 +08:00

411 lines
11 KiB
C

//
// Font Handler
//
#ifndef _H_FH
#define _H_FH
//
// This is needed to define LPCOM_ORDER
//
#include <oa.h>
//
// Constants.
//
//
// The sent ID field is set up when we copy fonts to send; if we don't send
// the font we set it to this value:
//
#define FONT_NOT_SENT (-1)
//
// Because a font can match to font ID zero, actually having an explicit
// 'no match' constant acts as an extra 'firewall'. The remote match array
// is of UINTs, so we have to make this constant positive...
//
#define NO_FONT_MATCH (0xffff)
//
// This dummy font id is used instead of a remote ID of 0 when we need to
// distinguish between a remote ID of 0, and a remote ID that on conversion
// to local gives zero.
//
#define DUMMY_FONT_ID 0xFFFF
//
// Font Width Table type.
//
typedef struct tagFHWIDTHTABLE
{
BYTE charWidths[256];
} FHWIDTHTABLE, FAR * PFHWIDTHTABLE;
//
// The local font structure contains the extra info we need for font
// matching; we can't change the NETWORKFONT structure because we have to
// maintain back compatibility
//
// This comment is slight tosh. We can and do change NETWORKFONT (though
// only in a carefully managed way!). The point is that the data outside
// of the Details field is only needed locally - it is not transmitted
// across the wire.
//
// Note that in FH_Init, we do a qsort, which assumes
// that the first thing in the LOCALFONT structure is the facename. So
// bear this in mind if you change it. We assume that the NETWORKFONT
// structure will always start with the facename.
//
typedef struct _LOCALFONT
{
NETWORKFONT Details; // old structure - sent over wire
TSHR_UINT16 lMaxBaselineExt; // max height of this font
char RealName[FH_FACESIZE]; // Real font name
TSHR_UINT32 SupportCode; // font is supported - see below
}
LOCALFONT;
typedef LOCALFONT FAR * LPLOCALFONT;
//
// The following values are set in the SupportCode field of the LOCALFONT
// structure to indicate whether a font is supported in the current
// share. The values are designed to make it easy to calculate the lowest
// common denominator of two support codes (l.c.d. = code1 & code2).
//
// A SupportCode contains the bit flag
// FH_SC_MATCH if it describes any sort of match at all
// FH_SC_ALL_CHARS if the match applies to all characters in the font,
// as opposed to just the ASCII alphanumeric characters
// FH_SC_EXACT if the match is considered exact,
// as opposed to an approximate match
//
//
#define FH_SC_MATCH 1
#define FH_SC_ALL_CHARS 2
#define FH_SC_EXACT 4
//
// Forget it: no viable match.
//
#define FH_SC_NO_MATCH 0
//
// Every char is a good but not exact match.
//
#define FH_SC_APPROX_MATCH (FH_SC_MATCH | FH_SC_ALL_CHARS)
//
// Every char is likely to be an accurate match.
//
#define FH_SC_EXACT_MATCH (FH_SC_MATCH | FH_SC_ALL_CHARS | FH_SC_EXACT)
//
// Chars 20->7F are likely to be an accurate match.
//
#define FH_SC_EXACT_ASCII_MATCH (FH_SC_MATCH | FH_SC_EXACT)
//
// Chars 20->7F are likely to be good but not exact matches.
//
#define FH_SC_APPROX_ASCII_MATCH (FH_SC_MATCH)
//
// Structures and typedefs.
//
// The FONTNAME structure is used for each entry in the array of font
// names.
//
typedef struct tagFONTNAME
{
char szFontName[FH_FACESIZE];
}
FONTNAME;
typedef FONTNAME FAR * LPFONTNAME;
//
// Maximum number of fonts that we can handle at all.
//
#define FH_MAX_FONTS \
(((TSHR_MAX_SEND_PKT - sizeof(FHPACKET)) / sizeof(NETWORKFONT)) + 1 )
//
// Size of index into local font table
//
#define FH_LOCAL_INDEX_SIZE 256
typedef struct tagFHFAMILIES
{
STRUCTURE_STAMP
UINT fhcFamilies;
FONTNAME afhFamilies[FH_MAX_FONTS];
}
FHFAMILIES;
typedef FHFAMILIES FAR * LPFHFAMILIES;
//
// Local font list
//
// NOTE: The font index is an array of bookmarks that indicate the first
// entry in the local font table that starts with a particular character.
// For example, afhFontIndex[65] gives the first index in afhFonts
// that starts with the character 'A'.
//
//
typedef struct tagFHLOCALFONTS
{
STRUCTURE_STAMP
UINT fhNumFonts;
TSHR_UINT16 afhFontIndex[FH_LOCAL_INDEX_SIZE];
LOCALFONT afhFonts[FH_MAX_FONTS];
}
FHLOCALFONTS;
typedef FHLOCALFONTS FAR * LPFHLOCALFONTS;
//
// FUNCTION: FH_GetFaceNameFromLocalHandle
//
// DESCRIPTION:
//
// Given an FH font handle (ie a handle originating from the locally
// supported font structure which was sent to the remote machine at the
// start of the call) this function returns the face name of the font.
//
// PARAMETERS:
//
// fontHandle - font handle being queried.
//
// pFaceNameLength - pointer to variable to receive the length of the face
// name returned.
//
// RETURNS: pointer to face name.
//
//
LPSTR FH_GetFaceNameFromLocalHandle(UINT fontHandle,
LPUINT faceNameLength);
UINT FH_GetMaxHeightFromLocalHandle(UINT fontHandle);
//
// FUNCTION: FH_GetFontFlagsFromLocalHandle
//
// DESCRIPTION:
//
// Given an FH font handle (ie a handle originating from the locally
// supported font structure which was sent to the remote machine at the
// start of the call) this function returns the FontFlags value stored with
// the LOCALFONT details
//
// PARAMETERS:
//
// fontHandle - font handle being queried.
//
// RETURNS: font flags
//
//
UINT FH_GetFontFlagsFromLocalHandle(UINT fontHandle);
//
// FUNCTION: FH_GetCodePageFromLocalHandle
//
// DESCRIPTION:
//
// Given an FH font handle (ie a handle originating from the locally
// supported font structure which was sent to the remote machine at the
// start of the call) this function returns the CharSet value stored with
// the LOCALFONT details
//
// PARAMETERS:
//
// fontHandle - font handle being queried.
//
// RETURNS: CodePage
//
//
UINT FH_GetCodePageFromLocalHandle(UINT fontHandle);
//
// FUNCTION: FH_Init
//
// DESCRIPTION:
//
// This routine finds all the fonts in the local system. It is called from
// USR.
//
// PARAMETERS: VOID
//
// RETURNS: Number of fonts found
//
//
UINT FH_Init(void);
void FH_Term(void);
//
// API FUNCTION: FH_CreateAndSelectFont
//
// DESCRIPTION:
//
// Creates a logical font for the HPS/HDC supplied.
//
// PARAMETERS:
//
// surface - surface to create logical font for.
//
// pHNewFont - pointer to new font handle to use. This is returned.
//
// pHOldFont - pointer to old font handle (which was previously selected
// into the HPS or HDC).
//
// fontName - the facename of the font.
//
// codepage - codepage (though in most case just holds charset)
//
// fontMaxHeight - the max baseline extent of the font. (Do not confuse
// with fontHeight which is the cell height of the font).
//
// fontWidth,fontWeight,fontFlags - take the same values as the equivalent
// fields in a TEXTOUT or EXTTEXTOUT order.
//
// RETURNS: TRUE - success, FALSE - failure.
//
BOOL FH_CreateAndSelectFont(HDC hdc,
HFONT * pHNewFont,
HFONT * pHOldFont,
LPSTR fontName,
UINT codepage,
UINT fontMaxHeight,
UINT fontHeight,
UINT fontWidth,
UINT fontWeight,
UINT fontFlags);
//
// API FUNCTION: FH_DeleteFont
//
// DESCRIPTION:
//
// Deletes/frees the supplied system font handle.
//
// PARAMETERS:
//
// sysFontHandle - system font handle to delete/free
//
// RETURNS:
//
// None
//
void FH_DeleteFont(HFONT hFont);
//
// API FUNCTION: FH_SelectFont
//
// DESCRIPTION:
//
// Selects a font identified by its system font handle into a surface.
//
// PARAMETERS:
//
// surface - the surface to select the font into
// sysFontHandle - system font handle
//
// RETURNS:
//
// None
//
void FH_SelectFont(HDC hdc, HFONT hFont);
void FHAddFontToLocalTable( LPSTR faceName,
TSHR_UINT16 fontFlags,
TSHR_UINT16 codePage,
TSHR_UINT16 maxHeight,
TSHR_UINT16 aveHeight,
TSHR_UINT16 aveWidth,
TSHR_UINT16 aspectX,
TSHR_UINT16 aspectY,
TSHR_UINT16 maxAscent);
void FHConsiderAllLocalFonts(void);
void FHSortAndIndexLocalFonts(void);
int FHComp(LPVOID p1, LPVOID p2);
void FH_qsort(LPVOID base, UINT num, UINT size);
// prototypes UT_qsort routines
void shortsort(char *lo, char *hi, unsigned width);
void swap(char *p, char *q, unsigned int width);
// this parameter defines the cutoff between using quick sort and
// insertion sort for arrays; arrays with lengths shorter or equal to the
// below value use insertion sort
#define CUTOFF 8
BOOL FHGenerateFontWidthTable(PFHWIDTHTABLE pTable,
LPLOCALFONT pFontInfo,
UINT fontHeight,
UINT fontWidth,
UINT fontWeight,
UINT fontFlags,
LPTSHR_UINT16 pMaxAscent);
BOOL FHGetStringSpacing(UINT fontHandle,
UINT fontHeight,
UINT fontWidth,
UINT fontWeight,
UINT fontFlags,
UINT stringLength,
LPSTR string,
LPTSHR_INT16 deltaXArray);
//
// FHCalculateSignatures - see fh.c.
//
void FHCalculateSignatures(PFHWIDTHTABLE pTable,
LPTSHR_INT16 pSigFats,
LPTSHR_INT16 pSigThins,
LPTSHR_INT16 pSigSymbol);
//
// Although wingdi.h defines the first two parameters for an ENUMFONTPROC
// as LOGFONT and TEXTMETRIC (thereby disagreeing with MSDN), tests show
// that the structures are actually as defined in MSDN (i.e. we get valid
// information when accessing the extended fields)
//
int CALLBACK FHEachFontFamily(
const ENUMLOGFONT FAR * enumlogFont,
const NEWTEXTMETRIC FAR * TextMetric,
int FontType,
LPARAM lParam);
int CALLBACK FHEachFont(const ENUMLOGFONT FAR * enumlogFont,
const NEWTEXTMETRIC FAR * TextMetric,
int FontType,
LPARAM lParam);
#endif // _H_FH