X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1fd17880910977bc7fcea3ce14bea0db0b2416e6..e08efb8dd9d9af576baec04aa77a7ea4bd31de3b:/src/cocoa/dc.mm?ds=inline diff --git a/src/cocoa/dc.mm b/src/cocoa/dc.mm index 7f19fe7709..cf80a9700e 100644 --- a/src/cocoa/dc.mm +++ b/src/cocoa/dc.mm @@ -24,11 +24,46 @@ #import #import +#include +WX_DEFINE_LIST(wxCocoaDCStack); + 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; +wxCocoaDCStack wxDC::sm_cocoaDCStack; + +inline void CocoaSetPenForNSBezierPath(wxPen &pen, NSBezierPath *bezpath) +{ + [pen.GetNSColor() set]; + const float *pattern; + [bezpath setLineDash:pattern count:pen.GetCocoaLineDash(&pattern) phase:0.0]; + [bezpath setLineWidth:pen.GetWidth()]; + switch(pen.GetJoin()) + { + case wxJOIN_BEVEL: + [bezpath setLineJoinStyle:NSBevelLineJoinStyle]; + break; + case wxJOIN_ROUND: + [bezpath setLineJoinStyle:NSRoundLineJoinStyle]; + break; + case wxJOIN_MITER: + [bezpath setLineJoinStyle:NSMiterLineJoinStyle]; + break; + } + switch(pen.GetCap()) + { + case wxCAP_ROUND: + [bezpath setLineCapStyle:NSRoundLineCapStyle]; + break; + case wxCAP_PROJECTING: + [bezpath setLineCapStyle:NSSquareLineCapStyle]; + break; + case wxCAP_BUTT: + [bezpath setLineCapStyle:NSButtLineCapStyle]; + break; + } +} void wxDC::CocoaInitializeTextSystem() { @@ -57,18 +92,96 @@ void wxDC::CocoaShutdownTextSystem() [sm_cocoaNSTextStorage release]; sm_cocoaNSTextStorage = nil; } +void wxDC::CocoaUnwindStackAndLoseFocus() +{ + wxCocoaDCStack::Node *ourNode=sm_cocoaDCStack.Find(this); + if(ourNode) + { + wxCocoaDCStack::Node *node=sm_cocoaDCStack.GetFirst(); + for(;node!=ourNode; node=sm_cocoaDCStack.GetFirst()) + { + wxDC *dc = node->GetData(); + wxASSERT(dc); + wxASSERT(dc!=this); + if(!dc->CocoaUnlockFocus()) + { + wxFAIL_MSG("Unable to unlock focus on higher-level DC!"); + } + sm_cocoaDCStack.DeleteNode(node); + } + wxASSERT(node==ourNode); + wxASSERT(ourNode->GetData() == this); + ourNode->GetData()->CocoaUnlockFocus(); + sm_cocoaDCStack.DeleteNode(ourNode); + } +} + +bool wxDC::CocoaUnwindStackAndTakeFocus() +{ + wxCocoaDCStack::Node *node=sm_cocoaDCStack.GetFirst(); + for(;node;node = sm_cocoaDCStack.GetFirst()) + { + wxDC *dc = node->GetData(); + wxASSERT(dc); + // If we're on the stack, then it's unwound enough and we have focus + if(dc==this) + return true; + // If unable to unlockFocus (e.g. wxPaintDC) stop here + if(!dc->CocoaUnlockFocus()) + break; + sm_cocoaDCStack.DeleteNode(node); + } + return CocoaLockFocus(); +} + wxDC::wxDC(void) { + m_cocoaFlipped = false; + m_cocoaHeight = 0.0; + m_pen = *wxBLACK_PEN; } wxDC::~wxDC(void) { } +bool wxDC::CocoaLockFocus() +{ + return false; +} + +bool wxDC::CocoaUnlockFocus() +{ + return false; +} + +void wxDC::CocoaApplyTransformations() +{ + // This transform flips the graphics since wxDC uses top-left origin + if(!m_cocoaFlipped) + { + // 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, m_cocoaHeight + }; + [transform setTransformStruct: matrix]; + // Apply the transform + [transform concat]; + } + // TODO: Apply scaling transformation +} + void wxDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height) { + if(!CocoaTakeFocus()) return; NSBezierPath *bezpath = [NSBezierPath bezierPathWithRect:NSMakeRect(x,y,width,height)]; - [m_textForegroundColour.GetNSColor() set]; + CocoaSetPenForNSBezierPath(m_pen,bezpath); [bezpath stroke]; [m_brush.GetNSColor() set]; [bezpath fill]; @@ -76,11 +189,12 @@ void wxDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height) void wxDC::DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2) { + if(!CocoaTakeFocus()) return; NSBezierPath *bezpath = [NSBezierPath bezierPath]; [bezpath moveToPoint:NSMakePoint(x1,y1)]; [bezpath lineToPoint:NSMakePoint(x2,y2)]; - [m_textForegroundColour.GetNSColor() set]; + CocoaSetPenForNSBezierPath(m_pen,bezpath); [bezpath stroke]; } @@ -108,6 +222,7 @@ void wxDC::DoGetTextExtent(const wxString& text, wxCoord *x, wxCoord *y, wxCoord void wxDC::DoDrawText(const wxString& text, wxCoord x, wxCoord y) { + if(!CocoaTakeFocus()) return; 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()]]; @@ -186,6 +301,16 @@ int wxDCBase::DeviceToLogicalY(int y) const return y; } +int wxDCBase::DeviceToLogicalXRel(int x) const +{ + return x; +} + +int wxDCBase::DeviceToLogicalYRel(int y) const +{ + return y; +} + int wxDCBase::LogicalToDeviceX(int x) const { return x; @@ -196,6 +321,16 @@ int wxDCBase::LogicalToDeviceY(int y) const return y; } +int wxDCBase::LogicalToDeviceXRel(int x) const +{ + return x; +} + +int wxDCBase::LogicalToDeviceYRel(int y) const +{ + return y; +} + /////////////////////////////////////////////////////////////////////////// // cut here, the rest is stubs /////////////////////////////////////////////////////////////////////////// @@ -272,6 +407,7 @@ void wxDC::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCoord xc, void wxDC::SetPen(const wxPen& pen) { + m_pen = pen; } void wxDC::SetBrush(const wxBrush& brush) @@ -309,6 +445,7 @@ void wxDC::DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height) void wxDC::DoDrawBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y, bool useMask) { + if(!CocoaTakeFocus()) return; if(!bmp.Ok()) return; @@ -364,6 +501,16 @@ 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) +{ + if(!CocoaTakeFocus()) return false; + if(!source) return false; + return source->CocoaDoBlitOnFocusedDC(xdest,ydest,width,height, + xsrc, ysrc, rop, useMask, xsrcMask, ysrcMask); +} + +bool wxDC::CocoaDoBlitOnFocusedDC(wxCoord xdest, wxCoord ydest, + wxCoord width, wxCoord height, wxCoord xsrc, wxCoord ysrc, + int logicalFunc, bool useMask, wxCoord xsrcMask, wxCoord ysrcMask) { return false; }