=================================================================== RCS file: /sources/freetype/freetype2/src/truetype/ttinterp.c,v retrieving revision 1.99 retrieving revision 1.102 diff -u -r1.99 -r1.102 --- freetype2/src/truetype/ttinterp.c 2007/02/16 08:12:50 1.99 +++ freetype2/src/truetype/ttinterp.c 2007/03/18 07:35:08 1.102 @@ -4839,16 +4839,18 @@ if ( CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 ) - FT_ARRAY_COPY( CUR.twilight.orus, - CUR.twilight.org, - CUR.twilight.n_points ); - - /* get scaled orus coordinates */ - vec1.x = TT_MULFIX( CUR.zp0.orus[L].x - CUR.zp1.orus[K].x, - CUR.metrics.x_scale ); - vec1.y = TT_MULFIX( CUR.zp0.orus[L].y - CUR.zp1.orus[L].y, - CUR.metrics.y_scale ); - + { + vec1.x = CUR.zp0.org[L].x - CUR.zp1.org[K].x; + vec1.y = CUR.zp0.org[L].y - CUR.zp1.org[K].y; + } + else + { + /* get scaled orus coordinates */ + vec1.x = TT_MULFIX( CUR.zp0.orus[L].x - CUR.zp1.orus[K].x, + CUR.metrics.x_scale ); + vec1.y = TT_MULFIX( CUR.zp0.orus[L].y - CUR.zp1.orus[K].y, + CUR.metrics.y_scale ); + } D = CUR_fast_dualproj( &vec1 ); #else @@ -5780,23 +5782,28 @@ #ifdef FIX_BYTECODE + /* UNDOCUMENTED: twilight zone special case */ + + if ( CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 ) + { + FT_Vector* vec1 = &CUR.zp1.org[point]; + FT_Vector* vec2 = &CUR.zp0.org[CUR.GS.rp0]; + + org_dist = CUR_Func_dualproj( vec1, vec2 ); + } + else { FT_Vector* vec1 = &CUR.zp1.orus[point]; FT_Vector* vec2 = &CUR.zp0.orus[CUR.GS.rp0]; - if ( CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 ) - FT_ARRAY_COPY( CUR.twilight.orus, - CUR.twilight.org, - CUR.twilight.n_points ); - - if ( CUR.metrics.x_scale == CUR.metrics.y_scale ) + if ( CUR.metrics.x_scale == CUR.metrics.y_scale ) { /* this should be faster */ org_dist = CUR_Func_dualproj( vec1, vec2 ); org_dist = TT_MULFIX( org_dist, CUR.metrics.x_scale ); } - else + else { FT_Vector vec; @@ -6173,6 +6180,7 @@ FT_F26Dot6 old_range, cur_range; FT_Vector* orus_base; FT_Vector* cur_base; + FT_Int twilight; FT_UNUSED_ARG; @@ -6184,21 +6192,18 @@ } /* - * We need to deal in a special way with the twilight zone. The easiest - * solution is simply to copy the coordinates from `org' to `orus' - * whenever a font tries to perform intersections based on some of its - * points. - * + * We need to deal in a special way with the twilight zone. * Otherwise, by definition, the value of CUR.twilight.orus[n] is (0,0), - * whatever value of `n'. + * for every n. */ - if ( CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 || CUR.GS.gep2 == 0 ) - FT_ARRAY_COPY( CUR.twilight.orus, - CUR.twilight.org, - CUR.twilight.n_points ); + twilight = ( CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 || CUR.GS.gep2 == 0 ); + + if (twilight) + orus_base = &CUR.zp0.org[CUR.GS.rp1]; + else + orus_base = &CUR.zp0.orus[CUR.GS.rp1]; - orus_base = &CUR.zp0.orus[CUR.GS.rp1]; - cur_base = &CUR.zp0.cur[CUR.GS.rp1]; + cur_base = &CUR.zp0.cur[CUR.GS.rp1]; /* XXX: There are some glyphs in some braindead but popular */ /* fonts out there (e.g. [aeu]grave in monotype.ttf) */ @@ -6212,7 +6217,11 @@ } else { - old_range = CUR_Func_dualproj( &CUR.zp1.orus[CUR.GS.rp2], orus_base ); + if (twilight) + old_range = CUR_Func_dualproj( &CUR.zp1.org[CUR.GS.rp2], orus_base ); + else + old_range = CUR_Func_dualproj( &CUR.zp1.orus[CUR.GS.rp2], orus_base ); + cur_range = CUR_Func_project ( &CUR.zp1.cur[CUR.GS.rp2], cur_base ); } @@ -6233,7 +6242,11 @@ continue; } - org_dist = CUR_Func_dualproj( &CUR.zp2.orus[point], orus_base ); + if (twilight) + org_dist = CUR_Func_dualproj( &CUR.zp2.org[point], orus_base ); + else + org_dist = CUR_Func_dualproj( &CUR.zp2.orus[point], orus_base ); + cur_dist = CUR_Func_project ( &CUR.zp2.cur[point], cur_base ); new_dist = (old_range != 0) ? TT_MULDIV( org_dist, cur_range, old_range )