X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c99d6f997c48ab79dd301ca18b7a66d260a99636..ad816ba53975de78ea29acdc40f05217137c8ad3:/src/mac/dc.cpp diff --git a/src/mac/dc.cpp b/src/mac/dc.cpp index de479fbeec..55312eb06f 100644 --- a/src/mac/dc.cpp +++ b/src/mac/dc.cpp @@ -19,6 +19,7 @@ #include "wx/dcmemory.h" #include "wx/region.h" #include "wx/image.h" +#include "wx/log.h" #if __MSL__ >= 0x6000 @@ -52,8 +53,6 @@ const double RAD2DEG = 180.0 / M_PI; const short kEmulatedMode = -1 ; const short kUnsupportedMode = -2 ; -#define wxMAC_EXPERIMENTAL_PATTERN 0 - wxMacPortSetter::wxMacPortSetter( const wxDC* dc ) : m_ph( (GrafPtr) dc->m_macPort ) { @@ -650,9 +649,13 @@ void wxDC::SetLogicalFunction( int function ) m_macPenInstalled = false ; } -void wxDC::DoFloodFill( wxCoord x, wxCoord y, const wxColour& col, - int style ) +extern bool wxDoFloodFill(wxDC *dc, wxCoord x, wxCoord y, + const wxColour & col, int style); + +bool wxDC::DoFloodFill(wxCoord x, wxCoord y, + const wxColour& col, int style) { + return wxDoFloodFill(this, x, y, col, style); } bool wxDC::DoGetPixel( wxCoord x, wxCoord y, wxColour *col ) const @@ -870,12 +873,11 @@ void wxDC::DoDrawPoint( wxCoord x, wxCoord y ) if (m_pen.GetStyle() != wxTRANSPARENT) { - MacInstallPen() ; wxCoord xx1 = XLOG2DEVMAC(x); wxCoord yy1 = YLOG2DEVMAC(y); - - ::MoveTo(xx1,yy1); - ::LineTo(xx1+1, yy1+1); + RGBColor pencolor = MAC_WXCOLORREF( m_pen.GetColour().GetPixel()); + ::SetCPixel( xx1,yy1,&pencolor) ; + CalcBoundingBox(x, y); } } @@ -907,8 +909,8 @@ void wxDC::DoDrawLines(int n, wxPoint points[], } void wxDC::DoDrawPolygon(int n, wxPoint points[], - wxCoord xoffset, wxCoord yoffset, - int fillStyle ) + wxCoord xoffset, wxCoord yoffset, + int fillStyle ) { wxCHECK_RET(Ok(), wxT("Invalid DC")); wxMacPortSetter helper(this) ; @@ -1199,7 +1201,6 @@ bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, if ( LockPixels(bmappixels) ) { wxMacPortSetter helper(this) ; - RGBColor tempColor ; if ( source->GetDepth() == 1 ) { @@ -1376,12 +1377,15 @@ void wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y, { wxCHECK_RET( Ok(), wxT("wxDC::DoDrawRotatedText Invalid window dc") ); - if (angle == 0.0) + if (angle == 0.0 ) { DrawText(str, x, y); return; } + if ( str.Length() == 0 ) + return ; + wxMacPortSetter helper(this) ; MacInstallFont() ; @@ -1427,14 +1431,17 @@ void wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y, &chars , (ATSUStyle*) &m_macATSUIStyle , &atsuLayout ) ; wxASSERT_MSG( status == noErr , "couldn't create the layout of the rotated text" ); - Fixed atsuAngle = IntToFixed( angle ) ; - ByteCount angleSize = sizeof(Fixed) ; - ATSUAttributeTag rotationTag = kATSULineRotationTag ; - ATSUAttributeValuePtr angleValue = &atsuAngle ; - status = ::ATSUSetLayoutControls(atsuLayout , 1 , &rotationTag , &angleSize , &angleValue ) ; + if ( abs(angle) > 0 ) + { + Fixed atsuAngle = IntToFixed( angle ) ; + ByteCount angleSize = sizeof(Fixed) ; + ATSUAttributeTag rotationTag = kATSULineRotationTag ; + ATSUAttributeValuePtr angleValue = &atsuAngle ; + status = ::ATSUSetLayoutControls(atsuLayout , 1 , &rotationTag , &angleSize , &angleValue ) ; + } - status = ::ATSUDrawText( atsuLayout, kATSUFromTextBeginning, kATSUToTextEnd, - IntToFixed(XLOG2DEVMAC(x) ) , IntToFixed(YLOG2DEVMAC(y) ) ); + status = ::ATSUDrawText( atsuLayout, kATSUFromTextBeginning, kATSUToTextEnd, + IntToFixed(XLOG2DEVMAC(x) ) , IntToFixed(YLOG2DEVMAC(y) ) ); wxASSERT_MSG( status == noErr , "couldn't draw the rotated text" ); Rect rect ; status = ::ATSUMeasureTextImage( atsuLayout, kATSUFromTextBeginning, kATSUToTextEnd, @@ -1449,13 +1456,15 @@ void wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y, } void wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y) -{ +{ wxCHECK_RET(Ok(), wxT("wxDC::DoDrawText Invalid DC")); wxMacPortSetter helper(this) ; long xx = XLOG2DEVMAC(x); long yy = YLOG2DEVMAC(y); - +#if TARGET_CARBON + bool useDrawThemeText = ( DrawThemeTextBox != (void*) kUnresolvedCFragSymbolAddress ) ; +#endif MacInstallFont() ; if ( 0 ) { @@ -1467,7 +1476,11 @@ void wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y) FontInfo fi ; ::GetFontInfo( &fi ) ; - yy += fi.ascent ; +#if TARGET_CARBON + if ( !useDrawThemeText ) +#endif + yy += fi.ascent ; + ::MoveTo( xx , yy ); if ( m_backgroundMode == wxTRANSPARENT ) { @@ -1498,19 +1511,58 @@ void wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y) int i = 0 ; int line = 0 ; - while( i < length ) - { - if( text[i] == 13 || text[i] == 10) - { - ::DrawText( text , laststop , i - laststop ) ; - line++ ; - ::MoveTo( xx , yy + line*(fi.descent + fi.ascent + fi.leading) ); - laststop = i+1 ; - } - i++ ; + { + + while( i < length ) + { + if( text[i] == 13 || text[i] == 10) + { +#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 + 1000 } ; + CFStringRef mString = CFStringCreateWithBytes( NULL , (UInt8*) text + laststop , i - laststop , CFStringGetSystemEncoding(), false ) ; + ::DrawThemeTextBox( mString, + kThemeCurrentPortFont, + kThemeStateActive, + true, + &frame, + teJustLeft, + nil ); + CFRelease( mString ) ; + line++ ; + } + else +#endif + { + ::DrawText( text , laststop , i - laststop ) ; + line++ ; + ::MoveTo( xx , yy + line*(fi.descent + fi.ascent + fi.leading) ); + } + laststop = i+1 ; + } + i++ ; + } +#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 + 1000 } ; + CFStringRef mString = CFStringCreateWithCString( NULL , text + laststop , kCFStringEncodingMacRoman ) ; + ::DrawThemeTextBox( mString, + kThemeCurrentPortFont, + kThemeStateActive, + true, + &frame, + teJustLeft, + nil ); + CFRelease( mString ) ; + } + else +#endif + { + ::DrawText( text , laststop , i - laststop ) ; + } } - - ::DrawText( text , laststop , i - laststop ) ; ::TextMode( srcOr ) ; } @@ -1634,7 +1686,7 @@ void wxDC::Clear(void) { wxCHECK_RET(Ok(), wxT("Invalid DC")); wxMacPortSetter helper(this) ; - Rect rect = { -32000 , -32000 , 32000 , 32000 } ; + Rect rect = { -31000 , -31000 , 31000 , 31000 } ; if (m_backgroundBrush.GetStyle() != wxTRANSPARENT) { @@ -1652,6 +1704,8 @@ void wxDC::MacInstallFont() const // return ; Pattern blackColor ; + MacSetupBackgroundForCurrentPort(m_backgroundBrush) ; + wxFontRefData * font = (wxFontRefData*) m_font.GetRefData() ; if ( font ) @@ -1671,12 +1725,16 @@ void wxDC::MacInstallFont() const } else { - short fontnum ; - - GetFNum( "\pGeneva" , &fontnum ) ; - ::TextFont( fontnum ) ; - ::TextSize( short(m_scaleY * 10) ) ; - ::TextFace( 0 ) ; + FontFamilyID fontId ; + Str255 fontName ; + SInt16 fontSize ; + Style fontStyle ; + GetThemeFont(kThemeSmallSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ; + GetFNum( fontName, &fontId ); + + ::TextFont( fontId ) ; + ::TextSize( short(m_scaleY * fontSize) ) ; + ::TextFace( fontStyle ) ; // todo reset after spacing changes - or store the current spacing somewhere @@ -1746,37 +1804,48 @@ void wxDC::MacInstallFont() const { kATSUFontTag , kATSUSizeTag , - kATSUColorTag , - +// kATSUColorTag , + kATSUBaselineClassTag , + kATSUVerticalCharacterTag, + kATSUQDBoldfaceTag , kATSUQDItalicTag , kATSUQDUnderlineTag , kATSUQDCondensedTag , kATSUQDExtendedTag , - + } ; ByteCount atsuSizes[sizeof(atsuTags)/sizeof(ATSUAttributeTag)] = { sizeof( ATSUFontID ) , sizeof( Fixed ) , - sizeof( RGBColor ) , +// sizeof( RGBColor ) , + sizeof( BslnBaselineClass ) , + sizeof( ATSUVerticalCharacterType), + sizeof( Boolean ) , sizeof( Boolean ) , sizeof( Boolean ) , sizeof( Boolean ) , sizeof( Boolean ) , + } ; Boolean kTrue = true ; Boolean kFalse = false ; + BslnBaselineClass kBaselineDefault = kBSLNHangingBaseline ; + + ATSUVerticalCharacterType kHorizontal = kATSUStronglyHorizontal; ATSUAttributeValuePtr atsuValues[sizeof(atsuTags)/sizeof(ATSUAttributeTag)] = { &atsuFont , &atsuSize , - &MAC_WXCOLORREF( m_textForegroundColour.GetPixel() ) , - +// &MAC_WXCOLORREF( m_textForegroundColour.GetPixel() ) , + &kBaselineDefault , + &kHorizontal, + (qdStyle & bold) ? &kTrue : &kFalse , (qdStyle & italic) ? &kTrue : &kFalse , (qdStyle & underline) ? &kTrue : &kFalse , @@ -1790,11 +1859,21 @@ void wxDC::MacInstallFont() const } +Pattern gHatchPatterns[] = +{ + { 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF } , + { 0x01 , 0x02 , 0x04 , 0x08 , 0x10 , 0x20 , 0x40 , 0x80 } , + { 0x80 , 0x40 , 0x20 , 0x10 , 0x08 , 0x04 , 0x02 , 0x01 } , + { 0x10 , 0x10 , 0x10 , 0xFF , 0x10 , 0x10 , 0x10 , 0x10 } , + { 0x00 , 0x00 , 0x00 , 0xFF , 0x00 , 0x00 , 0x00 , 0x00 } , + { 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 } , + { 0x81 , 0x42 , 0x24 , 0x18 , 0x18 , 0x24 , 0x42 , 0x81 } , +} ; + static void wxMacGetHatchPattern(int hatchStyle, Pattern *pattern) { - // we have our own pattern list now - int thePatListID = 128; - int theIndex; + int theIndex = 1 ; + switch(hatchStyle) { case wxBDIAGONAL_HATCH: @@ -1819,7 +1898,7 @@ static void wxMacGetHatchPattern(int hatchStyle, Pattern *pattern) theIndex = 1; // solid pattern break; } - GetIndPattern( pattern, thePatListID, theIndex); + *pattern = gHatchPatterns[theIndex-1] ; } void wxDC::MacInstallPen() const