X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e40298d54ecd5b109222a7c60aa2ef084a304d69..70ddb200c10bb6f1075f4a39452fdcf77f84fdf5:/src/mac/dc.cpp diff --git a/src/mac/dc.cpp b/src/mac/dc.cpp index 9dff84e4d3..8038c0b217 100644 --- a/src/mac/dc.cpp +++ b/src/mac/dc.cpp @@ -17,6 +17,7 @@ #include "wx/app.h" #include "wx/mac/uma.h" #include "wx/dcmemory.h" +#include "wx/dcprint.h" #include "wx/region.h" #include "wx/image.h" #include "wx/log.h" @@ -25,6 +26,7 @@ #include "math.h" using namespace std ; #endif + #include "wx/mac/private.h" #include "ATSUnicode.h" #include "TextCommon.h" @@ -43,7 +45,7 @@ IMPLEMENT_ABSTRACT_CLASS(wxDC, wxObject) #define twips2mm 0.0176388888889 #define mm2pt 2.83464566929 #define pt2mm 0.352777777778 -#ifndef __DARWIN__ +#if !defined( __DARWIN__ ) || defined(__MWERKS__) const double M_PI = 3.14159265358979 ; #endif const double RAD2DEG = 180.0 / M_PI; @@ -88,7 +90,6 @@ wxMacWindowClipper::wxMacWindowClipper( const wxWindow* win ) SetClip( m_newClip ) ; DisposeRgn( insidergn ) ; #endif - RgnHandle insidergn = NewRgn() ; int x = 0 , y = 0; win->MacWindowToRootWindow( &x,&y ) ; CopyRgn( (RgnHandle) ((wxWindow*)win)->MacGetVisibleRegion().GetWXHRGN() , m_newClip ) ; @@ -1054,7 +1055,7 @@ bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, switch ( logical_func ) { case wxAND: // src AND dst - mode = srcOr ; // ok + mode = adMin ; // ok break ; case wxAND_INVERT: // (NOT src) AND dst mode = notSrcOr ; // ok @@ -1110,7 +1111,7 @@ bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, } if ( mode == kUnsupportedMode ) { - wxFAIL_MSG("unsupported blitting mode" ); + wxFAIL_MSG(wxT("unsupported blitting mode" )); return FALSE ; } CGrafPtr sourcePort = (CGrafPtr) source->m_macPort ; @@ -1294,17 +1295,10 @@ void wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y, } if ( str.Length() == 0 ) return ; + wxMacPortSetter helper(this) ; MacInstallFont() ; - wxString text ; - if ( wxApp::s_macDefaultEncodingIsPC ) - { - text = wxMacMakeMacStringFromPC( str ) ; - } - else - { - text = str ; - } + wxFontRefData * font = (wxFontRefData*) m_font.GetRefData() ; if ( 0 ) { @@ -1313,23 +1307,30 @@ void wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y, m_macAliasWasEnabled = true ; } OSStatus status = noErr ; + ATSUTextLayout atsuLayout ; + UniCharCount chars = str.Length() ; +#if wxUSE_UNICODE + status = ::ATSUCreateTextLayoutWithTextPtr( (UniCharArrayPtr) (const wxChar*) str , 0 , str.Length() , str.Length() , 1 , + &chars , (ATSUStyle*) &m_macATSUIStyle , &atsuLayout ) ; +#else TECObjectRef ec; - status = TECCreateConverter(&ec, kTextEncodingMacRoman, kTextEncodingUnicodeDefault); - wxASSERT_MSG( status == noErr , "couldn't start converter" ) ; + status = TECCreateConverter(&ec, + wxApp::s_macDefaultEncodingIsPC ? kTextEncodingWindowsLatin1 : kTextEncodingMacRoman, kTextEncodingUnicodeDefault); + + wxASSERT_MSG( status == noErr , wxT("couldn't start converter") ) ; ByteCount byteOutLen ; - ByteCount byteInLen = text.Length() ; + ByteCount byteInLen = str.Length() ; ByteCount byteBufferLen = byteInLen *2 ; char* buf = new char[byteBufferLen] ; - status = TECConvertText(ec, (ConstTextPtr)text.c_str() , byteInLen, &byteInLen, + status = TECConvertText(ec, (ConstTextPtr)str.c_str() , byteInLen, &byteInLen, (TextPtr)buf, byteBufferLen, &byteOutLen); - wxASSERT_MSG( status == noErr , "couldn't convert text" ) ; + wxASSERT_MSG( status == noErr , wxT("couldn't convert text") ) ; status = TECDisposeConverter(ec); - wxASSERT_MSG( status == noErr , "couldn't dispose converter" ) ; - ATSUTextLayout atsuLayout ; - UniCharCount chars = byteOutLen / 2 ; + wxASSERT_MSG( status == noErr , wxT("couldn't dispose converter") ) ; status = ::ATSUCreateTextLayoutWithTextPtr( (UniCharArrayPtr) buf , 0 , byteOutLen / 2 , byteOutLen / 2 , 1 , &chars , (ATSUStyle*) &m_macATSUIStyle , &atsuLayout ) ; - wxASSERT_MSG( status == noErr , "couldn't create the layout of the rotated text" ); +#endif + wxASSERT_MSG( status == noErr , wxT("couldn't create the layout of the rotated text") ); int iAngle = int( angle ); int drawX = XLOG2DEVMAC(x) ; int drawY = YLOG2DEVMAC(y) ; @@ -1365,16 +1366,19 @@ void wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y, drawY += cos(angle/RAD2DEG) * FixedToInt(ascent) ; status = ::ATSUDrawText( atsuLayout, kATSUFromTextBeginning, kATSUToTextEnd, IntToFixed(drawX) , IntToFixed(drawY) ); - wxASSERT_MSG( status == noErr , "couldn't draw the rotated text" ); + wxASSERT_MSG( status == noErr , wxT("couldn't draw the rotated text") ); Rect rect ; status = ::ATSUMeasureTextImage( atsuLayout, kATSUFromTextBeginning, kATSUToTextEnd, IntToFixed(drawX) , IntToFixed(drawY) , &rect ); - wxASSERT_MSG( status == noErr , "couldn't measure the rotated text" ); + wxASSERT_MSG( status == noErr , wxT("couldn't measure the rotated text") ); OffsetRect( &rect , -m_macLocalOrigin.x , -m_macLocalOrigin.y ) ; CalcBoundingBox(XDEV2LOG(rect.left), YDEV2LOG(rect.top) ); CalcBoundingBox(XDEV2LOG(rect.right), YDEV2LOG(rect.bottom) ); ::ATSUDisposeTextLayout(atsuLayout); +#if wxUSE_UNICODE +#else delete[] buf ; +#endif } void wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y) @@ -1385,7 +1389,7 @@ void wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y) long yy = YLOG2DEVMAC(y); #if TARGET_CARBON bool useDrawThemeText = ( DrawThemeTextBox != (void*) kUnresolvedCFragSymbolAddress ) ; - if ( m_font.GetNoAntiAliasing() ) + if ( IsKindOf(CLASSINFO( wxPrinterDC ) ) || m_font.GetNoAntiAliasing() ) useDrawThemeText = false ; #endif MacInstallFont() ; @@ -1410,33 +1414,22 @@ void wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y) { ::TextMode( srcCopy ) ; } - const char *text = NULL ; - int length = 0 ; - wxString macText ; - if ( wxApp::s_macDefaultEncodingIsPC ) - { - macText = wxMacMakeMacStringFromPC( strtext ) ; - text = macText ; - length = macText.Length() ; - } - else - { - text = strtext ; - length = strtext.Length() ; - } + int length = strtext.Length() ; + int laststop = 0 ; int i = 0 ; int line = 0 ; { while( i < length ) { - if( text[i] == 13 || text[i] == 10) + if( strtext[i] == 13 || strtext[i] == 10) { + wxString linetext = strtext.Mid( laststop , i - laststop ) ; #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 } ; - CFStringRef mString = CFStringCreateWithBytes( NULL , (UInt8*) text + laststop , i - laststop , CFStringGetSystemEncoding(), false ) ; + wxMacCFStringHolder mString( linetext ) ; if ( m_backgroundMode != wxTRANSPARENT ) { Point bounds={0,0} ; @@ -1459,13 +1452,13 @@ void wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y) &frame, teJustLeft, nil ); - CFRelease( mString ) ; line++ ; } else #endif { - ::DrawText( text , laststop , i - laststop ) ; + wxCharBuffer text = wxMacStringToCString(linetext) ; + ::DrawText( text , 0 , strlen(text) ) ; line++ ; ::MoveTo( xx , yy + line*(fi.descent + fi.ascent + fi.leading) ); } @@ -1473,11 +1466,13 @@ void wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y) } i++ ; } + wxString linetext = strtext.Mid( laststop , i - laststop ) ; #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 } ; - CFStringRef mString = CFStringCreateWithCString( NULL , text + laststop , kCFStringEncodingMacRoman ) ; + wxMacCFStringHolder mString( linetext ) ; + if ( m_backgroundMode != wxTRANSPARENT ) { Point bounds={0,0} ; @@ -1500,13 +1495,13 @@ void wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y) &frame, teJustLeft, nil ); - CFRelease( mString ) ; } else #endif { - ::DrawText( text , laststop , i - laststop ) ; - } + wxCharBuffer text = wxMacStringToCString(linetext) ; + ::DrawText( text , 0 , strlen(text) ) ; + } } ::TextMode( srcOr ) ; } @@ -1517,7 +1512,7 @@ bool wxDC::CanGetTextExtent() const return true ; } -void wxDC::DoGetTextExtent( const wxString &string, wxCoord *width, wxCoord *height, +void wxDC::DoGetTextExtent( const wxString &strtext, wxCoord *width, wxCoord *height, wxCoord *descent, wxCoord *externalLeading , wxFont *theFont ) const { @@ -1534,7 +1529,7 @@ void wxDC::DoGetTextExtent( const wxString &string, wxCoord *width, wxCoord *he ::GetFontInfo( &fi ) ; #if TARGET_CARBON bool useGetThemeText = ( GetThemeTextDimensions != (void*) kUnresolvedCFragSymbolAddress ) ; - if ( ((wxFont*)&m_font)->GetNoAntiAliasing() ) + if ( IsKindOf(CLASSINFO( wxPrinterDC ) ) || ((wxFont*)&m_font)->GetNoAntiAliasing() ) useGetThemeText = false ; #endif if ( height ) @@ -1543,8 +1538,9 @@ void wxDC::DoGetTextExtent( const wxString &string, wxCoord *width, wxCoord *he *descent =YDEV2LOGREL( fi.descent ); if ( externalLeading ) *externalLeading = YDEV2LOGREL( fi.leading ) ; + int length = strtext.Length() ; + /* const char *text = NULL ; - int length = 0 ; wxString macText ; if ( wxApp::s_macDefaultEncodingIsPC ) { @@ -1557,6 +1553,7 @@ void wxDC::DoGetTextExtent( const wxString &string, wxCoord *width, wxCoord *he text = string ; length = string.Length() ; } + */ int laststop = 0 ; int i = 0 ; int curwidth = 0 ; @@ -1565,8 +1562,9 @@ void wxDC::DoGetTextExtent( const wxString &string, wxCoord *width, wxCoord *he *width = 0 ; while( i < length ) { - if( text[i] == 13 || text[i] == 10) + if( strtext[i] == 13 || strtext[i] == 10) { + wxString linetext = strtext.Mid( laststop , i - laststop ) ; if ( height ) *height += YDEV2LOGREL( fi.descent + fi.ascent + fi.leading ) ; #if TARGET_CARBON @@ -1574,20 +1572,20 @@ void wxDC::DoGetTextExtent( const wxString &string, wxCoord *width, wxCoord *he { Point bounds={0,0} ; SInt16 baseline ; - CFStringRef mString = CFStringCreateWithBytes( NULL , (UInt8*) text + laststop , i - laststop , CFStringGetSystemEncoding(), false ) ; + wxMacCFStringHolder mString( linetext ) ; ::GetThemeTextDimensions( mString, kThemeCurrentPortFont, kThemeStateActive, false, &bounds, &baseline ); - CFRelease( mString ) ; curwidth = bounds.h ; } else #endif { - curwidth = ::TextWidth( text , laststop , i - laststop ) ; + wxCharBuffer text = wxMacStringToCString(linetext) ; + curwidth = ::TextWidth( text , 0 , strlen(text) ) ; } if ( curwidth > *width ) *width = XDEV2LOGREL( curwidth ) ; @@ -1596,25 +1594,26 @@ void wxDC::DoGetTextExtent( const wxString &string, wxCoord *width, wxCoord *he i++ ; } + wxString linetext = strtext.Mid( laststop , i - laststop ) ; #if TARGET_CARBON if ( useGetThemeText ) { Point bounds={0,0} ; SInt16 baseline ; - CFStringRef mString = CFStringCreateWithBytes( NULL , (UInt8*) text + laststop , i - laststop , CFStringGetSystemEncoding(), false ) ; + wxMacCFStringHolder mString( linetext ) ; ::GetThemeTextDimensions( mString, kThemeCurrentPortFont, kThemeStateActive, false, &bounds, &baseline ); - CFRelease( mString ) ; curwidth = bounds.h ; } else #endif { - curwidth = ::TextWidth( text , laststop , i - laststop ) ; + wxCharBuffer text = wxMacStringToCString(linetext) ; + curwidth = ::TextWidth( text , 0 , strlen(text) ) ; } if ( curwidth > *width ) *width = XDEV2LOGREL( curwidth ) ; @@ -1747,10 +1746,12 @@ void wxDC::MacInstallFont() const case wxSRC_INVERT: // (NOT src) mode = notPatCopy ; break ; + case wxAND: // src AND dst + mode = adMin ; + break ; // unsupported TODO case wxCLEAR: // 0 case wxAND_REVERSE:// src AND (NOT dst) - case wxAND: // src AND dst case wxAND_INVERT: // (NOT src) AND dst case wxNO_OP: // dst case wxNOR: // (NOT src) AND (NOT dst) @@ -1769,7 +1770,7 @@ void wxDC::MacInstallFont() const Style qdStyle = font->m_macFontStyle ; ATSUFontID atsuFont = font->m_macATSUFontID ; status = ::ATSUCreateStyle(&(ATSUStyle)m_macATSUIStyle) ; - wxASSERT_MSG( status == noErr , "couldn't create ATSU style" ) ; + wxASSERT_MSG( status == noErr , wxT("couldn't create ATSU style") ) ; ATSUAttributeTag atsuTags[] = { kATSUFontTag , @@ -1815,7 +1816,7 @@ void wxDC::MacInstallFont() const } ; status = ::ATSUSetAttributes((ATSUStyle)m_macATSUIStyle, sizeof(atsuTags)/sizeof(ATSUAttributeTag), atsuTags, atsuSizes, atsuValues); - wxASSERT_MSG( status == noErr , "couldn't set create ATSU style" ) ; + wxASSERT_MSG( status == noErr , wxT("couldn't set create ATSU style") ) ; } Pattern gHatchPatterns[] = @@ -1951,10 +1952,12 @@ void wxDC::MacInstallPen() const case wxSRC_INVERT: // (NOT src) mode = notPatCopy ; break ; + case wxAND: // src AND dst + mode = adMin ; + break ; // unsupported TODO case wxCLEAR: // 0 case wxAND_REVERSE:// src AND (NOT dst) - case wxAND: // src AND dst case wxAND_INVERT: // (NOT src) AND dst case wxNO_OP: // dst case wxNOR: // (NOT src) AND (NOT dst) @@ -2131,10 +2134,12 @@ void wxDC::MacInstallBrush() const case wxSRC_INVERT: // (NOT src) mode = notPatCopy ; break ; + case wxAND: // src AND dst + mode = adMin ; + break ; // unsupported TODO case wxCLEAR: // 0 case wxAND_REVERSE:// src AND (NOT dst) - case wxAND: // src AND dst case wxAND_INVERT: // (NOT src) AND dst case wxNO_OP: // dst case wxNOR: // (NOT src) AND (NOT dst) @@ -2195,4 +2200,4 @@ wxCoord wxDCBase::LogicalToDeviceXRel(wxCoord x) const wxCoord wxDCBase::LogicalToDeviceYRel(wxCoord y) const { return ((wxDC *)this)->YLOG2DEVREL(y); -} \ No newline at end of file +}