gdi32: Fix ArcTo to use proper starting and ending points.
This commit is contained in:
parent
2c9c761b56
commit
1dbe178f5e
|
@ -118,19 +118,26 @@ BOOL WINAPI ArcTo( HDC hdc,
|
||||||
if(!dc) return FALSE;
|
if(!dc) return FALSE;
|
||||||
|
|
||||||
if(dc->funcs->pArcTo)
|
if(dc->funcs->pArcTo)
|
||||||
{
|
|
||||||
result = dc->funcs->pArcTo( dc->physDev, left, top, right, bottom,
|
result = dc->funcs->pArcTo( dc->physDev, left, top, right, bottom,
|
||||||
xstart, ystart, xend, yend );
|
xstart, ystart, xend, yend );
|
||||||
GDI_ReleaseObj( hdc );
|
else
|
||||||
return result;
|
{
|
||||||
}
|
double width = fabs(right-left),
|
||||||
GDI_ReleaseObj( hdc );
|
height = fabs(bottom-top),
|
||||||
|
xradius = width/2,
|
||||||
|
yradius = height/2,
|
||||||
|
xcenter = right > left ? left+xradius : right+xradius,
|
||||||
|
ycenter = bottom > top ? top+yradius : bottom+yradius;
|
||||||
/*
|
/*
|
||||||
* Else emulate it.
|
* Else emulate it.
|
||||||
* According to the documentation, a line is drawn from the current
|
* According to the documentation, a line is drawn from the current
|
||||||
* position to the starting point of the arc.
|
* position to the starting point of the arc.
|
||||||
*/
|
*/
|
||||||
LineTo(hdc, xstart, ystart);
|
double angle = atan2(
|
||||||
|
((ystart-ycenter)/height),
|
||||||
|
((xstart-xcenter)/width));
|
||||||
|
LineTo(hdc, GDI_ROUND(xcenter+(cos(angle)*xradius)),
|
||||||
|
GDI_ROUND(ycenter+(sin(angle)*yradius)));
|
||||||
/*
|
/*
|
||||||
* Then the arc is drawn.
|
* Then the arc is drawn.
|
||||||
*/
|
*/
|
||||||
|
@ -139,7 +146,16 @@ BOOL WINAPI ArcTo( HDC hdc,
|
||||||
* If no error occurred, the current position is moved to the ending
|
* If no error occurred, the current position is moved to the ending
|
||||||
* point of the arc.
|
* point of the arc.
|
||||||
*/
|
*/
|
||||||
if (result) MoveToEx(hdc, xend, yend, NULL);
|
if (result)
|
||||||
|
{
|
||||||
|
angle = atan2(
|
||||||
|
((yend-ycenter)/height),
|
||||||
|
((xend-xcenter)/width));
|
||||||
|
MoveToEx(hdc, GDI_ROUND(xcenter+(cos(angle)*xradius)),
|
||||||
|
GDI_ROUND(ycenter+(sin(angle)*yradius)), NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
GDI_ReleaseObj( hdc );
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -193,7 +193,7 @@ static void ok_path(HDC hdc, const path_test_t *expected, int expected_size, BOO
|
||||||
|
|
||||||
static const path_test_t arcto_path[] = {
|
static const path_test_t arcto_path[] = {
|
||||||
{0, 0, PT_MOVETO, 0, 0}, /* 0 */
|
{0, 0, PT_MOVETO, 0, 0}, /* 0 */
|
||||||
{229, 215, PT_LINETO, 0, 1}, /* 1 */
|
{229, 215, PT_LINETO, 0, 0}, /* 1 */
|
||||||
{248, 205, PT_BEZIERTO, 1, 0}, /* 2 */
|
{248, 205, PT_BEZIERTO, 1, 0}, /* 2 */
|
||||||
{273, 200, PT_BEZIERTO, 0, 0}, /* 3 */
|
{273, 200, PT_BEZIERTO, 0, 0}, /* 3 */
|
||||||
{300, 200, PT_BEZIERTO, 0, 0}, /* 4 */
|
{300, 200, PT_BEZIERTO, 0, 0}, /* 4 */
|
||||||
|
@ -203,7 +203,7 @@ static const path_test_t arcto_path[] = {
|
||||||
{399, 263, PT_BEZIERTO, 0, 0}, /* 8 */
|
{399, 263, PT_BEZIERTO, 0, 0}, /* 8 */
|
||||||
{389, 275, PT_BEZIERTO, 0, 0}, /* 9 */
|
{389, 275, PT_BEZIERTO, 0, 0}, /* 9 */
|
||||||
{370, 285, PT_BEZIERTO, 0, 0}, /* 10 */
|
{370, 285, PT_BEZIERTO, 0, 0}, /* 10 */
|
||||||
{363, 277, PT_LINETO, 1, 1}, /* 11 */
|
{363, 277, PT_LINETO, 1, 0}, /* 11 */
|
||||||
{380, 270, PT_BEZIERTO, 1, 0}, /* 12 */
|
{380, 270, PT_BEZIERTO, 1, 0}, /* 12 */
|
||||||
{389, 260, PT_BEZIERTO, 0, 0}, /* 13 */
|
{389, 260, PT_BEZIERTO, 0, 0}, /* 13 */
|
||||||
{389, 250, PT_BEZIERTO, 0, 0}, /* 14 */
|
{389, 250, PT_BEZIERTO, 0, 0}, /* 14 */
|
||||||
|
|
Loading…
Reference in New Issue