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
This commit is contained in:
David Elliott
2003-04-06 00:54:38 +00:00
parent ec4e4a1415
commit 891d0563f7
5 changed files with 238 additions and 169 deletions

View 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");

View File

@@ -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 <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)
#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

View File

@@ -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)
{
};

92
src/cocoa/dcclient.mm Normal file
View File

@@ -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;
};

View 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 \