X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cc95f4f9477e96ac2ce9a18f410ef98a169a75a6..1696dde5fdcc34c00440f3de8a6d8b8d3bf73f92:/src/os2/fontutil.cpp diff --git a/src/os2/fontutil.cpp b/src/os2/fontutil.cpp index 052537053e..aac250ae03 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" @@ -239,7 +240,7 @@ bool wxTestFontEncoding( vLogFont.fsFontUse = FATTR_FONTUSE_OUTLINE | // only outline fonts allowed FATTR_FONTUSE_TRANSFORMABLE; // may be transformed - strncpy(vLogFont.szFacename, rInfo.facename.c_str(), sizeof(vLogFont.szFacename)); + wxStrncpy((wxChar*)vLogFont.szFacename, rInfo.facename.c_str(), WXSIZEOF(vLogFont.szFacename)); if (!::GpiCreateLogFont( hPS ,NULL @@ -258,10 +259,49 @@ 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 -, HPS hPS +, HPS* phPS +, bool* pbInternalPS , long* pflId , wxString& sFaceName , wxFont* pFont @@ -269,7 +309,7 @@ void wxFillLogFont( { 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; @@ -277,22 +317,30 @@ void wxFillLogFont( // 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. @@ -303,7 +351,7 @@ void wxFillLogFont( // Retrieve the font metrics. // lTemp = lNumFonts; - lTemp = ::GpiQueryFonts( hPS + lTemp = ::GpiQueryFonts( *phPS ,QF_PUBLIC ,NULL ,&lTemp @@ -314,31 +362,19 @@ void wxFillLogFont( ,(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; @@ -355,8 +391,7 @@ void wxFillLogFont( // 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 lGpiError; + long lNumLids = ::GpiQueryNumberSetIds(*phPS); if(lNumLids ) { @@ -364,7 +399,8 @@ void wxFillLogFont( STR8 azNames[255]; long alIds[255]; - if(!::GpiQuerySetIds( hPS + memset(alIds, 0, sizeof(long) * 255); + if(!::GpiQuerySetIds( *phPS ,lNumLids ,alTypes ,azNames @@ -372,26 +408,28 @@ void wxFillLogFont( )) { if (bInternalPS) - ::WinReleasePS(hPS); + ::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! { 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 @@ -400,7 +438,7 @@ void wxFillLogFont( strcpy(zFacename, pFattrs->szFacename); - if(::GpiQueryFaceString( hPS + if(::GpiQueryFaceString( *phPS ,zFacename ,pFaceName ,FACESIZE @@ -409,7 +447,8 @@ void wxFillLogFont( { vError = ::WinGetLastError(vHabmain); } - sFaceName = zFacename; + sFaceName = (wxChar*)zFacename; + *pbInternalPS = bInternalPS; // // That's it, we now have everything we need to actually create the font @@ -425,18 +464,13 @@ void wxOS2SelectMatchingFontByName( ) { int i; - int nDiff0; int nPointSize; - int nDiff; int nIs; - int nIndex; - int nMinDiff; int nMinDiff0; - int nApirc; int anDiff[16]; int anMinDiff[16]; - STR8 zFn; - char zFontFaceName[FACESIZE]; + int nIndex = 0; + wxChar zFontFaceName[FACESIZE]; wxString sFaceName; USHORT usWeightClass; int fsSelection = 0; @@ -448,26 +482,32 @@ 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("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()) @@ -525,7 +565,7 @@ void wxOS2SelectMatchingFontByName( int nEmHeight = 0; int nXHeight = 0; - anDiff[0] = wxGpiStrcmp(pFM[i].szFamilyname, zFontFaceName); + anDiff[0] = wxGpiStrcmp((wxChar*)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); @@ -593,35 +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 - 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((wxChar*)pFattrs->szFacename, (wxChar*)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( @@ -630,115 +660,17 @@ 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( - char* s0 -, char* s1 + wxChar* s0 +, wxChar* s1 ) { int l0; int l1; @@ -759,8 +691,8 @@ int wxGpiStrcmp( else if(s1 == NULL) return 32; - l0 = strlen(s0); - l1 = strlen(s1); + l0 = wxStrlen(s0); + l1 = wxStrlen(s1); l = l0; if(l0 != l1) { @@ -773,7 +705,7 @@ int wxGpiStrcmp( d = s0[i]-s1[i]; if(!d) continue; - d1 = toupper(s0[i]) - toupper(s1[i]); + d1 = wxToupper(s0[i]) - wxToupper(s1[i]); if(!d1) continue; rc += abs(d);