📄 dccg.cpp
字号:
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 ;
wxMacCGContext* mctx = ((wxMacCGContext*) m_graphicContext) ;
CGContextRef ctx = mctx->GetNativeContext() ;
CGContextSaveGState( ctx ) ;
CGContextTranslateCTM( ctx, xxc , yyc );
CGContextScaleCTM( ctx , 1 , -1 ) ;
if ( fill )
CGContextMoveToPoint( ctx , 0 , 0 ) ;
CGContextAddArc( ctx, 0, 0 , rad , DegToRad(sa), DegToRad(ea), 0 );
if ( fill )
CGContextAddLineToPoint( ctx , 0 , 0 ) ;
CGContextRestoreGState( ctx ) ;
CGContextDrawPath( ctx , mctx->GetDrawingMode() ) ;
}
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 ;
wxMacCGContext* mctx = ((wxMacCGContext*) m_graphicContext) ;
CGContextRef ctx = mctx->GetNativeContext() ;
CGContextSaveGState( ctx ) ;
CGContextTranslateCTM( ctx, xx + ww / 2, yy + hh / 2 );
CGContextScaleCTM( ctx , 1 * ww / 2 , -1 * hh / 2 ) ;
if ( fill )
CGContextMoveToPoint( ctx , 0 , 0 ) ;
CGContextAddArc( ctx, 0, 0, 1, DegToRad( sa ), DegToRad( ea ), 0 );
if ( fill )
CGContextAddLineToPoint( ctx , 0 , 0 ) ;
CGContextRestoreGState( ctx ) ;
CGContextDrawPath( ctx , mctx->GetDrawingMode() ) ;
}
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
void wxDC::DoDrawSpline(wxList *points)
{
wxCHECK_RET( Ok(), wxT("wxDC(cg)::DoDrawSpline - invalid DC") );
if ( m_logicalFunction != wxCOPY )
return ;
wxGraphicPath* path = m_graphicContext->CreatePath() ;
wxList::compatibility_iterator node = points->GetFirst();
if (node == wxList::compatibility_iterator())
// empty list
return;
wxPoint *p = (wxPoint *)node->GetData();
wxCoord x1 = p->x;
wxCoord y1 = p->y;
node = node->GetNext();
p = (wxPoint *)node->GetData();
wxCoord x2 = p->x;
wxCoord y2 = p->y;
wxCoord cx1 = ( x1 + x2 ) / 2;
wxCoord cy1 = ( y1 + y2 ) / 2;
path->MoveToPoint( XLOG2DEVMAC( x1 ) , XLOG2DEVMAC( y1 ) ) ;
path->AddLineToPoint( XLOG2DEVMAC( cx1 ) , XLOG2DEVMAC( cy1 ) ) ;
#if !wxUSE_STL
while ((node = node->GetNext()) != NULL)
#else
while ((node = node->GetNext()))
#endif // !wxUSE_STL
{
p = (wxPoint *)node->GetData();
x1 = x2;
y1 = y2;
x2 = p->x;
y2 = p->y;
wxCoord cx4 = (x1 + x2) / 2;
wxCoord cy4 = (y1 + y2) / 2;
path->AddQuadCurveToPoint(
XLOG2DEVMAC( x1 ) , XLOG2DEVMAC( y1 ) ,
XLOG2DEVMAC( cx4 ) , XLOG2DEVMAC( cy4 ) ) ;
cx1 = cx4;
cy1 = cy4;
}
path->AddLineToPoint( XLOG2DEVMAC( x2 ) , XLOG2DEVMAC( y2 ) ) ;
m_graphicContext->StrokePath( path ) ;
delete path ;
}
#endif
void wxDC::DoDrawPolygon( int n, wxPoint points[],
wxCoord xoffset, wxCoord yoffset,
int fillStyle )
{
wxCHECK_RET( Ok(), wxT("wxDC(cg)::DoDrawPolygon - invalid DC") );
if ( n <= 0 || (m_brush.GetStyle() == wxTRANSPARENT && m_pen.GetStyle() == wxTRANSPARENT ) )
return ;
if ( m_logicalFunction != wxCOPY )
return ;
wxCoord x1, x2 , y1 , y2 ;
x2 = x1 = XLOG2DEVMAC(points[0].x + xoffset);
y2 = 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 ) ;
}
if ( x1 != x2 || y1 != y2 )
path->AddLineToPoint( x1, y1 ) ;
path->CloseSubpath() ;
m_graphicContext->DrawPath( path , fillStyle ) ;
delete path ;
}
void wxDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
{
wxCHECK_RET( Ok(), wxT("wxDC(cg)::DoDrawRectangle - invalid DC") );
if ( m_logicalFunction != wxCOPY )
return ;
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;
}
wxGraphicPath* path = m_graphicContext->CreatePath() ;
path->AddRectangle( xx , yy , ww , hh ) ;
m_graphicContext->DrawPath( path ) ;
delete path ;
}
void wxDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y,
wxCoord width, wxCoord height,
double radius)
{
wxCHECK_RET( Ok(), wxT("wxDC(cg)::DoDrawRoundedRectangle - invalid DC") );
if ( m_logicalFunction != wxCOPY )
return ;
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;
}
wxMacCGContext* mctx = ((wxMacCGContext*) m_graphicContext) ;
CGContextRef ctx = mctx->GetNativeContext() ;
AddRoundedRectToPath( ctx , CGRectMake( xx , yy , ww , hh ) , radius , radius ) ;
CGContextDrawPath( ctx , mctx->GetDrawingMode() ) ;
}
void wxDC::DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
{
wxCHECK_RET( Ok(), wxT("wxDC(cg)::DoDrawEllipse - invalid DC") );
if ( m_logicalFunction != wxCOPY )
return ;
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;
}
wxMacCGContext* mctx = ((wxMacCGContext*) m_graphicContext) ;
CGContextRef ctx = mctx->GetNativeContext() ;
CGContextSaveGState( ctx ) ;
CGContextTranslateCTM( ctx, xx + ww / 2, yy + hh / 2 );
CGContextScaleCTM( ctx , ww / 2 , hh / 2 ) ;
CGContextAddArc( ctx, 0, 0, 1, 0 , 2 * M_PI , 0 );
CGContextRestoreGState( ctx ) ;
CGContextDrawPath( ctx , mctx->GetDrawingMode() ) ;
}
bool wxDC::CanDrawBitmap() 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(cg)::DoBlit - invalid DC") );
wxCHECK_MSG( source->Ok(), false, wxT("wxDC(cg)::DoBlit - invalid source DC") );
if ( logical_func == wxNO_OP )
return true ;
if (xsrcMask == -1 && ysrcMask == -1)
{
xsrcMask = xsrc;
ysrcMask = ysrc;
}
wxCoord yysrc = source->YLOG2DEVMAC(ysrc) ;
wxCoord xxsrc = source->XLOG2DEVMAC(xsrc) ;
wxCoord wwsrc = source->XLOG2DEVREL(width) ;
wxCoord hhsrc = source->YLOG2DEVREL(height) ;
wxCoord yydest = YLOG2DEVMAC(ydest) ;
wxCoord xxdest = XLOG2DEVMAC(xdest) ;
wxCoord wwdest = XLOG2DEVREL(width) ;
wxCoord hhdest = YLOG2DEVREL(height) ;
wxMemoryDC* memdc = dynamic_cast<wxMemoryDC*>(source) ;
if ( memdc && logical_func == wxCOPY )
{
wxBitmap blit = memdc->GetSelectedObject() ;
wxASSERT_MSG( blit.Ok() , wxT("Invalid bitmap for blitting") ) ;
wxCoord bmpwidth = blit.GetWidth();
wxCoord bmpheight = blit.GetHeight();
if ( xxsrc != 0 || yysrc != 0 || bmpwidth != wwsrc || bmpheight != hhsrc )
{
wwsrc = wxMin( wwsrc , bmpwidth - xxsrc ) ;
hhsrc = wxMin( hhsrc , bmpheight - yysrc ) ;
if ( wwsrc > 0 && hhsrc > 0 )
{
if ( xxsrc >= 0 && yysrc >= 0 )
{
wxRect subrect( xxsrc, yysrc, wwsrc , hhsrc ) ;
blit = blit.GetSubBitmap( subrect ) ;
}
else
{
// in this case we'd probably have to adjust the different coordinates, but
// we have to find out proper contract first
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -