]> git.saurik.com Git - wxWidgets.git/commitdiff
Replace dc.cpp with dc.mm and dcclient.cpp with dc.mm
authorDavid Elliott <dfe@tgwbd.org>
Sun, 6 Apr 2003 00:54:38 +0000 (00:54 +0000)
committerDavid Elliott <dfe@tgwbd.org>
Sun, 6 Apr 2003 00:54:38 +0000 (00:54 +0000)
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

src/cocoa/app.mm
src/cocoa/dc.cpp [deleted file]
src/cocoa/dc.mm [new file with mode: 0644]
src/cocoa/dcclient.cpp [deleted file]
src/cocoa/dcclient.mm [new file with mode: 0644]
src/cocoa/files.lst

index 97ae62132a7537476f0b1b9b64e68c6adf149127..3574ca20b96a5593045ab19aaafc5333ff11c920 100644 (file)
@@ -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 (file)
index b936c37..0000000
+++ /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 (file)
index 0000000..79c10e0
--- /dev/null
@@ -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 <AppKit/NSBezierPath.h>
+#import <AppKit/NSTextStorage.h>
+#import <AppKit/NSLayoutManager.h>
+#import <AppKit/NSTextContainer.h>
+#import <AppKit/NSGraphicsContext.h>
+#import <AppKit/NSAffineTransform.h>
+#import <AppKit/NSColor.h>
+#import <AppKit/NSTypeSetter.h>
+
+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 (file)
index 054a0d4..0000000
+++ /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 <math.h>
-
-//-----------------------------------------------------------------------------
-// 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 (file)
index 0000000..b5da8bd
--- /dev/null
@@ -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 <AppKit/NSView.h>
+#import <AppKit/NSAffineTransform.h>
+
+/*
+ * 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;
+};
+
index 873d3faa7d850fdd9a32e024632fd1f02f3dcdff..615e80fb78491957f08db4cbea492e7b3b7c021c 100644 (file)
@@ -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 \