1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/osx/carbon/font.cpp
3 // Purpose: wxFont class
4 // Author: Stefan Csomor
8 // Copyright: (c) Stefan Csomor
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 #include "wx/wxprec.h"
17 #include "wx/string.h"
20 #include "wx/gdicmn.h"
24 #include "wx/fontutil.h"
25 #include "wx/graphics.h"
26 #include "wx/settings.h"
27 #include "wx/tokenzr.h"
29 #include "wx/osx/private.h"
34 IMPLEMENT_DYNAMIC_CLASS(wxFont
, wxGDIObject
)
36 class WXDLLEXPORT wxFontRefData
: public wxGDIRefData
43 m_info
.Init(10, wxFONTFAMILY_DEFAULT
, wxFONTSTYLE_NORMAL
, wxFONTWEIGHT_NORMAL
,
44 false, wxEmptyString
, wxFONTENCODING_DEFAULT
);
47 wxFontRefData(const wxFontRefData
& data
);
49 wxFontRefData( const wxNativeFontInfo
& info
) : m_info(info
)
54 wxFontRefData(wxOSXSystemFont font
, int size
);
56 #if wxOSX_USE_CORE_TEXT
57 wxFontRefData( wxUint32 coreTextFontType
);
58 wxFontRefData( CTFontRef font
);
59 wxFontRefData( CTFontDescriptorRef fontdescriptor
, int size
);
62 virtual ~wxFontRefData();
64 void SetPointSize( int size
)
66 if( GetPointSize() != size
)
68 m_info
.SetPointSize(size
);
73 int GetPointSize() const { return m_info
.GetPointSize(); }
75 void SetFamily( wxFontFamily family
)
77 if ( m_info
.m_family
!= family
)
79 m_info
.SetFamily( family
);
84 wxFontFamily
GetFamily() const { return m_info
.GetFamily(); }
86 void SetStyle( wxFontStyle style
)
88 if ( m_info
.m_style
!= style
)
90 m_info
.SetStyle( style
);
96 wxFontStyle
GetStyle() const { return m_info
.GetStyle(); }
98 void SetWeight( wxFontWeight weight
)
100 if ( m_info
.m_weight
!= weight
)
102 m_info
.SetWeight( weight
);
108 wxFontWeight
GetWeight() const { return m_info
.GetWeight(); }
110 void SetUnderlined( bool u
)
112 if ( m_info
.m_underlined
!= u
)
114 m_info
.SetUnderlined( u
);
119 bool GetUnderlined() const { return m_info
.GetUnderlined(); }
121 void SetFaceName( const wxString
& facename
)
123 if ( m_info
.m_faceName
!= facename
)
125 m_info
.SetFaceName( facename
);
130 wxString
GetFaceName() const { return m_info
.GetFaceName(); }
132 void SetEncoding( wxFontEncoding encoding
)
134 if ( m_info
.m_encoding
!= encoding
)
136 m_info
.SetEncoding( encoding
);
141 wxFontEncoding
GetEncoding() const { return m_info
.GetEncoding(); }
148 // common part of all ctors
150 #if wxOSX_USE_CORE_TEXT
151 // void Init( CTFontRef font );
155 #if wxOSX_USE_CARBON && wxOSX_USE_ATSU_TEXT
156 // for true theming support we must store the correct font
157 // information here, as this speeds up and optimizes rendering
158 ThemeFontID m_macThemeFontID
;
160 #if wxOSX_USE_CORE_TEXT
161 wxCFRef
<CTFontRef
> m_ctFont
;
163 #if wxOSX_USE_ATSU_TEXT
164 void CreateATSUFont();
166 ATSUStyle m_macATSUStyle
;
168 wxCFRef
<CGFontRef
> m_cgFont
;
175 wxNativeFontInfo m_info
;
178 #define M_FONTDATA ((wxFontRefData*)m_refData)
180 wxFontRefData::wxFontRefData(const wxFontRefData
& data
)
183 m_info
= data
.m_info
;
184 m_fontValid
= data
.m_fontValid
;
185 #if wxOSX_USE_CARBON && wxOSX_USE_ATSU_TEXT
186 m_macThemeFontID
= data
.m_macThemeFontID
;
188 #if wxOSX_USE_CORE_TEXT
189 m_ctFont
= data
.m_ctFont
;
191 m_cgFont
= data
.m_cgFont
;
192 #if wxOSX_USE_ATSU_TEXT
193 if ( data
.m_macATSUStyle
!= NULL
)
195 ATSUCreateStyle(&m_macATSUStyle
) ;
196 ATSUCopyAttributes(data
.m_macATSUStyle
, m_macATSUStyle
);
200 m_nsFont
= (NSFont
*) wxMacCocoaRetain(data
.m_nsFont
);
203 m_uiFont
= (UIFont
*) wxMacCocoaRetain(data
.m_uiFont
);
208 // ============================================================================
210 // ============================================================================
212 // ----------------------------------------------------------------------------
214 // ----------------------------------------------------------------------------
216 void wxFontRefData::Init()
218 #if wxOSX_USE_CARBON && wxOSX_USE_ATSU_TEXT
219 m_macThemeFontID
= kThemeCurrentPortFont
;
221 #if wxOSX_USE_ATSU_TEXT
222 m_macATSUStyle
= NULL
;
233 wxFontRefData::~wxFontRefData()
238 void wxFontRefData::Free()
240 #if wxOSX_USE_CORE_TEXT
244 #if wxOSX_USE_ATSU_TEXT
246 m_macThemeFontID
= kThemeCurrentPortFont
;
248 if ( m_macATSUStyle
)
250 ::ATSUDisposeStyle((ATSUStyle
)m_macATSUStyle
);
251 m_macATSUStyle
= NULL
;
255 if (m_nsFont
!= NULL
)
257 wxMacCocoaRelease(m_nsFont
);
262 if (m_uiFont
!= NULL
)
264 wxMacCocoaRelease(m_uiFont
);
271 wxFontRefData::wxFontRefData(wxOSXSystemFont font
, int size
)
273 wxASSERT( font
!= wxOSX_SYSTEM_FONT_NONE
);
276 #if wxOSX_USE_CORE_TEXT
277 if ( UMAGetSystemVersion() >= 0x1050 )
279 CTFontUIFontType uifont
= kCTFontSystemFontType
;
282 case wxOSX_SYSTEM_FONT_NORMAL
:
283 uifont
= kCTFontSystemFontType
;
285 case wxOSX_SYSTEM_FONT_BOLD
:
286 uifont
= kCTFontEmphasizedSystemFontType
;
288 case wxOSX_SYSTEM_FONT_SMALL
:
289 uifont
= kCTFontSmallSystemFontType
;
291 case wxOSX_SYSTEM_FONT_SMALL_BOLD
:
292 uifont
= kCTFontSmallEmphasizedSystemFontType
;
294 case wxOSX_SYSTEM_FONT_MINI
:
295 uifont
= kCTFontMiniSystemFontType
;
297 case wxOSX_SYSTEM_FONT_MINI_BOLD
:
298 uifont
= kCTFontMiniEmphasizedSystemFontType
;
300 case wxOSX_SYSTEM_FONT_LABELS
:
301 uifont
= kCTFontLabelFontType
;
303 case wxOSX_SYSTEM_FONT_VIEWS
:
304 uifont
= kCTFontViewsFontType
;
309 m_ctFont
.reset(CTFontCreateUIFontForLanguage( uifont
, (CGFloat
) size
, NULL
));
310 wxCFRef
<CTFontDescriptorRef
> descr
;
311 descr
.reset( CTFontCopyFontDescriptor( m_ctFont
) );
315 #if wxOSX_USE_ATSU_TEXT
317 #if !wxOSX_USE_CARBON
318 // not needed outside
319 ThemeFontID m_macThemeFontID
= kThemeSystemFont
;
323 case wxOSX_SYSTEM_FONT_NORMAL
:
324 m_macThemeFontID
= kThemeSystemFont
;
326 case wxOSX_SYSTEM_FONT_BOLD
:
327 m_macThemeFontID
= kThemeEmphasizedSystemFont
;
329 case wxOSX_SYSTEM_FONT_SMALL
:
330 m_macThemeFontID
= kThemeSmallSystemFont
;
332 case wxOSX_SYSTEM_FONT_SMALL_BOLD
:
333 m_macThemeFontID
= kThemeSmallEmphasizedSystemFont
;
335 case wxOSX_SYSTEM_FONT_MINI
:
336 m_macThemeFontID
= kThemeMiniSystemFont
;
338 case wxOSX_SYSTEM_FONT_MINI_BOLD
:
339 // bold not available under theming
340 m_macThemeFontID
= kThemeMiniSystemFont
;
342 case wxOSX_SYSTEM_FONT_LABELS
:
343 m_macThemeFontID
= kThemeLabelFont
;
345 case wxOSX_SYSTEM_FONT_VIEWS
:
346 m_macThemeFontID
= kThemeViewsFont
;
351 if ( m_info
.m_faceName
.empty() )
357 GetThemeFont( m_macThemeFontID
, GetApplicationScript(), qdFontName
, &fontSize
, &style
);
361 wxFontStyle fontstyle
= wxFONTSTYLE_NORMAL
;
362 wxFontWeight fontweight
= wxFONTWEIGHT_NORMAL
;
363 bool underlined
= false;
366 fontweight
= wxFONTWEIGHT_BOLD
;
368 fontweight
= wxFONTWEIGHT_NORMAL
;
369 if ( style
& italic
)
370 fontstyle
= wxFONTSTYLE_ITALIC
;
371 if ( style
& underline
)
374 m_info
.Init(fontSize
,wxFONTFAMILY_DEFAULT
,fontstyle
,fontweight
,underlined
,
375 wxMacMakeStringFromPascal( qdFontName
), wxFONTENCODING_DEFAULT
);
380 m_nsFont
= wxFont::OSXCreateNSFont( font
, &m_info
);
383 m_uiFont
= wxFont::OSXCreateUIFont( font
, &m_info
);
385 m_info
.EnsureValid();
386 #if wxOSX_USE_ATSU_TEXT
393 #if wxOSX_USE_ATSU_TEXT
394 void wxFontRefData::CreateATSUFont()
396 // we try to get as much styles as possible into ATSU
398 OSStatus status
= ::ATSUCreateStyle(&m_macATSUStyle
);
399 wxASSERT_MSG( status
== noErr
, wxT("couldn't create ATSU style") );
401 ATSUAttributeTag atsuTags
[] =
405 kATSUVerticalCharacterTag
,
408 kATSUQDUnderlineTag
,
409 kATSUQDCondensedTag
,
412 ByteCount atsuSizes
[WXSIZEOF(atsuTags
)] =
414 sizeof( ATSUFontID
) ,
416 sizeof( ATSUVerticalCharacterType
),
424 Boolean kTrue
= true ;
425 Boolean kFalse
= false ;
427 Fixed atsuSize
= IntToFixed( m_info
.m_pointSize
);
428 ATSUVerticalCharacterType kHorizontal
= kATSUStronglyHorizontal
;
429 FMFontStyle addQDStyle
= m_info
.m_atsuAdditionalQDStyles
;
430 ATSUAttributeValuePtr atsuValues
[WXSIZEOF(atsuTags
)] =
432 &m_info
.m_atsuFontID
,
435 (addQDStyle
& bold
) ? &kTrue
: &kFalse
,
436 (addQDStyle
& italic
) ? &kTrue
: &kFalse
,
437 (addQDStyle
& underline
) ? &kTrue
: &kFalse
,
438 (addQDStyle
& condense
) ? &kTrue
: &kFalse
,
439 (addQDStyle
& extend
) ? &kTrue
: &kFalse
,
442 status
= ::ATSUSetAttributes(
443 (ATSUStyle
)m_macATSUStyle
,
445 atsuTags
, atsuSizes
, atsuValues
);
447 wxASSERT_MSG( status
== noErr
, wxString::Format(wxT("couldn't modify ATSU style. Status was %d"), (int) status
).c_str() );
449 if ( m_cgFont
.get() == NULL
)
451 ATSFontRef fontRef
= FMGetATSFontRefFromFont(m_info
.m_atsuFontID
);
452 m_cgFont
.reset( CGFontCreateWithPlatformFont( &fontRef
) );
457 void wxFontRefData::MacFindFont()
462 wxCHECK_RET( m_info
.m_pointSize
> 0, wxT("Point size should not be zero.") );
464 m_info
.EnsureValid();
466 #if wxOSX_USE_CORE_TEXT
467 if ( UMAGetSystemVersion() >= 0x1050 )
469 CTFontSymbolicTraits traits
= 0;
471 if (m_info
.m_weight
== wxFONTWEIGHT_BOLD
)
472 traits
|= kCTFontBoldTrait
;
473 if (m_info
.m_style
== wxFONTSTYLE_ITALIC
|| m_info
.m_style
== wxFONTSTYLE_SLANT
)
474 traits
|= kCTFontItalicTrait
;
477 wxString lookupnameWithSize
= wxString::Format( "%s_%ld_%ld", m_info
.m_faceName
.c_str(), traits
, m_info
.m_pointSize
);
479 static std::map
< std::wstring
, wxCFRef
< CTFontRef
> > fontcache
;
480 m_ctFont
= fontcache
[ std::wstring(lookupnameWithSize
.wc_str()) ];
483 m_ctFont
.reset(CTFontCreateWithName( wxCFStringRef(m_info
.m_faceName
), m_info
.m_pointSize
, NULL
));
486 m_ctFont
.reset(CTFontCreateCopyWithSymbolicTraits( m_ctFont
, 0, NULL
, traits
, traits
));
490 m_cgFont
.reset(CTFontCopyGraphicsFont(m_ctFont
, NULL
));
494 #if wxOSX_USE_ATSU_TEXT
498 m_nsFont
= wxFont::OSXCreateNSFont( &m_info
);
501 m_uiFont
= wxFont::OSXCreateUIFont( &m_info
);
506 // ----------------------------------------------------------------------------
508 // ----------------------------------------------------------------------------
510 bool wxFont::Create(const wxNativeFontInfo
& info
)
514 m_refData
= new wxFontRefData( info
);
520 wxFont::wxFont(wxOSXSystemFont font
)
522 m_refData
= new wxFontRefData( font
, 0 );
525 wxFont::wxFont(const wxString
& fontdesc
)
527 wxNativeFontInfo info
;
528 if ( info
.FromString(fontdesc
) )
532 bool wxFont::Create(int pointSize
,
537 const wxString
& faceNameParam
,
538 wxFontEncoding encoding
)
542 wxString faceName
= faceNameParam
;
544 if ( faceName
.empty() )
548 case wxFONTFAMILY_DEFAULT
:
549 faceName
= wxT("Lucida Grande");
552 case wxFONTFAMILY_SCRIPT
:
553 case wxFONTFAMILY_ROMAN
:
554 case wxFONTFAMILY_DECORATIVE
:
555 faceName
= wxT("Times");
558 case wxFONTFAMILY_SWISS
:
559 faceName
= wxT("Helvetica");
562 case wxFONTFAMILY_MODERN
:
563 case wxFONTFAMILY_TELETYPE
:
564 faceName
= wxT("Courier");
568 faceName
= wxT("Times");
573 wxNativeFontInfo info
;
575 info
.Init(pointSize
, family
, style
, weight
,
576 underlined
, faceName
, encoding
);
578 m_refData
= new wxFontRefData(info
);
587 void wxFont::DoSetNativeFontInfo(const wxNativeFontInfo
& info
)
591 m_refData
= new wxFontRefData( info
);
595 bool wxFont::RealizeResource()
597 M_FONTDATA
->MacFindFont();
602 void wxFont::SetEncoding(wxFontEncoding encoding
)
606 M_FONTDATA
->SetEncoding( encoding
);
609 wxGDIRefData
*wxFont::CreateGDIRefData() const
611 return new wxFontRefData
;
614 wxGDIRefData
*wxFont::CloneGDIRefData(const wxGDIRefData
*data
) const
616 return new wxFontRefData(*static_cast<const wxFontRefData
*>(data
));
619 void wxFont::SetPointSize(int pointSize
)
621 if ( M_FONTDATA
->GetPointSize() == pointSize
)
626 M_FONTDATA
->SetPointSize( pointSize
);
629 void wxFont::SetFamily(wxFontFamily family
)
633 M_FONTDATA
->SetFamily( family
);
636 void wxFont::SetStyle(wxFontStyle style
)
640 M_FONTDATA
->SetStyle( style
);
643 void wxFont::SetWeight(wxFontWeight weight
)
647 M_FONTDATA
->SetWeight( weight
);
650 bool wxFont::SetFaceName(const wxString
& faceName
)
654 M_FONTDATA
->SetFaceName( faceName
);
656 return wxFontBase::SetFaceName(faceName
);
659 void wxFont::SetUnderlined(bool underlined
)
663 M_FONTDATA
->SetUnderlined( underlined
);
666 // ----------------------------------------------------------------------------
668 // ----------------------------------------------------------------------------
670 // TODO: insert checks everywhere for M_FONTDATA == NULL!
672 int wxFont::GetPointSize() const
674 wxCHECK_MSG( M_FONTDATA
!= NULL
, 0, wxT("invalid font") );
676 return M_FONTDATA
->GetPointSize();
679 wxSize
wxFont::GetPixelSize() const
681 #if wxUSE_GRAPHICS_CONTEXT
682 // TODO: consider caching the value
683 wxGraphicsContext
* dc
= wxGraphicsContext::CreateFromNative((CGContextRef
) NULL
);
684 dc
->SetFont(*(wxFont
*)this,*wxBLACK
);
685 wxDouble width
, height
= 0;
686 dc
->GetTextExtent( wxT("g"), &width
, &height
, NULL
, NULL
);
688 return wxSize((int)width
, (int)height
);
690 return wxFontBase::GetPixelSize();
694 wxFontFamily
wxFont::GetFamily() const
696 wxCHECK_MSG( M_FONTDATA
!= NULL
, wxFONTFAMILY_MAX
, wxT("invalid font") );
698 return M_FONTDATA
->GetFamily();
701 wxFontStyle
wxFont::GetStyle() const
703 wxCHECK_MSG( M_FONTDATA
!= NULL
, wxFONTSTYLE_MAX
, wxT("invalid font") );
705 return M_FONTDATA
->GetStyle() ;
708 wxFontWeight
wxFont::GetWeight() const
710 wxCHECK_MSG( M_FONTDATA
!= NULL
, wxFONTWEIGHT_MAX
, wxT("invalid font") );
712 return M_FONTDATA
->GetWeight();
715 bool wxFont::GetUnderlined() const
717 wxCHECK_MSG( M_FONTDATA
!= NULL
, false, wxT("invalid font") );
719 return M_FONTDATA
->GetUnderlined();
722 wxString
wxFont::GetFaceName() const
724 wxCHECK_MSG( M_FONTDATA
!= NULL
, wxEmptyString
, wxT("invalid font") );
726 return M_FONTDATA
->GetFaceName() ;
729 wxFontEncoding
wxFont::GetEncoding() const
731 wxCHECK_MSG( M_FONTDATA
!= NULL
, wxFONTENCODING_DEFAULT
, wxT("invalid font") );
733 return M_FONTDATA
->GetEncoding() ;
736 #if wxOSX_USE_ATSU_TEXT && wxOSX_USE_CARBON
738 short wxFont::MacGetFontNum() const
740 wxCHECK_MSG( M_FONTDATA
!= NULL
, 0, wxT("invalid font") );
742 // cast away constness otherwise lazy font resolution is not possible
743 const_cast<wxFont
*>(this)->RealizeResource();
745 return M_FONTDATA
->m_info
.m_qdFontFamily
;
748 wxByte
wxFont::MacGetFontStyle() const
750 wxCHECK_MSG( M_FONTDATA
!= NULL
, 0, wxT("invalid font") );
752 // cast away constness otherwise lazy font resolution is not possible
753 const_cast<wxFont
*>(this)->RealizeResource();
755 return M_FONTDATA
->m_info
.m_qdFontStyle
;
758 wxUint16
wxFont::MacGetThemeFontID() const
760 wxCHECK_MSG( M_FONTDATA
!= NULL
, 0, wxT("invalid font") );
762 return M_FONTDATA
->m_macThemeFontID
;
767 #if wxOSX_USE_ATSU_TEXT
768 void * wxFont::MacGetATSUStyle() const
770 wxCHECK_MSG( M_FONTDATA
!= NULL
, NULL
, wxT("invalid font") );
772 // cast away constness otherwise lazy font resolution is not possible
773 const_cast<wxFont
*>(this)->RealizeResource();
775 return M_FONTDATA
->m_macATSUStyle
;
778 #if WXWIN_COMPATIBILITY_2_8
779 wxUint32
wxFont::MacGetATSUFontID() const
781 wxCHECK_MSG( M_FONTDATA
!= NULL
, 0, wxT("invalid font") );
783 // cast away constness otherwise lazy font resolution is not possible
784 const_cast<wxFont
*>(this)->RealizeResource();
786 return M_FONTDATA
->m_info
.m_atsuFontID
;
789 wxUint32
wxFont::MacGetATSUAdditionalQDStyles() const
791 wxCHECK_MSG( M_FONTDATA
!= NULL
, 0, wxT("invalid font") );
793 // cast away constness otherwise lazy font resolution is not possible
794 const_cast<wxFont
*>(this)->RealizeResource();
796 return M_FONTDATA
->m_info
.m_atsuAdditionalQDStyles
;
802 #if wxOSX_USE_CORE_TEXT
804 CTFontRef
wxFont::OSXGetCTFont() const
806 wxCHECK_MSG( M_FONTDATA
!= NULL
, 0, wxT("invalid font") );
808 // cast away constness otherwise lazy font resolution is not possible
809 const_cast<wxFont
*>(this)->RealizeResource();
811 return (CTFontRef
)(M_FONTDATA
->m_ctFont
);
816 #if wxOSX_USE_COCOA_OR_CARBON
818 CGFontRef
wxFont::OSXGetCGFont() const
820 wxCHECK_MSG( M_FONTDATA
!= NULL
, 0, wxT("invalid font") );
822 // cast away constness otherwise lazy font resolution is not possible
823 const_cast<wxFont
*>(this)->RealizeResource();
825 return (M_FONTDATA
->m_cgFont
);
833 NSFont
* wxFont::OSXGetNSFont() const
835 wxCHECK_MSG( M_FONTDATA
!= NULL
, 0, wxT("invalid font") );
837 // cast away constness otherwise lazy font resolution is not possible
838 const_cast<wxFont
*>(this)->RealizeResource();
840 return (M_FONTDATA
->m_nsFont
);
845 const wxNativeFontInfo
* wxFont::GetNativeFontInfo() const
847 wxCHECK_MSG( M_FONTDATA
!= NULL
, NULL
, wxT("invalid font") );
848 wxCHECK_MSG( Ok(), NULL
, wxT("invalid font") );
850 // cast away constness otherwise lazy font resolution is not possible
851 const_cast<wxFont
*>(this)->RealizeResource();
853 // M_FONTDATA->m_info.InitFromFont(*this);
855 return &(M_FONTDATA
->m_info
);
858 // ----------------------------------------------------------------------------
860 // ----------------------------------------------------------------------------
862 #if wxOSX_USE_CORE_TEXT
864 /* from Core Text Manual Common Operations */
866 static CTFontDescriptorRef
wxMacCreateCTFontDescriptor(CFStringRef iFamilyName
, CTFontSymbolicTraits iTraits
)
868 CTFontDescriptorRef descriptor
= NULL
;
869 CFMutableDictionaryRef attributes
;
871 wxASSERT(iFamilyName
!= NULL
);
872 // Create a mutable dictionary to hold our attributes.
873 attributes
= CFDictionaryCreateMutable(kCFAllocatorDefault
, 0,
874 &kCFTypeDictionaryKeyCallBacks
, &kCFTypeDictionaryValueCallBacks
);
875 wxASSERT(attributes
!= NULL
);
877 if (attributes
!= NULL
) {
878 // Add a family name to our attributes.
879 CFDictionaryAddValue(attributes
, kCTFontFamilyNameAttribute
, iFamilyName
);
883 CFMutableDictionaryRef traits
;
884 CFNumberRef symTraits
;
886 // Create the traits dictionary.
887 symTraits
= CFNumberCreate(kCFAllocatorDefault
, kCFNumberSInt32Type
,
889 wxASSERT(symTraits
!= NULL
);
891 if (symTraits
!= NULL
) {
892 // Create a dictionary to hold our traits values.
893 traits
= CFDictionaryCreateMutable(kCFAllocatorDefault
, 0,
894 &kCFTypeDictionaryKeyCallBacks
, &kCFTypeDictionaryValueCallBacks
);
895 wxASSERT(traits
!= NULL
);
897 if (traits
!= NULL
) {
898 // Add the symbolic traits value to the traits dictionary.
899 CFDictionaryAddValue(traits
, kCTFontSymbolicTrait
, symTraits
);
901 // Add the traits attribute to our attributes.
902 CFDictionaryAddValue(attributes
, kCTFontTraitsAttribute
, traits
);
905 CFRelease(symTraits
);
908 // Create the font descriptor with our attributes
909 descriptor
= CTFontDescriptorCreateWithAttributes(attributes
);
910 wxASSERT(descriptor
!= NULL
);
912 CFRelease(attributes
);
914 // Return our font descriptor.
920 void wxNativeFontInfo::Init()
922 #if wxOSX_USE_ATSU_TEXT
924 m_atsuAdditionalQDStyles
= 0;
925 m_atsuFontValid
= false;
932 m_family
= wxFONTFAMILY_DEFAULT
;
933 m_style
= wxFONTSTYLE_NORMAL
;
934 m_weight
= wxFONTWEIGHT_NORMAL
;
935 m_underlined
= false;
937 m_encoding
= wxFont::GetDefaultEncoding();
938 m_descriptorValid
= false;
941 #if wxOSX_USE_CORE_TEXT
942 void wxNativeFontInfo::Init(CTFontDescriptorRef descr
)
946 wxCFRef
< CFNumberRef
> sizevalue( (CFNumberRef
) CTFontDescriptorCopyAttribute( descr
, kCTFontSizeAttribute
) );
948 if ( CFNumberGetValue( sizevalue
, kCFNumberFloatType
, &fsize
) )
949 m_pointSize
= (int)( fsize
+ 0.5 );
951 wxCFRef
< CFDictionaryRef
> traitsvalue( (CFDictionaryRef
) CTFontDescriptorCopyAttribute( descr
, kCTFontTraitsAttribute
) );
952 CTFontSymbolicTraits traits
;
953 if ( CFNumberGetValue((CFNumberRef
) CFDictionaryGetValue(traitsvalue
,kCTFontSymbolicTrait
),kCFNumberIntType
,&traits
) )
955 if ( traits
& kCTFontItalicTrait
)
956 m_style
= wxFONTSTYLE_ITALIC
;
957 if ( traits
& kCTFontBoldTrait
)
958 m_weight
= wxFONTWEIGHT_BOLD
;
961 wxCFStringRef
familyName( (CFStringRef
) CTFontDescriptorCopyAttribute(descr
, kCTFontFamilyNameAttribute
));
962 m_faceName
= familyName
.AsString();
966 void wxNativeFontInfo::EnsureValid()
968 if ( m_descriptorValid
)
971 #if wxOSX_USE_ATSU_TEXT
972 if ( !m_atsuFontValid
)
974 #if !wxOSX_USE_CARBON
975 // not needed outside
976 wxInt16 m_qdFontFamily
;
977 wxInt16 m_qdFontStyle
;
979 wxCFStringRef
cf( m_faceName
, wxLocale::GetSystemEncoding() );
980 ATSFontFamilyRef atsfamily
= ATSFontFamilyFindFromName( cf
, kATSOptionFlagsDefault
);
981 if ( atsfamily
== (ATSFontFamilyRef
) -1 )
983 wxLogDebug( wxT("ATSFontFamilyFindFromName failed for ") + m_faceName
);
984 m_qdFontFamily
= GetAppFont();
988 m_qdFontFamily
= FMGetFontFamilyFromATSFontFamilyRef( atsfamily
);
992 if (m_weight
== wxFONTWEIGHT_BOLD
)
993 m_qdFontStyle
|= bold
;
994 if (m_style
== wxFONTSTYLE_ITALIC
|| m_style
== wxFONTSTYLE_SLANT
)
995 m_qdFontStyle
|= italic
;
997 m_qdFontStyle
|= underline
;
1000 // we try to get as much styles as possible into ATSU
1002 // ATSUFontID and FMFont are equivalent
1003 FMFontStyle intrinsicStyle
= 0 ;
1004 OSStatus status
= FMGetFontFromFontFamilyInstance( m_qdFontFamily
, m_qdFontStyle
, (FMFont
*)&m_atsuFontID
, &intrinsicStyle
);
1005 if ( status
!= noErr
)
1007 wxFAIL_MSG( wxT("couldn't get an ATSUFont from font family") );
1009 m_atsuAdditionalQDStyles
= m_qdFontStyle
& (~intrinsicStyle
);
1010 m_atsuFontValid
= true;
1013 m_descriptorValid
= true;
1016 void wxNativeFontInfo::Init(const wxNativeFontInfo
& info
)
1019 #if wxOSX_USE_ATSU_TEXT
1020 m_atsuFontValid
= info
.m_atsuFontValid
;
1021 m_atsuFontID
= info
.m_atsuFontID
;
1022 m_atsuAdditionalQDStyles
= info
.m_atsuAdditionalQDStyles
;
1023 #if wxOSX_USE_CARBON
1024 m_qdFontFamily
= info
.m_qdFontFamily
;
1025 m_qdFontStyle
= info
.m_qdFontStyle
;
1028 m_pointSize
= info
.m_pointSize
;
1029 m_family
= info
.m_family
;
1030 m_style
= info
.m_style
;
1031 m_weight
= info
.m_weight
;
1032 m_underlined
= info
.m_underlined
;
1033 m_faceName
= info
.m_faceName
;
1034 m_encoding
= info
.m_encoding
;
1035 m_descriptorValid
= info
.m_descriptorValid
;
1038 void wxNativeFontInfo::Init(int size
,
1039 wxFontFamily family
,
1041 wxFontWeight weight
,
1043 const wxString
& faceName
,
1044 wxFontEncoding encoding
)
1051 m_underlined
= underlined
;
1052 m_faceName
= faceName
;
1053 if ( encoding
== wxFONTENCODING_DEFAULT
)
1054 encoding
= wxFont::GetDefaultEncoding();
1055 m_encoding
= encoding
;
1059 void wxNativeFontInfo::Free()
1061 #if wxOSX_USE_ATSU_TEXT
1063 m_atsuAdditionalQDStyles
= 0;
1064 m_atsuFontValid
= false;
1066 m_descriptorValid
= false;
1069 bool wxNativeFontInfo::FromString(const wxString
& s
)
1073 wxStringTokenizer
tokenizer(s
, wxT(";"));
1075 wxString token
= tokenizer
.GetNextToken();
1077 // Ignore the version for now
1080 token
= tokenizer
.GetNextToken();
1081 if ( !token
.ToLong(&l
) )
1083 m_pointSize
= (int)l
;
1085 token
= tokenizer
.GetNextToken();
1086 if ( !token
.ToLong(&l
) )
1088 m_family
= (wxFontFamily
)l
;
1090 token
= tokenizer
.GetNextToken();
1091 if ( !token
.ToLong(&l
) )
1093 m_style
= (wxFontStyle
)l
;
1095 token
= tokenizer
.GetNextToken();
1096 if ( !token
.ToLong(&l
) )
1098 m_weight
= (wxFontWeight
)l
;
1100 token
= tokenizer
.GetNextToken();
1101 if ( !token
.ToLong(&l
) )
1103 m_underlined
= l
!= 0;
1105 m_faceName
= tokenizer
.GetNextToken();
1112 token
= tokenizer
.GetNextToken();
1113 if ( !token
.ToLong(&l
) )
1115 m_encoding
= (wxFontEncoding
)l
;
1120 wxString
wxNativeFontInfo::ToString() const
1124 s
.Printf(wxT("%d;%d;%d;%d;%d;%d;%s;%d"),
1131 m_faceName
.GetData(),
1137 int wxNativeFontInfo::GetPointSize() const
1142 wxFontStyle
wxNativeFontInfo::GetStyle() const
1147 wxFontWeight
wxNativeFontInfo::GetWeight() const
1152 bool wxNativeFontInfo::GetUnderlined() const
1154 return m_underlined
;
1157 wxString
wxNativeFontInfo::GetFaceName() const
1162 wxFontFamily
wxNativeFontInfo::GetFamily() const
1167 wxFontEncoding
wxNativeFontInfo::GetEncoding() const
1172 // changing the font descriptor
1174 void wxNativeFontInfo::SetPointSize(int pointsize
)
1176 if ( m_pointSize
!= pointsize
)
1178 m_pointSize
= pointsize
;
1183 void wxNativeFontInfo::SetStyle(wxFontStyle style_
)
1185 if ( m_style
!= style_
)
1192 void wxNativeFontInfo::SetWeight(wxFontWeight weight_
)
1194 if ( m_weight
!= weight_
)
1201 void wxNativeFontInfo::SetUnderlined(bool underlined_
)
1203 if ( m_underlined
!= underlined_
)
1205 m_underlined
= underlined_
;
1210 bool wxNativeFontInfo::SetFaceName(const wxString
& facename_
)
1212 if ( m_faceName
!= facename_
)
1214 m_faceName
= facename_
;
1220 void wxNativeFontInfo::SetFamily(wxFontFamily family_
)
1222 if ( m_family
!= family_
)
1229 void wxNativeFontInfo::SetEncoding(wxFontEncoding encoding_
)
1231 if ( encoding_
== wxFONTENCODING_DEFAULT
)
1232 encoding_
= wxFont::GetDefaultEncoding();
1233 m_encoding
= encoding_
;
1234 // not reflected in native descriptors