diff options
author | Andreas Kling <andreas.kling@nokia.com> | 2010-08-16 02:33:03 (GMT) |
---|---|---|
committer | Andreas Kling <andreas.kling@nokia.com> | 2010-08-16 12:12:49 (GMT) |
commit | a9c0fbd5e946ae6e90b6db6dd4aea64c824a4066 (patch) | |
tree | 628c7141982424753fd1e617c1ceaa544127bd42 /src/gui | |
parent | aebac76abbc5ed617d5998009afb06f07b9e237f (diff) | |
download | Qt-a9c0fbd5e946ae6e90b6db6dd4aea64c824a4066.zip Qt-a9c0fbd5e946ae6e90b6db6dd4aea64c824a4066.tar.gz Qt-a9c0fbd5e946ae6e90b6db6dd4aea64c824a4066.tar.bz2 |
qgrayraster: Speed up rendering of small cubic splines.
Based on these upstream freetype2 commits:
7fb3ef64a24489189113f693696eaf935f500c3f
e419f48b40a746465a6c8e1d446b407b8677bfed
Reviewed-by: Samuel Rødal
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/painting/qgrayraster.c | 36 |
1 files changed, 16 insertions, 20 deletions
diff --git a/src/gui/painting/qgrayraster.c b/src/gui/painting/qgrayraster.c index 5e7c67a..539a33c 100644 --- a/src/gui/painting/qgrayraster.c +++ b/src/gui/painting/qgrayraster.c @@ -956,53 +956,49 @@ const QT_FT_Vector* control2, const QT_FT_Vector* to ) { - TPos dx, dy, da, db; int top, level; int* levels; QT_FT_Vector* arc; + int mid_x = ( DOWNSCALE( ras.x ) + to->x + + 3 * (control1->x + control2->x ) ) / 8; + int mid_y = ( DOWNSCALE( ras.y ) + to->y + + 3 * (control1->y + control2->y ) ) / 8; + TPos dx = DOWNSCALE( ras.x ) + to->x - ( mid_x << 1 ); + TPos dy = DOWNSCALE( ras.y ) + to->y - ( mid_y << 1 ); - 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 - 3 * ( control1->x + control2->x ); - if ( dx < 0 ) - dx = -dx; - dy = DOWNSCALE( ras.y ) + to->y - 3 * ( control1->x + control2->y ); - if ( dy < 0 ) - dy = -dy; - if ( dx < dy ) - dx = dy; - db = dx; level = 1; - da = da / ras.cubic_level; - db = db / ras.conic_level; - while ( da > 0 || db > 0 ) + dx /= ras.cubic_level; + while ( dx > 0 ) { - da >>= 2; - db >>= 3; + dx >>= 2; level++; } if ( level <= 1 ) { - TPos to_x, to_y, mid_x, mid_y; + TPos to_x, to_y; to_x = UPSCALE( to->x ); to_y = UPSCALE( to->y ); + + /* Recalculation of midpoint is needed only if */ + /* UPSCALE and DOWNSCALE have any effect. */ + +#if ( PIXEL_BITS != 6 ) mid_x = ( ras.x + to_x + 3 * UPSCALE( control1->x + control2->x ) ) / 8; mid_y = ( ras.y + to_y + 3 * UPSCALE( control1->y + control2->y ) ) / 8; +#endif gray_render_line( RAS_VAR_ mid_x, mid_y ); gray_render_line( RAS_VAR_ to_x, to_y ); |