X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/dbdcff51023a2c8efa35bd21f23c39102b0b6c12..5b304314d9b9b479c85d384737667768f0071d36:/src/mgl/fontutil.cpp diff --git a/src/mgl/fontutil.cpp b/src/mgl/fontutil.cpp index 59eb523363..16a7f0dabc 100644 --- a/src/mgl/fontutil.cpp +++ b/src/mgl/fontutil.cpp @@ -1,18 +1,13 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: mgl/fontutil.cpp +// Name: src/mgl/fontutil.cpp // Purpose: Font helper functions for MGL // Author: Vaclav Slavik // Created: 2001/04/29 // RCS-ID: $Id$ -// Copyright: (c) 2001 SciTech Software, Inc. (www.scitechsoft.com) -// Licence: wxWindows license +// Copyright: (c) 2001-2002 SciTech Software, Inc. (www.scitechsoft.com) +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// - -#ifdef __GNUG__ - #pragma implementation "fontutil.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -21,17 +16,19 @@ #endif #ifndef WX_PRECOMP - #include "wx/log.h" - #include "wx/fontutil.h" - #include "wx/fontmap.h" - #include "wx/tokenzr.h" #include "wx/hash.h" -#endif // PCH + #include "wx/log.h" +#endif +#include "wx/fontutil.h" +#include "wx/encinfo.h" +#include "wx/fontmap.h" +#include "wx/tokenzr.h" #include "wx/listimpl.cpp" #include "wx/sysopt.h" #include "wx/mgl/private.h" +#include "wx/private/fontmgr.h" #include @@ -52,20 +49,20 @@ bool wxNativeEncodingInfo::FromString(const wxString& s) wxString encid = tokenizer.GetNextToken(); long enc; if ( !encid.ToLong(&enc) ) - return FALSE; + return false; encoding = (wxFontEncoding)enc; // ok even if empty facename = tokenizer.GetNextToken(); - return TRUE; + return true; } wxString wxNativeEncodingInfo::ToString() const { wxString s; s << (long)encoding; - if ( !!facename ) + if ( !facename.empty() ) { s << _T(';') << facename; } @@ -80,7 +77,7 @@ wxString wxNativeEncodingInfo::ToString() const bool wxGetNativeFontEncoding(wxFontEncoding encoding, wxNativeEncodingInfo *info) { - wxCHECK_MSG( info, FALSE, _T("bad pointer in wxGetNativeFontEncoding") ); + wxCHECK_MSG( info, false, _T("bad pointer in wxGetNativeFontEncoding") ); if ( encoding == wxFONTENCODING_DEFAULT ) { @@ -129,324 +126,29 @@ bool wxGetNativeFontEncoding(wxFontEncoding encoding, default: // encoding not known to MGL - return FALSE; + return false; } info->encoding = encoding; - return TRUE; + return true; } bool wxTestFontEncoding(const wxNativeEncodingInfo& info) { if ( !info.facename ) - return TRUE; - - wxMGLFontFamily *family = wxTheFontsManager->GetFamily(info.facename); - if ( !family ) - return FALSE; - if ( family->GetInfo()->fontLibType == MGL_BITMAPFONT_LIB ) + return true; + + wxFontBundle *bundle = wxFontsManager::Get()->GetBundle(info.facename); + if ( !bundle ) + return false; + if ( bundle->GetInfo()->fontLibType == MGL_BITMAPFONT_LIB ) + { return (info.mglEncoding == MGL_ENCODING_ASCII || info.mglEncoding == MGL_ENCODING_ISO8859_1 || info.mglEncoding == MGL_ENCODING_ISO8859_15 || info.mglEncoding == MGL_ENCODING_CP1252); - else - return TRUE; -} - - -// ---------------------------------------------------------------------------- -// wxFontFamily, wxMGLFontInstance, wxMGLFontLibrary -// ---------------------------------------------------------------------------- - -WX_DECLARE_LIST(wxMGLFontInstance, wxMGLFontInstanceList); -WX_DEFINE_LIST(wxMGLFontInstanceList); -WX_DEFINE_LIST(wxMGLFontFamilyList); - -wxMGLFontInstance::wxMGLFontInstance(wxMGLFontLibrary *fontLib, - float pt, bool slant, bool aa) -{ - m_fontLib = fontLib; - m_font = NULL; - m_pt = pt; - m_slant = slant; - m_aa = aa; - - float slantAngle = m_slant ? 15.0 : 0.0; - - wxLogTrace("mgl_font", "loading instance of '%s' slant=%i pt=%0.1f aa=%i", - m_fontLib->GetMGLfont_lib_t()->name, m_slant, m_pt, m_aa); - m_font = MGL_loadFontInstance(m_fontLib->GetMGLfont_lib_t(), - m_pt, slantAngle, 0.0, aa); - wxASSERT_MSG( m_font, wxT("Cannot create font instance.") ); -} - -wxMGLFontInstance::~wxMGLFontInstance() -{ - wxLogTrace("mgl_font", "unloading instance of '%s' slant=%i pt=%0.1f aa=%i", - m_fontLib->GetMGLfont_lib_t()->name, m_slant, m_pt, m_aa); - if ( m_font ) - MGL_unloadFontInstance(m_font); -} - -wxMGLFontLibrary::wxMGLFontLibrary(const wxString& filename, int type) -{ - m_type = type; - m_fileName = filename; - m_refs = 0; - m_fontLib = NULL; - - m_instances = new wxMGLFontInstanceList; - m_instances->DeleteContents(TRUE); -} - -wxMGLFontLibrary::~wxMGLFontLibrary() -{ - wxLogTrace("mgl_font", "font library dtor '%s'", m_fileName.mb_str()); - delete m_instances; -} - -void wxMGLFontLibrary::IncRef() -{ - wxLogTrace("mgl_font", "incRef(%u) '%s'", m_refs, m_fileName.c_str()); - if ( m_refs++ == 0 ) - { - wxLogTrace("mgl_font", "opening library '%s'", m_fileName.mb_str()); - m_fontLib = MGL_openFontLib(m_fileName.mb_str()); } -} - -void wxMGLFontLibrary::DecRef() -{ - wxLogTrace("mgl_font", "decRef(%u) '%s'", m_refs, m_fileName.c_str()); - if ( --m_refs == 0 ) - { - wxLogTrace("mgl_font", "killing instances of '%s'", m_fileName.mb_str()); - m_instances->Clear(); - wxLogTrace("mgl_font", "closing library '%s'", m_fileName.mb_str()); - MGL_closeFontLib(m_fontLib); - m_fontLib = NULL; - } -} - -static int gs_antialiasingThreshold = -1; - -wxMGLFontInstance *wxMGLFontLibrary::GetFontInstance(wxFont *font, - float scale, bool aa) -{ - wxASSERT_MSG(m_refs > 0 && m_fontLib, wxT("font library not loaded!")); - - wxString facename; - bool slant; - bool antialiased; - float pt = (float)font->GetPointSize() * scale; - - if ( gs_antialiasingThreshold == -1 ) - { - gs_antialiasingThreshold = 10; -#if wxUSE_SYSTEM_OPTIONS - if ( wxSystemOptions::HasOption(wxT("mgl.aa-threshold")) ) - gs_antialiasingThreshold = - wxSystemOptions::GetOptionInt(wxT("mgl.aa-threshold")); - wxLogTrace("mgl_font", "AA threshold set to %i", gs_antialiasingThreshold); -#endif - } - - // Small characters don't look good when antialiased with the algorithm - // that FreeType uses (mere 2x2 supersampling), so lets disable it AA - // completely for small fonts. - if ( pt <= gs_antialiasingThreshold ) - antialiased = FALSE; - else - antialiased = (m_fontLib->fontLibType == MGL_BITMAPFONT_LIB) ? FALSE : aa; - - slant = (((m_type & wxFONTFACE_ITALIC) == 0) && - (font->GetStyle() == wxSLANT || font->GetStyle() == wxITALIC)); - - // FIXME_MGL -- MGL does not yet support slant, although the API is there - slant = FALSE; - - wxLogTrace("mgl_font", "requested instance of '%s' slant=%i pt=%0.1f aa=%i", - m_fileName.mb_str(), slant, pt, antialiased); - - wxMGLFontInstance *i; - wxMGLFontInstanceList::Node *node; - - for (node = m_instances->GetFirst(); node; node = node->GetNext()) - { - i = node->GetData(); - if ( i->GetPt() == pt && i->GetSlant() == slant && - i->GetAA() == antialiased ) - { - wxLogTrace("mgl_font", " got from cache: slant=%i pt=%0.1f aa=%i", - i->GetSlant(), i->GetPt(), i->GetAA()); - return i; - } - } - - i = new wxMGLFontInstance(this, pt, slant, antialiased); - m_instances->Append(i); - return i; -} - - -wxMGLFontFamily::wxMGLFontFamily(const font_info_t *info) -{ - m_name = info->familyName; - m_fontInfo = info; - - if ( info->regularFace[0] == '\0' ) - m_fontLibs[wxFONTFACE_REGULAR] = NULL; - else - m_fontLibs[wxFONTFACE_REGULAR] = - new wxMGLFontLibrary(info->regularFace, wxFONTFACE_REGULAR); - - if ( info->italicFace[0] == '\0' ) - m_fontLibs[wxFONTFACE_ITALIC] = NULL; else - m_fontLibs[wxFONTFACE_ITALIC] = - new wxMGLFontLibrary(info->italicFace, wxFONTFACE_ITALIC); - - if ( info->boldFace[0] == '\0' ) - m_fontLibs[wxFONTFACE_BOLD] = NULL; - else - m_fontLibs[wxFONTFACE_BOLD] = - new wxMGLFontLibrary(info->boldFace, wxFONTFACE_BOLD); - - if ( info->boldItalicFace[0] == '\0' ) - m_fontLibs[wxFONTFACE_BOLD_ITALIC] = NULL; - else - m_fontLibs[wxFONTFACE_BOLD_ITALIC] = - new wxMGLFontLibrary(info->boldItalicFace, wxFONTFACE_BOLD_ITALIC); - - wxLogTrace("mgl_font", "new family '%s' (r=%s, i=%s, b=%s, bi=%s)\n", - info->familyName, info->regularFace, info->italicFace, - info->boldFace, info->boldItalicFace); -} - -wxMGLFontFamily::~wxMGLFontFamily() -{ - for (size_t i = 0; i < wxFONTFACE_MAX; i++) - delete m_fontLibs[i]; -} - -bool wxMGLFontFamily::HasFace(int type) const -{ - return (m_fontLibs[type] != NULL); -} - - -// ---------------------------------------------------------------------------- -// wxFontsManager -// ---------------------------------------------------------------------------- - -wxMGLFontLibrary *wxFontsManager::GetFontLibrary(wxFont *font) -{ - wxMGLFontFamily *family; - int type; - wxString facename = font->GetFaceName(); - - if ( !facename.IsEmpty() ) - family = GetFamily(facename); - else - family = NULL; - - if ( !family ) - { - facename.Empty(); - switch (font->GetFamily()) - { - case wxSCRIPT: - facename = wxT("Script"); - break; - case wxDECORATIVE: - facename = wxT("Charter"); - break; - case wxROMAN: - facename = wxT("Times"); - break; - case wxTELETYPE: - case wxMODERN: - facename = wxT("Courier"); - break; - case wxSWISS: - facename = wxT("Helvetica"); - break; - case wxDEFAULT: - default: - facename = wxT("Helvetica"); - break; - } - - family = GetFamily(facename); - if ( !family ) - { - if ( m_list->GetFirst() ) - family = m_list->GetFirst()->GetData(); - else - wxFAIL_MSG(wxT("Fatal error, no fonts available!")); - } - } - - type = wxFONTFACE_REGULAR; - - if ( font->GetWeight() == wxBOLD ) - type |= wxFONTFACE_BOLD; - - // FIXME_MGL -- this should read "if ( font->GetStyle() == wxITALIC )", - // but since MGL does not yet support slant, we try to display it with - // italic face (better than nothing...) - if ( font->GetStyle() == wxITALIC || font->GetStyle() == wxSLANT ) - { - if ( family->HasFace(type | wxFONTFACE_ITALIC) ) - type |= wxFONTFACE_ITALIC; - } - if ( !family->HasFace(type) ) - { - for (int i = 0; i < wxFONTFACE_MAX; i++) - if ( family->HasFace(i) ) - { - type = i; - break; - } - } - - return family->GetLibrary(type); -} - -static ibool MGLAPI enum_callback(const font_info_t *info, void *cookie) -{ - wxFontsManager *db = (wxFontsManager*)cookie; - db->AddFamily(info); - return TRUE; + return true; } - -wxFontsManager::wxFontsManager() -{ - m_hash = new wxHashTable(wxKEY_STRING); - m_hash->DeleteContents(FALSE); - m_list = new wxMGLFontFamilyList; - m_list->DeleteContents(TRUE); - MGL_enumerateFonts(enum_callback, (void*)this); -} - -wxFontsManager::~wxFontsManager() -{ - delete m_hash; - delete m_list; -} - -void wxFontsManager::AddFamily(const font_info_t *info) -{ - wxMGLFontFamily *f = new wxMGLFontFamily(info); - m_hash->Put(f->GetName().Lower(), f); - m_list->Append(f); -} - -wxMGLFontFamily *wxFontsManager::GetFamily(const wxString& name) const -{ - return (wxMGLFontFamily*)m_hash->Get(name.Lower()); -} - - -wxFontsManager *wxTheFontsManager = NULL;