📄 graphics.cpp
字号:
m_matrix = CGAffineTransformMake(a,b,c,d,tx,ty);}// gets the component valuess of the matrixvoid wxMacCoreGraphicsMatrixData::Get(wxDouble* a, wxDouble* b, wxDouble* c, wxDouble* d, wxDouble* tx, wxDouble* ty) const{ if (a) *a = m_matrix.a; if (b) *b = m_matrix.b; if (c) *c = m_matrix.c; if (d) *d = m_matrix.d; if (tx) *tx= m_matrix.tx; if (ty) *ty= m_matrix.ty;}// makes this the inverse matrixvoid wxMacCoreGraphicsMatrixData::Invert(){ m_matrix = CGAffineTransformInvert( m_matrix );}// returns true if the elements of the transformation matrix are equal ?bool wxMacCoreGraphicsMatrixData::IsEqual( const wxGraphicsMatrixData* t) const{ const CGAffineTransform* tm = (CGAffineTransform*) t->GetNativeMatrix();#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 if ( CGAffineTransformEqualToTransform!=NULL ) { return CGAffineTransformEqualToTransform(m_matrix, *((CGAffineTransform*) t->GetNativeMatrix())); } else#endif { return ( m_matrix.a == tm->a && m_matrix.b == tm->b && m_matrix.c == tm->c && m_matrix.d == tm->d && m_matrix.tx == tm->tx && m_matrix.ty == tm->ty ) ; }}// return true if this is the identity matrixbool wxMacCoreGraphicsMatrixData::IsIdentity() const{ return ( m_matrix.a == 1 && m_matrix.d == 1 && m_matrix.b == 0 && m_matrix.d == 0 && m_matrix.tx == 0 && m_matrix.ty == 0);}//// transformation//// add the translation to this matrixvoid wxMacCoreGraphicsMatrixData::Translate( wxDouble dx , wxDouble dy ){ m_matrix = CGAffineTransformTranslate( m_matrix, dx, dy);}// add the scale to this matrixvoid wxMacCoreGraphicsMatrixData::Scale( wxDouble xScale , wxDouble yScale ){ m_matrix = CGAffineTransformScale( m_matrix, xScale, yScale);}// add the rotation to this matrix (radians)void wxMacCoreGraphicsMatrixData::Rotate( wxDouble angle ){ m_matrix = CGAffineTransformRotate( m_matrix, angle);}//// apply the transforms//// applies that matrix to the pointvoid wxMacCoreGraphicsMatrixData::TransformPoint( wxDouble *x, wxDouble *y ) const{ CGPoint pt = CGPointApplyAffineTransform( CGPointMake(*x,*y), m_matrix); *x = pt.x; *y = pt.y;}// applies the matrix except for translationsvoid wxMacCoreGraphicsMatrixData::TransformDistance( wxDouble *dx, wxDouble *dy ) const{ CGSize sz = CGSizeApplyAffineTransform( CGSizeMake(*dx,*dy) , m_matrix ); *dx = sz.width; *dy = sz.height;}// returns the native representationvoid * wxMacCoreGraphicsMatrixData::GetNativeMatrix() const{ return (void*) &m_matrix;}//// Graphics Path////-----------------------------------------------------------------------------// wxMacCoreGraphicsPath declaration//-----------------------------------------------------------------------------class WXDLLEXPORT wxMacCoreGraphicsPathData : public wxGraphicsPathData{public : wxMacCoreGraphicsPathData( wxGraphicsRenderer* renderer, CGMutablePathRef path = NULL); ~wxMacCoreGraphicsPathData(); virtual wxGraphicsObjectRefData *Clone() const; // begins a new subpath at (x,y) virtual void MoveToPoint( wxDouble x, wxDouble y ); // adds a straight line from the current point to (x,y) virtual void AddLineToPoint( wxDouble x, wxDouble y ); // adds a cubic Bezier curve from the current point, using two control points and an end point virtual void AddCurveToPoint( wxDouble cx1, wxDouble cy1, wxDouble cx2, wxDouble cy2, wxDouble x, wxDouble y ); // closes the current sub-path virtual void CloseSubpath(); // gets the last point of the current path, (0,0) if not yet set virtual void GetCurrentPoint( wxDouble* x, wxDouble* y) const; // adds an arc of a circle centering at (x,y) with radius (r) from startAngle to endAngle virtual void AddArc( wxDouble x, wxDouble y, wxDouble r, wxDouble startAngle, wxDouble endAngle, bool clockwise ); // // These are convenience functions which - if not available natively will be assembled // using the primitives from above // // adds a quadratic Bezier curve from the current point, using a control point and an end point virtual void AddQuadCurveToPoint( wxDouble cx, wxDouble cy, wxDouble x, wxDouble y ); // appends a rectangle as a new closed subpath virtual void AddRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h ); // appends an ellipsis as a new closed subpath fitting the passed rectangle virtual void AddCircle( wxDouble x, wxDouble y, wxDouble r ); // draws a an arc to two tangents connecting (current) to (x1,y1) and (x1,y1) to (x2,y2), also a straight line from (current) to (x1,y1) virtual void AddArcToPoint( wxDouble x1, wxDouble y1 , wxDouble x2, wxDouble y2, wxDouble r ); // adds another path virtual void AddPath( const wxGraphicsPathData* path ); // returns the native path virtual void * GetNativePath() const { return m_path; } // give the native path returned by GetNativePath() back (there might be some deallocations necessary) virtual void UnGetNativePath(void *p) const {} // transforms each point of this path by the matrix virtual void Transform( const wxGraphicsMatrixData* matrix ); // gets the bounding box enclosing all points (possibly including control points) virtual void GetBox(wxDouble *x, wxDouble *y, wxDouble *w, wxDouble *y) const; virtual bool Contains( wxDouble x, wxDouble y, int fillStyle = wxODDEVEN_RULE) const;private : CGMutablePathRef m_path;};//-----------------------------------------------------------------------------// wxMacCoreGraphicsPath implementation//-----------------------------------------------------------------------------wxMacCoreGraphicsPathData::wxMacCoreGraphicsPathData( wxGraphicsRenderer* renderer, CGMutablePathRef path) : wxGraphicsPathData(renderer){ if ( path ) m_path = path; else m_path = CGPathCreateMutable();}wxMacCoreGraphicsPathData::~wxMacCoreGraphicsPathData(){ CGPathRelease( m_path );}wxGraphicsObjectRefData* wxMacCoreGraphicsPathData::Clone() const{ wxMacCoreGraphicsPathData* clone = new wxMacCoreGraphicsPathData(GetRenderer(),CGPathCreateMutableCopy(m_path)); return clone ;}// opens (starts) a new subpathvoid wxMacCoreGraphicsPathData::MoveToPoint( wxDouble x1 , wxDouble y1 ){ CGPathMoveToPoint( m_path , NULL , x1 , y1 );}void wxMacCoreGraphicsPathData::AddLineToPoint( wxDouble x1 , wxDouble y1 ){ CGPathAddLineToPoint( m_path , NULL , x1 , y1 );}void wxMacCoreGraphicsPathData::AddCurveToPoint( wxDouble cx1, wxDouble cy1, wxDouble cx2, wxDouble cy2, wxDouble x, wxDouble y ){ CGPathAddCurveToPoint( m_path , NULL , cx1 , cy1 , cx2, cy2, x , y );}void wxMacCoreGraphicsPathData::AddQuadCurveToPoint( wxDouble cx1, wxDouble cy1, wxDouble x, wxDouble y ){ CGPathAddQuadCurveToPoint( m_path , NULL , cx1 , cy1 , x , y );}void wxMacCoreGraphicsPathData::AddRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h ){ CGRect cgRect = { { x , y } , { w , h } }; CGPathAddRect( m_path , NULL , cgRect );}void wxMacCoreGraphicsPathData::AddCircle( wxDouble x, wxDouble y , wxDouble r ){ CGPathAddArc( m_path , NULL , x , y , r , 0.0 , 2 * M_PI , true );}// adds an arc of a circle centering at (x,y) with radius (r) from startAngle to endAnglevoid wxMacCoreGraphicsPathData::AddArc( wxDouble x, wxDouble y, wxDouble r, wxDouble startAngle, wxDouble endAngle, bool clockwise ){ // inverse direction as we the 'normal' state is a y axis pointing down, ie mirrored to the standard core graphics setup CGPathAddArc( m_path, NULL , x, y, r, startAngle, endAngle, !clockwise);}void wxMacCoreGraphicsPathData::AddArcToPoint( wxDouble x1, wxDouble y1 , wxDouble x2, wxDouble y2, wxDouble r ){ CGPathAddArcToPoint( m_path, NULL , x1, y1, x2, y2, r);}void wxMacCoreGraphicsPathData::AddPath( const wxGraphicsPathData* path ){ CGPathAddPath( m_path , NULL, (CGPathRef) path->GetNativePath() );}// closes the current subpathvoid wxMacCoreGraphicsPathData::CloseSubpath(){ CGPathCloseSubpath( m_path );}// gets the last point of the current path, (0,0) if not yet setvoid wxMacCoreGraphicsPathData::GetCurrentPoint( wxDouble* x, wxDouble* y) const{ CGPoint p = CGPathGetCurrentPoint( m_path ); *x = p.x; *y = p.y;}// transforms each point of this path by the matrixvoid wxMacCoreGraphicsPathData::Transform( const wxGraphicsMatrixData* matrix ){ CGMutablePathRef p = CGPathCreateMutable() ; CGPathAddPath( p, (CGAffineTransform*) matrix->GetNativeMatrix() , m_path ); CGPathRelease( m_path ); m_path = p;}// gets the bounding box enclosing all points (possibly including control points)void wxMacCoreGraphicsPathData::GetBox(wxDouble *x, wxDouble *y, wxDouble *w, wxDouble *h) const{ CGRect bounds = CGPathGetBoundingBox( m_path ) ; *x = bounds.origin.x; *y = bounds.origin.y; *w = bounds.size.width; *h = bounds.size.height;}bool wxMacCoreGraphicsPathData::Contains( wxDouble x, wxDouble y, int fillStyle) const{#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 if ( CGPathContainsPoint!=NULL ) { return CGPathContainsPoint( m_path, NULL, CGPointMake(x,y), fillStyle == wxODDEVEN_RULE ); } else#endif { // TODO : implementation for 10.3 CGRect bounds = CGPathGetBoundingBox( m_path ) ; return CGRectContainsPoint( bounds, CGPointMake(x,y) ) == 1; }}//// Graphics Context////-----------------------------------------------------------------------------// wxMacCoreGraphicsContext declaration//-----------------------------------------------------------------------------class WXDLLEXPORT wxMacCoreGraphicsContext : public wxGraphicsContext{public: wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer, CGContextRef cgcontext ); wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer, WindowRef window ); wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer, wxWindow* window ); wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer); wxMacCoreGraphicsContext(); ~wxMacCoreGraphicsContext(); void Init(); // push the current state of the context, ie the transformation matrix on a stack virtual void PushState(); // pops a stored state from the stack virtual void PopState(); // clips drawings to the region virtual void Clip( const wxRegion ®ion ); // clips drawings to the rect virtual void Clip( wxDouble x, wxDouble y, wxDouble w, wxDouble h ); // resets the clipping to original extent virtual void ResetClip(); virtual void * GetNativeContext(); bool SetLogicalFunction( int function ); // // transformation // // translate virtual void Translate( wxDouble dx , wxDouble dy ); // scale virtual void Scale( wxDouble xScale , wxDouble yScale ); // rotate (radians) virtual void Rotate( wxDouble angle ); // concatenates this transform with the current transform of this context virtual void ConcatTransform( const wxGraphicsMatrix& matrix ); // sets the transform of this context virtual void SetTransform( const wxGraphicsMatrix& matrix ); // gets the matrix of this context virtual wxGraphicsMatrix GetTransform() const; // // setting the paint // // strokes along a path with the current pen virtual void StrokePath( const wxGraphicsPath &path ); // fills a path with the current brush virtual void FillPath( const wxGraphicsPath &path, int fillStyle = wxODDEVEN_RULE ); // draws a path by first filling and then stroking virtual void DrawPath( const wxGraphicsPath &path, int fillStyle = wxODDEVEN_RULE ); virtual bool ShouldOffset() const { int penwidth = 0 ; if ( !m_pen.IsNull() ) { penwidth = (int)((wxMacCoreGraphicsPenData*)m_pen.GetRefData())->GetWidth(); if ( penwidth == 0 ) penwidth = 1; } return ( penwidth % 2 ) == 1; } // // text // virtual void DrawText( const wxString &str, wxDouble x, wxDouble y ); virtual void DrawText( const wxString &str, wxDouble x, wxDouble y, wxDouble angle ); virtual void GetTextExtent( const wxString &text, wxDouble *width, wxDouble *height, wxDouble *descent, wxDouble *externalLeading ) const; virtual void GetPartialTextExtents(const wxString& text, wxArrayDouble& widths) const; // // image support // virtual void DrawBitmap( const wxBitmap &bmp, wxDouble x, wxDouble y, wxDouble w, wxDouble h ); virtual void DrawIcon( const wxIcon &icon, wxDouble x, wxDouble y, wxDouble w, wxDouble h ); void SetNativeContext( CGContextRef cg ); DECLARE_NO_COPY_CLASS(wxMacCoreGraphicsContext) DECLARE_DYNAMIC_CLASS(wxMacCoreGraphicsContext)private: void EnsureIsValid(); CGContextRef m_cgContext; WindowRef m_windowRef; bool m_releaseContext; CGAffineTransform m_windowTransform;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -