/////////////////////////////////////////////////////////////////////////////
-// Name: src/mac/carbon/dccg.cpp
+// Name: src/osx/carbon/dccg.cpp
// Purpose: wxDC class
// Author: Stefan Csomor
// Modified by:
#endif
#ifdef __WXMAC__
- #include "wx/osx/uma.h"
+ #include "wx/osx/private.h"
#include "wx/osx/dcprint.h"
+ #include "wx/osx/dcclient.h"
+ #include "wx/osx/dcmemory.h"
+#if wxOSX_USE_CARBON
+#include "wx/osx/uma.h"
+#else
+#include "wx/osx/private.h"
+#endif
+
#else
#include "CoreServices/CoreServices.h"
#include "ApplicationServices/ApplicationServices.h"
}
-#define wxMAC_USE_CORE_TEXT 1
+#define wxOSX_USE_CORE_TEXT 1
#endif
const CGRect * inBounds,
CGImageRef inImage)
{
-#if defined( __LP64__ ) || defined(__WXCOCOA__)
- // todo flip
- CGContextDrawImage(inContext, *inBounds, inImage );
- return noErr;
-#else
+#if wxOSX_USE_CARBON
return HIViewDrawCGImage( inContext, inBounds, inImage );
+#else
+ CGContextSaveGState(inContext);
+ CGContextTranslateCTM(inContext, inBounds->origin.x, inBounds->origin.y + inBounds->size.height);
+ CGRect r = *inBounds;
+ r.origin.x = r.origin.y = 0;
+ CGContextScaleCTM(inContext, 1, -1);
+ CGContextDrawImage(inContext, r, inImage );
+ CGContextRestoreGState(inContext);
+ return noErr;
#endif
}
return retval;
}
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 && defined(wxMAC_USE_CORE_TEXT)
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 && wxOSX_USE_CORE_TEXT
CTFontRef wxMacCreateCTFont( const wxFont& font )
{
// Font
//
+#if wxOSX_USE_IPHONE
+
+extern UIFont* CreateUIFont( const wxFont& font );
+extern void DrawTextInContext( CGContextRef context, CGPoint where, UIFont *font, NSString* text );
+extern CGSize MeasureTextInContext( UIFont *font, NSString* text );
+
+#endif
+
class wxMacCoreGraphicsFontData : public wxGraphicsObjectRefData
{
public:
wxMacCoreGraphicsFontData( wxGraphicsRenderer* renderer, const wxFont &font, const wxColour& col );
~wxMacCoreGraphicsFontData();
-#if wxMAC_USE_ATSU_TEXT
+#if wxOSX_USE_ATSU_TEXT
virtual ATSUStyle GetATSUStyle() { return m_macATSUIStyle; }
#endif
-#if wxMAC_USE_CORE_TEXT
+#if wxOSX_USE_CORE_TEXT
CTFontRef GetCTFont() const { return m_ctFont ; }
#endif
wxColour GetColour() const { return m_colour ; }
bool GetUnderlined() const { return m_underlined ; }
+#if wxOSX_USE_IPHONE
+ UIFont* GetUIFont() const { return m_uiFont; }
+#endif
private :
wxColour m_colour;
bool m_underlined;
-#if wxMAC_USE_ATSU_TEXT
+#if wxOSX_USE_ATSU_TEXT
ATSUStyle m_macATSUIStyle;
#endif
-#if wxMAC_USE_CORE_TEXT
+#if wxOSX_USE_CORE_TEXT
wxCFRef< CTFontRef > m_ctFont;
#endif
+#if wxOSX_USE_IPHONE
+ UIFont* m_uiFont;
+#endif
};
wxMacCoreGraphicsFontData::wxMacCoreGraphicsFontData(wxGraphicsRenderer* renderer, const wxFont &font, const wxColour& col) : wxGraphicsObjectRefData( renderer )
m_colour = col;
m_underlined = font.GetUnderlined();
-#if wxMAC_USE_CORE_TEXT
+#if wxOSX_USE_CORE_TEXT
m_ctFont.reset( wxMacCreateCTFont( font ) );
#endif
-#if wxMAC_USE_ATSU_TEXT
+#if wxOSX_USE_IPHONE
+ m_uiFont = CreateUIFont(font);
+ wxMacCocoaRetain( m_uiFont );
+#endif
+#if wxOSX_USE_ATSU_TEXT
OSStatus status = noErr;
m_macATSUIStyle = NULL;
wxASSERT_MSG( status == noErr , wxT("couldn't modify ATSU style") );
#endif
-#if wxMAC_USE_CG_TEXT
-#endif
}
wxMacCoreGraphicsFontData::~wxMacCoreGraphicsFontData()
{
-#if wxMAC_USE_CORE_TEXT
+#if wxOSX_USE_CORE_TEXT
#endif
-#if wxMAC_USE_ATSU_TEXT
+#if wxOSX_USE_ATSU_TEXT
if ( m_macATSUIStyle )
{
::ATSUDisposeStyle((ATSUStyle)m_macATSUIStyle);
m_macATSUIStyle = NULL;
}
#endif
-#if wxMAC_USE_CG_TEXT
+#if wxOSX_USE_IPHONE
+ wxMacCocoaRelease( m_uiFont );
#endif
}
public:
wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer, CGContextRef cgcontext, wxDouble width = 0, wxDouble height = 0 );
+#if wxOSX_USE_CARBON
wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer, WindowRef window );
+#endif
wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer, wxWindow* window );
void SetNativeContext( CGContextRef cg );
- DECLARE_NO_COPY_CLASS(wxMacCoreGraphicsContext)
- DECLARE_DYNAMIC_CLASS(wxMacCoreGraphicsContext)
+ DECLARE_DYNAMIC_CLASS_NO_COPY(wxMacCoreGraphicsContext)
private:
void EnsureIsValid();
CGContextRef m_cgContext;
+#if wxOSX_USE_CARBON
WindowRef m_windowRef;
+#endif
bool m_releaseContext;
CGAffineTransform m_windowTransform;
wxDouble m_width;
wxDouble m_height;
+#if wxOSX_USE_CARBON
wxCFRef<HIShapeRef> m_clipRgn;
+#endif
};
//-----------------------------------------------------------------------------
{
m_cgContext = NULL;
m_releaseContext = false;
+#if wxOSX_USE_CARBON
m_windowRef = NULL;
+#endif
m_width = 0;
m_height = 0;
}
m_height = height;
}
+#if wxOSX_USE_CARBON
wxMacCoreGraphicsContext::wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer, WindowRef window ): wxGraphicsContext(renderer)
{
Init();
m_windowRef = window;
}
+#endif
wxMacCoreGraphicsContext::wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer, wxWindow* window ): wxGraphicsContext(renderer)
{
originX = originY = 0;
Rect bounds = { 0,0,0,0 };
-#if defined( __LP64__ ) || defined(__WXCOCOA__)
+#if defined(__WXCOCOA__) || !wxOSX_USE_CARBON
#else
m_windowRef = (WindowRef) window->MacGetTopLevelWindowRef();
window->MacWindowToRootWindow( &originX , &originY );
{
if ( !m_cgContext )
{
- OSStatus status =
-#if ! ( defined( __LP64__ ) || defined(__WXCOCOA__) )
- QDBeginCGContext( GetWindowPort( m_windowRef ) , &m_cgContext );
+#if defined(__WXCOCOA__) || ! wxOSX_USE_CARBON
+ wxFAIL_MSG("Cannot create wxDCs lazily");
#else
- paramErr;
-#endif
+ OSStatus status = QDBeginCGContext( GetWindowPort( m_windowRef ) , &m_cgContext );
if ( status != noErr )
{
wxFAIL_MSG("Cannot nest wxDCs on the same window");
}
}
CGContextSaveGState( m_cgContext );
+#endif
}
}
bool shouldAntiAlias = true;
CGBlendMode mode = kCGBlendModeNormal;
-#if defined(__WXMAC__) && ( MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 )
+#if defined(__WXMAC__) && ( wxOSX_USE_IPHONE || ( MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 ) )
+#if wxOSX_USE_IPHONE
+ if ( 1 )
+#else
if ( UMAGetSystemVersion() >= 0x1050 )
+#endif
{
retval = true;
switch ( function )
void wxMacCoreGraphicsContext::Clip( const wxRegion ®ion )
{
-#ifdef __WXMAC__
+#if wxOSX_USE_CARBON
if( m_cgContext )
{
wxCFRef<HIShapeRef> shape = wxCFRefFromGet(region.GetWXHRGN());
HIShapeOffset( mutableShape, transformedOrigin.x, transformedOrigin.y );
m_clipRgn.reset(mutableShape);
}
+#else
+ // allow usage as measuring context
+ // wxASSERT_MSG( m_cgContext != NULL, "Needs a valid context for clipping" );
#endif
}
}
else
{
+#if wxOSX_USE_CARBON
// the clipping itself must be stored as device coordinates, otherwise
// we cannot apply it back correctly
r.origin= CGPointApplyAffineTransform( r.origin, m_windowTransform );
m_clipRgn.reset(HIShapeCreateWithRect(&r));
+#else
+ // allow usage as measuring context
+ // wxFAIL_MSG( "Needs a valid context for clipping" );
+#endif
}
}
}
else
{
+#if wxOSX_USE_CARBON
m_clipRgn.reset();
+#else
+ // allow usage as measuring context
+ // wxFAIL_MSG( "Needs a valid context for clipping" );
+#endif
}
}
CGContextRestoreGState( m_cgContext );
if ( m_releaseContext )
{
-#if ! ( defined( __LP64__ ) || defined(__WXCOCOA__) )
+#if wxOSX_USE_CARBON
QDEndCGContext( GetWindowPort( m_windowRef ) , &m_cgContext);
#endif
}
CGContextSaveGState( m_cgContext );
CGContextTranslateCTM( m_cgContext,(CGFloat) x ,(CGFloat) (y + h) );
CGContextScaleCTM( m_cgContext, 1, -1 );
-#ifdef __WXMAC__
+#if wxOSX_USE_CARBON
PlotIconRefInContext( m_cgContext , &r , kAlignNone , kTransformNone ,
NULL , kPlotIconRefNormalFlags , MAC_WXHICON( icon.GetHICON() ) );
#endif
void wxMacCoreGraphicsContext::DrawText( const wxString &str, wxDouble x, wxDouble y )
{
- if ( m_font.IsNull() )
- return;
+ wxCHECK_RET( !m_font.IsNull(), wxT("wxMacCoreGraphicsContext::DrawText - no valid font set") );
EnsureIsValid();
-#if wxMAC_USE_CORE_TEXT
+#if wxOSX_USE_CORE_TEXT
if ( UMAGetSystemVersion() >= 0x1050 )
{
wxMacCoreGraphicsFontData* fref = (wxMacCoreGraphicsFontData*)m_font.GetRefData();
return;
}
#endif
-#if wxMAC_USE_ATSU_TEXT
+#if wxOSX_USE_ATSU_TEXT
{
DrawText(str, x, y, 0.0);
return;
}
#endif
-#if wxMAC_USE_CG_TEXT
- // TODO core graphics text implementation here
+#if wxOSX_USE_IPHONE
+ wxMacCoreGraphicsFontData* fref = (wxMacCoreGraphicsFontData*)m_font.GetRefData();
+
+ CGContextSaveGState(m_cgContext);
+
+ CGColorRef col = wxMacCreateCGColor( fref->GetColour() );
+ CGContextSetTextDrawingMode (m_cgContext, kCGTextFill);
+ CGContextSetFillColorWithColor( m_cgContext, col );
+
+ wxCFStringRef text(str, wxLocale::GetSystemEncoding() );
+ DrawTextInContext( m_cgContext, CGPointMake( x, y ), fref->GetUIFont() , text.AsNSString() );
+
+ CGContextRestoreGState(m_cgContext);
+ CFRelease( col );
#endif
}
void wxMacCoreGraphicsContext::DrawText( const wxString &str, wxDouble x, wxDouble y, wxDouble angle )
{
- if ( m_font.IsNull() )
- return;
+ wxCHECK_RET( !m_font.IsNull(), wxT("wxMacCoreGraphicsContext::DrawText - no valid font set") );
EnsureIsValid();
-#if wxMAC_USE_CORE_TEXT
+#if wxOSX_USE_CORE_TEXT
if ( UMAGetSystemVersion() >= 0x1050 )
{
// default implementation takes care of rotation and calls non rotated DrawText afterwards
return;
}
#endif
-#if wxMAC_USE_ATSU_TEXT
+#if wxOSX_USE_ATSU_TEXT
{
OSStatus status = noErr;
ATSUTextLayout atsuLayout;
return;
}
#endif
-#if wxMAC_USE_CG_TEXT
+#if wxOSX_USE_IPHONE
// default implementation takes care of rotation and calls non rotated DrawText afterwards
wxGraphicsContext::DrawText( str, x, y, angle );
#endif
void wxMacCoreGraphicsContext::GetTextExtent( const wxString &str, wxDouble *width, wxDouble *height,
wxDouble *descent, wxDouble *externalLeading ) const
{
- wxCHECK_RET( !m_font.IsNull(), wxT("wxDC(cg)::DoGetTextExtent - no valid font set") );
+ wxCHECK_RET( !m_font.IsNull(), wxT("wxMacCoreGraphicsContext::GetTextExtent - no valid font set") );
if ( width )
*width = 0;
if (str.empty())
return;
-#if wxMAC_USE_CORE_TEXT
+#if wxOSX_USE_CORE_TEXT
if ( UMAGetSystemVersion() >= 0x1050 )
{
wxMacCoreGraphicsFontData* fref = (wxMacCoreGraphicsFontData*)m_font.GetRefData();
return;
}
#endif
-#if wxMAC_USE_ATSU_TEXT
+#if wxOSX_USE_ATSU_TEXT
{
OSStatus status = noErr;
return;
}
#endif
-#if wxMAC_USE_CG_TEXT
- // TODO core graphics text implementation here
+#if wxOSX_USE_IPHONE
+ wxMacCoreGraphicsFontData* fref = (wxMacCoreGraphicsFontData*)m_font.GetRefData();
+
+ wxCFStringRef text(str, wxLocale::GetSystemEncoding() );
+ CGSize sz = MeasureTextInContext( fref->GetUIFont() , text.AsNSString() );
+
+ if ( height )
+ *height = sz.height;
+ /*
+ if ( descent )
+ *descent = FixedToInt(textDescent);
+ if ( externalLeading )
+ *externalLeading = 0;
+ */
+ if ( width )
+ *width = sz.width;
#endif
}
widths.Empty();
widths.Add(0, text.length());
+ wxCHECK_RET( !m_font.IsNull(), wxT("wxMacCoreGraphicsContext::DrawText - no valid font set") );
+
if (text.empty())
return;
-#if wxMAC_USE_CORE_TEXT
+#if wxOSX_USE_CORE_TEXT
{
wxMacCoreGraphicsFontData* fref = (wxMacCoreGraphicsFontData*)m_font.GetRefData();
CTFontRef font = fref->GetCTFont();
return;
}
#endif
-#if wxMAC_USE_ATSU_TEXT
+#if wxOSX_USE_ATSU_TEXT
{
OSStatus status = noErr;
ATSUTextLayout atsuLayout;
::ATSUDisposeTextLayout(atsuLayout);
}
#endif
-#if wxMAC_USE_CG_TEXT
+#if wxOSX_USE_IPHONE
// TODO core graphics text implementation here
#endif
}
virtual wxGraphicsContext * CreateContext( const wxWindowDC& dc);
virtual wxGraphicsContext * CreateContext( const wxMemoryDC& dc);
+#if wxUSE_PRINTING_ARCHITECTURE
virtual wxGraphicsContext * CreateContext( const wxPrinterDC& dc);
+#endif
virtual wxGraphicsContext * CreateContextFromNativeContext( void * context );
return &gs_MacCoreGraphicsRenderer;
}
-#ifdef __WXCOCOA__
+#if defined( __WXCOCOA__ ) || wxOSX_USE_COCOA
extern CGContextRef wxMacGetContextFromCurrentNSContext() ;
#endif
return NULL;
}
+#if wxUSE_PRINTING_ARCHITECTURE
wxGraphicsContext * wxMacCoreGraphicsRenderer::CreateContext( const wxPrinterDC& dc )
{
#ifdef __WXMAC__
#endif
return NULL;
}
+#endif
wxGraphicsContext * wxMacCoreGraphicsRenderer::CreateContextFromNativeContext( void * context )
{
return new wxMacCoreGraphicsContext(this,(CGContextRef)context);
}
-
wxGraphicsContext * wxMacCoreGraphicsRenderer::CreateContextFromNativeWindow( void * window )
{
+#if wxOSX_USE_CARBON
return new wxMacCoreGraphicsContext(this,(WindowRef)window);
+#else
+ return NULL;
+#endif
}
wxGraphicsContext * wxMacCoreGraphicsRenderer::CreateContext( wxWindow* window )