X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3a46bcdd32a216b78174c1d115ced691d02932a7..513b47e9b7faf61ed20bb00541c793d163ac307b:/src/mac/carbon/fontenum.cpp diff --git a/src/mac/carbon/fontenum.cpp b/src/mac/carbon/fontenum.cpp index adb3957eca..3cbe7bad1b 100644 --- a/src/mac/carbon/fontenum.cpp +++ b/src/mac/carbon/fontenum.cpp @@ -14,143 +14,93 @@ #if wxUSE_FONTMAP +#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/intl.h" #include "wx/mac/private.h" - -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) -{ - 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; -} - -void wxFontEnumeratorHelper::DoEnumerate() +bool wxFontEnumerator::EnumerateFacenames(wxFontEncoding encoding, + bool fixedWidthOnly) { - MenuHandle menu; - short lines; - - menu = NewMenu( 32000, "\pFont" ); - AppendResMenu( menu, 'FONT' ); - lines = CountMenuItems( menu ); - - for ( int i = 1; i < lines + 1; i ++ ) + // + // From Apple's QA 1471 http://developer.apple.com/qa/qa2006/qa1471.html + // + + ATSFontFamilyIterator theFontFamilyIterator = NULL; + ATSFontFamilyRef theATSFontFamilyRef = 0; + OSStatus status = noErr; + + wxArrayString fontFamilies ; + + // Create the iterator + status = ATSFontFamilyIteratorCreate(kATSFontContextLocal, nil,nil, + kATSOptionFlagsUnRestrictedScope, + &theFontFamilyIterator ); + + wxUint32 macEncoding = wxMacGetSystemEncFromFontEnc(encoding) ; + + while (status == noErr) { - wxString c_name ; -#if TARGET_API_MAC_CARBON - CFStringRef menutext ; - c_name = wxEmptyString ; - if ( CopyMenuItemTextAsCFString (menu, i, &menutext) == noErr ) + // Get the next font in the iteration. + status = ATSFontFamilyIteratorNext( theFontFamilyIterator, &theATSFontFamilyRef ); + if(status == noErr) { - c_name = wxMacCFStringHolder(menutext).AsString(wxLocale::GetSystemEncoding()); - } -#else - Str255 p_name; - GetMenuItemText( menu, i, p_name ); - c_name = wxMacMakeStringFromPascal( p_name ); + #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 ) + { + status = noErr; + continue ; + } #endif - -#if 0 - if ( m_fixedOnly ) - { - // check that it's a fixed pitch font: - // there is *no* error here: the flag name is misleading! - if ( tm->tmPitchAndFamily & TMPF_FIXED_PITCH ) - // not a fixed pitch font - return true; + if ( encoding != wxFONTENCODING_SYSTEM ) + { + TextEncoding fontFamiliyEncoding = ATSFontFamilyGetEncoding(theATSFontFamilyRef) ; + if ( fontFamiliyEncoding != macEncoding ) + continue ; + } + + // TODO: determine fixed widths ... + + CFStringRef theName = NULL; + ATSFontFamilyGetName(theATSFontFamilyRef, kATSOptionFlagsDefault, &theName); + wxMacCFStringHolder cfName(theName) ; + fontFamilies.Add(cfName.AsString(wxLocale::GetSystemEncoding())); } - - if ( m_charset != -1 ) + else if (status == kATSIterationScopeModified) // Make sure the font database hasnÕt changed. { - // check that we have the right encoding - if ( lf->lfCharSet != m_charset ) - return true; + // reset the iterator + status = ATSFontFamilyIteratorReset (kATSFontContextLocal, nil, nil, + kATSOptionFlagsUnRestrictedScope, + &theFontFamilyIterator); + fontFamilies.Clear() ; } -#endif - - m_fontEnum->OnFacename( c_name ); } - - DisposeMenu( menu ); -} - -// ---------------------------------------------------------------------------- -// wxFontEnumerator -// ---------------------------------------------------------------------------- - -bool wxFontEnumerator::EnumerateFacenames(wxFontEncoding encoding, - bool fixedWidthOnly) -{ - wxFontEnumeratorHelper fe(this); - if ( fe.SetEncoding(encoding) ) + ATSFontFamilyIteratorRelease(&theFontFamilyIterator); + + 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; } @@ -161,4 +111,4 @@ bool wxFontEnumerator::EnumerateEncodings(const wxString& family) return true; } -#endif +#endif // wxUSE_FONTMAP