From: David Elliott Date: Sun, 6 Apr 2003 00:54:38 +0000 (+0000) Subject: Replace dc.cpp with dc.mm and dcclient.cpp with dc.mm X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/891d0563f7f43b640c4e0e78c30f038b2127fffb?ds=inline Replace dc.cpp with dc.mm and dcclient.cpp with dc.mm Update app.mm to call wxDC text system startup and cleanup code git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@20000 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/cocoa/app.mm b/src/cocoa/app.mm index 97ae62132a..3574ca20b9 100644 --- a/src/cocoa/app.mm +++ b/src/cocoa/app.mm @@ -23,6 +23,7 @@ #include "wx/app.h" #include "wx/frame.h" #include "wx/dialog.h" + #include "wx/dc.h" #include "wx/intl.h" #include "wx/log.h" #include "wx/cocoa/ObjcPose.h" @@ -311,6 +312,7 @@ END_EVENT_TABLE() // wxDebugContext::SetStream(NULL, NULL); #endif + wxDC::CocoaShutdownTextSystem(); #if wxUSE_LOG // do it as the very last thing because everything else can log messages delete wxLog::SetActiveTarget(NULL); @@ -352,6 +354,7 @@ bool wxApp::OnInitGui() // Create the app using the sharedApplication method m_cocoaApp = [NSApplication sharedApplication]; + wxDC::CocoaInitializeTextSystem(); // [ m_cocoaApp setDelegate:m_cocoaApp ]; #if 0 wxLogDebug("Just for kicks"); diff --git a/src/cocoa/dc.cpp b/src/cocoa/dc.cpp deleted file mode 100644 index b936c37f99..0000000000 --- a/src/cocoa/dc.cpp +++ /dev/null @@ -1,348 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// Name: dc.cpp -// Purpose: wxDC class -// Author: AUTHOR -// Modified by: -// Created: 01/02/97 -// RCS-ID: $Id$ -// Copyright: (c) AUTHOR -// Licence: wxWindows licence -///////////////////////////////////////////////////////////////////////////// - -#ifdef __GNUG__ -#pragma implementation "dc.h" -#endif - -#include "wx/dc.h" -#include "wx/bitmap.h" -#include "wx/log.h" - -#if !USE_SHARED_LIBRARY -IMPLEMENT_ABSTRACT_CLASS(wxDC, wxObject) -#endif - -//----------------------------------------------------------------------------- -// constants -//----------------------------------------------------------------------------- - -#define mm2inches 0.0393700787402 -#define inches2mm 25.4 -#define mm2twips 56.6929133859 -#define twips2mm 0.0176388888889 -#define mm2pt 2.83464566929 -#define pt2mm 0.352777777778 - -//----------------------------------------------------------------------------- -// wxDC -//----------------------------------------------------------------------------- - -wxDC::wxDC(void) -{ - m_ok = FALSE; - m_colour = TRUE; - m_clipping = FALSE; - - m_logicalOriginX = 0; - m_logicalOriginY = 0; - m_deviceOriginX = 0; - m_deviceOriginY = 0; - - m_logicalScaleX = 1.0; - m_logicalScaleY = 1.0; - m_userScaleX = 1.0; - m_userScaleY = 1.0; - m_scaleX = 1.0; - m_scaleY = 1.0; - - m_mappingMode = wxMM_TEXT; - - m_signX = 1; // default x-axis left to right - m_signY = 1; // default y-axis top down - - m_maxX = m_maxY = -100000; - m_minY = m_minY = 100000; - - m_logicalFunction = wxCOPY; -// m_textAlignment = wxALIGN_TOP_LEFT; - m_backgroundMode = wxTRANSPARENT; - - m_textForegroundColour = *wxBLACK; - m_textBackgroundColour = *wxWHITE; - m_pen = *wxBLACK_PEN; - m_font = *wxNORMAL_FONT; - m_brush = *wxTRANSPARENT_BRUSH; - m_backgroundBrush = *wxWHITE_BRUSH; - -// m_palette = wxAPP_COLOURMAP; -}; - -wxDC::~wxDC(void) -{ -}; - -void wxDC::DoDrawIcon( const wxIcon &WXUNUSED(icon), int WXUNUSED(x), int WXUNUSED(y) ) -{ -}; - -void wxDC::DoDrawPoint( int x, int y ) -{ -}; - -void wxDC::DoDrawPolygon( int, wxPoint *, int, int, int) -{ -}; - -void wxDC::DoDrawLines( int, wxPoint *, int, int ) -{ -} - -void wxDC::DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2) -{ -} - -int wxDC::GetDepth() const -{ - return 0; -} - -wxSize wxDC::GetPPI() const -{ - return wxSize(0,0); -} - -bool wxDC::CanGetTextExtent() const -{ - return false; -} - -void wxDC::DoGetTextExtent(const wxString& string, wxCoord *x, wxCoord *y, wxCoord *descent, wxCoord *externalLeading, wxFont *theFont) const -{ - wxLogDebug("wxDC::DoGetTextExtent(%s)",string.c_str()); - if(x) - *x=0; - if(y) - *y=0; - if(descent) - *descent=0; - if(externalLeading) - *externalLeading=0; -} - -wxCoord wxDC::GetCharHeight() const -{ - return 0; -} - -wxCoord wxDC::GetCharWidth() const -{ - return 0; -} - -bool wxDC::CanDrawBitmap() const -{ - return false; -} - -bool wxDC::DoGetPixel(wxCoord x, wxCoord y, wxColour *col) const -{ - return false; -} - -void wxDC::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCoord xc, wxCoord yc) -{ -} - -void wxDC::SetPen(const wxPen& pen) -{ -} - -void wxDC::SetBrush(const wxBrush& brush) -{ -} - -void wxDC::DoSetClippingRegionAsRegion(const wxRegion& region) -{ -} - -void wxDC::DoSetClippingRegion(wxCoord x, wxCoord y, wxCoord width, wxCoord height) -{ -} - -void wxDC::DestroyClippingRegion() -{ -} - -void wxDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height, double radius) -{ -} - -void wxDC::DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord y, double angle) -{ -} - -void wxDC::DoDrawEllipticArc(wxCoord x, wxCoord y, wxCoord w, wxCoord h, double sa, double ea) -{ -} - -void wxDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height) -{ -} - -void wxDC::DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height) -{ -} - -void wxDC::DoDrawBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y, bool useMask) -{ -} - -bool wxDC::DoFloodFill(wxCoord x, wxCoord y, const wxColour& col, int style) -{ - return false; -} - -void wxDC::DoCrossHair(wxCoord x, wxCoord y) -{ -} - -void wxDC::DoDrawText(const wxString& text, wxCoord x, wxCoord y) -{ -} - - -bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, wxDC *source, wxCoord xsrc, wxCoord ysrc, int rop, bool useMask , wxCoord xsrcMask, wxCoord ysrcMask) -{ - return false; -} - -void wxDC::DoGetSize( int* width, int* height ) const -{ - *width = m_maxX-m_minX; - *height = m_maxY-m_minY; -}; - -void wxDC::DoGetSizeMM( int* width, int* height ) const -{ - int w = 0; - int h = 0; - GetSize( &w, &h ); -}; - -void wxDC::SetTextForeground( const wxColour &col ) -{ - if (!Ok()) return; - m_textForegroundColour = col; -}; - -void wxDC::SetTextBackground( const wxColour &col ) -{ - if (!Ok()) return; - m_textBackgroundColour = col; -}; - -void wxDC::Clear() -{ -} - -void wxDC::SetBackground(const wxBrush&) -{ -} - -void wxDC::SetPalette(const wxPalette&) -{ -} - -void wxDC::SetLogicalFunction(int) -{ -} - - -void wxDC::SetMapMode( int mode ) -{ - switch (mode) - { - case wxMM_TWIPS: - break; - case wxMM_POINTS: - break; - case wxMM_METRIC: - break; - case wxMM_LOMETRIC: - break; - default: - case wxMM_TEXT: - SetLogicalScale( 1.0, 1.0 ); - break; - }; - if (mode != wxMM_TEXT) - { - }; -}; - -void wxDC::SetUserScale( double x, double y ) -{ - // allow negative ? -> no - m_userScaleX = x; - m_userScaleY = y; - ComputeScaleAndOrigin(); -}; - -void wxDC::SetLogicalScale( double x, double y ) -{ - // allow negative ? - m_logicalScaleX = x; - m_logicalScaleY = y; - ComputeScaleAndOrigin(); -}; - -void wxDC::SetLogicalOrigin( wxCoord x, wxCoord y ) -{ - m_logicalOriginX = x * m_signX; // is this still correct ? - m_logicalOriginY = y * m_signY; - ComputeScaleAndOrigin(); -}; - -void wxDC::SetDeviceOrigin( wxCoord x, wxCoord y ) -{ - ComputeScaleAndOrigin(); -}; - -void wxDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp ) -{ - m_signX = (xLeftRight ? 1 : -1); - m_signY = (yBottomUp ? -1 : 1); - ComputeScaleAndOrigin(); -}; - -void wxDC::ComputeScaleAndOrigin(void) -{ - // CMB: copy scale to see if it changes - double origScaleX = m_scaleX; - double origScaleY = m_scaleY; - - m_scaleX = m_logicalScaleX * m_userScaleX; - m_scaleY = m_logicalScaleY * m_userScaleY; - - // CMB: if scale has changed call SetPen to recalulate the line width - if (m_scaleX != origScaleX || m_scaleY != origScaleY) - { - // 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); - } -}; - -int wxDCBase::DeviceToLogicalX(int x) const -{ - return x; -} - -int wxDCBase::DeviceToLogicalY(int y) const -{ - return y; -} - -// vim:sts=4:sw=4:et diff --git a/src/cocoa/dc.mm b/src/cocoa/dc.mm new file mode 100644 index 0000000000..79c10e0555 --- /dev/null +++ b/src/cocoa/dc.mm @@ -0,0 +1,406 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/cocoa/dc.mm +// Purpose: wxDC +// Author: David Elliott +// Modified by: +// Created: 2003/04/01 +// RCS-ID: $Id$ +// Copyright: (c) 2003 David Elliott +// Licence: wxWindows license +///////////////////////////////////////////////////////////////////////////// + +#include "wx/dc.h" +#include "wx/log.h" + +#import +#import +#import +#import +#import +#import +#import +#import + +IMPLEMENT_ABSTRACT_CLASS(wxDC, wxObject) +wxDC *wxDC::sm_focusedDC = NULL; +WX_NSTextStorage wxDC::sm_cocoaNSTextStorage = nil; +WX_NSLayoutManager wxDC::sm_cocoaNSLayoutManager = nil; +WX_NSTextContainer wxDC::sm_cocoaNSTextContainer = nil; + +void wxDC::CocoaInitializeTextSystem() +{ + wxASSERT_MSG(!sm_cocoaNSTextStorage && !sm_cocoaNSLayoutManager && !sm_cocoaNSTextContainer,"Text system already initalized! BAD PROGRAMMER!"); + + sm_cocoaNSTextStorage = [[NSTextStorage alloc] init]; + + sm_cocoaNSLayoutManager = [[NSLayoutManager alloc] init]; + [sm_cocoaNSTextStorage addLayoutManager:sm_cocoaNSLayoutManager]; + // NSTextStorage retains NSLayoutManager, but so do we + // [sm_cocoaNSLayoutManager release]; [sm_cocoaNSLayoutManager retain]; + + // NOTE: initWithContainerSize is the designated initializer, but the + // Apple CircleView sample gets away with just calling init, which + // is all we really need for our purposes. + sm_cocoaNSTextContainer = [[NSTextContainer alloc] init]; + [sm_cocoaNSLayoutManager addTextContainer:sm_cocoaNSTextContainer]; + // NSLayoutManager retains NSTextContainer, but so do we + // [sm_cocoaNSTextContainer release]; [sm_cocoaNSTextContainer retain]; +} + +void wxDC::CocoaShutdownTextSystem() +{ + [sm_cocoaNSTextContainer release]; sm_cocoaNSTextContainer = nil; + [sm_cocoaNSLayoutManager release]; sm_cocoaNSLayoutManager = nil; + [sm_cocoaNSTextStorage release]; sm_cocoaNSTextStorage = nil; +} + +wxDC::wxDC(void) +{ +} + +wxDC::~wxDC(void) +{ +} + +void wxDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height) +{ + NSBezierPath *bezpath = [NSBezierPath bezierPathWithRect:NSMakeRect(x,y,width,height)]; + [bezpath stroke]; +} + +void wxDC::DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2) +{ + NSBezierPath *bezpath = [NSBezierPath bezierPath]; + [bezpath moveToPoint:NSMakePoint(x1,y1)]; + [bezpath lineToPoint:NSMakePoint(x2,y2)]; + [bezpath stroke]; +} + +void wxDC::DoGetTextExtent(const wxString& text, wxCoord *x, wxCoord *y, wxCoord *descent, wxCoord *externalLeading, wxFont *theFont) const +{ +// FIXME: Cache this so it can be used for DoDrawText + wxASSERT_MSG(sm_cocoaNSTextStorage && sm_cocoaNSLayoutManager && sm_cocoaNSTextContainer, "Text system has not been initialized. BAD PROGRAMMER!"); + NSAttributedString *attributedString = [[NSAttributedString alloc] + initWithString:[NSString stringWithCString:text.c_str()]]; + [sm_cocoaNSTextStorage setAttributedString:attributedString]; + [attributedString release]; + + NSRange glyphRange = [sm_cocoaNSLayoutManager glyphRangeForTextContainer:sm_cocoaNSTextContainer]; + NSRect usedRect = [sm_cocoaNSLayoutManager usedRectForTextContainer:sm_cocoaNSTextContainer]; + if(x) + *x=usedRect.size.width; + if(y) + *y=usedRect.size.height; + if(descent) + *descent=0; + if(externalLeading) + *externalLeading=0; +} + +void wxDC::DoDrawText(const wxString& text, wxCoord x, wxCoord y) +{ + wxASSERT_MSG(sm_cocoaNSTextStorage && sm_cocoaNSLayoutManager && sm_cocoaNSTextContainer, "Text system has not been initialized. BAD PROGRAMMER!"); + NSAttributedString *attributedString = [[NSAttributedString alloc] + initWithString:[NSString stringWithCString:text.c_str()]]; + [sm_cocoaNSTextStorage setAttributedString:attributedString]; + [attributedString release]; + + NSRange glyphRange = [sm_cocoaNSLayoutManager glyphRangeForTextContainer:sm_cocoaNSTextContainer]; + NSRect usedRect = [sm_cocoaNSLayoutManager usedRectForTextContainer:sm_cocoaNSTextContainer]; + + + NSAffineTransform *transform = [NSAffineTransform transform]; + [transform translateXBy:x yBy:y]; + + NSAffineTransform *flipTransform = [NSAffineTransform transform]; + /* x' = 1x + 0y + 0 + y' = 0x + -1y + window's height + */ + NSAffineTransformStruct matrix = { + 1, 0 + , 0, -1 + , 0, usedRect.size.height + }; + [flipTransform setTransformStruct: matrix]; + + NSGraphicsContext *context = [NSGraphicsContext currentContext]; + [context saveGraphicsState]; + [transform concat]; + [flipTransform concat]; + // Draw+fill a rectangle so we can see where the shit is supposed to be. + wxLogDebug("(%f,%f) (%fx%f)",usedRect.origin.x,usedRect.origin.y,usedRect.size.width,usedRect.size.height); + NSBezierPath *bezpath = [NSBezierPath bezierPathWithRect:NSMakeRect(0,0,usedRect.size.width,usedRect.size.height)]; + [[NSColor blackColor] set]; + [bezpath stroke]; + [[NSColor blueColor] set]; + [bezpath fill]; + + NSPoint layoutLocation = [sm_cocoaNSLayoutManager locationForGlyphAtIndex:0]; + layoutLocation.x = 0.0; + layoutLocation.y *= -1.0; + layoutLocation.y += [[sm_cocoaNSLayoutManager typesetter] baselineOffsetInLayoutManager:sm_cocoaNSLayoutManager glyphIndex:0]; + // NOTE: That's NSMakePoint, not NSMakePint (working on that though) + [sm_cocoaNSLayoutManager drawGlyphsForGlyphRange:glyphRange atPoint:layoutLocation]; + + [context restoreGraphicsState]; +} + +/////////////////////////////////////////////////////////////////////////// +// cut here, the rest is stubs +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// constants +//----------------------------------------------------------------------------- + +#define mm2inches 0.0393700787402 +#define inches2mm 25.4 +#define mm2twips 56.6929133859 +#define twips2mm 0.0176388888889 +#define mm2pt 2.83464566929 +#define pt2mm 0.352777777778 + +//----------------------------------------------------------------------------- +// wxDC +//----------------------------------------------------------------------------- + +void wxDC::DoDrawIcon( const wxIcon &WXUNUSED(icon), int WXUNUSED(x), int WXUNUSED(y) ) +{ +}; + +void wxDC::DoDrawPoint( int x, int y ) +{ +}; + +void wxDC::DoDrawPolygon( int, wxPoint *, int, int, int) +{ +}; + +void wxDC::DoDrawLines( int, wxPoint *, int, int ) +{ +} + +int wxDC::GetDepth() const +{ + return 0; +} + +wxSize wxDC::GetPPI() const +{ + return wxSize(0,0); +} + +bool wxDC::CanGetTextExtent() const +{ + return false; +} + +wxCoord wxDC::GetCharHeight() const +{ + return 0; +} + +wxCoord wxDC::GetCharWidth() const +{ + return 0; +} + +bool wxDC::CanDrawBitmap() const +{ + return false; +} + +bool wxDC::DoGetPixel(wxCoord x, wxCoord y, wxColour *col) const +{ + return false; +} + +void wxDC::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCoord xc, wxCoord yc) +{ +} + +void wxDC::SetPen(const wxPen& pen) +{ +} + +void wxDC::SetBrush(const wxBrush& brush) +{ +} + +void wxDC::DoSetClippingRegionAsRegion(const wxRegion& region) +{ +} + +void wxDC::DoSetClippingRegion(wxCoord x, wxCoord y, wxCoord width, wxCoord height) +{ +} + +void wxDC::DestroyClippingRegion() +{ +} + +void wxDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height, double radius) +{ +} + +void wxDC::DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord y, double angle) +{ +} + +void wxDC::DoDrawEllipticArc(wxCoord x, wxCoord y, wxCoord w, wxCoord h, double sa, double ea) +{ +} + +void wxDC::DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height) +{ +} + +void wxDC::DoDrawBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y, bool useMask) +{ +} + +bool wxDC::DoFloodFill(wxCoord x, wxCoord y, const wxColour& col, int style) +{ + return false; +} + +void wxDC::DoCrossHair(wxCoord x, wxCoord y) +{ +} + + +bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, wxDC *source, wxCoord xsrc, wxCoord ysrc, int rop, bool useMask , wxCoord xsrcMask, wxCoord ysrcMask) +{ + return false; +} + +void wxDC::DoGetSize( int* width, int* height ) const +{ + *width = m_maxX-m_minX; + *height = m_maxY-m_minY; +}; + +void wxDC::DoGetSizeMM( int* width, int* height ) const +{ + int w = 0; + int h = 0; + GetSize( &w, &h ); +}; + +void wxDC::SetTextForeground( const wxColour &col ) +{ + if (!Ok()) return; + m_textForegroundColour = col; +}; + +void wxDC::SetTextBackground( const wxColour &col ) +{ + if (!Ok()) return; + m_textBackgroundColour = col; +}; + +void wxDC::Clear() +{ +} + +void wxDC::SetBackground(const wxBrush&) +{ +} + +void wxDC::SetPalette(const wxPalette&) +{ +} + +void wxDC::SetLogicalFunction(int) +{ +} + + +void wxDC::SetMapMode( int mode ) +{ + switch (mode) + { + case wxMM_TWIPS: + break; + case wxMM_POINTS: + break; + case wxMM_METRIC: + break; + case wxMM_LOMETRIC: + break; + default: + case wxMM_TEXT: + SetLogicalScale( 1.0, 1.0 ); + break; + }; + if (mode != wxMM_TEXT) + { + }; +}; + +void wxDC::SetUserScale( double x, double y ) +{ + // allow negative ? -> no + m_userScaleX = x; + m_userScaleY = y; + ComputeScaleAndOrigin(); +}; + +void wxDC::SetLogicalScale( double x, double y ) +{ + // allow negative ? + m_logicalScaleX = x; + m_logicalScaleY = y; + ComputeScaleAndOrigin(); +}; + +void wxDC::SetLogicalOrigin( wxCoord x, wxCoord y ) +{ + m_logicalOriginX = x * m_signX; // is this still correct ? + m_logicalOriginY = y * m_signY; + ComputeScaleAndOrigin(); +}; + +void wxDC::SetDeviceOrigin( wxCoord x, wxCoord y ) +{ + ComputeScaleAndOrigin(); +}; + +void wxDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp ) +{ + m_signX = (xLeftRight ? 1 : -1); + m_signY = (yBottomUp ? -1 : 1); + ComputeScaleAndOrigin(); +}; + +void wxDC::ComputeScaleAndOrigin(void) +{ + // CMB: copy scale to see if it changes + double origScaleX = m_scaleX; + double origScaleY = m_scaleY; + + m_scaleX = m_logicalScaleX * m_userScaleX; + m_scaleY = m_logicalScaleY * m_userScaleY; + + // CMB: if scale has changed call SetPen to recalulate the line width + if (m_scaleX != origScaleX || m_scaleY != origScaleY) + { + // 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); + } +}; + +int wxDCBase::DeviceToLogicalX(int x) const +{ + return x; +} + +int wxDCBase::DeviceToLogicalY(int y) const +{ + return y; +} + diff --git a/src/cocoa/dcclient.cpp b/src/cocoa/dcclient.cpp deleted file mode 100644 index 054a0d4b57..0000000000 --- a/src/cocoa/dcclient.cpp +++ /dev/null @@ -1,84 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// Name: dcclient.cpp -// Purpose: wxClientDC class -// Author: AUTHOR -// Modified by: -// Created: 01/02/97 -// RCS-ID: $Id$ -// Copyright: (c) AUTHOR -// Licence: wxWindows licence -///////////////////////////////////////////////////////////////////////////// - -#ifdef __GNUG__ -#pragma implementation "dcclient.h" -#endif - -#include "wx/dcclient.h" -#include "wx/dcmemory.h" -#include "wx/region.h" -#include - -//----------------------------------------------------------------------------- -// constants -//----------------------------------------------------------------------------- - -#define RAD2DEG 57.2957795131 - -//----------------------------------------------------------------------------- -// wxPaintDC -//----------------------------------------------------------------------------- - -#if !USE_SHARED_LIBRARY -IMPLEMENT_DYNAMIC_CLASS(wxWindowDC, wxDC) -IMPLEMENT_DYNAMIC_CLASS(wxClientDC, wxWindowDC) -IMPLEMENT_DYNAMIC_CLASS(wxPaintDC, wxWindowDC) -#endif - -/* - * wxWindowDC - */ - -wxWindowDC::wxWindowDC(void) -{ -}; - -wxWindowDC::wxWindowDC( wxWindow *window ) -{ -}; - -wxWindowDC::~wxWindowDC(void) -{ -}; - -/* - * wxClientDC - */ - -wxClientDC::wxClientDC(void) -{ -}; - -wxClientDC::wxClientDC( wxWindow *window ) -{ -}; - -wxClientDC::~wxClientDC(void) -{ -}; - -/* - * wxPaintDC - */ - -wxPaintDC::wxPaintDC(void) -{ -}; - -wxPaintDC::wxPaintDC( wxWindow *window ) -{ -}; - -wxPaintDC::~wxPaintDC(void) -{ -}; - diff --git a/src/cocoa/dcclient.mm b/src/cocoa/dcclient.mm new file mode 100644 index 0000000000..b5da8bd6c3 --- /dev/null +++ b/src/cocoa/dcclient.mm @@ -0,0 +1,92 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/cocoa/dcclient.mm +// Purpose: wxWindowDC, wxPaintDC, and wxClientDC classes +// Author: David Elliott +// Modified by: +// Created: 2003/04/01 +// RCS-ID: $Id$ +// Copyright: (c) 2003 David Elliott +// Licence: wxWindows license +///////////////////////////////////////////////////////////////////////////// + +#include "wx/dcclient.h" +#include "wx/window.h" + +#import +#import + +/* + * wxWindowDC + */ +IMPLEMENT_DYNAMIC_CLASS(wxWindowDC, wxDC) + +wxWindowDC::wxWindowDC(void) +{ +}; + +wxWindowDC::wxWindowDC( wxWindow *window ) +{ + wxFAIL_MSG("non-client window DC's are not supported"); +}; + +wxWindowDC::~wxWindowDC(void) +{ +}; + +/* + * wxClientDC + */ +IMPLEMENT_DYNAMIC_CLASS(wxClientDC, wxWindowDC) + +wxClientDC::wxClientDC(void) +{ +}; + +wxClientDC::wxClientDC( wxWindow *window ) +{ +}; + +wxClientDC::~wxClientDC(void) +{ +}; + +/* + * wxPaintDC + */ +IMPLEMENT_DYNAMIC_CLASS(wxPaintDC, wxWindowDC) + +wxPaintDC::wxPaintDC(void) +{ +}; + +wxPaintDC::wxPaintDC( wxWindow *window ) +{ + wxASSERT_MSG(!sm_focusedDC,"Found another wxDC with focus. Do not use wxPaintDC outside of paint handlers!"); + wxASSERT_MSG([NSView focusView]==window->GetNSView(), "PaintDC's NSView does not have focus. Please use wxPaintDC only as the first DC created in a paint handler"); + sm_focusedDC=this; + // This transform flips the graphics since wxDC uses top-left origin + if(![window->GetNSView() isFlipped]) + { + // The transform is auto released + NSAffineTransform *transform = [NSAffineTransform transform]; + /* x' = 1x + 0y + 0 + y' = 0x + -1y + window's height + */ + NSAffineTransformStruct matrix = { + 1, 0 + , 0, -1 + , 0, [window->GetNSView() bounds].size.height + }; + [transform setTransformStruct: matrix]; + // Apply the transform + [transform concat]; + } + // TODO: Apply scaling transformation +}; + +wxPaintDC::~wxPaintDC(void) +{ + if(sm_focusedDC==this) + sm_focusedDC=NULL; +}; + diff --git a/src/cocoa/files.lst b/src/cocoa/files.lst index 873d3faa7d..615e80fb78 100644 --- a/src/cocoa/files.lst +++ b/src/cocoa/files.lst @@ -199,8 +199,8 @@ ALL_SOURCES = \ cocoa/control.mm \ cocoa/cursor.mm \ cocoa/data.cpp \ - cocoa/dc.cpp \ - cocoa/dcclient.cpp \ + cocoa/dc.mm \ + cocoa/dcclient.mm \ cocoa/dcmemory.cpp \ cocoa/dcscreen.cpp \ cocoa/dialog.mm \