Oops, revert unwanted previous commit for ftgrays.c.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
diff --git a/src/smooth/ftgrays.c b/src/smooth/ftgrays.c
index cef8188..846e454 100644
--- a/src/smooth/ftgrays.c
+++ b/src/smooth/ftgrays.c
@@ -1007,40 +1007,45 @@
const FT_Vector* control2,
const FT_Vector* to )
{
- TPos dx, dy;
- TPos mid_x, mid_y;
+ TPos dx, dy, da, db;
int top, level;
int* levels;
FT_Vector* arc;
- /* Calculate midpoint and compare it with start and end. */
- mid_x = ( DOWNSCALE( ras.x ) + to->x +
- 3 * ( control1->x + control2->x ) ) / 8;
- mid_y = ( DOWNSCALE( ras.y ) + to->y +
- 3 * ( control1->y + control2->y ) ) / 8;
+ dx = DOWNSCALE( ras.x ) + to->x - ( control1->x << 1 );
+ if ( dx < 0 )
+ dx = -dx;
+ dy = DOWNSCALE( ras.y ) + to->y - ( control1->y << 1 );
+ if ( dy < 0 )
+ dy = -dy;
+ if ( dx < dy )
+ dx = dy;
+ da = dx;
- dx = DOWNSCALE( ras.x ) + to->x - ( mid_x << 1 );
+ dx = DOWNSCALE( ras.x ) + to->x - 3 * ( control1->x + control2->x );
if ( dx < 0 )
dx = -dx;
- dy = DOWNSCALE( ras.y ) + to->y - ( mid_y << 1 );
+ dy = DOWNSCALE( ras.y ) + to->y - 3 * ( control1->x + control2->y );
if ( dy < 0 )
dy = -dy;
if ( dx < dy )
dx = dy;
+ db = dx;
- /* Check whether an approximation with straight lines is sufficient. */
level = 1;
- dx = dx / ras.conic_level;
- while ( dx > 0 )
+ da = da / ras.cubic_level;
+ db = db / ras.conic_level;
+ while ( da > 0 || db > 0 )
{
- dx >>= 3;
+ da >>= 2;
+ db >>= 3;
level++;
}
if ( level <= 1 )
{
- TPos to_x, to_y;
+ TPos to_x, to_y, mid_x, mid_y;
to_x = UPSCALE( to->x );
@@ -1099,7 +1104,7 @@
Draw:
{
- TPos to_x, to_y;
+ TPos to_x, to_y, mid_x, mid_y;
to_x = arc[0].x;