From 891d0563f7f43b640c4e0e78c30f038b2127fffb Mon Sep 17 00:00:00 2001 From: David Elliott Date: Sun, 6 Apr 2003 00:54:38 +0000 Subject: [PATCH] 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 --- src/cocoa/app.mm | 3 + src/cocoa/{dc.cpp => dc.mm} | 224 +++++++++++++++++++++++------------- src/cocoa/dcclient.cpp | 84 -------------- src/cocoa/dcclient.mm | 92 +++++++++++++++ src/cocoa/files.lst | 4 +- 5 files changed, 238 insertions(+), 169 deletions(-) rename src/cocoa/{dc.cpp => dc.mm} (50%) delete mode 100644 src/cocoa/dcclient.cpp create mode 100644 src/cocoa/dcclient.mm 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.mm similarity index 50% rename from src/cocoa/dc.cpp rename to src/cocoa/dc.mm index b936c37f99..79c10e0555 100644 --- a/src/cocoa/dc.cpp +++ b/src/cocoa/dc.mm @@ -1,25 +1,153 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: dc.cpp -// Purpose: wxDC class -// Author: AUTHOR +// Name: src/cocoa/dc.mm +// Purpose: wxDC +// Author: David Elliott // Modified by: -// Created: 01/02/97 +// Created: 2003/04/01 // RCS-ID: $Id$ -// Copyright: (c) AUTHOR -// Licence: wxWindows licence +// Copyright: (c) 2003 David Elliott +// Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "dc.h" -#endif - #include "wx/dc.h" -#include "wx/bitmap.h" #include "wx/log.h" -#if !USE_SHARED_LIBRARY +#import +#import +#import +#import +#import +#import +#import +#import + IMPLEMENT_ABSTRACT_CLASS(wxDC, wxObject) -#endif +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 @@ -36,50 +164,6 @@ IMPLEMENT_ABSTRACT_CLASS(wxDC, wxObject) // 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) ) { }; @@ -96,10 +180,6 @@ void wxDC::DoDrawLines( int, wxPoint *, int, int ) { } -void wxDC::DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2) -{ -} - int wxDC::GetDepth() const { return 0; @@ -115,19 +195,6 @@ 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; @@ -184,10 +251,6 @@ void wxDC::DoDrawEllipticArc(wxCoord x, wxCoord y, wxCoord w, wxCoord h, double { } -void wxDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height) -{ -} - void wxDC::DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height) { } @@ -205,10 +268,6 @@ 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) { @@ -345,4 +404,3 @@ int wxDCBase::DeviceToLogicalY(int y) const return y; } -// vim:sts=4:sw=4:et 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 \ -- 2.45.2