+ wxString linetext = strtext ;
+
+#if TARGET_CARBON
+ if ( useDrawThemeText )
+ {
+ Rect frame = {
+ yy + line*(fi.descent + fi.ascent + fi.leading), xx ,
+ yy + (line+1)*(fi.descent + fi.ascent + fi.leading) , xx + 10000 } ;
+ wxMacCFStringHolder mString( linetext , m_font.GetEncoding()) ;
+
+ if ( m_backgroundMode != wxTRANSPARENT )
+ {
+ Point bounds = {0, 0} ;
+ Rect background = frame ;
+ SInt16 baseline ;
+ ::GetThemeTextDimensions( mString,
+ m_font.MacGetThemeFontID() ,
+ kThemeStateActive,
+ false,
+ &bounds,
+ &baseline );
+ background.right = background.left + bounds.h ;
+ background.bottom = background.top + bounds.v ;
+ ::EraseRect( &background ) ;
+ }
+
+ ::DrawThemeTextBox( mString,
+ m_font.MacGetThemeFontID() ,
+ kThemeStateActive,
+ false,
+ &frame,
+ teJustLeft,
+ NULL );
+ }
+ else
+#endif
+ {
+ wxCharBuffer text = linetext.mb_str(wxConvLocal) ;
+ ::DrawText( text , 0 , strlen(text) ) ;
+ }
+ }
+
+ ::TextMode( srcOr ) ;
+}
+
+bool wxDC::CanGetTextExtent() const
+{
+ wxCHECK_MSG(Ok(), false, wxT("wxDC::CanGetTextExtent - invalid DC"));
+
+ return true ;
+}
+
+void wxDC::DoGetTextExtent( const wxString &strtext, wxCoord *width, wxCoord *height,
+ wxCoord *descent, wxCoord *externalLeading ,
+ wxFont *theFont ) const
+{
+ wxCHECK_RET(Ok(), wxT("wxDC::DoGetTextExtent - invalid DC"));
+
+ wxMacFastPortSetter helper(this) ;
+ wxFont formerFont = m_font ;
+ if ( theFont )
+ {
+ // work around the constness
+ *((wxFont*)(&m_font)) = *theFont ;
+ }
+
+ MacInstallFont() ;
+ FontInfo fi ;
+ ::GetFontInfo( &fi ) ;
+
+#if TARGET_CARBON
+ bool useGetThemeText = ( GetThemeTextDimensions != (void*) kUnresolvedCFragSymbolAddress ) ;
+ if ( UMAGetSystemVersion() < 0x1000 || IsKindOf(CLASSINFO( wxPrinterDC ) ) || ((wxFont*)&m_font)->GetNoAntiAliasing() )
+ useGetThemeText = false ;
+#endif
+
+ if ( height )
+ *height = YDEV2LOGREL( fi.descent + fi.ascent ) ;
+ if ( descent )
+ *descent =YDEV2LOGREL( fi.descent );
+ if ( externalLeading )
+ *externalLeading = YDEV2LOGREL( fi.leading ) ;
+
+ int curwidth = 0 ;
+ if ( width )
+ {
+ *width = 0 ;
+ wxString linetext = strtext ;
+
+ if ( useGetThemeText )
+ {
+ Point bounds = {0, 0} ;
+ SInt16 baseline ;
+ wxMacCFStringHolder mString( linetext , m_font.GetEncoding() ) ;
+ ThemeFontID themeFont = m_font.MacGetThemeFontID() ;
+ ::GetThemeTextDimensions( mString,
+ themeFont ,
+ kThemeStateActive,
+ false,
+ &bounds,
+ &baseline );
+ curwidth = bounds.h ;
+ }
+ else
+ {
+ wxCharBuffer text = linetext.mb_str(wxConvLocal) ;
+ curwidth = ::TextWidth( text , 0 , strlen(text) ) ;
+ }
+
+ if ( curwidth > *width )
+ *width = XDEV2LOGREL( curwidth ) ;
+ }
+
+ if ( theFont )
+ {
+ // work around the constness
+ *((wxFont*)(&m_font)) = formerFont ;
+ m_macFontInstalled = false ;
+ }
+}
+
+bool wxDC::DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) const
+{
+ wxCHECK_MSG(Ok(), false, wxT("wxDC::DoGetPartialTextExtents - invalid DC"));
+
+ widths.Empty();
+ widths.Add(0, text.length());
+
+ if (text.length() == 0)
+ return false;
+
+ wxMacFastPortSetter helper(this) ;
+ MacInstallFont() ;
+
+#if TARGET_CARBON
+ bool useGetThemeText = ( GetThemeTextDimensions != (void*) kUnresolvedCFragSymbolAddress ) ;
+ if ( UMAGetSystemVersion() < 0x1000 || IsKindOf(CLASSINFO( wxPrinterDC ) ) || ((wxFont*)&m_font)->GetNoAntiAliasing() )
+ useGetThemeText = false ;
+
+ if ( useGetThemeText )
+ {
+ // If anybody knows how to do this more efficiently yet still handle
+ // the fractional glyph widths that may be present when using AA
+ // fonts, please change it. Currently it is measuring from the
+ // beginning of the string for each succeeding substring, which is much
+ // slower than this should be.
+ for (size_t i=0; i<text.length(); i++)
+ {
+ wxString str(text.Left(i + 1));
+ Point bounds = {0, 0};
+ SInt16 baseline ;
+ wxMacCFStringHolder mString(str, m_font.GetEncoding());
+
+ ::GetThemeTextDimensions( mString,
+ m_font.MacGetThemeFontID(),
+ kThemeStateActive,
+ false,
+ &bounds,
+ &baseline );
+ widths[i] = XDEV2LOGREL(bounds.h);
+ }
+ }
+ else
+#endif
+ {
+ wxCharBuffer buff = text.mb_str(wxConvLocal);
+ size_t len = strlen(buff);
+ short* measurements = new short[len+1];
+ MeasureText(len, buff.data(), measurements);
+
+ // Copy to widths, starting at measurements[1]
+ // NOTE: this doesn't take into account any multi-byte characters
+ // in buff, it probably should...
+ for (size_t i=0; i<text.length(); i++)
+ widths[i] = XDEV2LOGREL(measurements[i + 1]);
+
+ delete [] measurements;