mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
207 lines
4.1 KiB
207 lines
4.1 KiB
#include "stdafx.h"
|
|
#include "cfontmap.h"
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
static BOOL ParseFont(PSTR pszLine, PSTR pszFace, PSTR& rpszSize, int& nCharset);
|
|
|
|
CFontMap* g_pFirst;
|
|
static CFontMap* g_pLast;
|
|
|
|
|
|
/***************************************************************************
|
|
|
|
FUNCTION: CFontMap::CFontMap
|
|
|
|
PURPOSE:
|
|
|
|
PARAMETERS:
|
|
pszLine
|
|
|
|
RETURNS:
|
|
|
|
COMMENTS:
|
|
Syntax (with all items optional) is:
|
|
|
|
fontname,pt size,charset=fontname,pt size,charset
|
|
|
|
MODIFICATION DATES:
|
|
02-Sep-1995 [ralphw]
|
|
Added code comments
|
|
|
|
***************************************************************************/
|
|
|
|
CFontMap::CFontMap(PSTR pszLine)
|
|
{
|
|
m_fInitialized = FALSE;
|
|
|
|
// Ignore comments and leading and trailing spaces.
|
|
pszLine = FirstNonSpace(pszLine);
|
|
PSTR psz = StrChr(pszLine, ';', _fDBCSSystem);
|
|
if (psz)
|
|
*psz = '\0';
|
|
RemoveTrailingSpaces(pszLine);
|
|
|
|
// Look for equal sign.
|
|
psz = StrChr(pszLine, '=', _fDBCSSystem);
|
|
if (!psz) {
|
|
VReportError(HCERR_INVALID_FONTMAP, &errHpj);
|
|
return;
|
|
}
|
|
*psz = '\0';
|
|
|
|
// First partse the original font attributes
|
|
PSTR pszSize;
|
|
if (!ParseFont(pszLine, m_szFace1, pszSize, m_nCharset1))
|
|
return;
|
|
if (pszSize) {
|
|
PSTR pszMinus = StrChr(pszSize, '-', _fDBCSSystem);
|
|
if (pszMinus)
|
|
*pszMinus = '\0';
|
|
|
|
m_nMin1 = atoi(pszSize);
|
|
if (m_nMin1 < 1 || m_nMin1 > 255) {
|
|
VReportError(HCERR_INVALID_FONTMAP, &errHpj);
|
|
return;
|
|
}
|
|
|
|
if (pszMinus) {
|
|
m_nMax1 = atoi(pszMinus + 1);
|
|
if (m_nMax1 < 1 || m_nMax1 > 255) {
|
|
VReportError(HCERR_INVALID_FONTMAP, &errHpj);
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
m_nMax1 = m_nMin1;
|
|
}
|
|
else
|
|
m_nMin1 = -1;
|
|
|
|
// Now parse the replacement attributes
|
|
|
|
ASSERT(psz);
|
|
if (!ParseFont(psz + 1, m_szFace2, pszSize, m_nCharset2))
|
|
return;
|
|
if (pszSize) {
|
|
if (*pszSize == '+' || *pszSize == '-') {
|
|
m_fRelative = TRUE;
|
|
m_nSize2 = atoi(pszSize + 1);
|
|
if (m_nSize2 < 1 || m_nSize2 > 255) {
|
|
VReportError(HCERR_INVALID_FONTMAP, &errHpj);
|
|
return;
|
|
}
|
|
if (*pszSize == '-')
|
|
m_nSize2 = -m_nSize2;
|
|
}
|
|
else {
|
|
m_fRelative = FALSE;
|
|
m_nSize2 = atoi(pszSize);
|
|
if (m_nSize2 < 1 || m_nSize2 > 255) {
|
|
VReportError(HCERR_INVALID_FONTMAP, &errHpj);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
m_fRelative = FALSE;
|
|
m_nSize2 = -1;
|
|
}
|
|
|
|
// We initialized successfully.
|
|
m_fInitialized = TRUE;
|
|
|
|
// Add this fontmap to the linked list.
|
|
if (g_pLast)
|
|
g_pLast->m_pNext = this;
|
|
else
|
|
g_pFirst = this;
|
|
g_pLast = this;
|
|
g_pLast->m_pNext = NULL;
|
|
}
|
|
|
|
static BOOL ParseFont(PSTR pszLine, PSTR pszFace, PSTR& rpszSize, int& nCharset)
|
|
{
|
|
*pszFace = '\0';
|
|
rpszSize = NULL;
|
|
nCharset = -1;
|
|
|
|
PSTR pszComma = StrChr(pszLine, ',', _fDBCSSystem);
|
|
if (pszComma)
|
|
*pszComma = '\0';
|
|
|
|
// Typeface.
|
|
if (*pszLine) {
|
|
if (lstrlen(pszLine) >= MAX4_FONTNAME) {
|
|
VReportError(HCERR_FONTNAME_TOO_LONG, &errHpj);
|
|
return FALSE;
|
|
}
|
|
lstrcpy(pszFace, pszLine);
|
|
SzTrimSz(pszFace);
|
|
}
|
|
|
|
// Comma followed by point size.
|
|
if (pszComma) {
|
|
pszLine = pszComma + 1;
|
|
pszComma = StrChr(pszLine, ',', _fDBCSSystem);
|
|
if (pszComma)
|
|
*pszComma = '\0';
|
|
|
|
if (*pszLine)
|
|
rpszSize = pszLine;
|
|
|
|
// Comma followed by character set.
|
|
if (pszComma) {
|
|
pszLine = pszComma + 1;
|
|
if (*pszLine) {
|
|
nCharset = atoi(pszLine);
|
|
if (nCharset < 0 || nCharset > 255) {
|
|
VReportError(HCERR_INVALID_FONTMAP, &errHpj);
|
|
return FALSE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CFontMap::Replace(PSTR pszFace, int* pSize, int* pCharset)
|
|
{
|
|
if (*m_szFace1 && strcmp(m_szFace1, pszFace))
|
|
return FALSE;
|
|
|
|
if (pSize && m_nMin1 != -1 && *pSize >= m_nMin1 && *pSize <= m_nMax1)
|
|
return FALSE;
|
|
|
|
if (m_nCharset1 != -1 && m_nCharset1 != *pCharset)
|
|
return FALSE;
|
|
|
|
if (*m_szFace2)
|
|
lstrcpy(pszFace, m_szFace2);
|
|
|
|
if (m_fRelative && pSize)
|
|
*pSize += m_nSize2;
|
|
else if (m_nSize2 != -1 && pSize)
|
|
*pSize = m_nSize2;
|
|
|
|
if (m_nCharset2 != -1)
|
|
*pCharset = m_nCharset2;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL ReplaceFont(PSTR pszTypeface, int* pSize, int* pCharset)
|
|
{
|
|
if (!g_pFirst)
|
|
return FALSE;
|
|
|
|
BOOL fResult = FALSE;
|
|
|
|
for (CFontMap* pMap = g_pFirst; pMap; pMap = pMap->m_pNext)
|
|
fResult |= pMap->Replace(pszTypeface, pSize, pCharset);
|
|
|
|
return fResult;
|
|
}
|