📄 dc.cpp
字号:
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; // Order important Mac in opposite direction to wx // we have to make sure that the filling is always counter-clockwise double angle = sa - ea; 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("wxDC::DoDrawPoint - 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()); // NOTE: Get/SetCPixel are slow! ::SetCPixel( xx1, yy1, &pencolor) ; CalcBoundingBox(x, y); }}void wxDC::DoDrawLines(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset){ wxCHECK_RET(Ok(), wxT("wxDC::DoDrawLines - invalid DC")); if (m_pen.GetStyle() == wxTRANSPARENT) return; wxMacFastPortSetter helper(this) ; 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("wxDC::DoDrawPolygon - invalid DC")); if ( m_brush.GetStyle() == wxTRANSPARENT && m_pen.GetStyle() == wxTRANSPARENT ) return ; wxMacFastPortSetter helper(this) ; wxCoord x1, x2 , y1 , y2 ; 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("wxDC::DoDrawRectangle - 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("wxDC::DoDrawRoundedRectangle - 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("wxDC::DoDrawEllipse - 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 - invalid DC")); wxCHECK_MSG(source->Ok(), false, wxT("wxDC::DoBlit - invalid 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 { // the modes need this, otherwise we'll end up having really nice colors... RGBColor white = { 0xFFFF, 0xFFFF, 0xFFFF } ; RGBColor black = { 0, 0, 0 } ; RGBForeColor( &black ) ; RGBBackColor( &white ) ; } if ( useMask && source->m_macMask ) { if ( mode == srcCopy ) { if ( LockPixels( GetGWorldPixMap( MAC_WXHBITMAP(source->m_macMask) ) ) ) { CopyMask( GetPortBitMapForCopyBits( sourcePort ) , GetPortBitMapForCopyBits( MAC_WXHBITMAP(source->m_macMask) ) , GetPortBitMapForCopyBits( MAC_WXHBITMAP(m_macPort) ) , &srcrect, &srcrect , &dstrect ) ; UnlockPixels( GetGWorldPixMap( MAC_WXHBITMAP(source->m_macMask) ) ) ; } } else { RgnHandle clipRgn = NewRgn() ; LockPixels( GetGWorldPixMap( MAC_WXHBITMAP(source->m_macMask) ) ) ; BitMapToRegion( clipRgn , (BitMap*) *GetGWorldPixMap( MAC_WXHBITMAP(source->m_macMask) ) ) ; UnlockPixels( GetGWorldPixMap( MAC_WXHBITMAP(source->m_macMask) ) ) ; OffsetRgn( clipRgn , -srcrect.left + dstrect.left, -srcrect.top + dstrect.top ) ; if ( mode == kEmulatedMode ) { Pattern pat ; ::PenPat(GetQDGlobalsBlack(&pat)); if ( logical_func == wxSET ) { RGBColor col= { 0xFFFF, 0xFFFF, 0xFFFF } ; ::RGBForeColor( &col ) ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -