📄 dc.cpp
字号:
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));
while ( alpha2 < 0 )
alpha2 += 360 ;
alpha2 = -alpha2 ;
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;
// 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 ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -