-
-bool wxDC::CanDrawBitmap(void) const
-{
- return true ;
-}
-
-bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height,
- wxDC *source, wxCoord xsrc, wxCoord ysrc, int logical_func , bool useMask,
- wxCoord xsrcMask, wxCoord ysrcMask )
-{
- 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 ;
- if (xsrcMask == -1 && ysrcMask == -1)
- {
- xsrcMask = xsrc; ysrcMask = ysrc;
- }
- // correct the parameter in case this dc does not have a mask at all
- if ( useMask && !source->m_macMask )
- useMask = false ;
- Rect srcrect , dstrect ;
- srcrect.top = source->YLOG2DEVMAC(ysrc) ;
- srcrect.left = source->XLOG2DEVMAC(xsrc) ;
- srcrect.right = source->XLOG2DEVMAC(xsrc + width ) ;
- srcrect.bottom = source->YLOG2DEVMAC(ysrc + height) ;
- dstrect.top = YLOG2DEVMAC(ydest) ;
- dstrect.left = XLOG2DEVMAC(xdest) ;
- dstrect.bottom = YLOG2DEVMAC(ydest + height ) ;
- dstrect.right = XLOG2DEVMAC(xdest + width ) ;
- short mode = kUnsupportedMode ;
- bool invertDestinationFirst = false ;
- switch ( logical_func )
- {
- case wxAND: // src AND dst
- mode = srcOr ; // ok
- break ;
- case wxAND_INVERT: // (NOT src) AND dst
- mode = notSrcOr ; // ok
- break ;
- case wxAND_REVERSE:// src AND (NOT dst)
- invertDestinationFirst = true ;
- mode = srcOr ;
- break ;
- case wxCLEAR: // 0
- mode = kEmulatedMode ;
- break ;
- case wxCOPY: // src
- mode = srcCopy ; // ok
- break ;
- case wxEQUIV: // (NOT src) XOR dst
- mode = srcXor ; // ok
- break ;
- case wxINVERT: // NOT dst
- mode = kEmulatedMode ; //or hilite ;
- break ;
- case wxNAND: // (NOT src) OR (NOT dst)
- invertDestinationFirst = true ;
- mode = srcBic ;
- break ;
- case wxNOR: // (NOT src) AND (NOT dst)
- invertDestinationFirst = true ;
- mode = notSrcOr ;
- break ;
- case wxNO_OP: // dst
- mode = kEmulatedMode ; // this has already been handled upon entry
- break ;
- case wxOR: // src OR dst
- mode = notSrcBic ;
- break ;
- case wxOR_INVERT: // (NOT src) OR dst
- mode = srcBic ;
- break ;
- case wxOR_REVERSE: // src OR (NOT dst)
- invertDestinationFirst = true ;
- mode = notSrcBic ;
- break ;
- case wxSET: // 1
- mode = kEmulatedMode ;
- break ;
- case wxSRC_INVERT: // (NOT src)
- mode = notSrcCopy ; // ok
- break ;
- case wxXOR: // src XOR dst
- mode = notSrcXor ; // ok
- break ;
- default :
- break ;
- }
- if ( mode == kUnsupportedMode )
- {
- wxFAIL_MSG("unsupported blitting mode" );
- return FALSE ;
- }
- CGrafPtr sourcePort = (CGrafPtr) source->m_macPort ;
- PixMapHandle bmappixels = GetGWorldPixMap( sourcePort ) ;
- if ( LockPixels(bmappixels) )
- {
- wxMacPortSetter helper(this) ;
- if ( source->GetDepth() == 1 )
- {
- RGBForeColor( &MAC_WXCOLORREF(m_textForegroundColour.GetPixel()) ) ;
- RGBBackColor( &MAC_WXCOLORREF(m_textBackgroundColour.GetPixel()) ) ;
- }
- else
- {
- // the modes need this, otherwise we'll end up having really nice colors...
- RGBColor white = { 0xFFFF, 0xFFFF,0xFFFF} ;
- RGBColor black = { 0,0,0} ;
- RGBForeColor( &black ) ;
- RGBBackColor( &white ) ;
- }
- if ( useMask && source->m_macMask )
- {
- if ( mode == srcCopy )
- {
- if ( LockPixels( GetGWorldPixMap( MAC_WXHBITMAP(source->m_macMask) ) ) )
- {
- CopyMask( GetPortBitMapForCopyBits( sourcePort ) ,
- GetPortBitMapForCopyBits( MAC_WXHBITMAP(source->m_macMask) ) ,
- GetPortBitMapForCopyBits( MAC_WXHBITMAP(m_macPort) ) ,
- &srcrect, &srcrect , &dstrect ) ;
- UnlockPixels( GetGWorldPixMap( MAC_WXHBITMAP(source->m_macMask) ) ) ;
- }
- }
- else
- {
- RgnHandle clipRgn = NewRgn() ;
- LockPixels( GetGWorldPixMap( MAC_WXHBITMAP(source->m_macMask) ) ) ;
- BitMapToRegion( clipRgn , (BitMap*) *GetGWorldPixMap( MAC_WXHBITMAP(source->m_macMask) ) ) ;
- UnlockPixels( GetGWorldPixMap( MAC_WXHBITMAP(source->m_macMask) ) ) ;
- OffsetRgn( clipRgn , -srcrect.left + dstrect.left, -srcrect.top + dstrect.top ) ;
- if ( mode == kEmulatedMode )
- {
- Pattern pat ;
- ::PenPat(GetQDGlobalsBlack(&pat));
- if ( logical_func == wxSET )
- {
- RGBColor col= { 0xFFFF, 0xFFFF, 0xFFFF } ;
- ::RGBForeColor( &col ) ;
- ::PaintRgn( clipRgn ) ;
- }
- else if ( logical_func == wxCLEAR )
- {
- RGBColor col= { 0x0000, 0x0000, 0x0000 } ;
- ::RGBForeColor( &col ) ;
- ::PaintRgn( clipRgn ) ;
- }
- else if ( logical_func == wxINVERT )
- {
- MacInvertRgn( clipRgn ) ;
- }
- else
- {
- for ( int y = 0 ; y < srcrect.right - srcrect.left ; ++y )
- {
- for ( int x = 0 ; x < srcrect.bottom - srcrect.top ; ++x )
- {
- Point dstPoint = { dstrect.top + y , dstrect.left + x } ;
- Point srcPoint = { srcrect.top + y , srcrect.left + x } ;
- if ( PtInRgn( dstPoint , clipRgn ) )
- {
- RGBColor srcColor ;
- RGBColor dstColor ;
- SetPort( (GrafPtr) sourcePort ) ;
- GetCPixel( srcPoint.h , srcPoint.v , &srcColor) ;
- SetPort( (GrafPtr) m_macPort ) ;
- GetCPixel( dstPoint.h , dstPoint.v , &dstColor ) ;
- wxMacCalculateColour( logical_func , srcColor , dstColor ) ;
- SetCPixel( dstPoint.h , dstPoint.v , &dstColor ) ;
- }
- }
- }
- }
- }
- else
- {
- if ( invertDestinationFirst )
- {
- MacInvertRgn( clipRgn ) ;
- }
- CopyBits( GetPortBitMapForCopyBits( sourcePort ) ,
- GetPortBitMapForCopyBits( MAC_WXHBITMAP(m_macPort) ) ,
- &srcrect, &dstrect, mode, clipRgn ) ;
- }
- DisposeRgn( clipRgn ) ;
- }
- }
- else
- {
- RgnHandle clipRgn = NewRgn() ;
- SetRectRgn( clipRgn , dstrect.left , dstrect.top , dstrect.right , dstrect.bottom ) ;
- if ( mode == kEmulatedMode )
- {
- Pattern pat ;
- ::PenPat(GetQDGlobalsBlack(&pat));
- if ( logical_func == wxSET )
- {
- RGBColor col= { 0xFFFF, 0xFFFF, 0xFFFF } ;
- ::RGBForeColor( &col ) ;
- ::PaintRgn( clipRgn ) ;
- }
- else if ( logical_func == wxCLEAR )
- {
- RGBColor col= { 0x0000, 0x0000, 0x0000 } ;
- ::RGBForeColor( &col ) ;
- ::PaintRgn( clipRgn ) ;
- }
- else if ( logical_func == wxINVERT )
- {
- MacInvertRgn( clipRgn ) ;
- }
- else
- {
- for ( int y = 0 ; y < srcrect.right - srcrect.left ; ++y )
- {
- for ( int x = 0 ; x < srcrect.bottom - srcrect.top ; ++x )
- {
- Point dstPoint = { dstrect.top + y , dstrect.left + x } ;
- Point srcPoint = { srcrect.top + y , srcrect.left + x } ;
- {
- RGBColor srcColor ;
- RGBColor dstColor ;
- SetPort( (GrafPtr) sourcePort ) ;
- GetCPixel( srcPoint.h , srcPoint.v , &srcColor) ;
- SetPort( (GrafPtr) m_macPort ) ;
- GetCPixel( dstPoint.h , dstPoint.v , &dstColor ) ;
- wxMacCalculateColour( logical_func , srcColor , dstColor ) ;
- SetCPixel( dstPoint.h , dstPoint.v , &dstColor ) ;
- }
- }
- }
- }
- }
- else
- {
- if ( invertDestinationFirst )
- {
- MacInvertRgn( clipRgn ) ;
- }
- CopyBits( GetPortBitMapForCopyBits( sourcePort ) ,
- GetPortBitMapForCopyBits( MAC_WXHBITMAP(m_macPort) ) ,
- &srcrect, &dstrect, mode, NULL ) ;
- }
- DisposeRgn( clipRgn ) ;
- }
- UnlockPixels( bmappixels ) ;
- }
- m_macPenInstalled = false ;
- m_macBrushInstalled = false ;
- m_macFontInstalled = false ;
- return TRUE;
-}
-inline Fixed IntToFixed( int inInt )
- {
- return (((SInt32) inInt) << 16);
- }
-inline int FixedToInt( Fixed inFixed )
- {
- return (((SInt32) inFixed) >> 16);
- }
-
-void wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y,
- double angle)
-{
- wxCHECK_RET( Ok(), wxT("wxDC::DoDrawRotatedText Invalid window dc") );
- if (angle == 0.0 )
- {
- DrawText(str, x, y);
- return;
- }
- 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 )
- {
- m_macFormerAliasState = IsAntiAliasedTextEnabled(&m_macFormerAliasSize);
- SetAntiAliasedTextEnabled(true, SInt16(m_scaleY * font->m_macFontSize));
- m_macAliasWasEnabled = true ;
- }
- OSStatus status = noErr ;
- TECObjectRef ec;
- status = TECCreateConverter(&ec, kTextEncodingMacRoman, kTextEncodingUnicodeDefault);
- wxASSERT_MSG( status == noErr , "couldn't start converter" ) ;
- ByteCount byteOutLen ;
- ByteCount byteInLen = text.Length() ;
- ByteCount byteBufferLen = byteInLen *2 ;
- char* buf = new char[byteBufferLen] ;
- status = TECConvertText(ec, (ConstTextPtr)text.c_str() , byteInLen, &byteInLen,
- (TextPtr)buf, byteBufferLen, &byteOutLen);
- wxASSERT_MSG( status == noErr , "couldn't convert text" ) ;
- status = TECDisposeConverter(ec);
- wxASSERT_MSG( status == noErr , "couldn't dispose converter" ) ;
- ATSUTextLayout atsuLayout ;
- UniCharCount chars = byteOutLen / 2 ;
- 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" );
- 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 ) ;
- ATSUAttributeTag atsuTags[] =
- {
- kATSULineRotationTag ,
- } ;
- ByteCount atsuSizes[sizeof(atsuTags)/sizeof(ATSUAttributeTag)] =
- {
- sizeof( Fixed ) ,
- } ;
- ATSUAttributeValuePtr atsuValues[sizeof(atsuTags)/sizeof(ATSUAttributeTag)] =
- {
- &atsuAngle ,
- } ;
- status = ::ATSUSetLayoutControls(atsuLayout , sizeof(atsuTags)/sizeof(ATSUAttributeTag),
- atsuTags, atsuSizes, atsuValues ) ;
- }
- status = ::ATSUMeasureText( atsuLayout, kATSUFromTextBeginning, kATSUToTextEnd,
- &textBefore , &textAfter, &ascent , &descent );
-
- drawX += sin(angle/RAD2DEG) * FixedToInt(ascent) ;
- 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" );
- Rect rect ;
- status = ::ATSUMeasureTextImage( atsuLayout, kATSUFromTextBeginning, kATSUToTextEnd,
- IntToFixed(drawX) , IntToFixed(drawY) , &rect );
- wxASSERT_MSG( status == noErr , "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);
- delete[] buf ;
-}
-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 ) ;
- if ( m_font.GetNoAntiAliasing() )
- useDrawThemeText = false ;
-#endif
- MacInstallFont() ;
- if ( 0 )
- {
- m_macFormerAliasState = IsAntiAliasedTextEnabled(&m_macFormerAliasSize);
- SetAntiAliasedTextEnabled(true, 8);
- m_macAliasWasEnabled = true ;
- }
- FontInfo fi ;
- ::GetFontInfo( &fi ) ;
-#if TARGET_CARBON
- if ( !useDrawThemeText )
-#endif
- yy += fi.ascent ;
- ::MoveTo( xx , yy );
- if ( m_backgroundMode == wxTRANSPARENT )
- {
- ::TextMode( srcOr) ;
- }
- else
- {
- ::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 laststop = 0 ;
- int i = 0 ;
- int line = 0 ;
- {
- 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 + 10000 } ;
- CFStringRef mString = CFStringCreateWithBytes( NULL , (UInt8*) text + laststop , i - laststop , CFStringGetSystemEncoding(), false ) ;
- ::DrawThemeTextBox( mString,
- kThemeCurrentPortFont,
- kThemeStateActive,
- false,
- &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 + 10000 } ;
- CFStringRef mString = CFStringCreateWithCString( NULL , text + laststop , kCFStringEncodingMacRoman ) ;
- ::DrawThemeTextBox( mString,
- kThemeCurrentPortFont,
- kThemeStateActive,
- false,
- &frame,
- teJustLeft,
- nil );
- CFRelease( mString ) ;
- }
- else
-#endif
- {
- ::DrawText( text , laststop , i - laststop ) ;
- }
- }
- ::TextMode( srcOr ) ;
-}
-bool wxDC::CanGetTextExtent() const
-{
- wxCHECK_MSG(Ok(), false, wxT("Invalid DC"));
- return true ;
-}
-void wxDC::DoGetTextExtent( const wxString &string, wxCoord *width, wxCoord *height,
- wxCoord *descent, wxCoord *externalLeading ,
- wxFont *theFont ) const
-{
- wxCHECK_RET(Ok(), wxT("Invalid DC"));
- wxMacPortSetter 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 ( ((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 ) ;
- const char *text = NULL ;
- int length = 0 ;
- wxString macText ;
- if ( wxApp::s_macDefaultEncodingIsPC )
- {
- macText = wxMacMakeMacStringFromPC( string ) ;
- text = macText ;
- length = macText.Length() ;
- }
- else
- {
- text = string ;
- length = string.Length() ;
- }
- int laststop = 0 ;
- int i = 0 ;
- int curwidth = 0 ;
- if ( width )
- {
- *width = 0 ;
- while( i < length )
- {
- if( text[i] == 13 || text[i] == 10)
- {
- if ( height )
- *height += YDEV2LOGREL( fi.descent + fi.ascent + fi.leading ) ;
-#if TARGET_CARBON
- if ( useGetThemeText )
- {
- Point bounds={0,0} ;
- SInt16 baseline ;
- CFStringRef mString = CFStringCreateWithBytes( NULL , (UInt8*) text + laststop , i - laststop , CFStringGetSystemEncoding(), false ) ;
- ::GetThemeTextDimensions( mString,
- kThemeCurrentPortFont,
- kThemeStateActive,
- false,
- &bounds,
- &baseline );
- CFRelease( mString ) ;
- curwidth = bounds.h ;
- }
- else
-#endif
- {
- curwidth = ::TextWidth( text , laststop , i - laststop ) ;
- }
- if ( curwidth > *width )
- *width = XDEV2LOGREL( curwidth ) ;
- laststop = i+1 ;
- }
- i++ ;
- }
-
-#if TARGET_CARBON
- if ( useGetThemeText )
- {
- Point bounds={0,0} ;
- SInt16 baseline ;
- CFStringRef mString = CFStringCreateWithBytes( NULL , (UInt8*) text + laststop , i - laststop , CFStringGetSystemEncoding(), false ) ;
- ::GetThemeTextDimensions( mString,
- kThemeCurrentPortFont,
- kThemeStateActive,
- false,
- &bounds,
- &baseline );
- CFRelease( mString ) ;
- curwidth = bounds.h ;
- }
- else
-#endif
- {
- curwidth = ::TextWidth( text , laststop , i - laststop ) ;
- }
- if ( curwidth > *width )
- *width = XDEV2LOGREL( curwidth ) ;
- }
- if ( theFont )
- {
- // work around the constness
- *((wxFont*)(&m_font)) = formerFont ;
- m_macFontInstalled = false ;
- }
-}
-wxCoord wxDC::GetCharWidth(void) const
-{
- wxCHECK_MSG(Ok(), 1, wxT("Invalid DC"));
- wxMacPortSetter helper(this) ;
- MacInstallFont() ;
- int width = 0 ;
-#if TARGET_CARBON
- bool useGetThemeText = ( GetThemeTextDimensions != (void*) kUnresolvedCFragSymbolAddress ) ;
- if ( ((wxFont*)&m_font)->GetNoAntiAliasing() )
- useGetThemeText = false ;
-#endif
- char text[] = "H" ;
-#if TARGET_CARBON
- if ( useGetThemeText )
- {
- Point bounds={0,0} ;
- SInt16 baseline ;
- CFStringRef mString = CFStringCreateWithBytes( NULL , (UInt8*) text , 1 , CFStringGetSystemEncoding(), false ) ;
- ::GetThemeTextDimensions( mString,
- kThemeCurrentPortFont,
- kThemeStateActive,
- false,
- &bounds,
- &baseline );
- CFRelease( mString ) ;
- width = bounds.h ;
- }
- else
-#endif
- {
- width = ::TextWidth( text , 0 , 1 ) ;
- }
- return YDEV2LOGREL(width) ;
-}
-wxCoord wxDC::GetCharHeight(void) const
-{
- wxCHECK_MSG(Ok(), 1, wxT("Invalid DC"));
- wxMacPortSetter helper(this) ;
- MacInstallFont() ;
- FontInfo fi ;
- ::GetFontInfo( &fi ) ;
- return YDEV2LOGREL( fi.descent + fi.ascent );
-}
-void wxDC::Clear(void)
-{
- wxCHECK_RET(Ok(), wxT("Invalid DC"));
- wxMacPortSetter helper(this) ;
- Rect rect = { -31000 , -31000 , 31000 , 31000 } ;
- if (m_backgroundBrush.GetStyle() != wxTRANSPARENT)
- {
- ::PenNormal() ;
- //MacInstallBrush() ;
- MacSetupBackgroundForCurrentPort( m_backgroundBrush ) ;
- ::EraseRect( &rect ) ;
- }
-}
-void wxDC::MacInstallFont() const
-{
- wxCHECK_RET(Ok(), wxT("Invalid DC"));
-// if ( m_macFontInstalled )
-// return ;
- Pattern blackColor ;
- MacSetupBackgroundForCurrentPort(m_backgroundBrush) ;
- wxFontRefData * font = (wxFontRefData*) m_font.GetRefData() ;
- if ( font )
- {
- ::TextFont( font->m_macFontNum ) ;
- ::TextSize( short(m_scaleY * font->m_macFontSize) ) ;
- ::TextFace( font->m_macFontStyle ) ;
- m_macFontInstalled = true ;
- m_macBrushInstalled = false ;
- m_macPenInstalled = false ;
- RGBColor forecolor = MAC_WXCOLORREF( m_textForegroundColour.GetPixel());
- RGBColor backcolor = MAC_WXCOLORREF( m_textBackgroundColour.GetPixel());
- ::RGBForeColor( &forecolor );
- ::RGBBackColor( &backcolor );
- }
- else
- {
- 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
- m_macFontInstalled = true ;
- m_macBrushInstalled = false ;
- m_macPenInstalled = false ;
- RGBColor forecolor = MAC_WXCOLORREF( m_textForegroundColour.GetPixel());
- RGBColor backcolor = MAC_WXCOLORREF( m_textBackgroundColour.GetPixel());
- ::RGBForeColor( &forecolor );
- ::RGBBackColor( &backcolor );
- }
- short mode = patCopy ;
- // todo :
- switch( m_logicalFunction )
- {
- case wxCOPY: // src
- mode = patCopy ;
- break ;
- case wxINVERT: // NOT dst
- ::PenPat(GetQDGlobalsBlack(&blackColor));
- mode = patXor ;
- break ;
- case wxXOR: // src XOR dst
- mode = patXor ;
- break ;
- case wxOR_REVERSE: // src OR (NOT dst)
- mode = notPatOr ;
- break ;
- case wxSRC_INVERT: // (NOT src)
- mode = notPatCopy ;
- 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)
- case wxEQUIV: // (NOT src) XOR dst
- case wxOR_INVERT: // (NOT src) OR dst
- case wxNAND: // (NOT src) OR (NOT dst)
- case wxOR: // src OR dst
- case wxSET: // 1
-// case wxSRC_OR: // source _bitmap_ OR destination
-// case wxSRC_AND: // source _bitmap_ AND destination
- break ;
- }
- ::PenMode( mode ) ;
- OSStatus status = noErr ;
- Fixed atsuSize = IntToFixed( int(m_scaleY * font->m_macFontSize) ) ;
- Style qdStyle = font->m_macFontStyle ;
- ATSUFontID atsuFont = font->m_macATSUFontID ;
- status = ::ATSUCreateStyle(&(ATSUStyle)m_macATSUIStyle) ;
- wxASSERT_MSG( status == noErr , "couldn't create ATSU style" ) ;
- ATSUAttributeTag atsuTags[] =
- {
- kATSUFontTag ,
- kATSUSizeTag ,
-// kATSUColorTag ,
-// kATSUBaselineClassTag ,
- kATSUVerticalCharacterTag,
- kATSUQDBoldfaceTag ,
- kATSUQDItalicTag ,
- kATSUQDUnderlineTag ,
- kATSUQDCondensedTag ,
- kATSUQDExtendedTag ,
- } ;
- ByteCount atsuSizes[sizeof(atsuTags)/sizeof(ATSUAttributeTag)] =
- {
- sizeof( ATSUFontID ) ,
- sizeof( Fixed ) ,
-// 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() ) ,
-// &kBaselineDefault ,
- &kHorizontal,
- (qdStyle & bold) ? &kTrue : &kFalse ,
- (qdStyle & italic) ? &kTrue : &kFalse ,
- (qdStyle & underline) ? &kTrue : &kFalse ,
- (qdStyle & condense) ? &kTrue : &kFalse ,
- (qdStyle & extend) ? &kTrue : &kFalse ,
- } ;
- status = ::ATSUSetAttributes((ATSUStyle)m_macATSUIStyle, sizeof(atsuTags)/sizeof(ATSUAttributeTag),
- atsuTags, atsuSizes, atsuValues);
- wxASSERT_MSG( status == noErr , "couldn't set create ATSU style" ) ;
-}
-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)
-{
- int theIndex = 1 ;
- switch(hatchStyle)
- {
- case wxBDIAGONAL_HATCH:
- theIndex = 2;
- break;
- case wxFDIAGONAL_HATCH:
- theIndex = 3;
- break;
- case wxCROSS_HATCH:
- theIndex = 4;
- break;
- case wxHORIZONTAL_HATCH:
- theIndex = 5;
- break;
- case wxVERTICAL_HATCH:
- theIndex = 6;
- break;
- case wxCROSSDIAG_HATCH:
- theIndex = 7;
- break;
- default:
- theIndex = 1; // solid pattern
- break;
- }
- *pattern = gHatchPatterns[theIndex-1] ;
-}
-void wxDC::MacInstallPen() const
-{
- wxCHECK_RET(Ok(), wxT("Invalid DC"));
- Pattern blackColor;
-// if ( m_macPenInstalled )
-// return ;
- RGBColor forecolor = MAC_WXCOLORREF( m_pen.GetColour().GetPixel());
- RGBColor backcolor = MAC_WXCOLORREF( m_backgroundBrush.GetColour().GetPixel());
- ::RGBForeColor( &forecolor );
- ::RGBBackColor( &backcolor );
- ::PenNormal() ;
- int penWidth = m_pen.GetWidth() * (int) m_scaleX ;
- // null means only one pixel, at whatever resolution
- if ( penWidth == 0 )
- penWidth = 1 ;
- ::PenSize(penWidth, penWidth);
- int penStyle = m_pen.GetStyle();
- if (penStyle == wxSOLID)
- {
- ::PenPat(GetQDGlobalsBlack(&blackColor));
- }
- else if (IS_HATCH(penStyle))
- {
- Pattern pat ;
- wxMacGetHatchPattern(penStyle, &pat);
- ::PenPat(&pat);
- }
- else
- {
- Pattern pat = *GetQDGlobalsBlack(&blackColor) ;
- switch( penStyle )
- {
- case wxDOT :
- for ( int i = 0 ; i < 8 ; ++i )
- {
- pat.pat[i] = 0xCC ;
- }
- break ;
- case wxLONG_DASH :
- for ( int i = 0 ; i < 8 ; ++i )
- {
- pat.pat[i] = 0xFE ;
- }
- break ;
- case wxSHORT_DASH :
- for ( int i = 0 ; i < 8 ; ++i )
- {
- pat.pat[i] = 0xEE ;
- }
- break ;
- case wxDOT_DASH :
- for ( int i = 0 ; i < 8 ; ++i )
- {
- pat.pat[i] = 0x6F ;
- }
- break ;
- case wxUSER_DASH :
- {
- wxDash* dash ;
- m_pen.GetDashes(&dash) ;
- // right now we don't allocate larger pixmaps
- // int number =
- m_pen.GetDashes(&dash) ;
- for ( int i = 0 ; i < 8 ; ++i )
- {
- pat.pat[i] = dash[0] ;
- }
- }
- break ;
- }
- ::PenPat(&pat);
- }
- short mode = patCopy ;
- // todo :
- switch( m_logicalFunction )
- {
- case wxCOPY: // only foreground color, leave background (thus not patCopy)
- mode = patOr ;
- break ;
- case wxINVERT: // NOT dst
-// ::PenPat(GetQDGlobalsBlack(&blackColor));
- mode = patXor ;
- break ;
- case wxXOR: // src XOR dst
- mode = patXor ;
- break ;
- case wxOR_REVERSE: // src OR (NOT dst)
- mode = notPatOr ;
- break ;
- case wxSRC_INVERT: // (NOT src)
- mode = notPatCopy ;
- 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)
- case wxEQUIV: // (NOT src) XOR dst
- case wxOR_INVERT: // (NOT src) OR dst
- case wxNAND: // (NOT src) OR (NOT dst)
- case wxOR: // src OR dst
- case wxSET: // 1
-// case wxSRC_OR: // source _bitmap_ OR destination
-// case wxSRC_AND: // source _bitmap_ AND destination
- break ;
- }
- ::PenMode( mode ) ;
- m_macPenInstalled = true ;
- m_macBrushInstalled = false ;
- m_macFontInstalled = false ;
-}
-void wxDC::MacSetupBackgroundForCurrentPort(const wxBrush& background )
-{
- Pattern whiteColor ;
- switch( background.MacGetBrushKind() )
- {
- case kwxMacBrushTheme :
- {
- ::SetThemeBackground( background.GetMacTheme() , wxDisplayDepth() , true ) ;
- break ;
- }
- case kwxMacBrushThemeBackground :
- {
- Rect extent ;
- ThemeBackgroundKind bg = background.GetMacThemeBackground( &extent ) ;
- ::ApplyThemeBackground( bg , &extent ,kThemeStateActive , wxDisplayDepth() , true ) ;
- break ;
- }
- case kwxMacBrushColour :
- {
- ::RGBBackColor( &MAC_WXCOLORREF( background.GetColour().GetPixel()) );
- int brushStyle = background.GetStyle();
- if (brushStyle == wxSOLID)
- ::BackPat(GetQDGlobalsWhite(&whiteColor));
- else if (IS_HATCH(brushStyle))
- {
- Pattern pat ;
- wxMacGetHatchPattern(brushStyle, &pat);
- ::BackPat(&pat);
- }
- else
- {
- ::BackPat(GetQDGlobalsWhite(&whiteColor));
- }
- break ;
- }
- }
-}
-void wxDC::MacInstallBrush() const
-{
- wxCHECK_RET(Ok(), wxT("Invalid DC"));
- Pattern blackColor ;
-// if ( m_macBrushInstalled )
-// return ;
- // foreground
- bool backgroundTransparent = (GetBackgroundMode() == wxTRANSPARENT) ;
- ::RGBForeColor( &MAC_WXCOLORREF( m_brush.GetColour().GetPixel()) );
- ::RGBBackColor( &MAC_WXCOLORREF( m_backgroundBrush.GetColour().GetPixel()) );
- int brushStyle = m_brush.GetStyle();
- if (brushStyle == wxSOLID)
- {
- ::PenPat(GetQDGlobalsBlack(&blackColor));
- }
- else if (IS_HATCH(brushStyle))
- {
- Pattern pat ;
- wxMacGetHatchPattern(brushStyle, &pat);
- ::PenPat(&pat);
- }
- else if ( m_brush.GetStyle() == wxSTIPPLE || m_brush.GetStyle() == wxSTIPPLE_MASK_OPAQUE )
- {
- // we force this in order to be compliant with wxMSW
- backgroundTransparent = false ;
- // for these the text fore (and back for MASK_OPAQUE) colors are used
- wxBitmap* bitmap = m_brush.GetStipple() ;
- int width = bitmap->GetWidth() ;
- int height = bitmap->GetHeight() ;
- GWorldPtr gw = NULL ;
- if ( m_brush.GetStyle() == wxSTIPPLE )
- gw = MAC_WXHBITMAP(bitmap->GetHBITMAP()) ;
- else
- gw = MAC_WXHBITMAP(bitmap->GetMask()->GetMaskBitmap()) ;
- PixMapHandle gwpixmaphandle = GetGWorldPixMap( gw ) ;
- LockPixels( gwpixmaphandle ) ;
- bool isMonochrome = !IsPortColor( gw ) ;
- if ( !isMonochrome )
- {
- if ( (**gwpixmaphandle).pixelSize == 1 )
- isMonochrome = true ;
- }
- if ( isMonochrome && width == 8 && height == 8 )
- {
- ::RGBForeColor( &MAC_WXCOLORREF( m_textForegroundColour.GetPixel()) );
- ::RGBForeColor( &MAC_WXCOLORREF( m_textBackgroundColour.GetPixel()) );
- BitMap* gwbitmap = (BitMap*) *gwpixmaphandle ; // since the color depth is 1 it is a BitMap
- UInt8 *gwbits = (UInt8*) gwbitmap->baseAddr ;
- int alignment = gwbitmap->rowBytes & 0x7FFF ;
- Pattern pat ;
- for ( int i = 0 ; i < 8 ; ++i )
- {
- pat.pat[i] = gwbits[i*alignment+0] ;
- }
- UnlockPixels( GetGWorldPixMap( gw ) ) ;
- ::PenPat( &pat ) ;
- }
- else
- {
- // this will be the code to handle power of 2 patterns, we will have to arrive at a nice
- // caching scheme before putting this into production
- Handle image;
- long imageSize;
- PixPatHandle pixpat = NewPixPat() ;
- CopyPixMap(gwpixmaphandle, (**pixpat).patMap);
- imageSize = GetPixRowBytes((**pixpat).patMap) *
- ((**(**pixpat).patMap).bounds.bottom -
- (**(**pixpat).patMap).bounds.top);
- PtrToHand( (**gwpixmaphandle).baseAddr, &image, imageSize );
- (**pixpat).patData = image;
- if ( isMonochrome )
- {
- CTabHandle ctable = ((**((**pixpat).patMap)).pmTable) ;
- ColorSpecPtr ctspec = (ColorSpecPtr) &(**ctable).ctTable ;
- if ( ctspec[0].rgb.red == 0x0000 )
- {
- ctspec[1].rgb = MAC_WXCOLORREF( m_textBackgroundColour.GetPixel()) ;
- ctspec[0].rgb = MAC_WXCOLORREF( m_textForegroundColour.GetPixel()) ;
- }
- else
- {
- ctspec[0].rgb = MAC_WXCOLORREF( m_textBackgroundColour.GetPixel()) ;
- ctspec[1].rgb = MAC_WXCOLORREF( m_textForegroundColour.GetPixel()) ;
- }
- ::CTabChanged( ctable ) ;
- }
- ::PenPixPat(pixpat);
- m_macForegroundPixMap = pixpat ;
- }
- UnlockPixels( gwpixmaphandle ) ;
- }
- else
- {
- ::PenPat(GetQDGlobalsBlack(&blackColor));
- }
- short mode = patCopy ;
- switch( m_logicalFunction )
- {
- case wxCOPY: // src
- if ( backgroundTransparent )
- mode = patOr ;
- else
- mode = patCopy ;
- break ;
- case wxINVERT: // NOT dst
- if ( !backgroundTransparent )
- {
- ::PenPat(GetQDGlobalsBlack(&blackColor));
- }
- mode = patXor ;
- break ;
- case wxXOR: // src XOR dst
- mode = patXor ;
- break ;
- case wxOR_REVERSE: // src OR (NOT dst)
- mode = notPatOr ;
- break ;
- case wxSRC_INVERT: // (NOT src)
- mode = notPatCopy ;
- 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)
- case wxEQUIV: // (NOT src) XOR dst
- case wxOR_INVERT: // (NOT src) OR dst
- case wxNAND: // (NOT src) OR (NOT dst)
- case wxOR: // src OR dst
- case wxSET: // 1
-// case wxSRC_OR: // source _bitmap_ OR destination
-// case wxSRC_AND: // source _bitmap_ AND destination
- break ;
- }
- ::PenMode( mode ) ;
- m_macBrushInstalled = true ;
- m_macPenInstalled = false ;
- m_macFontInstalled = false ;
-}
-// ---------------------------------------------------------------------------
-// coordinates transformations
-// ---------------------------------------------------------------------------
-
-wxCoord wxDCBase::DeviceToLogicalX(wxCoord x) const
-{
- return ((wxDC *)this)->XDEV2LOG(x);
-}
-wxCoord wxDCBase::DeviceToLogicalY(wxCoord y) const
-{
- return ((wxDC *)this)->YDEV2LOG(y);
-}
-wxCoord wxDCBase::DeviceToLogicalXRel(wxCoord x) const
-{
- return ((wxDC *)this)->XDEV2LOGREL(x);
-}
-wxCoord wxDCBase::DeviceToLogicalYRel(wxCoord y) const
-{
- return ((wxDC *)this)->YDEV2LOGREL(y);
-}
-wxCoord wxDCBase::LogicalToDeviceX(wxCoord x) const
-{
- return ((wxDC *)this)->XLOG2DEV(x);
-}
-wxCoord wxDCBase::LogicalToDeviceY(wxCoord y) const
-{
- return ((wxDC *)this)->YLOG2DEV(y);
-}
-wxCoord wxDCBase::LogicalToDeviceXRel(wxCoord x) const
-{
- return ((wxDC *)this)->XLOG2DEVREL(x);
-}
-wxCoord wxDCBase::LogicalToDeviceYRel(wxCoord y) const
-{
- return ((wxDC *)this)->YLOG2DEVREL(y);
-}
\ No newline at end of file