📄 dc.cpp
字号:
::MoveTo( xx, YLOG2DEVMAC(0) ); ::LineTo( xx, YLOG2DEVMAC(h) ); CalcBoundingBox(x, y); CalcBoundingBox(x+w, y+h); }}/** To draw arcs properly the angles need to be converted from the WX style:* Angles start on the +ve X axis and go anti-clockwise (As you would draw on* a normal axis on paper).* TO* the Mac style:* Angles start on the +ve y axis and go clockwise.*/static double wxConvertWXangleToMACangle(double angle){ double newAngle = 90 - angle ; if ( newAngle < 0 ) newAngle += 360 ; return newAngle ;}void wxDC::DoDrawArc( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCoord xc, wxCoord yc ){ wxCHECK_RET(Ok(), wxT("wxDC::DoDrawArc Invalid DC")); wxMacFastPortSetter helper(this) ; 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 radius1, radius2; if (xx1 == xx2 && yy1 == yy2) { radius1 = 0.0; radius2 = 360.0; } else if (radius == 0.0) { radius1 = radius2 = 0.0; } else { radius1 = (xx1 - xxc == 0) ? (yy1 - yyc < 0) ? 90.0 : -90.0 : -atan2(double(yy1-yyc), double(xx1-xxc)) * RAD2DEG; radius2 = (xx2 - xxc == 0) ? (yy2 - yyc < 0) ? 90.0 : -90.0 : -atan2(double(yy2-yyc), double(xx2-xxc)) * RAD2DEG; } wxCoord alpha2 = wxCoord(radius2 - radius1); wxCoord alpha1 = wxCoord(wxConvertWXangleToMACangle(radius1)); if( (xx1 > xx2) || (yy1 > yy2) ) { alpha2 *= -1; } Rect r = { yyc - rad, xxc - rad, yyc + rad, xxc + rad }; if(m_brush.GetStyle() != wxTRANSPARENT) { MacInstallBrush(); PaintArc(&r, alpha1, alpha2); } if(m_pen.GetStyle() != wxTRANSPARENT) { MacInstallPen(); FrameArc(&r, alpha1, alpha2); }}void wxDC::DoDrawEllipticArc( wxCoord x, wxCoord y, wxCoord w, wxCoord h, double sa, double ea ){ wxCHECK_RET(Ok(), wxT("wxDC::DoDrawEllepticArc Invalid DC")); wxMacFastPortSetter helper(this) ; Rect r; double angle = sa - ea; // Order important Mac in opposite direction to wx // we have to make sure that the filling is always counter-clockwise if ( angle > 0 ) angle -= 360 ; 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; } sa = wxConvertWXangleToMACangle(sa); r.top = yy; r.left = xx; r.bottom = yy + hh; r.right = xx + ww; if(m_brush.GetStyle() != wxTRANSPARENT) { MacInstallBrush(); PaintArc(&r, (short)sa, (short)angle); } if(m_pen.GetStyle() != wxTRANSPARENT) { MacInstallPen(); FrameArc(&r, (short)sa, (short)angle); }}void wxDC::DoDrawPoint( wxCoord x, wxCoord y ){ wxCHECK_RET(Ok(), wxT("Invalid DC")); wxMacFastPortSetter helper(this) ; if (m_pen.GetStyle() != wxTRANSPARENT) { wxCoord xx1 = XLOG2DEVMAC(x); wxCoord yy1 = YLOG2DEVMAC(y); RGBColor pencolor = MAC_WXCOLORREF( m_pen.GetColour().GetPixel()); ::SetCPixel( xx1,yy1,&pencolor) ; CalcBoundingBox(x, y); }}void wxDC::DoDrawLines(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset){ wxCHECK_RET(Ok(), wxT("Invalid DC")); wxMacFastPortSetter helper(this) ; if (m_pen.GetStyle() == wxTRANSPARENT) return; MacInstallPen() ; wxCoord offset = ( (m_pen.GetWidth() == 0 ? 1 : m_pen.GetWidth() ) * (wxCoord)m_scaleX - 1) / 2 ; wxCoord x1, x2 , y1 , y2 ; x1 = XLOG2DEVMAC(points[0].x + xoffset); y1 = YLOG2DEVMAC(points[0].y + yoffset); ::MoveTo(x1 - offset, y1 - offset ); for (int i = 0; i < n-1; i++) { x2 = XLOG2DEVMAC(points[i+1].x + xoffset); y2 = YLOG2DEVMAC(points[i+1].y + yoffset); ::LineTo( x2 - offset, y2 - offset ); }}void wxDC::DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset, int fillStyle ){ wxCHECK_RET(Ok(), wxT("Invalid DC")); wxMacFastPortSetter helper(this) ; wxCoord x1, x2 , y1 , y2 ; if ( m_brush.GetStyle() == wxTRANSPARENT && m_pen.GetStyle() == wxTRANSPARENT ) return ; PolyHandle polygon = OpenPoly(); x2 = x1 = XLOG2DEVMAC(points[0].x + xoffset); y2 = y1 = YLOG2DEVMAC(points[0].y + yoffset); ::MoveTo(x1,y1); for (int i = 1; i < n; i++) { x2 = XLOG2DEVMAC(points[i].x + xoffset); y2 = YLOG2DEVMAC(points[i].y + yoffset); ::LineTo(x2, y2); } // close the polyline if necessary if ( x1 != x2 || y1 != y2 ) { ::LineTo(x1,y1 ) ; } ClosePoly(); if (m_brush.GetStyle() != wxTRANSPARENT) { MacInstallBrush(); ::PaintPoly( polygon ); } if (m_pen.GetStyle() != wxTRANSPARENT) { MacInstallPen() ; ::FramePoly( polygon ) ; } KillPoly( polygon );}void wxDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height){ wxCHECK_RET(Ok(), wxT("Invalid DC")); wxMacFastPortSetter helper(this) ; wxCoord xx = XLOG2DEVMAC(x); wxCoord yy = YLOG2DEVMAC(y); wxCoord ww = m_signX * XLOG2DEVREL(width); wxCoord hh = m_signY * YLOG2DEVREL(height); // CMB: draw nothing if transformed w or h is 0 if (ww == 0 || hh == 0) return; // CMB: handle -ve width and/or height if (ww < 0) { ww = -ww; xx = xx - ww; } if (hh < 0) { hh = -hh; yy = yy - hh; } Rect rect = { yy , xx , yy + hh , xx + ww } ; if (m_brush.GetStyle() != wxTRANSPARENT) { MacInstallBrush() ; ::PaintRect( &rect ) ; } if (m_pen.GetStyle() != wxTRANSPARENT) { MacInstallPen() ; ::FrameRect( &rect ) ; }}void wxDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height, double radius){ wxCHECK_RET(Ok(), wxT("Invalid DC")); wxMacFastPortSetter helper(this) ; if (radius < 0.0) radius = - radius * ((width < height) ? width : height); wxCoord xx = XLOG2DEVMAC(x); wxCoord yy = YLOG2DEVMAC(y); wxCoord ww = m_signX * XLOG2DEVREL(width); wxCoord hh = m_signY * YLOG2DEVREL(height); // CMB: draw nothing if transformed w or h is 0 if (ww == 0 || hh == 0) return; // CMB: handle -ve width and/or height if (ww < 0) { ww = -ww; xx = xx - ww; } if (hh < 0) { hh = -hh; yy = yy - hh; } Rect rect = { yy , xx , yy + hh , xx + ww } ; if (m_brush.GetStyle() != wxTRANSPARENT) { MacInstallBrush() ; ::PaintRoundRect( &rect , int(radius * 2) , int(radius * 2) ) ; } if (m_pen.GetStyle() != wxTRANSPARENT) { MacInstallPen() ; ::FrameRoundRect( &rect , int(radius * 2) , int(radius * 2) ) ; }}void wxDC::DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height){ wxCHECK_RET(Ok(), wxT("Invalid DC")); wxMacFastPortSetter helper(this) ; wxCoord xx = XLOG2DEVMAC(x); wxCoord yy = YLOG2DEVMAC(y); wxCoord ww = m_signX * XLOG2DEVREL(width); wxCoord hh = m_signY * YLOG2DEVREL(height); // CMB: draw nothing if transformed w or h is 0 if (ww == 0 || hh == 0) return; // CMB: handle -ve width and/or height if (ww < 0) { ww = -ww; xx = xx - ww; } if (hh < 0) { hh = -hh; yy = yy - hh; } Rect rect = { yy , xx , yy + hh , xx + ww } ; if (m_brush.GetStyle() != wxTRANSPARENT) { MacInstallBrush() ; ::PaintOval( &rect ) ; } if (m_pen.GetStyle() != wxTRANSPARENT) { MacInstallPen() ; ::FrameOval( &rect ) ; }}bool wxDC::CanDrawBitmap(void) const{ return true ;}bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, wxDC *source, wxCoord xsrc, wxCoord ysrc, int logical_func , bool useMask, wxCoord xsrcMask, wxCoord ysrcMask ){ wxCHECK_MSG(Ok(), false, wxT("wxDC::DoBlit Illegal dc")); wxCHECK_MSG(source->Ok(), false, wxT("wxDC::DoBlit Illegal source DC")); if ( logical_func == wxNO_OP ) return true ; if (xsrcMask == -1 && ysrcMask == -1) { xsrcMask = xsrc; ysrcMask = ysrc; } // correct the parameter in case this dc does not have a mask at all if ( useMask && !source->m_macMask ) useMask = false ; Rect srcrect , dstrect ; srcrect.top = source->YLOG2DEVMAC(ysrc) ; srcrect.left = source->XLOG2DEVMAC(xsrc) ; srcrect.right = source->XLOG2DEVMAC(xsrc + width ) ; srcrect.bottom = source->YLOG2DEVMAC(ysrc + height) ; dstrect.top = YLOG2DEVMAC(ydest) ; dstrect.left = XLOG2DEVMAC(xdest) ; dstrect.bottom = YLOG2DEVMAC(ydest + height ) ; dstrect.right = XLOG2DEVMAC(xdest + width ) ; short mode = kUnsupportedMode ; bool invertDestinationFirst = false ; switch ( logical_func ) { case wxAND: // src AND dst mode = adMin ; // ok break ; case wxAND_INVERT: // (NOT src) AND dst mode = notSrcOr ; // ok break ; case wxAND_REVERSE:// src AND (NOT dst) invertDestinationFirst = true ; mode = srcOr ; break ; case wxCLEAR: // 0 mode = kEmulatedMode ; break ; case wxCOPY: // src mode = srcCopy ; // ok break ; case wxEQUIV: // (NOT src) XOR dst mode = srcXor ; // ok break ; case wxINVERT: // NOT dst mode = kEmulatedMode ; //or hilite ; break ; case wxNAND: // (NOT src) OR (NOT dst) invertDestinationFirst = true ; mode = srcBic ; break ; case wxNOR: // (NOT src) AND (NOT dst) invertDestinationFirst = true ; mode = notSrcOr ; break ; case wxNO_OP: // dst mode = kEmulatedMode ; // this has already been handled upon entry break ; case wxOR: // src OR dst mode = notSrcBic ; break ; case wxOR_INVERT: // (NOT src) OR dst mode = srcBic ; break ; case wxOR_REVERSE: // src OR (NOT dst) invertDestinationFirst = true ; mode = notSrcBic ; break ; case wxSET: // 1 mode = kEmulatedMode ; break ; case wxSRC_INVERT: // (NOT src) mode = notSrcCopy ; // ok break ; case wxXOR: // src XOR dst mode = notSrcXor ; // ok break ; default : break ; } if ( mode == kUnsupportedMode ) { wxFAIL_MSG(wxT("unsupported blitting mode" )); return false ; } CGrafPtr sourcePort = (CGrafPtr) source->m_macPort ; PixMapHandle bmappixels = GetGWorldPixMap( sourcePort ) ; if ( LockPixels(bmappixels) ) { wxMacFastPortSetter helper(this) ; if ( source->GetDepth() == 1 ) { RGBForeColor( &MAC_WXCOLORREF(m_textForegroundColour.GetPixel()) ) ; RGBBackColor( &MAC_WXCOLORREF(m_textBackgroundColour.GetPixel()) ) ; } else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -