basic support for encodings for wxMSW::wxFont
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3774 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
		@@ -97,7 +97,7 @@ enum wxFontEncoding
 | 
				
			|||||||
    wxFONTENCODING_CP850,           // CP437 merged with Latin1
 | 
					    wxFONTENCODING_CP850,           // CP437 merged with Latin1
 | 
				
			||||||
    wxFONTENCODING_CP852,           // CP437 merged with Latin2
 | 
					    wxFONTENCODING_CP852,           // CP437 merged with Latin2
 | 
				
			||||||
    wxFONTENCODING_CP855,           // another cyrillic encoding
 | 
					    wxFONTENCODING_CP855,           // another cyrillic encoding
 | 
				
			||||||
    wxFONTENCODING_CP866 = wxFONTENCODING_ALTERNATIVE,
 | 
					    wxFONTENCODING_CP866,           // and another one
 | 
				
			||||||
        // and for Windows
 | 
					        // and for Windows
 | 
				
			||||||
    wxFONTENCODING_CP1250,          // WinLatin2
 | 
					    wxFONTENCODING_CP1250,          // WinLatin2
 | 
				
			||||||
    wxFONTENCODING_CP1251,          // WinCyrillic
 | 
					    wxFONTENCODING_CP1251,          // WinCyrillic
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										183
									
								
								src/msw/font.cpp
									
									
									
									
									
								
							
							
						
						
									
										183
									
								
								src/msw/font.cpp
									
									
									
									
									
								
							@@ -205,52 +205,89 @@ bool wxFont::RealizeResource()
 | 
				
			|||||||
        return TRUE;
 | 
					        return TRUE;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    BYTE ff_italic;
 | 
					 | 
				
			||||||
    int ff_weight = 0;
 | 
					 | 
				
			||||||
    int ff_family = 0;
 | 
					    int ff_family = 0;
 | 
				
			||||||
    wxString ff_face;
 | 
					    wxString ff_face;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch (M_FONTDATA->m_family)
 | 
					    switch ( M_FONTDATA->m_family )
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        case wxSCRIPT:     ff_family = FF_SCRIPT ;
 | 
					        case wxSCRIPT:
 | 
				
			||||||
 | 
					            ff_family = FF_SCRIPT ;
 | 
				
			||||||
            ff_face = _T("Script") ;
 | 
					            ff_face = _T("Script") ;
 | 
				
			||||||
            break ;
 | 
					            break ;
 | 
				
			||||||
        case wxDECORATIVE: ff_family = FF_DECORATIVE;
 | 
					
 | 
				
			||||||
 | 
					        case wxDECORATIVE:
 | 
				
			||||||
 | 
					            ff_family = FF_DECORATIVE;
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
        case wxROMAN:      ff_family = FF_ROMAN;
 | 
					
 | 
				
			||||||
 | 
					        case wxROMAN:
 | 
				
			||||||
 | 
					            ff_family = FF_ROMAN;
 | 
				
			||||||
            ff_face = _T("Times New Roman") ;
 | 
					            ff_face = _T("Times New Roman") ;
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        case wxTELETYPE:
 | 
					        case wxTELETYPE:
 | 
				
			||||||
        case wxMODERN:     ff_family = FF_MODERN;
 | 
					        case wxMODERN:
 | 
				
			||||||
 | 
					            ff_family = FF_MODERN;
 | 
				
			||||||
            ff_face = _T("Courier New") ;
 | 
					            ff_face = _T("Courier New") ;
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
        case wxSWISS:      ff_family = FF_SWISS;
 | 
					
 | 
				
			||||||
 | 
					        case wxSWISS:
 | 
				
			||||||
 | 
					            ff_family = FF_SWISS;
 | 
				
			||||||
            ff_face = _T("Arial") ;
 | 
					            ff_face = _T("Arial") ;
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        case wxDEFAULT:
 | 
					        case wxDEFAULT:
 | 
				
			||||||
        default:           ff_family = FF_SWISS;
 | 
					        default:
 | 
				
			||||||
 | 
					            ff_family = FF_SWISS;
 | 
				
			||||||
            ff_face = _T("Arial") ; 
 | 
					            ff_face = _T("Arial") ; 
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (M_FONTDATA->m_style == wxITALIC || M_FONTDATA->m_style == wxSLANT)
 | 
					    BYTE ff_italic;
 | 
				
			||||||
 | 
					    switch ( M_FONTDATA->m_style )
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        case wxITALIC:
 | 
				
			||||||
 | 
					        case wxSLANT:
 | 
				
			||||||
            ff_italic = 1;
 | 
					            ff_italic = 1;
 | 
				
			||||||
    else
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					            wxFAIL_MSG(_T("unknown font slant"));
 | 
				
			||||||
 | 
					            // fall through
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case wxNORMAL:
 | 
				
			||||||
            ff_italic = 0;
 | 
					            ff_italic = 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (M_FONTDATA->m_weight == wxNORMAL)
 | 
					    int ff_weight = 0;
 | 
				
			||||||
 | 
					    switch ( M_FONTDATA->m_weight )
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					            wxFAIL_MSG(_T("unknown font weight"));
 | 
				
			||||||
 | 
					            // fall through
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case wxNORMAL:
 | 
				
			||||||
            ff_weight = FW_NORMAL;
 | 
					            ff_weight = FW_NORMAL;
 | 
				
			||||||
    else if (M_FONTDATA->m_weight == wxLIGHT)
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case wxLIGHT:
 | 
				
			||||||
            ff_weight = FW_LIGHT;
 | 
					            ff_weight = FW_LIGHT;
 | 
				
			||||||
    else if (M_FONTDATA->m_weight == wxBOLD)
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case wxBOLD:
 | 
				
			||||||
            ff_weight = FW_BOLD;
 | 
					            ff_weight = FW_BOLD;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const wxChar* pzFace = (const wxChar*) ff_face;
 | 
					    const wxChar* pzFace;
 | 
				
			||||||
    if (!M_FONTDATA->m_faceName.IsNull())
 | 
					    if ( M_FONTDATA->m_faceName.IsEmpty() )
 | 
				
			||||||
        pzFace = (const wxChar*) M_FONTDATA->m_faceName ;
 | 
					        pzFace = ff_face;
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        pzFace = M_FONTDATA->m_faceName ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
    /* Always calculate fonts using the screen DC (is this the best strategy?)
 | 
					    /* Always calculate fonts using the screen DC (is this the best strategy?)
 | 
				
			||||||
     * There may be confusion if a font is selected into a printer
 | 
					     * There may be confusion if a font is selected into a printer
 | 
				
			||||||
     * DC (say), because the height will be calculated very differently.
 | 
					     * DC (say), because the height will be calculated very differently.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
    // What sort of display is it?
 | 
					    // What sort of display is it?
 | 
				
			||||||
    int technology = ::GetDeviceCaps(dc, TECHNOLOGY);
 | 
					    int technology = ::GetDeviceCaps(dc, TECHNOLOGY);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -267,16 +304,19 @@ bool wxFont::RealizeResource()
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        nHeight = M_FONTDATA->m_pointSize*GetDeviceCaps(dc, LOGPIXELSY)/72;
 | 
					        nHeight = M_FONTDATA->m_pointSize*GetDeviceCaps(dc, LOGPIXELSY)/72;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
     */
 | 
					#endif // 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
    // Have to get screen DC Caps, because a metafile will return 0.
 | 
					    // Have to get screen DC Caps, because a metafile will return 0.
 | 
				
			||||||
    HDC dc2 = ::GetDC(NULL);
 | 
					    HDC dc2 = ::GetDC(NULL);
 | 
				
			||||||
    int ppInch = ::GetDeviceCaps(dc2, LOGPIXELSY);
 | 
					    ppInch = ::GetDeviceCaps(dc2, LOGPIXELSY);
 | 
				
			||||||
    ::ReleaseDC(NULL, dc2);
 | 
					    ::ReleaseDC(NULL, dc2);
 | 
				
			||||||
 | 
					#endif // 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // New behaviour: apparently ppInch varies according to
 | 
					    // New behaviour: apparently ppInch varies according to Large/Small Fonts
 | 
				
			||||||
    // Large/Small Fonts setting in Windows. This messes
 | 
					    // setting in Windows. This messes up fonts. So, set ppInch to a constant
 | 
				
			||||||
    // up fonts. So, set ppInch to a constant 96 dpi.
 | 
					    // 96 dpi.
 | 
				
			||||||
    ppInch = 96;
 | 
					    static const int ppInch = 96;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if wxFONT_SIZE_COMPATIBILITY
 | 
					#if wxFONT_SIZE_COMPATIBILITY
 | 
				
			||||||
    // Incorrect, but compatible with old wxWindows behaviour
 | 
					    // Incorrect, but compatible with old wxWindows behaviour
 | 
				
			||||||
