📄 dccg.cpp
字号:
CGContextRestoreGState( cgContext ); CGContextSaveGState( cgContext ); m_graphicContext->SetPen( m_pen ) ; m_graphicContext->SetBrush( m_brush ) ; m_clipping = false;}void wxDC::DoGetSizeMM( int* width, int* height ) const{ int w = 0, h = 0; GetSize( &w, &h ); if (width) *width = long( double(w) / (m_scaleX * m_mm_to_pix_x) ); if (height) *height = long( double(h) / (m_scaleY * m_mm_to_pix_y) );}void wxDC::SetTextForeground( const wxColour &col ){ wxCHECK_RET( Ok(), wxT("wxDC(cg)::SetTextForeground - invalid DC") ); if ( col != m_textForegroundColour ) { m_textForegroundColour = col; m_graphicContext->SetTextColor( col ); // in the current implementation the font contains the text color m_graphicContext->SetFont(m_font); }}void wxDC::SetTextBackground( const wxColour &col ){ wxCHECK_RET( Ok(), wxT("wxDC(cg)::SetTextBackground - invalid DC") ); m_textBackgroundColour = col;}void wxDC::SetMapMode( int mode ){ switch (mode) { case wxMM_TWIPS: SetLogicalScale( twips2mm * m_mm_to_pix_x, twips2mm * m_mm_to_pix_y ); break; case wxMM_POINTS: SetLogicalScale( pt2mm * m_mm_to_pix_x, pt2mm * m_mm_to_pix_y ); break; case wxMM_METRIC: SetLogicalScale( m_mm_to_pix_x, m_mm_to_pix_y ); break; case wxMM_LOMETRIC: SetLogicalScale( m_mm_to_pix_x / 10.0, m_mm_to_pix_y / 10.0 ); break; case wxMM_TEXT: default: SetLogicalScale( 1.0, 1.0 ); break; } if (mode != wxMM_TEXT) { m_needComputeScaleX = m_needComputeScaleY = true; }}void wxDC::SetUserScale( double x, double y ){ // allow negative ? -> no m_userScaleX = x; m_userScaleY = y; ComputeScaleAndOrigin();}void wxDC::SetLogicalScale( double x, double y ){ // allow negative ? m_logicalScaleX = x; m_logicalScaleY = y; ComputeScaleAndOrigin();}void wxDC::SetLogicalOrigin( wxCoord x, wxCoord y ){ m_logicalOriginX = x * m_signX; // is this still correct ? m_logicalOriginY = y * m_signY; ComputeScaleAndOrigin();}void wxDC::SetDeviceOrigin( wxCoord x, wxCoord y ){ m_externalDeviceOriginX = x; m_externalDeviceOriginY = y; ComputeScaleAndOrigin();}void wxDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp ){ m_signX = (xLeftRight ? 1 : -1); m_signY = (yBottomUp ? -1 : 1); ComputeScaleAndOrigin();}wxSize wxDC::GetPPI() const{ return wxSize(72, 72);}int wxDC::GetDepth() const{ return 32;}void wxDC::ComputeScaleAndOrigin(){ // CMB: copy scale to see if it changes double origScaleX = m_scaleX; double origScaleY = m_scaleY; m_scaleX = m_logicalScaleX * m_userScaleX; m_scaleY = m_logicalScaleY * m_userScaleY; m_deviceOriginX = m_externalDeviceOriginX; m_deviceOriginY = m_externalDeviceOriginY; // CMB: if scale has changed call SetPen to recalulate the line width if (m_scaleX != origScaleX || m_scaleY != origScaleY) { // this is a bit artificial, but we need to force wxDC to think // the pen has changed wxPen pen( GetPen() ); m_pen = wxNullPen; SetPen( pen ); }}void wxDC::SetPalette( const wxPalette& palette ){}void wxDC::SetBackgroundMode( int mode ){ m_backgroundMode = mode ;}void wxDC::SetFont( const wxFont &font ){ m_font = font; if ( m_graphicContext ) m_graphicContext->SetFont( font ) ;}void wxDC::SetPen( const wxPen &pen ){ if ( m_pen == pen ) return ; m_pen = pen; if ( m_graphicContext ) { if ( m_pen.GetStyle() == wxSOLID || m_pen.GetStyle() == wxTRANSPARENT ) { m_graphicContext->SetPen( m_pen ) ; } else { // we have to compensate for moved device origins etc. otherwise patterned pens are standing still // eg when using a wxScrollWindow and scrolling around int origX = XLOG2DEVMAC( 0 ) ; int origY = YLOG2DEVMAC( 0 ) ; m_graphicContext->Translate( origX , origY ) ; m_graphicContext->SetPen( m_pen ) ; m_graphicContext->Translate( -origX , -origY ) ; } }}void wxDC::SetBrush( const wxBrush &brush ){ if (m_brush == brush) return; m_brush = brush; if ( m_graphicContext ) { if ( brush.GetStyle() == wxSOLID || brush.GetStyle() == wxTRANSPARENT ) { m_graphicContext->SetBrush( m_brush ) ; } else { // we have to compensate for moved device origins etc. otherwise patterned brushes are standing still // eg when using a wxScrollWindow and scrolling around int origX = XLOG2DEVMAC(0) ; int origY = YLOG2DEVMAC(0) ; m_graphicContext->Translate( origX , origY ) ; m_graphicContext->SetBrush( m_brush ) ; m_graphicContext->Translate( -origX , -origY ) ; } }}void wxDC::SetBackground( const wxBrush &brush ){ if (m_backgroundBrush == brush) return; m_backgroundBrush = brush; if (!m_backgroundBrush.Ok()) return;}void wxDC::SetLogicalFunction( int function ){ if (m_logicalFunction == function) return; m_logicalFunction = function ;#if wxMAC_USE_CORE_GRAPHICS_BLEND_MODES CGContextRef cgContext = ((wxMacCGContext*)(m_graphicContext))->GetNativeContext() ; if ( m_logicalFunction == wxCOPY ) CGContextSetBlendMode( cgContext, kCGBlendModeNormal ) ; else if ( m_logicalFunction == wxINVERT ) CGContextSetBlendMode( cgContext, kCGBlendModeExclusion ) ; else CGContextSetBlendMode( cgContext, kCGBlendModeNormal ) ;#endif}extern bool wxDoFloodFill(wxDC *dc, wxCoord x, wxCoord y, const wxColour & col, int style);bool wxDC::DoFloodFill(wxCoord x, wxCoord y, const wxColour& col, int style){ return wxDoFloodFill(this, x, y, col, style);}bool wxDC::DoGetPixel( wxCoord x, wxCoord y, wxColour *col ) const{ wxCHECK_MSG( Ok(), false, wxT("wxDC(cg)::DoGetPixel - invalid DC") ); RGBColor colour;#ifndef __LP64__ wxMacPortSaver helper((CGrafPtr)m_macPort) ; // NB: GetCPixel is a deprecated QD call, and a slow one at that GetCPixel( XLOG2DEVMAC(x) + m_macLocalOriginInPort.x - m_macLocalOrigin.x, YLOG2DEVMAC(y) + m_macLocalOriginInPort.y - m_macLocalOrigin.y, &colour );#endif // convert from Mac colour to wx col->Set( colour.red >> 8, colour.green >> 8, colour.blue >> 8 ); return true ;}void wxDC::DoDrawLine( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2 ){ wxCHECK_RET( Ok(), wxT("wxDC(cg)::DoDrawLine - invalid DC") );#if !wxMAC_USE_CORE_GRAPHICS_BLEND_MODES if ( m_logicalFunction != wxCOPY ) return ;#endif wxCoord xx1 = XLOG2DEVMAC(x1) ; wxCoord yy1 = YLOG2DEVMAC(y1) ; wxCoord xx2 = XLOG2DEVMAC(x2) ; wxCoord yy2 = YLOG2DEVMAC(y2) ; wxGraphicPath* path = m_graphicContext->CreatePath() ; path->MoveToPoint( xx1, yy1 ) ; path->AddLineToPoint( xx2 , yy2 ) ; path->CloseSubpath() ; m_graphicContext->StrokePath( path ) ; delete path ; CalcBoundingBox(x1, y1); CalcBoundingBox(x2, y2);}void wxDC::DoCrossHair( wxCoord x, wxCoord y ){ wxCHECK_RET( Ok(), wxT("wxDC(cg)::DoCrossHair - invalid DC") ); if ( m_logicalFunction != wxCOPY ) return ; int w = 0, h = 0; GetSize( &w, &h ); wxCoord xx = XLOG2DEVMAC(x); wxCoord yy = YLOG2DEVMAC(y); wxGraphicPath* path = m_graphicContext->CreatePath() ; path->MoveToPoint( XLOG2DEVMAC(0), yy ) ; path->AddLineToPoint( XLOG2DEVMAC(w), yy ) ; path->CloseSubpath() ; path->MoveToPoint( xx, YLOG2DEVMAC(0) ) ; path->AddLineToPoint( xx, YLOG2DEVMAC(h) ) ; path->CloseSubpath() ; m_graphicContext->StrokePath( path ) ; delete path ; CalcBoundingBox(x, y); CalcBoundingBox(x + w, y + h);}void wxDC::DoDrawArc( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCoord xc, wxCoord yc ){ wxCHECK_RET( Ok(), wxT("wxDC(cg)::DoDrawArc - invalid DC") ); if ( m_logicalFunction != wxCOPY ) return ; wxCoord xx1 = XLOG2DEVMAC(x1); wxCoord yy1 = YLOG2DEVMAC(y1); wxCoord xx2 = XLOG2DEVMAC(x2); wxCoord yy2 = YLOG2DEVMAC(y2); wxCoord xxc = XLOG2DEVMAC(xc); wxCoord yyc = YLOG2DEVMAC(yc); double dx = xx1 - xxc; double dy = yy1 - yyc; double radius = sqrt((double)(dx * dx + dy * dy)); wxCoord rad = (wxCoord)radius; double sa, ea; if (xx1 == xx2 && yy1 == yy2) { sa = 0.0; ea = 360.0; } else if (radius == 0.0) { sa = ea = 0.0; } else { sa = (xx1 - xxc == 0) ? (yy1 - yyc < 0) ? 90.0 : -90.0 : -atan2(double(yy1 - yyc), double(xx1 - xxc)) * RAD2DEG; ea = (xx2 - xxc == 0) ? (yy2 - yyc < 0) ? 90.0 : -90.0 : -atan2(double(yy2 - yyc), double(xx2 - xxc)) * RAD2DEG; } bool fill = m_brush.GetStyle() != wxTRANSPARENT ; wxGraphicPath* path = m_graphicContext->CreatePath() ; m_graphicContext->PushState() ; m_graphicContext->Translate( xxc, yyc ) ; m_graphicContext->Scale( 1, -1 ) ; if ( fill ) path->MoveToPoint( 0, 0 ) ; path->AddArc( 0, 0, rad , DegToRad(sa) , DegToRad(ea), false ) ; if ( fill ) path->AddLineToPoint( 0, 0 ) ; m_graphicContext->DrawPath( path ) ; m_graphicContext->PopState() ; delete path ;}void wxDC::DoDrawEllipticArc( wxCoord x, wxCoord y, wxCoord w, wxCoord h, double sa, double ea ){ wxCHECK_RET( Ok(), wxT("wxDC(cg)::DoDrawEllipticArc - invalid DC") ); if ( m_logicalFunction != wxCOPY ) return ; wxCoord xx = XLOG2DEVMAC(x); wxCoord yy = YLOG2DEVMAC(y); wxCoord ww = m_signX * XLOG2DEVREL(w); wxCoord hh = m_signY * YLOG2DEVREL(h); // handle -ve width and/or height if (ww < 0) { ww = -ww; xx = xx - ww; } if (hh < 0) { hh = -hh; yy = yy - hh; } bool fill = m_brush.GetStyle() != wxTRANSPARENT ; wxGraphicPath* path = m_graphicContext->CreatePath() ; m_graphicContext->PushState() ; m_graphicContext->Translate( xx + ww / 2, yy + hh / 2 ) ; m_graphicContext->Scale( 1 * ww / 2 , -1 * hh / 2 ) ; if ( fill ) path->MoveToPoint( 0, 0 ) ; path->AddArc( 0, 0, 1 , DegToRad(sa) , DegToRad(ea), false ) ; if ( fill ) path->AddLineToPoint( 0, 0 ) ; m_graphicContext->DrawPath( path ) ; m_graphicContext->PopState() ; delete path ;}void wxDC::DoDrawPoint( wxCoord x, wxCoord y ){ wxCHECK_RET( Ok(), wxT("wxDC(cg)::DoDrawPoint - invalid DC") ); DoDrawLine( x , y , x + 1 , y + 1 ) ;}void wxDC::DoDrawLines(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset){ wxCHECK_RET( Ok(), wxT("wxDC(cg)::DoDrawLines - invalid DC") );#if !wxMAC_USE_CORE_GRAPHICS_BLEND_MODES if ( m_logicalFunction != wxCOPY ) return ;#endif wxCoord x1, x2 , y1 , y2 ; x1 = XLOG2DEVMAC(points[0].x + xoffset); y1 = YLOG2DEVMAC(points[0].y + yoffset); wxGraphicPath* path = m_graphicContext->CreatePath() ; path->MoveToPoint( x1 , y1 ) ; for (int i = 1; i < n; i++) { x2 = XLOG2DEVMAC(points[i].x + xoffset); y2 = YLOG2DEVMAC(points[i].y + yoffset); path->AddLineToPoint( x2 , y2 ) ; } m_graphicContext->StrokePath( path ) ; delete path ;}#if wxUSE_SPLINES
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -