New implementation for printing circles and epllipses.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@37698 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2006-02-24 09:36:35 +00:00
parent e773f79b19
commit 74ab0bfbb7
2 changed files with 50 additions and 36 deletions

View File

@@ -1155,30 +1155,59 @@ void wxGnomePrintDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width,
}
}
void wxGnomePrintDC::makeEllipticalPath(wxCoord x, wxCoord y,
wxCoord width, wxCoord height)
{
double r = 4 * (sqrt (2) - 1) / 3;
double halfW = 0.5 * width,
halfH = 0.5 * height,
halfWR = r * halfW,
halfHR = r * halfH;
wxCoord halfWI = (wxCoord) halfW,
halfHI = (wxCoord) halfH;
gs_lgp->gnome_print_newpath( m_gpc );
// Approximate an ellipse using four cubic splines, clockwise from 0 deg */
gs_lgp->gnome_print_moveto( m_gpc,
XLOG2DEV(x + width),
YLOG2DEV(y + halfHI) );
gs_lgp->gnome_print_curveto( m_gpc,
XLOG2DEV(x + width),
YLOG2DEV(y + (wxCoord) rint (halfH + halfHR)),
XLOG2DEV(x + (wxCoord) rint(halfW + halfWR)),
YLOG2DEV(y + height),
XLOG2DEV(x + halfWI),
YLOG2DEV(y + height) );
gs_lgp->gnome_print_curveto( m_gpc,
XLOG2DEV(x + (wxCoord) rint(halfW - halfWR)),
YLOG2DEV(y + height),
XLOG2DEV(x),
YLOG2DEV(y + (wxCoord) rint (halfH + halfHR)),
XLOG2DEV(x), YLOG2DEV(y+halfHI) );
gs_lgp->gnome_print_curveto( m_gpc,
XLOG2DEV(x),
YLOG2DEV(y + (wxCoord) rint (halfH - halfHR)),
XLOG2DEV(x + (wxCoord) rint (halfW - halfWR)),
YLOG2DEV(y),
XLOG2DEV(x+halfWI), YLOG2DEV(y) );
gs_lgp->gnome_print_curveto( m_gpc,
XLOG2DEV(x + (wxCoord) rint(halfW + halfWR)),
YLOG2DEV(y),
XLOG2DEV(x + width),
YLOG2DEV(y + (wxCoord) rint(halfH - halfHR)),
XLOG2DEV(x + width), YLOG2DEV(y + halfHI) );
gs_lgp->gnome_print_closepath(m_gpc);
}
void wxGnomePrintDC::DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
{
if (m_brush.GetStyle () != wxTRANSPARENT)
{
SetBrush( m_brush );
gs_lgp->gnome_print_newpath( m_gpc );
gs_lgp->gnome_print_moveto( m_gpc,
XLOG2DEV(x), YLOG2DEV(y+height/2) );
// start with top half
gs_lgp->gnome_print_curveto( m_gpc,
XLOG2DEV(x), YLOG2DEV(y),
XLOG2DEV(x+width), YLOG2DEV(y),
XLOG2DEV(x+width), YLOG2DEV(y+height/2) );
// lower half
gs_lgp->gnome_print_curveto( m_gpc,
XLOG2DEV(x+width), YLOG2DEV(y+height),
XLOG2DEV(x), YLOG2DEV(y+height),
XLOG2DEV(x), YLOG2DEV(y+height/2) );
gs_lgp->gnome_print_closepath( m_gpc );
makeEllipticalPath( x, y, width, height );
gs_lgp->gnome_print_fill( m_gpc );
CalcBoundingBox( x, y );
CalcBoundingBox( x + width, y + height );
}
@@ -1186,25 +1215,8 @@ void wxGnomePrintDC::DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord
if (m_pen.GetStyle () != wxTRANSPARENT)
{
SetPen (m_pen);
gs_lgp->gnome_print_newpath( m_gpc );
gs_lgp->gnome_print_moveto( m_gpc,
XLOG2DEV(x), YLOG2DEV(y+height/2) );
// start with top half
gs_lgp->gnome_print_curveto( m_gpc,
XLOG2DEV(x), YLOG2DEV(y),
XLOG2DEV(x+width), YLOG2DEV(y),
XLOG2DEV(x+width), YLOG2DEV(y+height/2) );
// lower half
gs_lgp->gnome_print_curveto( m_gpc,
XLOG2DEV(x+width), YLOG2DEV(y+height),
XLOG2DEV(x), YLOG2DEV(y+height),
XLOG2DEV(x), YLOG2DEV(y+height/2) );
gs_lgp->gnome_print_closepath( m_gpc );
makeEllipticalPath( x, y, width, height );
gs_lgp->gnome_print_stroke( m_gpc );
CalcBoundingBox( x, y );
CalcBoundingBox( x + width, y + height );
}