+ if ( GetResourceHandle() )
+ {
+ // VZ: the old code returned FALSE in this case, but it doesn't seem
+ // to make sense because the font _was_ created
+ wxLogDebug(wxT("Calling wxFont::RealizeResource() twice"));
+
+ return TRUE;
+ }
+
+ HPS hps;
+ FATTRS fAttrs;
+ FACENAMEDESC fName;
+ LONG fLid;
+
+ fAttrs.usRecordLength = sizeof(FATTRS);
+ fAttrs.fsFontUse = FATTR_FONTUSE_OUTLINE | // only outline fonts allowed
+ FATTR_FONTUSE_TRANSFORMABLE; // may be transformed
+ fAttrs.fsType = 0;
+ fAttrs.lMaxBaselineExt = fAttrs.lAveCharWidth = 0;
+ fAttrs.idRegistry = 0;
+ fAttrs.lMatch = 0;
+
+ fName.usSize = sizeof(FACENAMEDESC);
+ fName.usWidthClass = FWIDTH_NORMAL;
+ fName.usReserved = 0;
+ fName.flOptions = 0;
+
+ wxString ff_face;
+
+// OS/2 combines the family with styles to give a facename
+
+ switch ( M_FONTDATA->m_family )
+ {
+ case wxSCRIPT:
+ case wxDECORATIVE:
+ case wxROMAN:
+ ff_face = wxT("Times New Roman") ;
+ break;
+
+ case wxTELETYPE:
+ case wxMODERN:
+ ff_face = wxT("Courier") ;
+ break;
+
+ case wxSWISS:
+ case wxDEFAULT:
+ default:
+ ff_face = wxT("Helvetica") ;
+ }
+
+ switch ( M_FONTDATA->m_style )
+ {
+ case wxITALIC:
+ case wxSLANT:
+ fAttrs.fsSelection = FATTR_SEL_ITALIC;
+ break;
+
+ default:
+ wxFAIL_MSG(wxT("unknown font slant"));
+ // fall through
+
+ case wxNORMAL:
+ fAttrs.fsSelection = 0;
+ }
+
+ switch ( M_FONTDATA->m_weight )
+ {
+ default:
+ wxFAIL_MSG(wxT("unknown font weight"));
+ // fall through
+
+ case wxNORMAL:
+ fName.usWeightClass = FWEIGHT_NORMAL;
+ break;
+
+ case wxLIGHT:
+ fName.usWeightClass = FWEIGHT_LIGHT;
+ break;
+
+ case wxBOLD:
+ fName.usWeightClass = FWEIGHT_BOLD;
+ break;
+ }
+
+ if( M_FONTDATA->m_underlined )
+ fAttrs.fsSelection |= FATTR_SEL_UNDERSCORE;
+
+ wxFontEncoding encoding = M_FONTDATA->m_encoding;
+ if ( encoding == wxFONTENCODING_DEFAULT )
+ {
+ encoding = wxFont::GetDefaultEncoding();
+ }
+
+ switch ( encoding )
+ {
+ case wxFONTENCODING_ISO8859_1:
+ case wxFONTENCODING_ISO8859_15:
+ case wxFONTENCODING_CP1250:
+ fAttrs.usCodePage = 1250;
+ break;
+
+ case wxFONTENCODING_ISO8859_2:
+ case wxFONTENCODING_CP1252:
+ fAttrs.usCodePage = 1252;
+ break;
+
+ case wxFONTENCODING_ISO8859_4:
+ case wxFONTENCODING_ISO8859_10:
+ fAttrs.usCodePage = 850; // what is baltic?
+ break;
+
+ case wxFONTENCODING_ISO8859_5:
+ case wxFONTENCODING_CP1251:
+ fAttrs.usCodePage = 1251;
+ break;
+
+ case wxFONTENCODING_ISO8859_6:
+ fAttrs.usCodePage = 850; // what is arabic?
+ break;
+
+ case wxFONTENCODING_ISO8859_7:
+ fAttrs.usCodePage = 850; // what is greek
+ break;
+
+ case wxFONTENCODING_ISO8859_8:
+ fAttrs.usCodePage = 850; // what is hebrew?
+ break;
+
+ case wxFONTENCODING_ISO8859_9:
+ fAttrs.usCodePage = 857;
+ break;
+
+ case wxFONTENCODING_ISO8859_11:
+ fAttrs.usCodePage = 850; // what is thai
+ break;
+
+ case wxFONTENCODING_CP437:
+ fAttrs.usCodePage = 437;
+ break;
+
+ default:
+ wxFAIL_MSG(wxT("unsupported encoding"));
+ // fall through
+
+ case wxFONTENCODING_SYSTEM:
+ fAttrs.usCodePage = 850; // what is ANSI?
+ break;
+ }
+
+// Now cheking
+ fLid = 1;
+ hps = ::WinGetPS( HWND_DESKTOP );
+
+ long numLids = ::GpiQueryNumberSetIds( hps );
+ long gpiError;
+
+ // First we should generate unique id
+ if( numLids )
+ {
+ long Types[255];
+ STR8 Names[255];
+ long lIds[255];
+
+ if( !GpiQuerySetIds(hps, numLids, Types, Names, lIds) )
+ {
+ ::WinReleasePS( hps );
+ return 0;
+ }
+
+ for(unsigned long LCNum = 0; LCNum < numLids; LCNum++)
+ if(lIds[LCNum] == fLid)
+ ++fLid;
+ if(fLid > 254) // wow, no id available!
+ {
+ ::WinReleasePS( hps );
+ return 0;
+ }
+ }
+
+ // now building facestring
+ if(::GpiQueryFaceString(hps, ff_face.c_str(), &fName, FACESIZE, fAttrs.szFacename) == GPI_ERROR)
+ {
+ ::WinReleasePS( hps );
+ return 0;
+ }
+
+ // now creating font
+ WXHFONT hFont = (WXHFONT)0;
+
+ if(::GpiCreateLogFont(hps, NULL, fLid, &fAttrs) != GPI_ERROR)
+ M_FONTDATA->m_hFont = hFont = (WXHFONT)1;
+
+ if( hFont )
+ ::GpiDeleteSetId(hps, fLid);
+
+ ::WinReleasePS( hps );
+
+ if ( !hFont )
+ {
+ wxLogLastError("CreateFont");
+ }
+
+ return hFont != 0;
+}
+
+bool wxFont::FreeResource(bool force)
+{
+ if ( GetResourceHandle() )
+ {
+// TODO:
+// if ( !::DeleteObject((HFONT) M_FONTDATA->m_hFont) )
+// {
+// wxLogLastError("DeleteObject(font)");
+// }
+
+ M_FONTDATA->m_hFont = 0;
+
+ return TRUE;
+ }