X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/179e085f05fab385b89a18281e115003de890388..4813bb8d72d4e6821e031f2b19baaa338b714d39:/src/mac/carbon/fontenum.cpp diff --git a/src/mac/carbon/fontenum.cpp b/src/mac/carbon/fontenum.cpp index ea743eee90..233bdf3dd8 100644 --- a/src/mac/carbon/fontenum.cpp +++ b/src/mac/carbon/fontenum.cpp @@ -1,177 +1,120 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: mac/fontenum.cpp +// Name: src/mac/carbon/fontenum.cpp // Purpose: wxFontEnumerator class for MacOS // Author: Stefan Csomor -// Modified by: +// Modified by: // Created: 04/01/98 // RCS-ID: $Id$ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// -// ============================================================================ -// declarations -// ============================================================================ - -// ---------------------------------------------------------------------------- -// headers -// ---------------------------------------------------------------------------- - -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "fontenum.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" -#if wxUSE_FONTMAP +#if wxUSE_FONTENUM -#ifdef __BORLANDC__ - #pragma hdrstop -#endif +#include "wx/fontenum.h" #ifndef WX_PRECOMP - #include "wx/font.h" + #include "wx/font.h" + #include "wx/intl.h" #endif -#include "wx/fontenum.h" #include "wx/fontutil.h" #include "wx/fontmap.h" -#include "wx/fontutil.h" #include "wx/encinfo.h" #include "wx/mac/private.h" // ---------------------------------------------------------------------------- -// private classes -// ---------------------------------------------------------------------------- - -class wxFontEnumeratorHelper -{ -public: - wxFontEnumeratorHelper(wxFontEnumerator *fontEnum); - - // control what exactly are we enumerating - bool SetEncoding(wxFontEncoding encoding); - void SetFixedOnly(bool fixedOnly) - { m_fixedOnly = fixedOnly; } - - // call to start enumeration - void DoEnumerate(); - -private: - // the object we forward calls to OnFont() to - wxFontEnumerator *m_fontEnum; - - // if != -1, enum only fonts which have this encoding - int m_charset; - - // if not empty, enum only the fonts with this facename - wxString m_facename; - - // if TRUE, enum only fixed fonts - bool m_fixedOnly; -}; -// ============================================================================ -// implementation -// ============================================================================ - -// ---------------------------------------------------------------------------- -// wxFontEnumeratorHelper +// wxFontEnumerator // ---------------------------------------------------------------------------- -wxFontEnumeratorHelper::wxFontEnumeratorHelper(wxFontEnumerator *fontEnum) -{ - m_fontEnum = fontEnum; - m_charset = -1; - m_fixedOnly = FALSE; -} - -bool wxFontEnumeratorHelper::SetEncoding(wxFontEncoding encoding) +bool wxFontEnumerator::EnumerateFacenames(wxFontEncoding encoding, + bool fixedWidthOnly) { - wxNativeEncodingInfo info; - if ( !wxGetNativeFontEncoding(encoding, &info) ) + if ( fixedWidthOnly ) { - if ( !wxFontMapper::Get()->GetAltForEncoding(encoding, &info) ) - { - // no such encodings at all - return FALSE; - } + wxFAIL_MSG( "enumerating only fixed width fonts not supported" ); + return false; } - m_charset = info.charset; - m_facename = info.facename; - return TRUE; -} + // + // From Apple's QA 1471 http://developer.apple.com/qa/qa2006/qa1471.html + // -void wxFontEnumeratorHelper::DoEnumerate() -{ - MenuHandle menu ; - Str255 p_name ; + ATSFontFamilyIterator theFontFamilyIterator = NULL; + ATSFontFamilyRef theATSFontFamilyRef = 0; + OSStatus status = noErr; - short lines ; - - menu = NewMenu( 32000 , "\pFont" ) ; - AppendResMenu( menu , 'FONT' ) ; - lines = CountMenuItems( menu ) ; + wxArrayString fontFamilies ; - for ( int i = 1 ; i < lines+1 ; i ++ ) - { - GetMenuItemText( menu , i , p_name ) ; - wxString c_name = wxMacMakeStringFromPascal(p_name) ; + // Create the iterator + status = ATSFontFamilyIteratorCreate(kATSFontContextLocal, nil,nil, + kATSOptionFlagsUnRestrictedScope, + &theFontFamilyIterator ); + + wxUint32 macEncoding = wxMacGetSystemEncFromFontEnc(encoding) ; - /* - - if ( m_fixedOnly ) + while (status == noErr) + { + // Get the next font in the iteration. + status = ATSFontFamilyIteratorNext( theFontFamilyIterator, &theATSFontFamilyRef ); + if(status == noErr) { - // check that it's a fixed pitch font (there is *no* error here, the - // flag name is misleading!) - if ( tm->tmPitchAndFamily & TMPF_FIXED_PITCH ) + #ifndef __LP64__ + // TODO CS : Find replacement + // added CS : avoid showing fonts that won't be displayable + FMFontStyle intrinsicStyle = 0 ; + FMFont fontInstance ; + FMFontFamily fmFamily = FMGetFontFamilyFromATSFontFamilyRef( theATSFontFamilyRef ); + status = FMGetFontFromFontFamilyInstance( fmFamily , 0 , &fontInstance , &intrinsicStyle); + if ( status != noErr ) { - // not a fixed pitch font - return TRUE; + status = noErr; + continue ; } - } - - if ( m_charset != -1 ) - { - // check that we have the right encoding - if ( lf->lfCharSet != m_charset ) +#endif + if ( encoding != wxFONTENCODING_SYSTEM ) { - return TRUE; + TextEncoding fontFamiliyEncoding = ATSFontFamilyGetEncoding(theATSFontFamilyRef) ; + if ( fontFamiliyEncoding != macEncoding ) + continue ; } + + // TODO: determine fixed widths ... + + CFStringRef theName = NULL; + ATSFontFamilyGetName(theATSFontFamilyRef, kATSOptionFlagsDefault, &theName); + wxCFStringRef cfName(theName) ; + fontFamilies.Add(cfName.AsString(wxLocale::GetSystemEncoding())); + } + else if (status == kATSIterationScopeModified) // Make sure the font database hasnÕt changed. + { + // reset the iterator + status = ATSFontFamilyIteratorReset (kATSFontContextLocal, nil, nil, + kATSOptionFlagsUnRestrictedScope, + &theFontFamilyIterator); + fontFamilies.Clear() ; } - - */ - m_fontEnum->OnFacename( c_name ) ; } - DisposeMenu( menu ) ; -} - -// ---------------------------------------------------------------------------- -// wxFontEnumerator -// ---------------------------------------------------------------------------- + ATSFontFamilyIteratorRelease(&theFontFamilyIterator); -bool wxFontEnumerator::EnumerateFacenames(wxFontEncoding encoding, - bool fixedWidthOnly) -{ - wxFontEnumeratorHelper fe(this); - if ( fe.SetEncoding(encoding) ) + for ( size_t i = 0 ; i < fontFamilies.Count() ; ++i ) { - fe.SetFixedOnly(fixedWidthOnly); - - fe.DoEnumerate(); + if ( OnFacename( fontFamilies[i] ) == false ) + break ; } - // else: no such fonts, unknown encoding - return TRUE; + return true; } -bool wxFontEnumerator::EnumerateEncodings(const wxString& family) +bool wxFontEnumerator::EnumerateEncodings(const wxString& WXUNUSED(family)) { wxFAIL_MSG(wxT("wxFontEnumerator::EnumerateEncodings() not yet implemented")); - return TRUE; + return true; } -#endif +#endif // wxUSE_FONTENUM