#include "wx/app.h"
#include "wx/mac/uma.h"
#include "wx/dcmemory.h"
+#include "wx/dcprint.h"
#include "wx/region.h"
#include "wx/image.h"
#include "wx/log.h"
#include "math.h"
using namespace std ;
#endif
+
#include "wx/mac/private.h"
#include "ATSUnicode.h"
#include "TextCommon.h"
#define twips2mm 0.0176388888889
#define mm2pt 2.83464566929
#define pt2mm 0.352777777778
-#ifndef __DARWIN__
+#if !defined( __DARWIN__ ) || defined(__MWERKS__)
const double M_PI = 3.14159265358979 ;
#endif
const double RAD2DEG = 180.0 / M_PI;
SetClip( m_newClip ) ;
DisposeRgn( insidergn ) ;
#endif
- RgnHandle insidergn = NewRgn() ;
int x = 0 , y = 0;
win->MacWindowToRootWindow( &x,&y ) ;
CopyRgn( (RgnHandle) ((wxWindow*)win)->MacGetVisibleRegion().GetWXHRGN() , m_newClip ) ;
switch ( logical_func )
{
case wxAND: // src AND dst
- mode = srcOr ; // ok
+ mode = adMin ; // ok
break ;
case wxAND_INVERT: // (NOT src) AND dst
mode = notSrcOr ; // ok
}
if ( mode == kUnsupportedMode )
{
- wxFAIL_MSG("unsupported blitting mode" );
+ wxFAIL_MSG(wxT("unsupported blitting mode" ));
return FALSE ;
}
CGrafPtr sourcePort = (CGrafPtr) source->m_macPort ;
}
if ( str.Length() == 0 )
return ;
+
wxMacPortSetter helper(this) ;
MacInstallFont() ;
- wxString text ;
- if ( wxApp::s_macDefaultEncodingIsPC )
- {
- text = wxMacMakeMacStringFromPC( str ) ;
- }
- else
- {
- text = str ;
- }
+
wxFontRefData * font = (wxFontRefData*) m_font.GetRefData() ;
if ( 0 )
{
m_macAliasWasEnabled = true ;
}
OSStatus status = noErr ;
+ ATSUTextLayout atsuLayout ;
+ UniCharCount chars = str.Length() ;
+#if wxUSE_UNICODE
+ status = ::ATSUCreateTextLayoutWithTextPtr( (UniCharArrayPtr) (const wxChar*) str , 0 , str.Length() , str.Length() , 1 ,
+ &chars , (ATSUStyle*) &m_macATSUIStyle , &atsuLayout ) ;
+#else
TECObjectRef ec;
- status = TECCreateConverter(&ec, kTextEncodingMacRoman, kTextEncodingUnicodeDefault);
- wxASSERT_MSG( status == noErr , "couldn't start converter" ) ;
+ status = TECCreateConverter(&ec,
+ wxApp::s_macDefaultEncodingIsPC ? kTextEncodingWindowsLatin1 : kTextEncodingMacRoman, kTextEncodingUnicodeDefault);
+
+ wxASSERT_MSG( status == noErr , wxT("couldn't start converter") ) ;
ByteCount byteOutLen ;
- ByteCount byteInLen = text.Length() ;
+ ByteCount byteInLen = str.Length() ;
ByteCount byteBufferLen = byteInLen *2 ;
char* buf = new char[byteBufferLen] ;
- status = TECConvertText(ec, (ConstTextPtr)text.c_str() , byteInLen, &byteInLen,
+ status = TECConvertText(ec, (ConstTextPtr)str.c_str() , byteInLen, &byteInLen,
(TextPtr)buf, byteBufferLen, &byteOutLen);
- wxASSERT_MSG( status == noErr , "couldn't convert text" ) ;
+ wxASSERT_MSG( status == noErr , wxT("couldn't convert text") ) ;
status = TECDisposeConverter(ec);
- wxASSERT_MSG( status == noErr , "couldn't dispose converter" ) ;
- ATSUTextLayout atsuLayout ;
- UniCharCount chars = byteOutLen / 2 ;
+ wxASSERT_MSG( status == noErr , wxT("couldn't dispose converter") ) ;
status = ::ATSUCreateTextLayoutWithTextPtr( (UniCharArrayPtr) buf , 0 , byteOutLen / 2 , byteOutLen / 2 , 1 ,
&chars , (ATSUStyle*) &m_macATSUIStyle , &atsuLayout ) ;
- wxASSERT_MSG( status == noErr , "couldn't create the layout of the rotated text" );
+#endif
+ wxASSERT_MSG( status == noErr , wxT("couldn't create the layout of the rotated text") );
int iAngle = int( angle );
int drawX = XLOG2DEVMAC(x) ;
int drawY = YLOG2DEVMAC(y) ;
drawY += cos(angle/RAD2DEG) * FixedToInt(ascent) ;
status = ::ATSUDrawText( atsuLayout, kATSUFromTextBeginning, kATSUToTextEnd,
IntToFixed(drawX) , IntToFixed(drawY) );
- wxASSERT_MSG( status == noErr , "couldn't draw the rotated text" );
+ wxASSERT_MSG( status == noErr , wxT("couldn't draw the rotated text") );
Rect rect ;
status = ::ATSUMeasureTextImage( atsuLayout, kATSUFromTextBeginning, kATSUToTextEnd,
IntToFixed(drawX) , IntToFixed(drawY) , &rect );
- wxASSERT_MSG( status == noErr , "couldn't measure the rotated text" );
+ wxASSERT_MSG( status == noErr , wxT("couldn't measure the rotated text") );
OffsetRect( &rect , -m_macLocalOrigin.x , -m_macLocalOrigin.y ) ;
CalcBoundingBox(XDEV2LOG(rect.left), YDEV2LOG(rect.top) );
CalcBoundingBox(XDEV2LOG(rect.right), YDEV2LOG(rect.bottom) );
::ATSUDisposeTextLayout(atsuLayout);
+#if wxUSE_UNICODE
+#else
delete[] buf ;
+#endif
}
void wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
long yy = YLOG2DEVMAC(y);
#if TARGET_CARBON
bool useDrawThemeText = ( DrawThemeTextBox != (void*) kUnresolvedCFragSymbolAddress ) ;
- if ( m_font.GetNoAntiAliasing() )
+ if ( IsKindOf(CLASSINFO( wxPrinterDC ) ) || m_font.GetNoAntiAliasing() )
useDrawThemeText = false ;
#endif
MacInstallFont() ;
{
::TextMode( srcCopy ) ;
}
- const char *text = NULL ;
- int length = 0 ;
- wxString macText ;
- if ( wxApp::s_macDefaultEncodingIsPC )
- {
- macText = wxMacMakeMacStringFromPC( strtext ) ;
- text = macText ;
- length = macText.Length() ;
- }
- else
- {
- text = strtext ;
- length = strtext.Length() ;
- }
+ int length = strtext.Length() ;
+
int laststop = 0 ;
int i = 0 ;
int line = 0 ;
{
while( i < length )
{
- if( text[i] == 13 || text[i] == 10)
+ if( strtext[i] == 13 || strtext[i] == 10)
{
+ wxString linetext = strtext.Mid( laststop , i - laststop ) ;
#if TARGET_CARBON
if ( useDrawThemeText )
{
Rect frame = { yy + line*(fi.descent + fi.ascent + fi.leading) ,xx , yy + (line+1)*(fi.descent + fi.ascent + fi.leading) , xx + 10000 } ;
- CFStringRef mString = CFStringCreateWithBytes( NULL , (UInt8*) text + laststop , i - laststop , CFStringGetSystemEncoding(), false ) ;
+ wxMacCFStringHolder mString( linetext ) ;
if ( m_backgroundMode != wxTRANSPARENT )
{
Point bounds={0,0} ;
&frame,
teJustLeft,
nil );
- CFRelease( mString ) ;
line++ ;
}
else
#endif
{
- ::DrawText( text , laststop , i - laststop ) ;
+ wxCharBuffer text = wxMacStringToCString(linetext) ;
+ ::DrawText( text , 0 , strlen(text) ) ;
line++ ;
::MoveTo( xx , yy + line*(fi.descent + fi.ascent + fi.leading) );
}
}
i++ ;
}
+ wxString linetext = strtext.Mid( laststop , i - laststop ) ;
#if TARGET_CARBON
if ( useDrawThemeText )
{
Rect frame = { yy + line*(fi.descent + fi.ascent + fi.leading) ,xx , yy + (line+1)*(fi.descent + fi.ascent + fi.leading) , xx + 10000 } ;
- CFStringRef mString = CFStringCreateWithCString( NULL , text + laststop , kCFStringEncodingMacRoman ) ;
+ wxMacCFStringHolder mString( linetext ) ;
+
if ( m_backgroundMode != wxTRANSPARENT )
{
Point bounds={0,0} ;
&frame,
teJustLeft,
nil );
- CFRelease( mString ) ;
}
else
#endif
{
- ::DrawText( text , laststop , i - laststop ) ;
- }
+ wxCharBuffer text = wxMacStringToCString(linetext) ;
+ ::DrawText( text , 0 , strlen(text) ) ;
+ }
}
::TextMode( srcOr ) ;
}
return true ;
}
-void wxDC::DoGetTextExtent( const wxString &string, wxCoord *width, wxCoord *height,
+void wxDC::DoGetTextExtent( const wxString &strtext, wxCoord *width, wxCoord *height,
wxCoord *descent, wxCoord *externalLeading ,
wxFont *theFont ) const
{
::GetFontInfo( &fi ) ;
#if TARGET_CARBON
bool useGetThemeText = ( GetThemeTextDimensions != (void*) kUnresolvedCFragSymbolAddress ) ;
- if ( ((wxFont*)&m_font)->GetNoAntiAliasing() )
+ if ( IsKindOf(CLASSINFO( wxPrinterDC ) ) || ((wxFont*)&m_font)->GetNoAntiAliasing() )
useGetThemeText = false ;
#endif
if ( height )
*descent =YDEV2LOGREL( fi.descent );
if ( externalLeading )
*externalLeading = YDEV2LOGREL( fi.leading ) ;
+ int length = strtext.Length() ;
+ /*
const char *text = NULL ;
- int length = 0 ;
wxString macText ;
if ( wxApp::s_macDefaultEncodingIsPC )
{
text = string ;
length = string.Length() ;
}
+ */
int laststop = 0 ;
int i = 0 ;
int curwidth = 0 ;
*width = 0 ;
while( i < length )
{
- if( text[i] == 13 || text[i] == 10)
+ if( strtext[i] == 13 || strtext[i] == 10)
{
+ wxString linetext = strtext.Mid( laststop , i - laststop ) ;
if ( height )
*height += YDEV2LOGREL( fi.descent + fi.ascent + fi.leading ) ;
#if TARGET_CARBON
{
Point bounds={0,0} ;
SInt16 baseline ;
- CFStringRef mString = CFStringCreateWithBytes( NULL , (UInt8*) text + laststop , i - laststop , CFStringGetSystemEncoding(), false ) ;
+ wxMacCFStringHolder mString( linetext ) ;
::GetThemeTextDimensions( mString,
kThemeCurrentPortFont,
kThemeStateActive,
false,
&bounds,
&baseline );
- CFRelease( mString ) ;
curwidth = bounds.h ;
}
else
#endif
{
- curwidth = ::TextWidth( text , laststop , i - laststop ) ;
+ wxCharBuffer text = wxMacStringToCString(linetext) ;
+ curwidth = ::TextWidth( text , 0 , strlen(text) ) ;
}
if ( curwidth > *width )
*width = XDEV2LOGREL( curwidth ) ;
i++ ;
}
+ wxString linetext = strtext.Mid( laststop , i - laststop ) ;
#if TARGET_CARBON
if ( useGetThemeText )
{
Point bounds={0,0} ;
SInt16 baseline ;
- CFStringRef mString = CFStringCreateWithBytes( NULL , (UInt8*) text + laststop , i - laststop , CFStringGetSystemEncoding(), false ) ;
+ wxMacCFStringHolder mString( linetext ) ;
::GetThemeTextDimensions( mString,
kThemeCurrentPortFont,
kThemeStateActive,
false,
&bounds,
&baseline );
- CFRelease( mString ) ;
curwidth = bounds.h ;
}
else
#endif
{
- curwidth = ::TextWidth( text , laststop , i - laststop ) ;
+ wxCharBuffer text = wxMacStringToCString(linetext) ;
+ curwidth = ::TextWidth( text , 0 , strlen(text) ) ;
}
if ( curwidth > *width )
*width = XDEV2LOGREL( curwidth ) ;
case wxSRC_INVERT: // (NOT src)
mode = notPatCopy ;
break ;
+ case wxAND: // src AND dst
+ mode = adMin ;
+ break ;
// unsupported TODO
case wxCLEAR: // 0
case wxAND_REVERSE:// src AND (NOT dst)
- case wxAND: // src AND dst
case wxAND_INVERT: // (NOT src) AND dst
case wxNO_OP: // dst
case wxNOR: // (NOT src) AND (NOT dst)
Style qdStyle = font->m_macFontStyle ;
ATSUFontID atsuFont = font->m_macATSUFontID ;
status = ::ATSUCreateStyle(&(ATSUStyle)m_macATSUIStyle) ;
- wxASSERT_MSG( status == noErr , "couldn't create ATSU style" ) ;
+ wxASSERT_MSG( status == noErr , wxT("couldn't create ATSU style") ) ;
ATSUAttributeTag atsuTags[] =
{
kATSUFontTag ,
} ;
status = ::ATSUSetAttributes((ATSUStyle)m_macATSUIStyle, sizeof(atsuTags)/sizeof(ATSUAttributeTag),
atsuTags, atsuSizes, atsuValues);
- wxASSERT_MSG( status == noErr , "couldn't set create ATSU style" ) ;
+ wxASSERT_MSG( status == noErr , wxT("couldn't set create ATSU style") ) ;
}
Pattern gHatchPatterns[] =
case wxSRC_INVERT: // (NOT src)
mode = notPatCopy ;
break ;
+ case wxAND: // src AND dst
+ mode = adMin ;
+ break ;
// unsupported TODO
case wxCLEAR: // 0
case wxAND_REVERSE:// src AND (NOT dst)
- case wxAND: // src AND dst
case wxAND_INVERT: // (NOT src) AND dst
case wxNO_OP: // dst
case wxNOR: // (NOT src) AND (NOT dst)
case wxSRC_INVERT: // (NOT src)
mode = notPatCopy ;
break ;
+ case wxAND: // src AND dst
+ mode = adMin ;
+ break ;
// unsupported TODO
case wxCLEAR: // 0
case wxAND_REVERSE:// src AND (NOT dst)
- case wxAND: // src AND dst
case wxAND_INVERT: // (NOT src) AND dst
case wxNO_OP: // dst
case wxNOR: // (NOT src) AND (NOT dst)
wxCoord wxDCBase::LogicalToDeviceYRel(wxCoord y) const
{
return ((wxDC *)this)->YLOG2DEVREL(y);
-}
\ No newline at end of file
+}