offsetting fixed, color handling factored out

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_8_BRANCH@49306 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Stefan Csomor
2007-10-21 18:16:07 +00:00
parent 53b6774787
commit 296faa4b72

View File

@@ -479,60 +479,6 @@ void wxMacCoreGraphicsPenData::Apply( wxGraphicsContext* context )
// Brush
//
class wxMacCoreGraphicsBrushData : public wxGraphicsObjectRefData
{
public:
wxMacCoreGraphicsBrushData( wxGraphicsRenderer* renderer );
wxMacCoreGraphicsBrushData( wxGraphicsRenderer* renderer, const wxBrush &brush );
~wxMacCoreGraphicsBrushData ();
virtual void Apply( wxGraphicsContext* context );
void CreateLinearGradientBrush( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2,
const wxColour&c1, const wxColour&c2 );
void CreateRadialGradientBrush( wxDouble xo, wxDouble yo, wxDouble xc, wxDouble yc, wxDouble radius,
const wxColour &oColor, const wxColour &cColor );
virtual bool IsShading() { return m_isShading; }
CGShadingRef GetShading() { return m_shading; }
protected:
CGFunctionRef CreateGradientFunction( const wxColour& c1, const wxColour& c2 );
static void CalculateShadingValues (void *info, const CGFloat *in, CGFloat *out);
virtual void Init();
wxMacCFRefHolder<CGColorRef> m_color;
wxMacCFRefHolder<CGColorSpaceRef> m_colorSpace;
bool m_isPattern;
wxMacCFRefHolder<CGPatternRef> m_pattern;
CGFloat* m_patternColorComponents;
bool m_isShading;
CGFunctionRef m_gradientFunction;
CGShadingRef m_shading;
CGFloat *m_gradientComponents;
};
wxMacCoreGraphicsBrushData::wxMacCoreGraphicsBrushData( wxGraphicsRenderer* renderer) : wxGraphicsObjectRefData( renderer )
{
Init();
}
void wxMacCoreGraphicsBrushData::CreateLinearGradientBrush( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2,
const wxColour&c1, const wxColour&c2 )
{
m_gradientFunction = CreateGradientFunction( c1, c2 );
m_shading = CGShadingCreateAxial( wxMacGetGenericRGBColorSpace(), CGPointMake(x1,y1), CGPointMake(x2,y2), m_gradientFunction, true, true ) ;
m_isShading = true ;
}
void wxMacCoreGraphicsBrushData::CreateRadialGradientBrush( wxDouble xo, wxDouble yo, wxDouble xc, wxDouble yc, wxDouble radius,
const wxColour &oColor, const wxColour &cColor )
{
m_gradientFunction = CreateGradientFunction( oColor, cColor );
m_shading = CGShadingCreateRadial( wxMacGetGenericRGBColorSpace(), CGPointMake(xo,yo), 0, CGPointMake(xc,yc), radius, m_gradientFunction, true, true ) ;
m_isShading = true ;
}
static const char *gs_stripedback_xpm[] = {
/* columns rows colors chars-per-pixel */
"4 4 2 1",
@@ -547,10 +493,40 @@ static const char *gs_stripedback_xpm[] = {
wxBitmap gs_stripedback_bmp( wxImage( (const char* const* ) gs_stripedback_xpm ), -1 ) ;
wxMacCoreGraphicsBrushData::wxMacCoreGraphicsBrushData(wxGraphicsRenderer* renderer, const wxBrush &brush) : wxGraphicsObjectRefData( renderer )
wxMacCoreGraphicsColour::~wxMacCoreGraphicsColour()
{
delete[] m_patternColorComponents;
}
void wxMacCoreGraphicsColour::Init()
{
m_isPattern = false;
m_patternColorComponents = NULL;
}
void wxMacCoreGraphicsColour::Apply( CGContextRef cgContext )
{
if ( m_isPattern )
{
CGAffineTransform matrix = CGContextGetCTM( cgContext );
CGContextSetPatternPhase( cgContext, CGSizeMake(matrix.tx, matrix.ty) );
CGContextSetFillColorSpace( cgContext , m_colorSpace );
CGContextSetFillPattern( cgContext, m_pattern , m_patternColorComponents );
}
else
{
CGContextSetFillColorWithColor( cgContext, m_color );
}
}
wxMacCoreGraphicsColour::wxMacCoreGraphicsColour()
{
Init();
}
wxMacCoreGraphicsColour::wxMacCoreGraphicsColour( const wxBrush &brush )
{
Init();
if ( brush.GetStyle() == wxSOLID )
{
if ( brush.MacGetBrushKind() == kwxMacBrushTheme )
@@ -620,6 +596,62 @@ wxMacCoreGraphicsBrushData::wxMacCoreGraphicsBrushData(wxGraphicsRenderer* rende
}
}
class wxMacCoreGraphicsBrushData : public wxGraphicsObjectRefData
{
public:
wxMacCoreGraphicsBrushData( wxGraphicsRenderer* renderer );
wxMacCoreGraphicsBrushData( wxGraphicsRenderer* renderer, const wxBrush &brush );
~wxMacCoreGraphicsBrushData ();
virtual void Apply( wxGraphicsContext* context );
void CreateLinearGradientBrush( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2,
const wxColour&c1, const wxColour&c2 );
void CreateRadialGradientBrush( wxDouble xo, wxDouble yo, wxDouble xc, wxDouble yc, wxDouble radius,
const wxColour &oColor, const wxColour &cColor );
virtual bool IsShading() { return m_isShading; }
CGShadingRef GetShading() { return m_shading; }
protected:
CGFunctionRef CreateGradientFunction( const wxColour& c1, const wxColour& c2 );
static void CalculateShadingValues (void *info, const CGFloat *in, CGFloat *out);
virtual void Init();
wxMacCoreGraphicsColour m_cgColor;
bool m_isShading;
CGFunctionRef m_gradientFunction;
CGShadingRef m_shading;
CGFloat *m_gradientComponents;
};
wxMacCoreGraphicsBrushData::wxMacCoreGraphicsBrushData( wxGraphicsRenderer* renderer) : wxGraphicsObjectRefData( renderer )
{
Init();
}
void wxMacCoreGraphicsBrushData::CreateLinearGradientBrush( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2,
const wxColour&c1, const wxColour&c2 )
{
m_gradientFunction = CreateGradientFunction( c1, c2 );
m_shading = CGShadingCreateAxial( wxMacGetGenericRGBColorSpace(), CGPointMake(x1,y1), CGPointMake(x2,y2), m_gradientFunction, true, true ) ;
m_isShading = true ;
}
void wxMacCoreGraphicsBrushData::CreateRadialGradientBrush( wxDouble xo, wxDouble yo, wxDouble xc, wxDouble yc, wxDouble radius,
const wxColour &oColor, const wxColour &cColor )
{
m_gradientFunction = CreateGradientFunction( oColor, cColor );
m_shading = CGShadingCreateRadial( wxMacGetGenericRGBColorSpace(), CGPointMake(xo,yo), 0, CGPointMake(xc,yc), radius, m_gradientFunction, true, true ) ;
m_isShading = true ;
}
wxMacCoreGraphicsBrushData::wxMacCoreGraphicsBrushData(wxGraphicsRenderer* renderer, const wxBrush &brush) : wxGraphicsObjectRefData( renderer ),
m_cgColor( brush )
{
Init();
}
wxMacCoreGraphicsBrushData::~wxMacCoreGraphicsBrushData()
{
if ( m_shading )
@@ -629,15 +661,12 @@ wxMacCoreGraphicsBrushData::~wxMacCoreGraphicsBrushData()
CGFunctionRelease(m_gradientFunction);
delete[] m_gradientComponents;
delete[] m_patternColorComponents;
}
void wxMacCoreGraphicsBrushData::Init()
{
m_patternColorComponents = NULL;
m_gradientFunction = NULL;
m_shading = NULL;
m_isPattern = false;
m_gradientComponents = NULL;
m_isShading = false;
}
@@ -652,17 +681,7 @@ void wxMacCoreGraphicsBrushData::Apply( wxGraphicsContext* context )
}
else
{
if ( m_isPattern )
{
CGAffineTransform matrix = CGContextGetCTM( cg );
CGContextSetPatternPhase( cg, CGSizeMake(matrix.tx, matrix.ty) );
CGContextSetFillColorSpace( cg , m_colorSpace );
CGContextSetFillPattern( cg, m_pattern , m_patternColorComponents );
}
else
{
CGContextSetFillColorWithColor( cg, m_color );
}
m_cgColor.Apply( cg );
}
}
@@ -1291,6 +1310,26 @@ private:
IMPLEMENT_DYNAMIC_CLASS(wxMacCoreGraphicsContext, wxGraphicsContext)
class wxQuartzOffsetHelper
{
public :
wxQuartzOffsetHelper( CGContextRef cg , bool offset )
{
m_cg = cg;
m_offset = offset;
if ( m_offset )
CGContextTranslateCTM( m_cg, 0.5, 0.5 );
}
~wxQuartzOffsetHelper( )
{
if ( m_offset )
CGContextTranslateCTM( m_cg, -0.5, -0.5 );
}
public :
CGContextRef m_cg;
bool m_offset;
} ;
void wxMacCoreGraphicsContext::Init()
{
m_cgContext = NULL;
@@ -1480,16 +1519,11 @@ void wxMacCoreGraphicsContext::StrokePath( const wxGraphicsPath &path )
EnsureIsValid();
bool offset = ShouldOffset();
if ( offset )
CGContextTranslateCTM( m_cgContext, 0.5, 0.5 );
wxQuartzOffsetHelper helper( m_cgContext , ShouldOffset() );
((wxMacCoreGraphicsPenData*)m_pen.GetRefData())->Apply(this);
CGContextAddPath( m_cgContext , (CGPathRef) path.GetNativePath() );
CGContextStrokePath( m_cgContext );
if ( offset )
CGContextTranslateCTM( m_cgContext, -0.5, -0.5 );
}
void wxMacCoreGraphicsContext::DrawPath( const wxGraphicsPath &path , int fillStyle )
@@ -1535,16 +1569,10 @@ void wxMacCoreGraphicsContext::DrawPath( const wxGraphicsPath &path , int fillSt
if ( !m_pen.IsNull() )
((wxMacCoreGraphicsPenData*)m_pen.GetRefData())->Apply(this);
bool offset = ShouldOffset();
if ( offset )
CGContextTranslateCTM( m_cgContext, 0.5, 0.5 );
wxQuartzOffsetHelper helper( m_cgContext , ShouldOffset() );
CGContextAddPath( m_cgContext , (CGPathRef) path.GetNativePath() );
CGContextDrawPath( m_cgContext , mode );
if ( offset )
CGContextTranslateCTM( m_cgContext, -0.5, -0.5 );
}
void wxMacCoreGraphicsContext::FillPath( const wxGraphicsPath &path , int fillStyle )
@@ -1823,6 +1851,18 @@ void wxMacCoreGraphicsContext::GetTextExtent( const wxString &str, wxDouble *wid
{
wxCHECK_RET( !m_font.IsNull(), wxT("wxDC(cg)::DoGetTextExtent - no valid font set") );
if ( width )
*width = 0;
if ( height )
*height = 0;
if ( descent )
*descent = 0;
if ( externalLeading )
*externalLeading = 0;
if (str.empty())
return;
OSStatus status = noErr;
ATSUTextLayout atsuLayout;