2025-04-27 07:49:33 -04:00

448 lines
14 KiB
C++

/******************************************************************************
Header File: Generic Font Information.H
This file contains a set of classes intended to incorporate the information
currently stored in the various font metric and related structures. These
classes are serializable, and will be capable of being loaded from and fed to
the various other formats.
Copyright (c) 1997 by Microsoft Corporation. All Rights Reserved.
A Pretty Penny Enterprises Production
Change History:
03-02-1997 Bob_Kjelgaard@Prodigy.Net Created it
******************************************************************************/
#if !defined(GENERIC_FONT_INFORMATION)
#define GENERIC_FONT_INFORMATION
/******************************************************************************
CFontDifference
This class handles the information content analogous to the FONTDIFF
structure.
******************************************************************************/
class AFX_EXT_CLASS CFontDifference {
CWordArray m_cwaMetrics;
CBasicNode *m_pcbnOwner;
public:
CFontDifference(WORD wWeight, WORD wMax, WORD wAverage, WORD wAngle,
CBasicNode *pcbn) {
m_cwaMetrics.Add(wWeight);
m_cwaMetrics.Add(wMax);
m_cwaMetrics.Add(wAverage);
m_cwaMetrics.Add(wAngle);
m_pcbnOwner = pcbn;
}
CFontDifference(PBYTE pb, CBasicNode *pcbn); // Init from memory image
// Attributes
enum {Weight, Max, Average, Angle};
WORD Metric(unsigned u) { return m_cwaMetrics[u]; }
// operations
enum {OK, TooBig, Reversed}; // Returns from SetMetric
WORD SetMetric(unsigned u, WORD wNew);
void Store(CFile& cfStore, WORD wfSelection);
};
/******************************************************************************
CFontInfo class
This primarily encapsulates the UFM file, but it also has to handle some PFM
and IF stuff, so it truly is generic.
******************************************************************************/
class AFX_EXT_CLASS CFontInfo : public CProjectNode {
// Conversion-related members
CString m_csSource; // The original PFM file name
CByteArray m_cbaPFM; // Loaded image of the PFM file
// Now for the real data member list, which is extensive!
CStringArray m_csaFamily;
CString m_csStyle, m_csFace, m_csUnique; // Various names
CWordArray m_cwaSpecial; // Special, little-used metrics
BYTE m_bCharacterSet, m_bPitchAndFamily;
WORD m_wWeight, m_wHeight;
WORD m_wAverageWidth, m_wMaximumIncrement, m_wfStyle;
CByteArray m_cbaSignificant; // Significant char codes (e.g., break)
CWordArray m_cwaSignificant;
// Kerning structure- CSafeObArray which contains the kerning pairs
CSafeObArray m_csoaKern;
CInvocation m_ciSelect, m_ciDeselect;
WORD m_widTranslation; // Translation table ID
CGlyphMap* m_pcgmTranslation;
CFontDifference *m_pcfdBold, *m_pcfdItalic, *m_pcfdBoth; // Simulations
// UNIDRVINFO fields worth noticing
BYTE m_bLocation; // Enumerated bnelow
BYTE m_bTechnology; // Scalable font technology- see below
BYTE m_bfGeneral; // Also enumerated in public
BOOL m_bScalable; // Set if the font can be scaled.
WORD m_wXResolution, m_wYResolution;
short m_sPreAdjustY, m_sPostAdjustY, m_sCenterAdjustment;
WORD m_wPrivateData;
// EXTTEXTMETRIC specific fields
WORD m_wMaxScale, m_wMinScale, m_wScaleDevice;
BYTE m_bfScaleOrientation;
// The width table is GTT-dependent, hence this member contains all of
// the glyphs (extracted from the GTT). But the widths are maintaned
// in a locally maintained array.
CPtrArray m_cpaGlyphs;
CWordArray m_cwaWidth;
CGlyphHandle& Glyph(unsigned uid) {
return *(CGlyphHandle *) m_cpaGlyphs[uid];
}
// Private conversion support routines
BOOL MapPFM(); // Assure the PFM file is loaded
// Private Editor support routines
BOOL DBCSFont() const { // This looks right, but no OFFICIAL way seems
return m_bCharacterSet > 127 && m_bCharacterSet < 145; // to exist
}
void CalculateWidths(); // When variable widths change...
DECLARE_SERIAL(CFontInfo)
public:
CFontInfo();
CFontInfo(const CFontInfo& cfiRef, WORD widCTT); // For cloning of UFMs
~CFontInfo();
// Attributes- Conversion Support
const CString& SourceName() const { return m_csSource; }
// Attributes - Editing (general info page)
const CString& FaceName() const { return m_csFace; }
const CString& StyleName() const { return m_csStyle; }
const CString& UniqueName() const { return m_csUnique; }
const CString& Family(unsigned u) const { return m_csaFamily[u]; }
unsigned Families() const {
return (unsigned) m_csaFamily.GetSize();
}
enum {Italic = 1, Underscore, StrikeOut = 0x10};
WORD GetStyle() const { return m_wfStyle; }
BOOL IsScalable() const { return !!m_bScalable; }
BOOL IsVariableWidth() const { return !!m_cpaGlyphs.GetSize(); }
BOOL CanKern() const { return !!m_csoaKern.GetSize(); }
// Attributes- Special metrics
enum {CapH, LowerX, SuperSizeX, SuperSizeY, SubSizeX, SubSizeY, SuperMoveX,
SuperMoveY, SubMoveX, SubMoveY, ItalicAngle, UnderSize, UnderOffset,
StrikeSize, StrikeOffset, Baseline, InterlineGap, Lowerp, Lowerd,
InternalLeading};
const short SpecialMetric(unsigned uIndex) const {
return (short) m_cwaSpecial[uIndex];
}
const WORD Translation() const { return m_widTranslation; }
// Attributes- Editing (General Page #2)
enum {Resident, Download, MainCartridge, Cartridge };
DWORD Location() const { return m_bLocation; }
enum {IntelliFont, TrueType, PPDS, CAPSL, Type1, Type2 };
DWORD Technology() const { return m_bLocation; }
WORD Resolution(BOOL bX = TRUE) const {
return bX ? m_wXResolution : m_wYResolution;
}
int BaselineAdjustment(BOOL bPrePrint = TRUE) const {
return bPrePrint ? m_sPreAdjustY : m_sPostAdjustY;
}
int CenterAdjustment() const { return m_sCenterAdjustment; }
short PrivateData() const { return (short) m_wPrivateData; }
CString GTTDescription() const;
// Attributes- General Metrics page
WORD Family() const { return m_bPitchAndFamily & 0xF0; }
WORD CharSet() const { return m_bCharacterSet; }
WORD Weight() const { return m_wWeight; }
WORD Height() const { return m_wHeight; }
WORD MaxWidth() const { return m_wMaximumIncrement; }
WORD AverageWidth() const { return m_wAverageWidth; }
enum {First, Last, Default, Break};
WORD SignificantChar(WORD wid, BOOL bUnicode = TRUE) const {
return bUnicode ? m_cwaSignificant[wid] : m_cbaSignificant[wid];
}
void InterceptItalic(CPoint& cpt) const;
// Attributes- Flags on Selection Page
enum {ItalicSim, UnderSim, UseCR, BoldSim, Unused, StrikeSim, UseBKSP};
BOOL SimFlag(WORD weFlag) const {
return !!(m_bfGeneral & (1 << weFlag));
}
// Attributes- Scaling (EXTTEXTMETRICS)
BYTE ScaleOrientation() const { return m_bfScaleOrientation & 3; }
WORD ScaleUnits(BOOL bDevice = TRUE) const {
return bDevice ? m_wScaleDevice :
m_wHeight - m_cwaSpecial[InternalLeading];
}
WORD ScaleLimit(BOOL bMaximum = TRUE) const {
return bMaximum ? m_wMaxScale : m_wMinScale;
}
// Attributes- Character Widths page
enum {Less, More, Equal};
unsigned CompareWidths(unsigned u1, unsigned u2);
// Attributes- Kerning page
void MapKerning(CSafeMapWordToOb& csmw2o1,
CSafeMapWordToOb& csmw2o2,
CWordArray& cwaPoints);
unsigned KernCount() const { return (unsigned) m_csoaKern.GetSize(); }
unsigned CompareKernAmount(unsigned u1, unsigned u2) const;
unsigned CompareKernFirst(unsigned u1, unsigned u2) const;
unsigned CompareKernSecond(unsigned u1, unsigned u2) const;
// Operations- Framework
void SetSourceName(LPCTSTR lpstrNew);
BOOL GetTranslation();
BOOL Generate(CString csPath);
void SetTranslation(WORD w) { m_widTranslation = w; }
void SetTranslation(CGlyphMap* pcgm) { m_pcgmTranslation = pcgm; }
BOOL Load(); // Load the UFM file so it can be edited
BOOL Store(LPCTSTR lpstrFileName); // Save as the specified UFM file
virtual CMDIChildWnd* CreateEditor();
virtual void Serialize(CArchive& car);
// Operations- Editor General Page
void SetFaceName(LPCTSTR lpstrNew) { m_csFace = lpstrNew; Changed(); }
void SetStyleName(LPCTSTR lpstrNew) { m_csStyle = lpstrNew; Changed(); }
void SetUniqueName(LPCTSTR lpstrNew) {
m_csUnique = lpstrNew;
Changed();
}
BOOL AddFamily(LPCTSTR lpstrNew);
void RemoveFamily(LPCTSTR lpstrDead);
void SetStyle(WORD wStyle) { m_wfStyle = wStyle; Changed(); }
void ChangePitch(BOOL bFixed = FALSE);
void SetScalability(BOOL bOn);
// Operations- Font Command and flag page
CInvocation& Selector(BOOL bSelect = TRUE) {
return bSelect ? m_ciSelect : m_ciDeselect;
}
void ToggleSimFlag(WORD w) { m_bfGeneral ^= (1 << w); }
// Operations- Editor General Page 2
void SetLocation(int i) {
if (BYTE (i) != m_bLocation) {
m_bLocation = (BYTE) i;
Changed();
}
}
void SetTechnology(int i) {
if (BYTE (i) != m_bTechnology) {
m_bTechnology = (BYTE) i;
Changed();
}
}
void SetCenterAdjustment(int i) {
if (i == m_sCenterAdjustment)
return;
m_sCenterAdjustment = i;
Changed();
}
void SetPrivateData(short s) {
if (s != (short) m_wPrivateData) {
m_wPrivateData = (WORD) s;
Changed();
}
}
void SetBaselineAdjustment(BOOL bPre, short sNew) {
if (sNew == (bPre ? m_sPreAdjustY : m_sPostAdjustY))
return;
if (bPre)
m_sPreAdjustY = sNew;
else
m_sPostAdjustY = sNew;
Changed();
}
void SetResolution(BOOL bX, WORD wNew) {
if (wNew == (bX ? m_wXResolution : m_wYResolution))
return;
if (bX)
m_wXResolution = wNew;
else
m_wYResolution = wNew;
Changed();
}
// Operations- Font metrics page
void SetSpecial(unsigned ufMetric, short sSpecial);
void SetMaxWidth(WORD wWidth);
BOOL SetHeight(WORD wHeight);
void SetWeight(WORD wWeight) { m_wWeight = wWeight; Changed(); }
void SetFamily(BYTE bNew) {
m_bPitchAndFamily &= 0xF;
m_bPitchAndFamily |= (bNew & 0xF0);
Changed();
}
BOOL SetCharacterSet(BYTE bNew);
enum {OK, InvalidChar, DoubleByte};
WORD SetSignificant(WORD wItem, WORD wChar, BOOL bUnicode);
// Operations- Scaling Page
enum {ScaleOK, Reversed, NotWindowed};
WORD SetScaleLimit(BOOL bMax, WORD wNew);
WORD SetDeviceEmHeight(WORD wNew);
void SetScaleOrientation(BYTE bfNew) {
if (bfNew & 3 != m_bfScaleOrientation) {
m_bfScaleOrientation = bfNew & 3;
Changed();
}
}
// Operations- simulation / difference page
enum {ItalicDiff, BoldDiff, BothDiff};
CFontDifference *Diff(unsigned u) {
return u ? u == BothDiff ? m_pcfdBoth : m_pcfdBold : m_pcfdItalic;
}
void EnableSim(unsigned uSim, BOOL bOn, CFontDifference*& pcfd);
// Operations- Kerning page
void FillKern(CListCtrl& clcView); // Fill the control
void AddKern(WORD wFirst, WORD wSecond, short sAmount,
CListCtrl& clcView);
void RemoveKern(unsigned u) { m_csoaKern.RemoveAt(u); Changed(); }
void SetKernAmount(unsigned u, short sAmount);
// Operations- Widths page
void FillWidths(CListCtrl& clcView); // Fill the control
void SetWidth(unsigned uGlyph, WORD wWidth);
};
/******************************************************************************
CFontInfoContainer class
This CDocument-derived class contains one CFontInfo structure- it allows to
edit the font information either from the driver, os from an individual file.
******************************************************************************/
class AFX_EXT_CLASS CFontInfoContainer : public CDocument {
BOOL m_bEmbedded;
CFontInfo *m_pcfi;
protected:
CFontInfoContainer(); // protected constructor used by dynamic creation
DECLARE_DYNCREATE(CFontInfoContainer)
// Attributes
public:
CFontInfo *Font() { return m_pcfi; }
// Operations
public:
// First a constructor for launching a view from the driver view.
CFontInfoContainer(CFontInfo *pcfi, CString csPath);
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CFontInfoContainer)
public:
virtual void Serialize(CArchive& ar); // overridden for document i/o
virtual BOOL OnSaveDocument(LPCTSTR lpszPathName);
virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);
protected:
virtual BOOL OnNewDocument();
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CFontInfoContainer();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
// Generated message map functions
protected:
//{{AFX_MSG(CFontInfoContainer)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
#endif