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:
@@ -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");
|
||||
|
@@ -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
|
@@ -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
92
src/cocoa/dcclient.mm
Normal 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;
|
||||
};
|
||||
|
@@ -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 \
|
||||
|
Reference in New Issue
Block a user