Fix DrawArc() implementation in wxGtkPrinterDC.
It didn't count the angles correctly when they were equal to 90 degrees. Also simplify the code by avoiding special cases for 90 degrees anyhow, just call atan2() directly. And also avoid converting the angles to degrees just to convert them back to radians immediately afterwards. See #15609. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@75064 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
8b3102cfb6
commit
db7af3c2a7
@ -573,6 +573,10 @@ All (GUI):
|
||||
|
||||
- Fix wxListEvent::GetData() in LLP64 builds.
|
||||
|
||||
wxGTK:
|
||||
|
||||
- Fix DrawArc() when printing.
|
||||
|
||||
wxMSW:
|
||||
|
||||
- Optional better handling of SAFEARRAYs in wxAutomationObject (PB).
|
||||
|
@ -1357,42 +1357,35 @@ void wxGtkPrinterDCImpl::DoCrossHair(wxCoord x, wxCoord y)
|
||||
|
||||
void wxGtkPrinterDCImpl::DoDrawArc(wxCoord x1,wxCoord y1,wxCoord x2,wxCoord y2,wxCoord xc,wxCoord yc)
|
||||
{
|
||||
double dx = x1 - xc;
|
||||
double dy = y1 - yc;
|
||||
double radius = sqrt((double)(dx*dx+dy*dy));
|
||||
const double dx1 = x1 - xc;
|
||||
const double dy1 = y1 - yc;
|
||||
const double radius = sqrt(dx1*dx1 + dy1*dy1);
|
||||
|
||||
if ( radius == 0.0 )
|
||||
return;
|
||||
|
||||
double alpha1, alpha2;
|
||||
if (x1 == x2 && y1 == y2)
|
||||
if ( x1 == x2 && y1 == y2 )
|
||||
{
|
||||
alpha1 = 0.0;
|
||||
alpha2 = 360.0;
|
||||
}
|
||||
else
|
||||
if (radius == 0.0)
|
||||
{
|
||||
alpha1 = alpha2 = 0.0;
|
||||
alpha2 = 2*M_PI;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
alpha1 = (x1 - xc == 0) ?
|
||||
(y1 - yc < 0) ? 90.0 : -90.0 :
|
||||
atan2(double(y1-yc), double(x1-xc)) * RAD2DEG;
|
||||
alpha2 = (x2 - xc == 0) ?
|
||||
(y2 - yc < 0) ? 90.0 : -90.0 :
|
||||
atan2(double(y2-yc), double(x2-xc)) * RAD2DEG;
|
||||
|
||||
while (alpha1 <= 0) alpha1 += 360;
|
||||
while (alpha2 <= 0) alpha2 += 360; // adjust angles to be between.
|
||||
while (alpha1 > 360) alpha1 -= 360; // 0 and 360 degree.
|
||||
while (alpha2 > 360) alpha2 -= 360;
|
||||
alpha1 = atan2(dy1, dx1);
|
||||
alpha2 = atan2(double(y2-yc), double(x2-xc));
|
||||
}
|
||||
|
||||
alpha1 *= DEG2RAD;
|
||||
alpha2 *= DEG2RAD;
|
||||
|
||||
cairo_new_path(m_cairo);
|
||||
|
||||
cairo_arc_negative ( m_cairo, XLOG2DEV(xc), YLOG2DEV(yc), XLOG2DEVREL((int)radius), alpha1, alpha2);
|
||||
// We use the "negative" variant because the arc should go counterclockwise
|
||||
// while in the default coordinate system, with Y axis going down, Cairo
|
||||
// counts angles in the direction from positive X axis direction to
|
||||
// positive Y axis direction, i.e. clockwise.
|
||||
cairo_arc_negative(m_cairo, XLOG2DEV(xc), YLOG2DEV(yc),
|
||||
XLOG2DEVREL(wxRound(radius)), alpha1, alpha2);
|
||||
|
||||
cairo_line_to(m_cairo, XLOG2DEV(xc), YLOG2DEV(yc));
|
||||
cairo_close_path (m_cairo);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user