// Created: 01.03.00
// RCS-ID: $Id$
// Copyright: (c) 1999 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
-// Licence: wxWindows license
+// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#define DEBUG_PRINTF(NAME) { static int raz=0; \
printf( #NAME " %i\n",raz); fflush(stdout); \
#include "wx/fontutil.h"
#include "wx/fontmap.h"
+#include "wx/encinfo.h"
#include "wx/tokenzr.h"
// wxFont <-> LOGFONT conversion
// ----------------------------------------------------------------------------
+void wxConvertVectorFontSize(
+ FIXED fxPointSize
+, PFATTRS pFattrs
+)
+{
+ HPS hPS;
+ HDC hDC;
+ LONG lXFontResolution;
+ LONG lYFontResolution;
+ SIZEF vSizef;
+
+ hPS = WinGetScreenPS(HWND_DESKTOP); // Screen presentation space
+
+ //
+ // Query device context for the screen and then query
+ // the resolution of the device for the device context.
+ //
+
+ hDC = GpiQueryDevice(hPS);
+ DevQueryCaps( hDC, CAPS_HORIZONTAL_FONT_RES, (LONG)1, &lXFontResolution);
+ DevQueryCaps( hDC, CAPS_VERTICAL_FONT_RES, (LONG)1, &lYFontResolution);
+
+ //
+ // Calculate the size of the character box, based on the
+ // point size selected and the resolution of the device.
+ // The size parameters are of type FIXED, NOT int.
+ // NOTE: 1 point == 1/72 of an inch.
+ //
+
+ vSizef.cx = (FIXED)(((fxPointSize) / 72 ) * lXFontResolution );
+ vSizef.cy = (FIXED)(((fxPointSize) / 72 ) * lYFontResolution );
+
+ pFattrs->lMaxBaselineExt = MAKELONG( HIUSHORT( vSizef.cy ), 0 );
+ pFattrs->lAveCharWidth = MAKELONG( HIUSHORT( vSizef.cx ), 0 );
+ WinReleasePS(hPS);
+
+} // end of wxConvertVectorPointSize
+
void wxFillLogFont(
LOGFONT* pFattrs // OS2 GPI FATTRS
, PFACENAMEDESC pFaceName
-, HPS hPS
+, HPS* phPS
+, bool* pbInternalPS
, long* pflId
, wxString& sFaceName
, wxFont* pFont
{
LONG lNumFonts = 0L; // For system font count
ERRORID vError; // For logging API errors
- LONG lTemp;
+ LONG lTemp = 0L;
bool bInternalPS = FALSE; // if we have to create one
PFONTMETRICS pFM = NULL;
// Initial house cleaning to free data buffers and ensure we have a
// functional PS to work with
//
- if (!hPS)
+ if (!*phPS)
{
- hPS = ::WinGetPS(HWND_DESKTOP);
+ *phPS = ::WinGetPS(HWND_DESKTOP);
bInternalPS = TRUE;
}
//
// Determine the number of fonts.
//
- lNumFonts = ::GpiQueryFonts( hPS
- ,QF_PUBLIC
- ,NULL
- ,&lTemp
- ,(LONG) sizeof(FONTMETRICS)
- ,NULL
- );
+ if((lNumFonts = ::GpiQueryFonts( *phPS
+ ,QF_PUBLIC | QF_PRIVATE
+ ,NULL
+ ,&lTemp
+ ,(LONG) sizeof(FONTMETRICS)
+ ,NULL
+ )) < 0L)
+ {
+ ERRORID vError;
+ wxString sError;
+
+ vError = ::WinGetLastError(wxGetInstance());
+ sError = wxPMErrorToStr(vError);
+ return;
+ }
//
// Allocate space for the font metrics.
// Retrieve the font metrics.
//
lTemp = lNumFonts;
- lTemp = ::GpiQueryFonts( hPS
+ lTemp = ::GpiQueryFonts( *phPS
,QF_PUBLIC
,NULL
,&lTemp
,(int)lNumFonts
);
- wxString sVals;
-
- for (int i = 0; i < lNumFonts; i++)
- {
- sVals << "Face: " << pFM[i].szFacename
- << "Family: " << pFM[i].szFamilyname
- << " PointSize: " << pFM[i].lEmHeight
- << " Height: " << pFM[i].lXHeight
- ;
- sVals = "";
- }
-
//
// Initialize FATTR and FACENAMEDESC
//
pFattrs->usRecordLength = sizeof(FATTRS);
- pFattrs->fsFontUse = FATTR_FONTUSE_OUTLINE | // only outline fonts allowed
- FATTR_FONTUSE_TRANSFORMABLE; // may be transformed
+ pFattrs->fsFontUse = FATTR_FONTUSE_OUTLINE; // only outline fonts allowed
pFattrs->fsType = 0;
pFattrs->lMaxBaselineExt = pFattrs->lAveCharWidth = 0;
pFattrs->idRegistry = 0;
pFattrs->lMatch = 0;
pFaceName->usSize = sizeof(FACENAMEDESC);
- pFaceName->usWidthClass = FWIDTH_NORMAL;
+ pFaceName->usWeightClass = FWEIGHT_DONT_CARE;
+ pFaceName->usWidthClass = FWIDTH_DONT_CARE;
pFaceName->usReserved = 0;
pFaceName->flOptions = 0;
// We should now have the correct FATTRS set with the selected
// font, so now we need to generate an ID
//
- long lNumLids = ::GpiQueryNumberSetIds(hPS);
+ long lNumLids = ::GpiQueryNumberSetIds(*phPS);
long lGpiError;
if(lNumLids )
STR8 azNames[255];
long alIds[255];
- if(!::GpiQuerySetIds( hPS
+ memset(alIds, 0, sizeof(long) * 255);
+ if(!::GpiQuerySetIds( *phPS
,lNumLids
,alTypes
,azNames
))
{
if (bInternalPS)
- ::WinReleasePS(hPS);
+ ::WinReleasePS(*phPS);
return;
}
-
+ if (*pflId == 0L)
+ *pflId = 1L;
for(unsigned long LCNum = 0; LCNum < lNumLids; LCNum++)
if(alIds[LCNum] == *pflId)
++*pflId;
if(*pflId > 254) // wow, no id available!
{
if (bInternalPS)
- ::WinReleasePS(hPS);
+ ::WinReleasePS(*phPS);
return;
}
}
-
+ else
+ *pflId = 1L;
//
// Release and delete the current font
//
- ::GpiSetCharSet(hPS, LCID_DEFAULT);/* release the font before deleting */
- ::GpiDeleteSetId(hPS, 1L); /* delete the logical font */
+ ::GpiSetCharSet(*phPS, LCID_DEFAULT);/* release the font before deleting */
+ ::GpiDeleteSetId(*phPS, 1L); /* delete the logical font */
//
// Now build a facestring
strcpy(zFacename, pFattrs->szFacename);
- if(::GpiQueryFaceString( hPS
+ if(::GpiQueryFaceString( *phPS
,zFacename
,pFaceName
,FACESIZE
vError = ::WinGetLastError(vHabmain);
}
sFaceName = zFacename;
+ *pbInternalPS = bInternalPS;
//
// That's it, we now have everything we need to actually create the font
int nPointSize;
int nDiff;
int nIs;
- int nIndex;
int nMinDiff;
int nMinDiff0;
int nApirc;
int anDiff[16];
int anMinDiff[16];
+ int nIndex = 0;
STR8 zFn;
char zFontFaceName[FACESIZE];
wxString sFaceName;
switch (pFont->GetFamily())
{
case wxSCRIPT:
- sFaceName = wxT("Script");
+ sFaceName = wxT("Tms Rmn");
break;
case wxDECORATIVE:
+ sFaceName = wxT("WarpSans");
+ break;
+
case wxROMAN:
- sFaceName = wxT("Times New Roman");
+ sFaceName = wxT("Tms Rmn");
break;
case wxTELETYPE:
- case wxMODERN:
sFaceName = wxT("Courier") ;
break;
+ case wxMODERN:
+ sFaceName = wxT("System VIO") ;
+ break;
+
case wxSWISS:
- sFaceName = wxT("WarpSans") ;
+ sFaceName = wxT("Helv") ;
break;
case wxDEFAULT:
default:
- sFaceName = wxT("Helv") ;
+ sFaceName = wxT("System VIO") ;
}
switch (pFont->GetWeight())
int nEmHeight = 0;
int nXHeight = 0;
- anDiff[0] = wxGpiStrcmp(pFM[i].szFamilyname, zFontFaceName);
+ anDiff[0] = wxGpiStrcmp(pFM[i].szFacename, zFontFaceName);
anDiff[1] = abs(pFM[i].lEmHeight - nPointSize);
anDiff[2] = abs(pFM[i].usWeightClass - usWeightClass);
anDiff[3] = abs((pFM[i].fsSelection & 0x2f) - fsSelection);
//
// Fill in the FATTRS with the best match from FONTMETRICS
//
- pFattrs->usRecordLength = sizeof(FATTRS); // sets size of structure
- pFattrs->fsSelection = pFM[nIndex].fsSelection; // uses default selection
- pFattrs->lMatch = pFM[nIndex].lMatch; // force match
- pFattrs->idRegistry = pFM[nIndex].idRegistry; // uses default registry
- pFattrs->usCodePage = pFM[nIndex].usCodePage; // code-page
- if(pFM[nIndex].lMatch)
- {
- pFattrs->lMaxBaselineExt = pFM[nIndex].lMaxBaselineExt; // requested font height
- pFattrs->lAveCharWidth = pFM[nIndex].lAveCharWidth ; // requested font width
- }
+ pFattrs->usRecordLength = sizeof(FATTRS); // Sets size of structure
+ pFattrs->lMatch = pFM[nIndex].lMatch; // Force match
+ pFattrs->idRegistry = 0;
+ pFattrs->usCodePage = 0;
+ pFattrs->fsFontUse = 0;
+ pFattrs->fsType = 0;
+ pFattrs->lMaxBaselineExt = 0;
+ pFattrs->lAveCharWidth = 0;
+ wxStrcpy(pFattrs->szFacename, pFM[nIndex].szFacename);
+ if (pFont->GetWeight() == wxNORMAL)
+ pFattrs->fsSelection = 0;
else
- {
- pFattrs->lMaxBaselineExt = 0;
- pFattrs->lAveCharWidth = 0;
- }
- pFattrs->fsType = 0;// pfm->fsType; /* uses default type */
- pFattrs->fsFontUse = 0;
+ pFattrs->fsSelection = FATTR_SEL_BOLD;
- wxStrcpy(pFattrs->szFacename, pFM[nIndex].szFacename);
- // Debug
- strcpy(zFontFaceName, pFM[nIndex].szFacename);
- strcpy(zFontFaceName, pFattrs->szFacename);
+ if (pFont->GetStyle() == wxITALIC || pFont->GetStyle() == wxSLANT)
+ pFattrs->fsSelection |= FATTR_SEL_ITALIC;
- if(usWeightClass >= FWEIGHT_BOLD)
- pFattrs->fsSelection |= FATTR_SEL_BOLD;
- if(pFont->GetUnderlined())
+ if (pFont->GetUnderlined())
pFattrs->fsSelection |= FATTR_SEL_UNDERSCORE;
- if(fsSelection & FM_SEL_ITALIC)
- pFattrs->fsSelection |= FATTR_SEL_ITALIC;
} // end of wxOS2SelectMatchingFontByName
wxFont wxCreateFontFromLogFont(
, PFACENAMEDESC pFaceName
)
{
- //
- // Extract family from facename
- //
- int nFontFamily;
-
- if (strcmp(pLogFont->szFacename, "Times New Roman") == 0)
- nFontFamily = wxROMAN;
- else if (strcmp(pLogFont->szFacename, "WarpSans") == 0)
- nFontFamily = wxSWISS;
- else if (strcmp(pLogFont->szFacename, "Script") == 0)
- nFontFamily = wxSCRIPT;
- else if (strcmp(pLogFont->szFacename, "Courier New") == 0)
- nFontFamily = wxMODERN;
- else
- nFontFamily = wxSWISS;
-
- //
- // Weight and Style
- //
- int nFontWeight = wxNORMAL;
-
- switch (pFaceName->usWeightClass)
- {
- case FWEIGHT_LIGHT:
- nFontWeight = wxLIGHT;
- break;
-
- default:
- case FWEIGHT_NORMAL:
- nFontWeight = wxNORMAL;
- break;
-
- case FWEIGHT_BOLD:
- nFontWeight = wxBOLD;
- break;
- }
-
- int nFontStyle;
-
- if(pLogFont->fsSelection & FATTR_SEL_ITALIC)
- nFontStyle = wxITALIC;
- else
- nFontStyle = wxNORMAL;
-
- bool bFontUnderline = (pLogFont->fsSelection & FATTR_SEL_UNDERSCORE);
- wxString sFontFace = pLogFont->szFacename;
- int nFontPoints = pFM->lEmHeight;
- wxFontEncoding vFontEncoding;
-
- switch (pLogFont->usCodePage)
- {
- default:
- wxFAIL_MSG(wxT("unsupported charset"));
- // fall through
-
- case 850:
- vFontEncoding = wxFONTENCODING_CP1252;
- break;
-
- case 1250:
- vFontEncoding = wxFONTENCODING_CP1250;
- break;
-
- case 921:
- vFontEncoding = wxFONTENCODING_CP1257;
- break;
-
- case 866:
- vFontEncoding = wxFONTENCODING_CP1251;
- break;
-
- case 864:
- vFontEncoding = wxFONTENCODING_CP1256;
- break;
-
- case 869:
- vFontEncoding = wxFONTENCODING_CP1253;
- break;
-
- case 862:
- vFontEncoding = wxFONTENCODING_CP1255;
- break;
-
- case 857:
- vFontEncoding = wxFONTENCODING_CP1254;
- break;
-
- case 874:
- vFontEncoding = wxFONTENCODING_CP437;
- break;
-
- case 437:
- vFontEncoding = wxFONTENCODING_CP437;
- break;
- }
+ wxNativeFontInfo vInfo;
- return wxFont( nFontPoints
- ,nFontFamily
- ,nFontStyle
- ,nFontWeight
- ,bFontUnderline
- ,sFontFace
- ,vFontEncoding
- );
+ vInfo.fa = *pLogFont;
+ vInfo.fm = *pFM;
+ vInfo.fn = *pFaceName;
+ return wxFont(vInfo);
} // end of wxCreateFontFromLogFont
int wxGpiStrcmp(