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:
@@ -285,6 +285,8 @@ private:
|
|||||||
wxGnomePrinter *m_printer;
|
wxGnomePrinter *m_printer;
|
||||||
GnomePrintContext *m_gpc;
|
GnomePrintContext *m_gpc;
|
||||||
|
|
||||||
|
void makeEllipticalPath(wxCoord x, wxCoord y, wxCoord width, wxCoord height);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
wxCoord XDEV2LOG(wxCoord x) const
|
wxCoord XDEV2LOG(wxCoord x) const
|
||||||
{
|
{
|
||||||
|
@@ -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)
|
void wxGnomePrintDC::DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
|
||||||
{
|
{
|
||||||
if (m_brush.GetStyle () != wxTRANSPARENT)
|
if (m_brush.GetStyle () != wxTRANSPARENT)
|
||||||
{
|
{
|
||||||
SetBrush( m_brush );
|
SetBrush( m_brush );
|
||||||
|
makeEllipticalPath( x, y, width, height );
|
||||||
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 );
|
|
||||||
gs_lgp->gnome_print_fill( m_gpc );
|
gs_lgp->gnome_print_fill( m_gpc );
|
||||||
|
|
||||||
CalcBoundingBox( x, y );
|
CalcBoundingBox( x, y );
|
||||||
CalcBoundingBox( x + width, y + height );
|
CalcBoundingBox( x + width, y + height );
|
||||||
}
|
}
|
||||||
@@ -1186,25 +1215,8 @@ void wxGnomePrintDC::DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord
|
|||||||
if (m_pen.GetStyle () != wxTRANSPARENT)
|
if (m_pen.GetStyle () != wxTRANSPARENT)
|
||||||
{
|
{
|
||||||
SetPen (m_pen);
|
SetPen (m_pen);
|
||||||
|
makeEllipticalPath( x, y, width, height );
|
||||||
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 );
|
|
||||||
gs_lgp->gnome_print_stroke( m_gpc );
|
gs_lgp->gnome_print_stroke( m_gpc );
|
||||||
|
|
||||||
CalcBoundingBox( x, y );
|
CalcBoundingBox( x, y );
|
||||||
CalcBoundingBox( x + width, y + height );
|
CalcBoundingBox( x + width, y + height );
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user