@@ -286,15 +326,96 @@ bool wxFont::RealizeResource()
 | 
				
			|||||||
    int nHeight = - (M_FONTDATA->m_pointSize*ppInch/72);
 | 
					    int nHeight = - (M_FONTDATA->m_pointSize*ppInch/72);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool ff_underline = M_FONTDATA->m_underlined;
 | 
					    BYTE ff_underline = M_FONTDATA->m_underlined;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    M_FONTDATA->m_hFont = (WXHFONT) CreateFont(nHeight, 0, 0, 0,ff_weight,ff_italic,(BYTE)ff_underline,
 | 
					    wxFontEncoding encoding = M_FONTDATA->m_encoding;
 | 
				
			||||||
            0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
 | 
					    if ( encoding == wxFONTENCODING_DEFAULT )
 | 
				
			||||||
            PROOF_QUALITY, DEFAULT_PITCH | ff_family, pzFace);
 | 
					    {
 | 
				
			||||||
#ifdef WXDEBUG_CREATE
 | 
					        encoding = wxFont::GetDefaultEncoding();
 | 
				
			||||||
    if (m_hFont==NULL) wxError(_T("Cannot create font"),_T("Internal Error")) ;
 | 
					    }
 | 
				
			||||||
#endif
 | 
					
 | 
				
			||||||
    return (M_FONTDATA->m_hFont != (WXHFONT) NULL);
 | 
					    DWORD charset;
 | 
				
			||||||
 | 
					    switch ( encoding )
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        case wxFONTENCODING_ISO8859_1:
 | 
				
			||||||
 | 
					        case wxFONTENCODING_ISO8859_15:
 | 
				
			||||||
 | 
					        case wxFONTENCODING_CP1250:
 | 
				
			||||||
 | 
					            charset = ANSI_CHARSET;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case wxFONTENCODING_ISO8859_2:
 | 
				
			||||||
 | 
					        case wxFONTENCODING_CP1252:
 | 
				
			||||||
 | 
					            charset = EASTEUROPE_CHARSET;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case wxFONTENCODING_ISO8859_4:
 | 
				
			||||||
 | 
					        case wxFONTENCODING_ISO8859_10:
 | 
				
			||||||
 | 
					            charset = BALTIC_CHARSET;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case wxFONTENCODING_ISO8859_5:
 | 
				
			||||||
 | 
					        case wxFONTENCODING_CP1251:
 | 
				
			||||||
 | 
					            charset = RUSSIAN_CHARSET;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case wxFONTENCODING_ISO8859_6:
 | 
				
			||||||
 | 
					            charset = ARABIC_CHARSET;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case wxFONTENCODING_ISO8859_7:
 | 
				
			||||||
 | 
					            charset = GREEK_CHARSET;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case wxFONTENCODING_ISO8859_8:
 | 
				
			||||||
 | 
					            charset = HEBREW_CHARSET;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case wxFONTENCODING_ISO8859_9:
 | 
				
			||||||
 | 
					            charset = TURKISH_CHARSET;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case wxFONTENCODING_ISO8859_11:
 | 
				
			||||||
 | 
					            charset = THAI_CHARSET;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case wxFONTENCODING_CP437:
 | 
				
			||||||
 | 
					            charset = OEM_CHARSET;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					            wxFAIL_MSG(_T("unsupported encoding"));
 | 
				
			||||||
 | 
					            // fall through
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case wxFONTENCODING_SYSTEM:
 | 
				
			||||||
 | 
					            charset = ANSI_CHARSET;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    HFONT hFont = ::CreateFont
 | 
				
			||||||
 | 
					                  (
 | 
				
			||||||
 | 
					                   nHeight,             // height
 | 
				
			||||||
 | 
					                   0,                   // width (choose best)
 | 
				
			||||||
 | 
					                   0,                   // escapement
 | 
				
			||||||
 | 
					                   0,                   // orientation
 | 
				
			||||||
 | 
					                   ff_weight,           // weight
 | 
				
			||||||
 | 
					                   ff_italic,           // italic?
 | 
				
			||||||
 | 
					                   ff_underline,        // underlined?
 | 
				
			||||||
 | 
					                   0,                   // strikeout?
 | 
				
			||||||
 | 
					                   charset,             // charset
 | 
				
			||||||
 | 
					                   OUT_DEFAULT_PRECIS,  // precision
 | 
				
			||||||
 | 
					                   CLIP_DEFAULT_PRECIS, // clip precision
 | 
				
			||||||
 | 
					                   PROOF_QUALITY,       // quality of match
 | 
				
			||||||
 | 
					                   DEFAULT_PITCH |      // fixed or variable
 | 
				
			||||||
 | 
					                   ff_family,           // family id
 | 
				
			||||||
 | 
					                   pzFace               // face name
 | 
				
			||||||
 | 
					                  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    M_FONTDATA->m_hFont = (WXHFONT)hFont;
 | 
				
			||||||
 | 
					    if ( !hFont )
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        wxLogLastError("CreateFont");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return hFont != 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool wxFont::FreeResource(bool force)
 | 
					bool wxFont::FreeResource(bool force)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user