bool wxFontEnumerator::EnumerateFacenames(wxFontEncoding encoding, bool fixedWidthOnly) { bool found = false; const wxFontBundleList& list = wxFontsManager::Get()->GetBundles(); wxFontBundleList::Node *node; wxFontBundle *f = NULL; wxNativeEncodingInfo info; if ( encoding != wxFONTENCODING_SYSTEM ) wxGetNativeFontEncoding(encoding, &info); for (node = list.GetFirst(); node; node = node->GetNext()) { f = node->GetData(); info.facename = f->GetName(); if ( (!fixedWidthOnly || f->IsFixed()) && (encoding == wxFONTENCODING_SYSTEM || wxTestFontEncoding(info)) ) { found = true; if ( !OnFacename(f->GetName()) ) return true; } } return found; }
void wxNativeFontInfo::SetEncoding(wxFontEncoding encoding) { wxNativeEncodingInfo info; if ( wxGetNativeFontEncoding(encoding, &info) ) { SetXFontComponent(wxXLFD_ENCODING, info.xencoding); SetXFontComponent(wxXLFD_REGISTRY, info.xregistry); } }
bool wxFontMapper::IsEncodingAvailable(wxFontEncoding encoding, const wxString& facename) { wxNativeEncodingInfo info; if ( !wxGetNativeFontEncoding(encoding, &info) ) return false; info.facename = facename; return wxTestFontEncoding(info); }
void wxFontRefData::SetEncoding(wxFontEncoding encoding) { m_encoding = encoding; if ( HasNativeFont() ) { wxNativeEncodingInfo info; if ( wxGetNativeFontEncoding(encoding, &info) ) { m_nativeFontInfo.SetXFontComponent(wxXLFD_REGISTRY, info.xregistry); m_nativeFontInfo.SetXFontComponent(wxXLFD_ENCODING, info.xencoding); } } }
bool wxFontEnumeratorHelper::SetEncoding(wxFontEncoding encoding) { wxNativeEncodingInfo info; if ( !wxGetNativeFontEncoding(encoding, &info) ) { if ( !wxFontMapper::Get()->GetAltForEncoding(encoding, &info) ) { // no such encodings at all return FALSE; } } m_charset = info.charset; m_facename = info.facename; return TRUE; }
bool wxFontEnumeratorHelper::SetEncoding(wxFontEncoding encoding) { if ( encoding != wxFONTENCODING_SYSTEM ) { wxNativeEncodingInfo info; if ( !wxGetNativeFontEncoding(encoding, &info) ) { #if wxUSE_FONTMAP if ( !wxFontMapper::Get()->GetAltForEncoding(encoding, &info) ) #endif // wxUSE_FONTMAP { // no such encodings at all return false; } } m_charset = info.charset; m_facename = info.facename; } return true; }
bool wxFontMapper::TestAltEncoding(const wxString& configEntry, wxFontEncoding encReplacement, wxNativeEncodingInfo *info) { if ( wxGetNativeFontEncoding(encReplacement, info) && wxTestFontEncoding(*info) ) { #if wxUSE_CONFIG && wxUSE_FILECONFIG // remember the mapping in the config wxFontMapperPathChanger path(this, FONTMAPPER_FONT_FROM_ENCODING_PATH); if ( path.IsOk() ) { GetConfig()->Write(configEntry, info->ToString()); } #else wxUnusedVar(configEntry); #endif // wxUSE_CONFIG return true; } return false; }
wxNativeFont wxLoadQueryNearestFont(float pointSize, wxFontFamily family, wxFontStyle style, int weight, bool underlined, const wxString &facename, wxFontEncoding encoding, wxString* xFontName) { if ( encoding == wxFONTENCODING_DEFAULT ) { encoding = wxFont::GetDefaultEncoding(); } // first determine the encoding - if the font doesn't exist at all in this // encoding, it's useless to do all other approximations (i.e. size, // family &c don't matter much) wxNativeEncodingInfo info; if ( encoding == wxFONTENCODING_SYSTEM ) { // This will always work so we don't test to save time wxGetNativeFontEncoding(wxFONTENCODING_SYSTEM, &info); } else { if ( !wxGetNativeFontEncoding(encoding, &info) || !wxTestFontEncoding(info) ) { #if wxUSE_FONTMAP if ( !wxFontMapper::Get()->GetAltForEncoding(encoding, &info) ) #endif // wxUSE_FONTMAP { // unspported encoding - replace it with the default // // NB: we can't just return 0 from here because wxGTK code doesn't // check for it (i.e. it supposes that we'll always succeed), // so it would provoke a crash wxGetNativeFontEncoding(wxFONTENCODING_SYSTEM, &info); } } } // OK, we have the correct xregistry/xencoding in info structure wxNativeFont font = 0; // if we already have the X font name, try to use it if( xFontName && !xFontName->empty() ) { // // Make sure point size is correct for scale factor. // wxStringTokenizer tokenizer(*xFontName, wxT("-"), wxTOKEN_RET_DELIMS); wxString newFontName; for(int i = 0; i < 8; i++) newFontName += tokenizer.NextToken(); (void) tokenizer.NextToken(); newFontName += wxString::Format(wxT("%d-"), pointSize); while(tokenizer.HasMoreTokens()) newFontName += tokenizer.GetNextToken(); font = wxLoadFont(newFontName); if(font) *xFontName = newFontName; } if ( !font ) { // search up and down by stepsize 10 int max_size = pointSize + 20 * (1 + (pointSize/180)); int min_size = pointSize - 20 * (1 + (pointSize/180)); int i, round; // counters // first round: search for equal, then for smaller and for larger size // with the given weight and style int testweight = weight; wxFontStyle teststyle = style; for ( round = 0; round < 3; round++ ) { // second round: use normal weight if ( round == 1 ) { if ( testweight != wxFONTWEIGHT_NORMAL ) { testweight = wxFONTWEIGHT_NORMAL; } else { ++round; // fall through to third round } } // third round: ... and use normal style if ( round == 2 ) { if ( teststyle != wxFONTSTYLE_NORMAL ) { teststyle = wxFONTSTYLE_NORMAL; } else { break; } } // Search for equal or smaller size (approx.) for ( i = pointSize; !font && i >= 10 && i >= min_size; i -= 10 ) { font = wxLoadQueryFont(i, family, teststyle, testweight, underlined, facename, info.xregistry, info.xencoding, xFontName); } // Search for larger size (approx.) for ( i = pointSize + 10; !font && i <= max_size; i += 10 ) { font = wxLoadQueryFont(i, family, teststyle, testweight, underlined, facename, info.xregistry, info.xencoding, xFontName); } } // Try default family if ( !font && family != wxFONTFAMILY_DEFAULT ) { font = wxLoadQueryFont(pointSize, wxFONTFAMILY_DEFAULT, style, weight, underlined, facename, info.xregistry, info.xencoding, xFontName ); } // ignore size, family, style and weight but try to find font with the // given facename and encoding if ( !font ) { font = wxLoadQueryFont(120, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, underlined, facename, info.xregistry, info.xencoding, xFontName); // ignore family as well if ( !font ) { font = wxLoadQueryFont(120, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, underlined, wxEmptyString, info.xregistry, info.xencoding, xFontName); // if it still failed, try to get the font of any size but // with the requested encoding: this can happen if the // encoding is only available in one size which happens to be // different from 120 if ( !font ) { font = wxLoadQueryFont(-1, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxEmptyString, info.xregistry, info.xencoding, xFontName); // this should never happen as we had tested for it in the // very beginning, but if it does, do return something non // NULL or we'd crash in wxFont code if ( !font ) { wxFAIL_MSG( wxT("this encoding should be available!") ); font = wxLoadQueryFont(-1, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxEmptyString, wxT("*"), wxT("*"), xFontName); } } } } } return font; }
bool wxFontEnumerator::EnumerateEncodings(const wxString& family) { static wxFontEncoding encodings[] = { wxFONTENCODING_ISO8859_1, wxFONTENCODING_ISO8859_2, wxFONTENCODING_ISO8859_3, wxFONTENCODING_ISO8859_4, wxFONTENCODING_ISO8859_5, wxFONTENCODING_ISO8859_6, wxFONTENCODING_ISO8859_7, wxFONTENCODING_ISO8859_8, wxFONTENCODING_ISO8859_9, wxFONTENCODING_ISO8859_10, //wxFONTENCODING_ISO8859_11, //wxFONTENCODING_ISO8859_12, wxFONTENCODING_ISO8859_13, wxFONTENCODING_ISO8859_14, wxFONTENCODING_ISO8859_15, wxFONTENCODING_CP1250, wxFONTENCODING_CP1251, wxFONTENCODING_CP1252, wxFONTENCODING_CP1253, wxFONTENCODING_CP1254, wxFONTENCODING_CP1255, wxFONTENCODING_CP1256, wxFONTENCODING_CP1257, wxFONTENCODING_KOI8, wxFONTENCODING_SYSTEM }; static const char *encodingNames[] = { "iso88590-1", "iso88590-2", "iso88590-3", "iso88590-4", "iso88590-5", "iso88590-6", "iso88590-7", "iso88590-8", "iso88590-9", "iso88590-10", "iso88590-13", "iso88590-14", "iso88590-15", "windows-1250", "windows-1251", "windows-1252", "windows-1253", "windows-1254", "windows-1255", "windows-1256", "windows-1257", "koi-8", NULL }; wxNativeEncodingInfo info; info.facename = family; for (size_t i = 0; encodings[i] != wxFONTENCODING_SYSTEM; i++) { if ( !wxGetNativeFontEncoding(encodings[i], &info) || !wxTestFontEncoding(info) ) continue; if ( !OnFontEncoding(family, encodingNames[i]) ) break; } return true; }