X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/47df2b8c540f17c55464719d0da74c0b43a29515..046d682f0f684977b7ba933a128f5c84e06ded0e:/src/os2/fontutil.cpp diff --git a/src/os2/fontutil.cpp b/src/os2/fontutil.cpp index bb4490f96c..264d0b7b2d 100644 --- a/src/os2/fontutil.cpp +++ b/src/os2/fontutil.cpp @@ -6,7 +6,7 @@ // Created: 01.03.00 // RCS-ID: $Id$ // Copyright: (c) 1999 Vadim Zeitlin -// Licence: wxWindows license +// Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// #define DEBUG_PRINTF(NAME) { static int raz=0; \ printf( #NAME " %i\n",raz); fflush(stdout); \ @@ -39,6 +39,7 @@ #include "wx/fontutil.h" #include "wx/fontmap.h" +#include "wx/encinfo.h" #include "wx/tokenzr.h" @@ -258,6 +259,44 @@ bool wxTestFontEncoding( // 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 @@ -288,7 +327,7 @@ void wxFillLogFont( // Determine the number of fonts. // if((lNumFonts = ::GpiQueryFonts( *phPS - ,QF_PUBLIC + ,QF_PUBLIC | QF_PRIVATE ,NULL ,&lTemp ,(LONG) sizeof(FONTMETRICS) @@ -327,15 +366,15 @@ void wxFillLogFont( // 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; @@ -353,7 +392,6 @@ void wxFillLogFont( // font, so now we need to generate an ID // long lNumLids = ::GpiQueryNumberSetIds(*phPS); - long lGpiError; if(lNumLids ) { @@ -361,6 +399,7 @@ void wxFillLogFont( STR8 azNames[255]; long alIds[255]; + memset(alIds, 0, sizeof(long) * 255); if(!::GpiQuerySetIds( *phPS ,lNumLids ,alTypes @@ -372,8 +411,9 @@ void wxFillLogFont( ::WinReleasePS(*phPS); return; } - - for(unsigned long LCNum = 0; LCNum < lNumLids; LCNum++) + if (*pflId == 0L) + *pflId = 1L; + for(unsigned long LCNum = 0; LCNum < (unsigned long)lNumLids; LCNum++) if(alIds[LCNum] == *pflId) ++*pflId; if(*pflId > 254) // wow, no id available! @@ -424,17 +464,12 @@ void wxOS2SelectMatchingFontByName( ) { int i; - int nDiff0; int nPointSize; - int nDiff; int nIs; - int nMinDiff; int nMinDiff0; - int nApirc; int anDiff[16]; int anMinDiff[16]; int nIndex = 0; - STR8 zFn; char zFontFaceName[FACESIZE]; wxString sFaceName; USHORT usWeightClass; @@ -447,10 +482,13 @@ void wxOS2SelectMatchingFontByName( switch (pFont->GetFamily()) { case wxSCRIPT: - sFaceName = wxT("Script"); + sFaceName = wxT("Tms Rmn"); break; case wxDECORATIVE: + sFaceName = wxT("WarpSans"); + break; + case wxROMAN: sFaceName = wxT("Tms Rmn"); break; @@ -527,7 +565,7 @@ void wxOS2SelectMatchingFontByName( 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); @@ -595,27 +633,25 @@ void wxOS2SelectMatchingFontByName( // // 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 - pFattrs->lMaxBaselineExt = 0; // OUTLINE fonts need this set to 0 as they use other attributes to match - pFattrs->lAveCharWidth = 0; // OUTLINE fonts need this set to 0 as they use other attributes to match - pFattrs->fsType = 0;// pfm->fsType; /* uses default type */ - pFattrs->fsFontUse = 0; - + 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); - // Debug - strcpy(zFontFaceName, pFM[nIndex].szFacename); - strcpy(zFontFaceName, pFattrs->szFacename); + if (pFont->GetWeight() == wxNORMAL) + pFattrs->fsSelection = 0; + else + pFattrs->fsSelection = FATTR_SEL_BOLD; - if(usWeightClass >= FWEIGHT_BOLD) - pFattrs->fsSelection |= FATTR_SEL_BOLD; - if(pFont->GetUnderlined()) - pFattrs->fsSelection |= FATTR_SEL_UNDERSCORE; - if(fsSelection & FM_SEL_ITALIC) + if (pFont->GetStyle() == wxITALIC || pFont->GetStyle() == wxSLANT) pFattrs->fsSelection |= FATTR_SEL_ITALIC; + + if (pFont->GetUnderlined()) + pFattrs->fsSelection |= FATTR_SEL_UNDERSCORE; } // end of wxOS2SelectMatchingFontByName wxFont wxCreateFontFromLogFont(