// Created: 2003/04/01
// RCS-ID: $Id$
// Copyright: (c) 2003 David Elliott
-// Licence: wxWidgets licence
+// Licence: wxWidgets licence
/////////////////////////////////////////////////////////////////////////////
#include "wx/wxprec.h"
+
+#include "wx/dc.h"
+
#ifndef WX_PRECOMP
#include "wx/log.h"
- #include "wx/dc.h"
+ #include "wx/math.h" //math constants
#endif //WX_PRECOMP
#include "wx/cocoa/autorelease.h"
#import <AppKit/NSTypesetter.h>
#import <AppKit/NSImage.h>
-#include <wx/listimpl.cpp>
+#include "wx/listimpl.cpp"
WX_DEFINE_LIST(wxCocoaDCStack);
IMPLEMENT_ABSTRACT_CLASS(wxDC, wxObject)
wxDC::wxDC(void)
{
- m_cocoaFlipped = false;
- m_cocoaHeight = 0.0;
+ m_cocoaWxToBoundsTransform = nil;
m_pen = *wxBLACK_PEN;
}
wxDC::~wxDC(void)
{
+ [m_cocoaWxToBoundsTransform release];
}
bool wxDC::CocoaLockFocus()
return false;
}
-void wxDC::CocoaApplyTransformations()
+/*static*/ WX_NSAffineTransform wxDC::CocoaGetWxToBoundsTransform(bool isFlipped, float height)
{
+ NSAffineTransform *transform = nil;
// This transform flips the graphics since wxDC uses top-left origin
- if(!m_cocoaFlipped)
+ if(!isFlipped)
{
// The transform is auto released
- NSAffineTransform *transform = [NSAffineTransform transform];
+ transform = [NSAffineTransform transform];
/* x' = 1x + 0y + 0
y' = 0x + -1y + window's height
*/
NSAffineTransformStruct matrix = {
1, 0
, 0, -1
- , 0, m_cocoaHeight
+ , 0, height
};
[transform setTransformStruct: matrix];
- // Apply the transform
- [transform concat];
}
- // TODO: Apply scaling transformation
+ return transform;
+}
+
+void wxDC::CocoaApplyTransformations()
+{
+ [m_cocoaWxToBoundsTransform concat];
+ // TODO: Apply device/logical/user position/scaling transformations
+}
+
+void wxDC::CocoaUnapplyTransformations()
+{
+ // NOTE: You *must* call this with focus held.
+ // Undo all transforms so we're back in true Cocoa coords with
+ // no scaling or flipping.
+ NSAffineTransform *invertTransform;
+ invertTransform = [m_cocoaWxToBoundsTransform copy];
+ [invertTransform invert];
+ [invertTransform concat];
+ [invertTransform release];
+}
+
+bool wxDC::CocoaGetBounds(void *rectData)
+{
+ // We don't know what we are so we can't return anything.
+ return false;
}
void wxDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
[bezpath stroke];
}
-void wxDC::DoGetTextExtent(const wxString& text, wxCoord *x, wxCoord *y, wxCoord *descent, wxCoord *externalLeading, wxFont *theFont) const
+void wxDC::DoGetTextExtent(const wxString& text, wxCoord *x, wxCoord *y, wxCoord *descent, wxCoord *externalLeading, const wxFont *theFont) const
{
wxAutoNSAutoreleasePool pool;
// FIXME: Cache this so it can be used for DoDrawText
// 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::DoDrawPoint( int x, int y )
-{
+void wxDC::DoDrawPoint( int x, int y )
+{
};
void wxDC::DoDrawPolygon( int, wxPoint *, int, int, int)
void wxDC::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCoord xc, wxCoord yc)
{
}
-
+
void wxDC::SetPen(const wxPen& pen)
{
m_pen = pen;
fromRect: NSMakeRect(0.0,0.0,bmp.GetWidth(),bmp.GetHeight())
operation: NSCompositeSourceOver
fraction: 1.0];
-
+
[nsimage release];
[context restoreGraphicsState];
}
void wxDC::Clear()
{
+ if(!CocoaTakeFocus()) return;
+
+ NSRect boundsRect;
+ if(!CocoaGetBounds(&boundsRect)) return;
+
+ NSGraphicsContext *context = [NSGraphicsContext currentContext];
+ [context saveGraphicsState];
+
+ // Undo all transforms so when we draw our bounds rect we
+ // really overwrite our bounds rect.
+ CocoaUnapplyTransformations();
+
+ [m_backgroundBrush.GetNSColor() set];
+ [NSBezierPath fillRect:boundsRect];
+
+ [context restoreGraphicsState];
}
void wxDC::SetBackground(const wxBrush& brush)
void wxDC::SetMapMode( int mode )
{
- switch (mode)
+ switch (mode)
{
case wxMM_TWIPS:
break;
m_scaleX = m_logicalScaleX * m_userScaleX;
m_scaleY = m_logicalScaleY * m_userScaleY;
- // CMB: if scale has changed call SetPen to recalulate the line width
+ // 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
SetPen(* pen);
}
};
-