X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/519cb848a8f4c91c73421bb75314754284e593a4..1d261710b8a6cf129d9670d640a4d5df3ca6c0cc:/src/mac/carbon/dc.cpp diff --git a/src/mac/carbon/dc.cpp b/src/mac/carbon/dc.cpp index e021274157..cbce6e301a 100644 --- a/src/mac/carbon/dc.cpp +++ b/src/mac/carbon/dc.cpp @@ -14,6 +14,12 @@ #endif #include "wx/dc.h" +#include "wx/app.h" +#include "wx/mac/uma.h" + +#if __MSL__ >= 0x6000 +#include "math.h" +#endif #if !USE_SHARED_LIBRARY IMPLEMENT_ABSTRACT_CLASS(wxDC, wxObject) @@ -36,7 +42,7 @@ long wxDC::m_macCurrentPortId = 1 ; // wxDC //----------------------------------------------------------------------------- -wxDC::wxDC(void) +wxDC::wxDC() { m_ok = FALSE; m_optimize = FALSE; @@ -44,8 +50,8 @@ wxDC::wxDC(void) m_colour = TRUE; m_clipping = FALSE; - m_mm_to_pix_x = 1.0; - m_mm_to_pix_y = 1.0; + m_mm_to_pix_x = mm2pt; + m_mm_to_pix_y = mm2pt; m_logicalOriginX = 0; m_logicalOriginY = 0; @@ -86,6 +92,7 @@ wxDC::wxDC(void) // m_palette = wxAPP_COLOURMAP; m_macPort = NULL ; + m_macMask = NULL ; m_ok = FALSE ; m_macFontInstalled = false ; @@ -103,20 +110,32 @@ wxDC::wxDC(void) wxDC::~wxDC(void) { + if ( !m_macPortHelper.IsCleared() ) + { + GrafPtr port ; + GetPort( &port ) ; + SetPort( m_macPortHelper.GetCurrentPort() ) ; + SetOrigin( 0 , 0 ) ; + SetPort( port ) ; + } + /* if ( m_macPort ) { + ::SetPort( m_macPort ) ; ::SetOrigin( 0 , 0 ) ; ::ClipRect( &m_macPort->portRect ) ; ::PenNormal() ; ::SetPort( m_macOrigPort ) ; } + */ ++m_macCurrentPortId ; }; void wxDC::MacSetupPort() const { + AGAPortHelper* help = (AGAPortHelper*) &m_macPortHelper ; + help->Setup( m_macPort ) ; m_macPortId = ++m_macCurrentPortId ; - ::SetPort(m_macPort); ::SetOrigin(-m_macLocalOrigin.h, -m_macLocalOrigin.v); ::ClipRect(&m_macClipRect); @@ -125,8 +144,10 @@ void wxDC::MacSetupPort() const m_macPenInstalled = false ; } -void wxDC::DrawBitmap( const wxBitmap &bmp, long x, long y, bool useMask ) +void wxDC::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool useMask ) { + float scale = 1.0 ; + if (!Ok()) return; MacVerifySetup() ; @@ -141,7 +162,7 @@ void wxDC::DrawBitmap( const wxBitmap &bmp, long x, long y, bool useMask ) { if ( bmap->m_bitmapType == kMacBitmapTypePict ) { - Rect bitmaprect = { 0 , 0 , bmap->m_height , bmap->m_width } ; + Rect bitmaprect = { 0 , 0 , int(bmap->m_height * scale) , int(bmap->m_width * scale)} ; ::OffsetRect( &bitmaprect , xx1 , yy1 ) ; ::DrawPicture( bmap->m_hPict , &bitmaprect ) ; } @@ -155,8 +176,6 @@ void wxDC::DrawBitmap( const wxBitmap &bmp, long x, long y, bool useMask ) RGBColor black = { 0,0,0} ; RGBForeColor( &black ) ; RGBBackColor( &white ) ; - // RGBForeColor( &m_textForegroundColour.GetPixel() ) ; - // RGBBackColor( &m_textBackgroundColour.GetPixel() ) ; bmappixels = GetGWorldPixMap( bmapworld ) ; if ( LockPixels(bmappixels) ) @@ -168,23 +187,23 @@ void wxDC::DrawBitmap( const wxBitmap &bmp, long x, long y, bool useMask ) source.bottom = bmap->m_height ; dest.top = YLOG2DEV(y) ; dest.left = XLOG2DEV(x) ; - dest.bottom = YLOG2DEV(y + bmap->m_height ) ; - dest.right = XLOG2DEV(x + bmap->m_width ) ; - // ::ClipRect(&m_macClipRect); - CopyBits( &GrafPtr( bmapworld )->portBits , &GrafPtr( m_macPort )->portBits , - &source, &dest, srcCopy, NULL ) ; - /* - if ( m_clipping ) - { - long x1 = XLOG2DEV(m_clipX1); - long y1 = YLOG2DEV(m_clipY1); - long x2 = XLOG2DEV(m_clipX2); - long y2 = YLOG2DEV(m_clipY2); + dest.bottom = YLOG2DEV(y + bmap->m_height * scale) ; + dest.right = XLOG2DEV(x + bmap->m_width * scale ) ; - Rect clip = { y1 , x1 , y2 , x2 } ; - ::ClipRect(&clip); + if ( useMask && bmp.GetMask() ) + { + if ( LockPixels( GetGWorldPixMap( bmp.GetMask()->GetMaskBitmap( ) ) ) ) + { + CopyMask( GetPortBitMapForCopyBits( bmapworld ) , GetPortBitMapForCopyBits( bmp.GetMask()->GetMaskBitmap( ) ) , + GetPortBitMapForCopyBits( m_macPort ) , + &source, &source , &dest ) ; + UnlockPixels( GetGWorldPixMap( bmp.GetMask()->GetMaskBitmap( ) ) ) ; + } } - */ + else + CopyBits( GetPortBitMapForCopyBits( bmapworld ) , GetPortBitMapForCopyBits( m_macPort ), + &source, &dest, srcCopy, NULL ) ; + UnlockPixels( bmappixels ) ; } m_macPenInstalled = false ; @@ -196,7 +215,7 @@ void wxDC::DrawBitmap( const wxBitmap &bmp, long x, long y, bool useMask ) } } -void wxDC::DrawIcon( const wxIcon &icon, long x, long y, bool useMask ) +void wxDC::DoDrawIcon( const wxIcon &icon, wxCoord x, wxCoord y ) { if (!Ok()) return; @@ -217,69 +236,9 @@ void wxDC::DrawIcon( const wxIcon &icon, long x, long y, bool useMask ) } }; -void wxDC::DrawPoint( wxPoint& point ) -{ - DrawPoint( point.x, point.y ); -}; - -void wxDC::DrawPolygon( wxList *list, long xoffset, long yoffset, int fillStyle ) +void wxDC::DoSetClippingRegion( wxCoord x, wxCoord y, wxCoord width, wxCoord height ) { - int n = list->Number(); - wxPoint *points = new wxPoint[n]; - - int i = 0; - for( wxNode *node = list->First(); node; node = node->Next() ) - { - wxPoint *point = (wxPoint *)node->Data(); - points[i].x = point->x; - points[i++].y = point->y; - }; - DrawPolygon( n, points, xoffset, yoffset, fillStyle ); - delete[] points; -}; - -void wxDC::DrawLines( wxList *list, long xoffset, long yoffset ) -{ - int n = list->Number(); - wxPoint *points = new wxPoint[n]; - - int i = 0; - for( wxNode *node = list->First(); node; node = node->Next() ) - { - wxPoint *point = (wxPoint *)node->Data(); - points[i].x = point->x; - points[i++].y = point->y; - }; - DrawLines( n, points, xoffset, yoffset ); - delete []points; -}; - -void wxDC::DrawSpline( long x1, long y1, long x2, long y2, long x3, long y3 ) -{ - wxList list; - list.Append( (wxObject*)new wxPoint(x1, y1) ); - list.Append( (wxObject*)new wxPoint(x2, y2) ); - list.Append( (wxObject*)new wxPoint(x3, y3) ); - DrawSpline(&list); - wxNode *node = list.First(); - while (node) - { - wxPoint *p = (wxPoint*)node->Data(); - delete p; - node = node->Next(); - }; -}; - -void wxDC::DrawSpline( int n, wxPoint points[] ) -{ - wxList list; - for (int i = 0; i < n; i++) list.Append( (wxObject*)&points[i] ); - DrawSpline( &list ); -}; - -void wxDC::SetClippingRegion( long x, long y, long width, long height ) -{ - MacVerifySetup() ; + MacVerifySetup() ; if( m_clipping ) { m_clipX1 = wxMax( m_clipX1 , x ) ; @@ -300,14 +259,30 @@ void wxDC::SetClippingRegion( long x, long y, long width, long height ) long x1 = XLOG2DEV(m_clipX1); long y1 = YLOG2DEV(m_clipY1); long x2 = XLOG2DEV(m_clipX2); - long y2 = XLOG2DEV(m_clipY2); + long y2 = YLOG2DEV(m_clipY2); Rect clip = { y1 , x1 , y2 , x2 } ; - ::ClipRect( &clip ) ; + ::ClipRect( &clip ) ; }; +void wxDC::DoSetClippingRegionAsRegion( const wxRegion ®ion ) +{ + wxCHECK_RET( Ok(), wxT("invalid window dc") ); + + MacVerifySetup() ; + if (region.Empty()) + { + DestroyClippingRegion(); + return; + } + + wxCoord xx, yy, ww, hh; + region.GetBox( xx, yy, ww, hh ); + wxDC::DoSetClippingRegion( xx, yy, ww, hh ); +} + void wxDC::DestroyClippingRegion(void) { MacVerifySetup() ; @@ -315,27 +290,14 @@ void wxDC::DestroyClippingRegion(void) // Rect clip = { -32000 , -32000 , 32000 , 32000 } ; ::ClipRect(&m_macClipRect); }; - -void wxDC::GetClippingBox( long *x, long *y, long *width, long *height ) const -{ - if (m_clipping) - { - if (x) *x = m_clipX1; - if (y) *y = m_clipY1; - if (width) *width = (m_clipX2 - m_clipX1); - if (height) *height = (m_clipY2 - m_clipY1); - } - else - *x = *y = *width = *height = 0; -}; - -void wxDC::GetSize( int* width, int* height ) const + +void wxDC::DoGetSize( int* width, int* height ) const { *width = m_maxX-m_minX; *height = m_maxY-m_minY; }; -void wxDC::GetSizeMM( long* width, long* height ) const +void wxDC::DoGetSizeMM( int* width, int* height ) const { int w = 0; int h = 0; @@ -394,12 +356,6 @@ void wxDC::SetUserScale( double x, double y ) ComputeScaleAndOrigin(); }; -void wxDC::GetUserScale( double *x, double *y ) -{ - if (x) *x = m_userScaleX; - if (y) *y = m_userScaleY; -}; - void wxDC::SetLogicalScale( double x, double y ) { // allow negative ? @@ -408,40 +364,20 @@ void wxDC::SetLogicalScale( double x, double y ) ComputeScaleAndOrigin(); }; -void wxDC::GetLogicalScale( double *x, double *y ) -{ - if (x) *x = m_logicalScaleX; - if (y) *y = m_logicalScaleY; -}; - -void wxDC::SetLogicalOrigin( long x, long y ) +void wxDC::SetLogicalOrigin( wxCoord x, wxCoord y ) { m_logicalOriginX = x * m_signX; // is this still correct ? m_logicalOriginY = y * m_signY; ComputeScaleAndOrigin(); }; -void wxDC::GetLogicalOrigin( long *x, long *y ) -{ - if (x) *x = m_logicalOriginX; - if (y) *y = m_logicalOriginY; -}; - -void wxDC::SetDeviceOrigin( long x, long y ) +void wxDC::SetDeviceOrigin( wxCoord x, wxCoord y ) { m_externalDeviceOriginX = x; m_externalDeviceOriginY = y; ComputeScaleAndOrigin(); }; - -void wxDC::GetDeviceOrigin( long *x, long *y ) -{ -// if (x) *x = m_externalDeviceOriginX; -// if (y) *y = m_externalDeviceOriginY; - if (x) *x = m_deviceOriginX; - if (y) *y = m_deviceOriginY; -}; - +/* void wxDC::SetInternalDeviceOrigin( long x, long y ) { m_internalDeviceOriginX = x; @@ -454,53 +390,14 @@ void wxDC::GetInternalDeviceOrigin( long *x, long *y ) if (x) *x = m_internalDeviceOriginX; if (y) *y = m_internalDeviceOriginY; }; - +*/ void wxDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp ) { m_signX = (xLeftRight ? 1 : -1); m_signY = (yBottomUp ? -1 : 1); ComputeScaleAndOrigin(); }; - -long wxDC::DeviceToLogicalX(long x) const -{ - return XDEV2LOG(x); -}; - -long wxDC::DeviceToLogicalY(long y) const -{ - return YDEV2LOG(y); -}; - -long wxDC::DeviceToLogicalXRel(long x) const -{ - return XDEV2LOGREL(x); -}; - -long wxDC::DeviceToLogicalYRel(long y) const -{ - return YDEV2LOGREL(y); -}; - -long wxDC::LogicalToDeviceX(long x) const -{ - return XLOG2DEV(x); -}; - -long wxDC::LogicalToDeviceY(long y) const -{ - return YLOG2DEV(y); -}; - -long wxDC::LogicalToDeviceXRel(long x) const -{ - return XLOG2DEVREL(x); -}; - -long wxDC::LogicalToDeviceYRel(long y) const -{ - return YLOG2DEVREL(y); -}; +/* void wxDC::CalcBoundingBox( long x, long y ) { @@ -509,6 +406,16 @@ void wxDC::CalcBoundingBox( long x, long y ) if (x > m_maxX) m_maxX = x; if (y > m_maxY) m_maxY = y; }; +*/ +wxSize wxDC::GetPPI() const +{ + return wxSize(72, 72); +} + +int wxDC::GetDepth() const +{ + return wxDisplayDepth() ; +} void wxDC::ComputeScaleAndOrigin(void) { @@ -612,16 +519,17 @@ void wxDC::SetLogicalFunction( int function ) m_macPenInstalled = false ; } -void wxDC::FloodFill( long x1, long y1, const wxColour& col, int style ) +void wxDC::DoFloodFill( wxCoord x, wxCoord y, const wxColour& col, + int style ) { } -bool wxDC::GetPixel( long x1, long y1, wxColour *col ) const +bool wxDC::DoGetPixel( wxCoord x, wxCoord y, wxColour *col ) const { return true ; } -void wxDC::DrawLine( long x1, long y1, long x2, long y2 ) +void wxDC::DoDrawLine( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2 ) { if (!Ok()) return; @@ -642,19 +550,22 @@ void wxDC::DrawLine( long x1, long y1, long x2, long y2 ) }; } -void wxDC::CrossHair( long x, long y ) +void wxDC::DoCrossHair( wxCoord x, wxCoord y ) { } -void wxDC::DrawArc( long x1, long y1, long x2, long y2, long xc, long yc ) +void wxDC::DoDrawArc( wxCoord x1, wxCoord y1, + wxCoord x2, wxCoord y2, + wxCoord xc, wxCoord yc ) { } -void wxDC::DrawEllipticArc( long x, long y, long width, long height, double sa, double ea ) +void wxDC::DoDrawEllipticArc( wxCoord x, wxCoord y, wxCoord w, wxCoord h, + double sa, double ea ) { } -void wxDC::DrawPoint( long x, long y ) +void wxDC::DoDrawPoint( wxCoord x, wxCoord y ) { if (!Ok()) return; @@ -672,7 +583,8 @@ void wxDC::DrawPoint( long x, long y ) }; } -void wxDC::DrawLines( int n, wxPoint points[], long xoffset , long yoffset ) +void wxDC::DoDrawLines(int n, wxPoint points[], + wxCoord xoffset, wxCoord yoffset) { if (!Ok()) return; @@ -681,24 +593,25 @@ void wxDC::DrawLines( int n, wxPoint points[], long xoffset , long yoffset ) if (m_pen.GetStyle() == wxTRANSPARENT) return; - MacInstallPen() ; + MacInstallPen() ; - int offset = (m_pen.GetWidth() - 1 ) / 2 ; + int offset = (m_pen.GetWidth() - 1 ) / 2 ; long x1, x2 , y1 , y2 ; x1 = XLOG2DEV(points[0].x + xoffset); - y1 = YLOG2DEV(points[0].y + yoffset); - ::MoveTo(x1 - offset ,y1 - offset ); + y1 = YLOG2DEV(points[0].y + yoffset); + ::MoveTo(x1 - offset ,y1 - offset ); for (int i = 0; i < n-1; i++) { - long x2 = XLOG2DEV(points[i+1].x + xoffset); - long y2 = YLOG2DEV(points[i+1].y + yoffset); - ::LineTo(x2 - offset , y2 - offset ); + x2 = XLOG2DEV(points[i+1].x + xoffset); + y2 = YLOG2DEV(points[i+1].y + yoffset); + ::LineTo(x2 - offset , y2 - offset ); } } -void wxDC::DrawPolygon( int n, wxPoint points[], long xoffset , long yoffset , - int fillStyle ) +void wxDC::DoDrawPolygon(int n, wxPoint points[], + wxCoord xoffset, wxCoord yoffset, + int fillStyle ) { if (!Ok()) return; @@ -707,14 +620,14 @@ void wxDC::DrawPolygon( int n, wxPoint points[], long xoffset , long yoffset , PolyHandle polygon = OpenPoly() ; long x1, x2 , y1 , y2 ; x1 = XLOG2DEV(points[0].x + xoffset); - y1 = YLOG2DEV(points[0].y + yoffset); - ::MoveTo(x1,y1); + y1 = YLOG2DEV(points[0].y + yoffset); + ::MoveTo(x1,y1); for (int i = 0; i < n-1; i++) { - long x2 = XLOG2DEV(points[i+1].x + xoffset); - long y2 = YLOG2DEV(points[i+1].y + yoffset); - ::LineTo(x2, y2); + x2 = XLOG2DEV(points[i+1].x + xoffset); + y2 = YLOG2DEV(points[i+1].y + yoffset); + ::LineTo(x2, y2); } ClosePoly() ; @@ -732,7 +645,7 @@ void wxDC::DrawPolygon( int n, wxPoint points[], long xoffset , long yoffset , KillPoly( polygon ) ; } -void wxDC::DrawRectangle( long x, long y, long width, long height ) +void wxDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height) { if (!Ok()) return; @@ -775,7 +688,9 @@ void wxDC::DrawRectangle( long x, long y, long width, long height ) }; } -void wxDC::DrawRoundedRectangle( long x, long y, long width, long height, double radius ) +void wxDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y, + wxCoord width, wxCoord height, + double radius) { if (!Ok()) return; @@ -811,17 +726,17 @@ void wxDC::DrawRoundedRectangle( long x, long y, long width, long height, doubl if (m_brush.GetStyle() != wxTRANSPARENT) { MacInstallBrush() ; - ::PaintRoundRect( &rect , radius * 2 , radius * 2 ) ; + ::PaintRoundRect( &rect , int(radius * 2) , int(radius * 2) ) ; }; if (m_pen.GetStyle() != wxTRANSPARENT) { MacInstallPen() ; - ::FrameRoundRect( &rect , radius * 2 , radius * 2 ) ; + ::FrameRoundRect( &rect , int(radius * 2) , int(radius * 2) ) ; }; } -void wxDC::DrawEllipse( long x, long y, long width, long height ) +void wxDC::DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height) { if (!Ok()) return; @@ -979,7 +894,7 @@ static void wx_spline_draw_point_array(wxDC *dc) } } -void wxDC::DrawSpline( wxList *points ) +void wxDC::DoDrawSpline(wxList *points) { wxPoint *p; double cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4; @@ -1037,20 +952,20 @@ bool wxDC::CanDrawBitmap(void) const } -bool wxDC::Blit( long xdest, long ydest, long width, long height, - wxDC *source, long xsrc, long ysrc, int logical_func , bool useMask ) +bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, + wxDC *source, wxCoord xsrc, wxCoord ysrc, int logical_func , bool useMask ) { if (!Ok()) return FALSE; MacVerifySetup() ; CGrafPtr sourcePort = (CGrafPtr) source->m_macPort ; PixMapHandle bmappixels = GetGWorldPixMap( sourcePort ) ; - RGBColor white = { 0xFFFF, 0xFFFF,0xFFFF} ; - RGBColor black = { 0,0,0} ; -// RGBForeColor( &black ) ; -// RGBBackColor( &white ) ; - RGBForeColor( &m_textForegroundColour.GetPixel() ) ; - RGBBackColor( &m_textBackgroundColour.GetPixel() ) ; + RGBColor white = { 0xFFFF, 0xFFFF,0xFFFF} ; + RGBColor black = { 0,0,0} ; + RGBColor forecolor = m_textForegroundColour.GetPixel(); + RGBColor backcolor = m_textBackgroundColour.GetPixel(); + RGBForeColor( &forecolor ) ; + RGBBackColor( &backcolor ) ; if ( LockPixels(bmappixels) ) { @@ -1063,21 +978,37 @@ bool wxDC::Blit( long xdest, long ydest, long width, long height, dstrect.left = XLOG2DEV(xdest) ; dstrect.bottom = YLOG2DEV(ydest + height ) ; dstrect.right = XLOG2DEV(xdest + width ) ; -// ::ClipRect(&m_macClipRect); - CopyBits( &GrafPtr( sourcePort )->portBits , &GrafPtr( m_macPort )->portBits , - &srcrect, &dstrect, srcCopy, NULL ) ; -/* - if ( m_clipping ) - { - long x1 = XLOG2DEV(m_clipX1); - long y1 = YLOG2DEV(m_clipY1); - long x2 = XLOG2DEV(m_clipX2); - long y2 = YLOG2DEV(m_clipY2); - - Rect clip = { y1 , x1 , y2 , x2 } ; - ::ClipRect(&clip); - } -*/ + + short mode = (logical_func == wxCOPY ? srcCopy : + // logical_func == wxCLEAR ? WHITENESS : + // logical_func == wxSET ? BLACKNESS : + logical_func == wxINVERT ? hilite : + // logical_func == wxAND ? MERGECOPY : + logical_func == wxOR ? srcOr : + logical_func == wxSRC_INVERT ? notSrcCopy : + logical_func == wxXOR ? srcXor : + // logical_func == wxOR_REVERSE ? MERGEPAINT : + // logical_func == wxAND_REVERSE ? SRCERASE : + // logical_func == wxSRC_OR ? srcOr : + // logical_func == wxSRC_AND ? SRCAND : + srcCopy ); + + if ( useMask && source->m_macMask ) + { + wxASSERT( mode == srcCopy ) ; + if ( LockPixels( GetGWorldPixMap( source->m_macMask ) ) ) + { + CopyMask( GetPortBitMapForCopyBits( sourcePort ) , GetPortBitMapForCopyBits( source->m_macMask ) , + GetPortBitMapForCopyBits( m_macPort ) , + &srcrect, &srcrect , &dstrect ) ; + UnlockPixels( GetGWorldPixMap( source->m_macMask ) ) ; + } + } + else + { + CopyBits( GetPortBitMapForCopyBits( sourcePort ) , GetPortBitMapForCopyBits( m_macPort ) , + &srcrect, &dstrect, mode, NULL ) ; + } UnlockPixels( bmappixels ) ; } @@ -1088,7 +1019,11 @@ bool wxDC::Blit( long xdest, long ydest, long width, long height, return TRUE; } -void wxDC::DrawText( const wxString &string, long x, long y, bool use16) +void wxDC::DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord y, + double angle) +{ +} +void wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y) { if (!Ok()) return; @@ -1126,14 +1061,14 @@ void wxDC::DrawText( const wxString &string, long x, long y, bool use16) if ( wxApp::s_macDefaultEncodingIsPC ) { - macText = wxMacMakeMacStringFromPC( string ) ; + macText = wxMacMakeMacStringFromPC( strtext ) ; text = macText ; length = macText.Length() ; } else { - text = string ; - length = string.Length() ; + text = strtext ; + length = strtext.Length() ; } int laststop = 0 ; @@ -1165,9 +1100,9 @@ bool wxDC::CanGetTextExtent(void) const return true ; } -void wxDC::GetTextExtent( const wxString &string, long *width, long *height, - long *descent, long *externalLeading , - wxFont *theFont , bool use16 ) const +void wxDC::DoGetTextExtent( const wxString &string, wxCoord *width, wxCoord *height, + wxCoord *descent, wxCoord *externalLeading , + wxFont *theFont ) const { if (!Ok()) return; @@ -1182,11 +1117,8 @@ void wxDC::GetTextExtent( const wxString &string, long *width, long *height, if ( font ) { - long yy1 = YLOG2DEV(0); - long yy2 = YLOG2DEV(font->m_macFontSize); - ::TextFont( font->m_macFontNum ) ; - ::TextSize( abs( yy2-yy1) ) ; + ::TextSize( YLOG2DEVREL( font->m_macFontSize) ) ; ::TextFace( font->m_macFontStyle ) ; } } @@ -1198,9 +1130,12 @@ void wxDC::GetTextExtent( const wxString &string, long *width, long *height, FontInfo fi ; ::GetFontInfo( &fi ) ; - *height = fi.descent + fi.ascent ; - *descent = fi.descent ; - *externalLeading = fi.leading ; + 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 ; @@ -1220,24 +1155,28 @@ void wxDC::GetTextExtent( const wxString &string, long *width, long *height, int laststop = 0 ; int i = 0 ; int curwidth = 0 ; - *width = 0 ; - - while( i < length ) + if ( width ) { - if( text[i] == 13 || text[i] == 10) + *width = 0 ; + + while( i < length ) { - *height += fi.descent + fi.ascent + fi.leading; - curwidth = ::TextWidth( text , laststop , i - laststop ) ; - if ( curwidth > *width ) - *width = curwidth ; - laststop = i+1 ; + if( text[i] == 13 || text[i] == 10) + { + if ( height ) + *height += YDEV2LOGREL( fi.descent + fi.ascent + fi.leading ) ; + curwidth = ::TextWidth( text , laststop , i - laststop ) ; + if ( curwidth > *width ) + *width = XDEV2LOGREL( curwidth ) ; + laststop = i+1 ; + } + i++ ; } - i++ ; + + curwidth = ::TextWidth( text , laststop , i - laststop ) ; + if ( curwidth > *width ) + *width = XDEV2LOGREL( curwidth ) ; } - - curwidth = ::TextWidth( text , laststop , i - laststop ) ; - if ( curwidth > *width ) - *width = curwidth ; if ( theFont ) { @@ -1245,7 +1184,7 @@ void wxDC::GetTextExtent( const wxString &string, long *width, long *height, } } -long wxDC::GetCharWidth(void) +wxCoord wxDC::GetCharWidth(void) const { if (!Ok()) return 1; @@ -1257,10 +1196,10 @@ long wxDC::GetCharWidth(void) FontInfo fi ; ::GetFontInfo( &fi ) ; - return (fi.descent + fi.ascent) / 2 ; + return YDEV2LOGREL((fi.descent + fi.ascent) / 2) ; } -long wxDC::GetCharHeight(void) +wxCoord wxDC::GetCharHeight(void) const { if (!Ok()) return 1; @@ -1272,7 +1211,7 @@ long wxDC::GetCharHeight(void) FontInfo fi ; ::GetFontInfo( &fi ) ; - return fi.descent + fi.ascent ; + return YDEV2LOGREL( fi.descent + fi.ascent ); } void wxDC::Clear(void) @@ -1297,21 +1236,24 @@ void wxDC::MacInstallFont() const if ( m_macFontInstalled ) return ; - + Pattern blackColor ; + wxFontRefData * font = (wxFontRefData*) m_font.GetRefData() ; if ( font ) { ::TextFont( font->m_macFontNum ) ; - ::TextSize( m_scaleY * font->m_macFontSize ) ; + ::TextSize( short(m_scaleY * font->m_macFontSize) ) ; ::TextFace( font->m_macFontStyle ) ; m_macFontInstalled = true ; m_macBrushInstalled = false ; m_macPenInstalled = false ; - - ::RGBForeColor(&m_textForegroundColour.GetPixel() ); - ::RGBBackColor(&m_textBackgroundColour.GetPixel() ); + + RGBColor forecolor = m_textForegroundColour.GetPixel(); + RGBColor backcolor = m_textBackgroundColour.GetPixel(); + ::RGBForeColor( &forecolor ); + ::RGBBackColor( &backcolor ); } else { @@ -1319,7 +1261,7 @@ void wxDC::MacInstallFont() const GetFNum( "\pGeneva" , &fontnum ) ; ::TextFont( fontnum ) ; - ::TextSize( m_scaleY * 10 ) ; + ::TextSize( short(m_scaleY * 10) ) ; ::TextFace( 0 ) ; // todo reset after spacing changes - or store the current spacing somewhere @@ -1327,10 +1269,12 @@ void wxDC::MacInstallFont() const m_macFontInstalled = true ; m_macBrushInstalled = false ; m_macPenInstalled = false ; - ::RGBForeColor( &(m_textForegroundColour.GetPixel()) ); - ::RGBBackColor(&m_textBackgroundColour.GetPixel() ); - } + RGBColor forecolor = m_textForegroundColour.GetPixel(); + RGBColor backcolor = m_textBackgroundColour.GetPixel(); + ::RGBForeColor( &forecolor ); + ::RGBBackColor( &backcolor ); + } short mode = patCopy ; @@ -1342,7 +1286,7 @@ void wxDC::MacInstallFont() const mode = patCopy ; break ; case wxINVERT: // NOT dst - ::PenPat(&qd.black); + ::PenPat(GetQDGlobalsBlack(&blackColor)); mode = patXor ; break ; case wxXOR: // src XOR dst @@ -1368,8 +1312,8 @@ void wxDC::MacInstallFont() const 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 +// case wxSRC_OR: // source _bitmap_ OR destination +// case wxSRC_AND: // source _bitmap_ AND destination break ; } ::PenMode( mode ) ; @@ -1412,11 +1356,15 @@ void wxDC::MacInstallPen() const return; MacVerifySetup() ; + Pattern blackColor; + if ( m_macPenInstalled ) return ; - ::RGBForeColor(&m_pen.GetColour().GetPixel() ); - ::RGBBackColor(&m_backgroundBrush.GetColour().GetPixel() ); + RGBColor forecolor = m_pen.GetColour().GetPixel(); + RGBColor backcolor = m_backgroundBrush.GetColour().GetPixel(); + ::RGBForeColor( &forecolor ); + ::RGBBackColor( &backcolor ); ::PenNormal() ; int penWidth = m_pen.GetWidth(); @@ -1425,7 +1373,9 @@ void wxDC::MacInstallPen() const int penStyle = m_pen.GetStyle(); if (penStyle == wxSOLID) - ::PenPat(&qd.black); + { + ::PenPat(GetQDGlobalsBlack(&blackColor)); + } else if (IS_HATCH(penStyle)) { Pattern pat ; @@ -1434,7 +1384,7 @@ void wxDC::MacInstallPen() const } else { - ::PenPat(&qd.black); + ::PenPat(GetQDGlobalsBlack(&blackColor)); } short mode = patCopy ; @@ -1447,7 +1397,7 @@ void wxDC::MacInstallPen() const mode = patCopy ; break ; case wxINVERT: // NOT dst - ::PenPat(&qd.black); + ::PenPat(GetQDGlobalsBlack(&blackColor)); mode = patXor ; break ; case wxXOR: // src XOR dst @@ -1473,8 +1423,8 @@ void wxDC::MacInstallPen() const 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 +// case wxSRC_OR: // source _bitmap_ OR destination +// case wxSRC_AND: // source _bitmap_ AND destination break ; } ::PenMode( mode ) ; @@ -1488,18 +1438,20 @@ void wxDC::MacInstallBrush() const if (!Ok()) return; MacVerifySetup() ; - + Pattern blackColor, whiteColor ; if ( m_macBrushInstalled ) return ; // foreground - ::RGBForeColor(&m_brush.GetColour().GetPixel() ); - ::RGBBackColor(&m_backgroundBrush.GetColour().GetPixel() ); + RGBColor forecolor = m_brush.GetColour().GetPixel(); + RGBColor backcolor = m_backgroundBrush.GetColour().GetPixel(); + ::RGBForeColor( &forecolor ); + ::RGBBackColor( &backcolor ); int brushStyle = m_brush.GetStyle(); if (brushStyle == wxSOLID) - ::PenPat(&qd.black); + ::PenPat(GetQDGlobalsBlack(&blackColor)); else if (IS_HATCH(brushStyle)) { Pattern pat ; @@ -1508,7 +1460,7 @@ void wxDC::MacInstallBrush() const } else { - ::PenPat(&qd.black); + ::PenPat(GetQDGlobalsBlack(&blackColor)); } @@ -1516,7 +1468,7 @@ void wxDC::MacInstallBrush() const brushStyle = m_backgroundBrush.GetStyle(); if (brushStyle == wxSOLID) - ::BackPat(&qd.white); + ::BackPat(GetQDGlobalsWhite(&whiteColor)); else if (IS_HATCH(brushStyle)) { Pattern pat ; @@ -1525,7 +1477,7 @@ void wxDC::MacInstallBrush() const } else { - ::BackPat(&qd.white); + ::BackPat(GetQDGlobalsWhite(&whiteColor)); } short mode = patCopy ; @@ -1538,7 +1490,7 @@ void wxDC::MacInstallBrush() const mode = patCopy ; break ; case wxINVERT: // NOT dst - ::PenPat(&qd.black); + ::PenPat(GetQDGlobalsBlack(&blackColor)); mode = patXor ; break ; case wxXOR: // src XOR dst @@ -1564,8 +1516,8 @@ void wxDC::MacInstallBrush() const 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 +// case wxSRC_OR: // source _bitmap_ OR destination +// case wxSRC_AND: // source _bitmap_ AND destination break ; } ::PenMode( mode ) ; @@ -1574,4 +1526,47 @@ void wxDC::MacInstallBrush() const 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); +}