/*++ Copyright (c) 2000 Microsoft Corporation Module Name: xltt.h Abstract: TrueType font handlig object Environment: Windows Whistler Revision History: 03/23/00 Created it. --*/ #ifndef _XLTT_H_ #define _XLTT_H_ // // TrueType font // // Header // typedef struct _TTHEADER { DWORD dwSfntVersion; USHORT usNumTables; USHORT usSearchRange; USHORT usEntrySelector; USHORT usRangeShift; } TTHEADER, *PTTHEADER; typedef struct _TTCHEADER { DWORD dwTTCTag; DWORD dwVersion; ULONG ulDirCount; } TTCHEADER, *PTTCHEADER; // // Directory // typedef struct _TTDIR { ULONG ulTag; ULONG ulCheckSum; ULONG ulOffset; ULONG ulLength; } TTDIR, *PTTDIR; // // head table // typedef DWORD longDateTime[2]; typedef struct _HEAD { DWORD Tableversionnumber; DWORD fontRevision; ULONG checkSumAdjustment; ULONG magicNumber; USHORT flags; USHORT unitsPerEm; longDateTime created; longDateTime modified; FWORD xMin; FWORD yMin; FWORD xMax; FWORD yMax; USHORT macStyle; USHORT lowestRecPPEM; SHORT fontDirectionHint; SHORT indexToLocFormat; SHORT glyphDataFormat; } HEAD, *PHEAD; // // maxp table // typedef struct _MAXP { DWORD Tableversionnumber; USHORT numGlyphs; USHORT maxPoints; USHORT maxContours; USHORT maxCompositePoints; USHORT maxCompositeContours; USHORT maxZones; USHORT maxTwilightPoints; USHORT maxStorage; USHORT maxFunctionDefs; USHORT maxInstructionDefs; USHORT maxStackElements; USHORT maxSizeOfInstructions; USHORT maxComponentElements; USHORT maxComponentDepth; } MAXP, *PMAXP; // // hhea table // typedef struct _HHEA { DWORD dwVersion; SHORT sAscender; SHORT sDescender; SHORT sLineGap; USHORT usAdvanceWidthMax; SHORT sMinLeftSideBearing; SHORT sMinRightSideBearing; SHORT sxMaxExtent; SHORT sCaretSlopeRise; SHORT sCaretSlopeRun; SHORT sCaretOffset; SHORT sReserved1; SHORT sReserved2; SHORT sReserved3; SHORT sReserved4; SHORT sMetricDataFormat; USHORT usNumberOfHMetrics; } HHEA, *PHHEA; // // vhea table // typedef struct _VHEA { DWORD dwVersion; SHORT sAscender; SHORT sDescender; SHORT sLineGap; USHORT usAdvanceHightMax; SHORT sMinTopSideBearing; SHORT sMinBottomSideBearing; SHORT syMaxExtent; SHORT sCaretSlopeRise; SHORT sCaretSlopeRun; SHORT sCaretOffset; SHORT sReserved1; SHORT sReserved2; SHORT sReserved3; SHORT sReserved4; SHORT sMetricDataFormat; USHORT usNumberOfVMetrics; } VHEA, *PVHEA; // // hmtx table // typedef struct _HMTX { USHORT usAdvanceWidth; SHORT sLeftSideBearing; } HMTX, *PHMTX; // // vmtx table // typedef struct _VMTX { USHORT usAdvanceWidth; SHORT sTopSideBearing; } VMTX, *PVMTX; // // glyf table // typedef struct _GLYF { SHORT numberOfContours; SHORT xMin; SHORT yMin; SHORT xMax; SHORT yMax; } GLYF, *PGLYF; // // Composite glyph description // // SHORT -1 // #define COMPONENTCTRCOUNT -1 typedef struct _CGLYF { SHORT flags; SHORT glyphIndex; SHORT argument1; SHORT argument2; } CGLYF, *PCGLYF; typedef struct _CGLYF_BYTE { SHORT flags; SHORT glyphIndex; BYTE argument1; BYTE argument2; } CGLYF_BYTE, *PCGLYF_BYTE; // // Format 1 Class 1 or 2 is used to download TrueType font. // Now hhea, hmtx, vhea, vmtx are not necessary. // typedef enum TagID { TagID_First = 0, TagID_cvt = 0, TagID_fpgm, TagID_gdir, // Empty table. This is a placeholder for the table that printer // will allocate to store downloaded charactres. TagID_head, TagID_maxp, TagID_perp, TagID_hhea, TagID_hmtx, TagID_vhea, TagID_vmtx, TagID_loca, TagID_glyf, TagID_os2, TagID_MAX, TagID_Header = TagID_vmtx + 1 }; typedef enum TTTag { TTTag_cvt = ' tvc', //0 TTTag_fpgm = 'mgpf', //1 TTTag_gdir = 'ridg', //2 TTTag_head = 'daeh', //3 TTTag_maxp = 'pxam', //4 TTTag_perp = 'perp', //5 TTTag_hhea = 'aehh', //6 TTTag_hmtx = 'xtmh', //7 TTTag_vhea = 'aehv', //8 TTTag_vmtx = 'xtmv', //9 TTTag_loca = 'acol', //10 TTTag_glyf = 'fylg', //11 TTTag_os2 = '2/SO', //12 TTTag_ttcf = 'fctt', //13 TTTag_INVALID = 0xFFFFFFFF }; class XLTrueType #if DBG : public XLDebug #endif { SIGNATURE ('xltt') public: XLTrueType:: XLTrueType(VOID); XLTrueType:: ~XLTrueType(VOID); HRESULT OpenTTFile(FONTOBJ *pfo); HRESULT CloseTTFile(VOID); HRESULT SameFont(FONTOBJ* pfo); HRESULT IsTTC(VOID); HRESULT IsVertical(VOID); HRESULT IsDBCSFont(VOID); HRESULT GetHeader(PTTHEADER *pHeader); DWORD GetSizeOfTable(TTTag tag); HRESULT GetTableDir(TTTag tag, PVOID *pTable); HRESULT GetTable(TTTag tag, PVOID *pTable, PDWORD pdwSize); DWORD GetNumOfTag(VOID); HRESULT TagAndID(DWORD *pdwID, TTTag *ptag); HRESULT GetGlyphData(HGLYPH hGlyph, PBYTE *ppubGlyphData, PDWORD pdwGlyphDataSize); HRESULT GetHMTXData(HGLYPH hGlyph, PUSHORT pusAdvanceWidth, PSHORT psLeftSideBearing); HRESULT GetVMTXData(HGLYPH hGlyph, PUSHORT pusAdvanceWidth, PSHORT psTopSideBearing, PSHORT psLeftSideBearing); HRESULT GetTypoDescender(VOID); #if DBG VOID SetDbgLevel(DWORD dwLevel); #endif private: DWORD m_dwFlags; FONTOBJ *m_pfo; PVOID m_pTTFile; ULONG m_ulFileSize; PTTHEADER m_pTTHeader; USHORT m_usNumTables; PTTDIR m_pTTDirHead; DWORD m_dwNumTag; DWORD m_dwNumGlyph; PTTDIR m_pTTDir[TagID_MAX]; DWORD m_dwNumOfHMetrics; DWORD m_dwNumOfVMetrics; HRESULT ParseTTDir(VOID); }; // // XLTrueType.m_dwFlags // #define XLTT_TTC 0x00000001 // Font is TTC. #define XLTT_SHORT_OFFSET_TO_LOC 0x00000002 // Short offset to loca table #define XLTT_VERTICAL_FONT 0x00000004 // Font is a vertial font. #define XLTT_DIR_PARSED 0x80000000 // The table directory is // parsed. #endif // _XLTT_H_