X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/01299d5694fdccdbec96588ea2fb81a7d597da07..fc32cd4a59dc7c6cedea430750b2ce2c2a342353:/src/mac/carbon/dc.cpp diff --git a/src/mac/carbon/dc.cpp b/src/mac/carbon/dc.cpp index 49de162c0a..028c3cd0fc 100644 --- a/src/mac/carbon/dc.cpp +++ b/src/mac/carbon/dc.cpp @@ -23,7 +23,7 @@ #include "wx/log.h" #if __MSL__ >= 0x6000 -#include "math.h" +namespace std {} using namespace std ; #endif @@ -46,11 +46,7 @@ IMPLEMENT_ABSTRACT_CLASS(wxDC, wxObject) #define twips2mm 0.0176388888889 #define mm2pt 2.83464566929 #define pt2mm 0.352777777778 -#if !defined( __DARWIN__ ) || defined(__MWERKS__) -#ifndef M_PI -const double M_PI = 3.14159265358979 ; -#endif -#endif + const double RAD2DEG = 180.0 / M_PI; const short kEmulatedMode = -1 ; const short kUnsupportedMode = -2 ; @@ -76,25 +72,26 @@ wxMacPortSetter::~wxMacPortSetter() class wxMacFastPortSetter { public : - wxMacFastPortSetter( const wxDC *dc ) + wxMacFastPortSetter( const wxDC *dc ) { - wxASSERT( dc->Ok() ) ; - GetPort( &m_oldPort ) ; - SetPort( (GrafPtr) dc->m_macPort ) ; - m_clipRgn = NewRgn() ; - GetClip( m_clipRgn ) ; - m_dc = dc ; - dc->MacSetupPort( NULL ) ; + wxASSERT( dc->Ok() ) ; + m_swapped = QDSwapPort( (GrafPtr) dc->m_macPort , &m_oldPort ) ; + m_clipRgn = NewRgn() ; + GetClip( m_clipRgn ) ; + m_dc = dc ; + dc->MacSetupPort( NULL ) ; } ~wxMacFastPortSetter() { - SetPort( (GrafPtr) m_dc->m_macPort ) ; + // SetPort( (GrafPtr) m_dc->m_macPort ) ; SetClip( m_clipRgn ) ; - SetPort( m_oldPort ) ; - m_dc->MacCleanupPort( NULL ) ; - DisposeRgn( m_clipRgn ) ; + if ( m_swapped ) + SetPort( m_oldPort ) ; + m_dc->MacCleanupPort( NULL ) ; + DisposeRgn( m_clipRgn ) ; } private : + bool m_swapped ; RgnHandle m_clipRgn ; GrafPtr m_oldPort ; const wxDC* m_dc ; @@ -111,7 +108,7 @@ wxMacWindowClipper::wxMacWindowClipper( const wxWindow* win ) : m_formerClip = NewRgn() ; m_newClip = NewRgn() ; GetClip( m_formerClip ) ; - + if ( win ) { int x = 0 , y = 0; @@ -125,7 +122,7 @@ wxMacWindowClipper::wxMacWindowClipper( const wxWindow* win ) : } } -wxMacWindowClipper::~wxMacWindowClipper() +wxMacWindowClipper::~wxMacWindowClipper() { SetPort( m_newPort ) ; SetClip( m_formerClip ) ; @@ -141,7 +138,7 @@ wxMacWindowStateSaver::wxMacWindowStateSaver( const wxWindow* win ) : GetThemeDrawingState( &m_themeDrawingState ) ; } -wxMacWindowStateSaver::~wxMacWindowStateSaver() +wxMacWindowStateSaver::~wxMacWindowStateSaver() { SetPort( m_newPort ) ; SetThemeDrawingState( m_themeDrawingState , true ) ; @@ -247,8 +244,8 @@ void wxMacCalculateColour( int logical_func , const RGBColor &srcColor , RGBColo wxDC::wxDC() { - m_ok = FALSE; - m_colour = TRUE; + m_ok = false; + m_colour = true; m_mm_to_pix_x = mm2pt; m_mm_to_pix_y = mm2pt; m_internalDeviceOriginX = 0; @@ -261,11 +258,11 @@ wxDC::wxDC() m_userScaleY = 1.0; m_scaleX = 1.0; m_scaleY = 1.0; - m_needComputeScaleX = FALSE; - m_needComputeScaleY = FALSE; + m_needComputeScaleX = false; + m_needComputeScaleY = false; m_macPort = NULL ; m_macMask = NULL ; - m_ok = FALSE ; + m_ok = false ; m_macFontInstalled = false ; m_macBrushInstalled = false ; m_macPenInstalled = false ; @@ -278,7 +275,7 @@ wxDC::wxDC() m_font = *wxNORMAL_FONT; m_brush = *wxWHITE_BRUSH; #ifdef __WXDEBUG__ - // needed to debug possible errors with two active drawing methods at the same time on + // needed to debug possible errors with two active drawing methods at the same time on // the same DC m_macCurrentPortStateHelper = NULL ; #endif @@ -451,7 +448,7 @@ void wxDC::DoSetClippingRegion( wxCoord x, wxCoord y, wxCoord width, wxCoord hei } else { - m_clipping = TRUE; + m_clipping = true; m_clipX1 = xx; m_clipY1 = yy; m_clipX2 = xx + ww; @@ -498,7 +495,7 @@ void wxDC::DoSetClippingRegionAsRegion( const wxRegion ®ion ) } else { - m_clipping = TRUE; + m_clipping = true; m_clipX1 = xx; m_clipY1 = yy; m_clipX2 = xx + ww; @@ -511,7 +508,7 @@ void wxDC::DestroyClippingRegion() { wxMacFastPortSetter helper(this) ; CopyRgn( (RgnHandle) m_macBoundaryClipRgn , (RgnHandle) m_macCurrentClipRgn ) ; - m_clipping = FALSE; + ResetClipping(); } void wxDC::DoGetSizeMM( int* width, int* height ) const @@ -560,8 +557,8 @@ void wxDC::SetMapMode( int mode ) } if (mode != wxMM_TEXT) { - m_needComputeScaleX = TRUE; - m_needComputeScaleY = TRUE; + m_needComputeScaleX = true; + m_needComputeScaleY = true; } } @@ -630,10 +627,9 @@ void wxDC::ComputeScaleAndOrigin() { // this is a bit artificial, but we need to force wxDC to think // the pen has changed - wxPen* pen = & GetPen(); - wxPen tempPen; - m_pen = tempPen; - SetPen(* pen); + wxPen pen(GetPen()); + m_pen = wxNullPen; + SetPen(pen); } } @@ -781,8 +777,8 @@ void wxDC::DoCrossHair( wxCoord x, wxCoord y ) static double wxConvertWXangleToMACangle(double angle) { double newAngle = 90 - angle ; - if ( newAngle < 0 ) - newAngle += 360 ; + while ( newAngle > 360 ) newAngle -= 360 ; + while ( newAngle < 0 ) newAngle += 360 ; return newAngle ; } @@ -823,9 +819,8 @@ void wxDC::DoDrawArc( wxCoord x1, wxCoord y1, } wxCoord alpha2 = wxCoord(radius2 - radius1); wxCoord alpha1 = wxCoord(wxConvertWXangleToMACangle(radius1)); - if( (xx1 > xx2) || (yy1 > yy2) ) { - alpha2 *= -1; - } + while( alpha2 < 0 ) alpha2 += 360 ; + alpha2 = -alpha2 ; Rect r = { yyc - rad, xxc - rad, yyc + rad, xxc + rad }; if(m_brush.GetStyle() != wxTRANSPARENT) { MacInstallBrush(); @@ -1064,7 +1059,7 @@ bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, wxCHECK_MSG(Ok(), false, wxT("wxDC::DoBlit Illegal dc")); wxCHECK_MSG(source->Ok(), false, wxT("wxDC::DoBlit Illegal source DC")); if ( logical_func == wxNO_OP ) - return TRUE ; + return true ; if (xsrcMask == -1 && ysrcMask == -1) { xsrcMask = xsrc; ysrcMask = ysrc; @@ -1143,7 +1138,7 @@ bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, if ( mode == kUnsupportedMode ) { wxFAIL_MSG(wxT("unsupported blitting mode" )); - return FALSE ; + return false ; } CGrafPtr sourcePort = (CGrafPtr) source->m_macPort ; PixMapHandle bmappixels = GetGWorldPixMap( sourcePort ) ; @@ -1302,7 +1297,7 @@ bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, m_macPenInstalled = false ; m_macBrushInstalled = false ; m_macFontInstalled = false ; - return TRUE; + return true; } #ifndef FixedToInt @@ -1321,17 +1316,12 @@ inline int FixedToInt( Fixed inFixed ) void wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y, double angle) { + // TODO support text background color (only possible by hand, ATSUI does not support it) wxCHECK_RET( Ok(), wxT("wxDC::DoDrawRotatedText Invalid window dc") ); -/* - if (angle == 0.0 ) - { - DrawText(str, x, y); - return; - } if ( str.Length() == 0 ) return ; -*/ + wxMacFastPortSetter helper(this) ; MacInstallFont() ; @@ -1344,26 +1334,44 @@ void wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y, OSStatus status = noErr ; ATSUTextLayout atsuLayout ; UniCharCount chars = str.Length() ; + UniChar* ubuf = NULL ; +#if SIZEOF_WCHAR_T == 4 + wxMBConvUTF16BE converter ; #if wxUSE_UNICODE - status = ::ATSUCreateTextLayoutWithTextPtr( (UniCharArrayPtr) (const wxChar*) str , 0 , str.Length() , str.Length() , 1 , - &chars , (ATSUStyle*) &m_macATSUIStyle , &atsuLayout ) ; + size_t unicharlen = converter.WC2MB( NULL , str.wc_str() , 0 ) ; + ubuf = (UniChar*) malloc( unicharlen + 2 ) ; + converter.WC2MB( (char*) ubuf , str.wc_str(), unicharlen + 2 ) ; +#else + const wxWCharBuffer wchar = str.wc_str( wxConvLocal ) ; + size_t unicharlen = converter.WC2MB( NULL , wchar.data() , 0 ) ; + ubuf = (UniChar*) malloc( unicharlen + 2 ) ; + converter.WC2MB( (char*) ubuf , wchar.data() , unicharlen + 2 ) ; +#endif + chars = unicharlen / 2 ; +#else +#if wxUSE_UNICODE + ubuf = (UniChar*) str.wc_str() ; #else wxWCharBuffer wchar = str.wc_str( wxConvLocal ) ; - int wlen = wxWcslen( wchar.data() ) ; - status = ::ATSUCreateTextLayoutWithTextPtr( (UniCharArrayPtr) wchar.data() , 0 , wlen , wlen , 1 , - &chars , (ATSUStyle*) &m_macATSUIStyle , &atsuLayout ) ; + chars = wxWcslen( wchar.data() ) ; + ubuf = (UniChar*) wchar.data() ; +#endif #endif + + status = ::ATSUCreateTextLayoutWithTextPtr( (UniCharArrayPtr) ubuf , 0 , chars , chars , 1 , + &chars , (ATSUStyle*) &m_macATSUIStyle , &atsuLayout ) ; + 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) ; - + ATSUTextMeasurement textBefore ; ATSUTextMeasurement textAfter ; ATSUTextMeasurement ascent ; ATSUTextMeasurement descent ; - - + + if ( abs(iAngle) > 0 ) { Fixed atsuAngle = IntToFixed( iAngle ) ; @@ -1384,7 +1392,7 @@ void wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y, } status = ::ATSUMeasureText( atsuLayout, kATSUFromTextBeginning, kATSUToTextEnd, &textBefore , &textAfter, &ascent , &descent ); - + drawX += (int)(sin(angle/RAD2DEG) * FixedToInt(ascent)); drawY += (int)(cos(angle/RAD2DEG) * FixedToInt(ascent)); status = ::ATSUDrawText( atsuLayout, kATSUFromTextBeginning, kATSUToTextEnd, @@ -1398,6 +1406,9 @@ void wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y, CalcBoundingBox(XDEV2LOG(rect.left), YDEV2LOG(rect.top) ); CalcBoundingBox(XDEV2LOG(rect.right), YDEV2LOG(rect.bottom) ); ::ATSUDisposeTextLayout(atsuLayout); +#if SIZEOF_WCHAR_T == 4 + free( ubuf ) ; +#endif } void wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y) @@ -1413,12 +1424,7 @@ void wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y) useDrawThemeText = false ; #endif MacInstallFont() ; - if ( 0 ) - { - m_macFormerAliasState = IsAntiAliasedTextEnabled(&m_macFormerAliasSize); - SetAntiAliasedTextEnabled(true, 8); - m_macAliasWasEnabled = true ; - } + FontInfo fi ; ::GetFontInfo( &fi ) ; #if TARGET_CARBON @@ -1469,15 +1475,7 @@ void wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y) else #endif { - wxCharBuffer text = linetext.mb_str(wxConvLocal) ; - if ( m_backgroundMode != wxTRANSPARENT ) - { - Rect frame = { yy - fi.ascent + line*(fi.descent + fi.ascent + fi.leading) ,xx , yy - fi.ascent + (line+1)*(fi.descent + fi.ascent + fi.leading) , xx + 10000 } ; - short width = ::TextWidth( text , 0 , strlen(text) ) ; - frame.right = frame.left + width ; - - ::EraseRect( &frame ) ; - } + wxCharBuffer text = linetext.mb_str(wxConvLocal) ; ::DrawText( text , 0 , strlen(text) ) ; } } @@ -1505,7 +1503,7 @@ void wxDC::DoGetTextExtent( const wxString &strtext, wxCoord *width, wxCoord *h MacInstallFont() ; FontInfo fi ; ::GetFontInfo( &fi ) ; -#if TARGET_CARBON +#if TARGET_CARBON bool useGetThemeText = ( GetThemeTextDimensions != (void*) kUnresolvedCFragSymbolAddress ) ; if ( UMAGetSystemVersion() < 0x1000 || IsKindOf(CLASSINFO( wxPrinterDC ) ) || ((wxFont*)&m_font)->GetNoAntiAliasing() ) useGetThemeText = false ; @@ -1539,7 +1537,7 @@ void wxDC::DoGetTextExtent( const wxString &strtext, wxCoord *width, wxCoord *h } else { - wxCharBuffer text = linetext.mb_str(wxConvLocal) ; + wxCharBuffer text = linetext.mb_str(wxConvLocal) ; curwidth = ::TextWidth( text , 0 , strlen(text) ) ; } if ( curwidth > *width ) @@ -1563,10 +1561,10 @@ bool wxDC::DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) con if (text.Length() == 0) return false; - + wxMacFastPortSetter helper(this) ; MacInstallFont() ; -#if TARGET_CARBON +#if TARGET_CARBON bool useGetThemeText = ( GetThemeTextDimensions != (void*) kUnresolvedCFragSymbolAddress ) ; if ( UMAGetSystemVersion() < 0x1000 || IsKindOf(CLASSINFO( wxPrinterDC ) ) || ((wxFont*)&m_font)->GetNoAntiAliasing() ) useGetThemeText = false ; @@ -1593,7 +1591,7 @@ bool wxDC::DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) con widths[i] = XDEV2LOGREL(bounds.h); } } - else + else #endif { wxCharBuffer buff = text.mb_str(wxConvLocal); @@ -1607,7 +1605,7 @@ bool wxDC::DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) con for (size_t i=0; i