|
|
|
@ -16,6 +16,10 @@ |
|
|
|
|
/***************************************************************************/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Greg Hitchcock from Microsoft has helped a lot in resolving unclear */ |
|
|
|
|
/* issues; many thanks! */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include <ft2build.h> |
|
|
|
|
#include FT_INTERNAL_DEBUG_H |
|
|
|
|
#include FT_INTERNAL_CALC_H |
|
|
|
@ -664,9 +668,9 @@ |
|
|
|
|
FT_Int i; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* XXXX: Will probably disappear soon with all the code range */ |
|
|
|
|
/* management, which is now rather obsolete. */ |
|
|
|
|
/* */ |
|
|
|
|
/* XXX: Will probably disappear soon with all the code range */ |
|
|
|
|
/* management, which is now rather obsolete. */ |
|
|
|
|
/* */ |
|
|
|
|
size->num_function_defs = exec->numFDefs; |
|
|
|
|
size->num_instruction_defs = exec->numIDefs; |
|
|
|
|
|
|
|
|
@ -5095,8 +5099,8 @@ |
|
|
|
|
|
|
|
|
|
CUR_Func_move( &CUR.zp2, L, args[1] - K ); |
|
|
|
|
|
|
|
|
|
/* not part of the specs, but here for safety */ |
|
|
|
|
|
|
|
|
|
/* UNDOCUMENTED! The MS rasterizer does that with */ |
|
|
|
|
/* twilight points (confirmed by Greg Hitchcock) */ |
|
|
|
|
if ( CUR.GS.gep2 == 0 ) |
|
|
|
|
CUR.zp2.org[L] = CUR.zp2.cur[L]; |
|
|
|
|
} |
|
|
|
@ -5920,9 +5924,9 @@ |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* XXX: UNDOCUMENTED! behaviour */ |
|
|
|
|
if ( CUR.GS.gep1 == 0 ) /* if the point that is to be moved */ |
|
|
|
|
/* is in twilight zone */ |
|
|
|
|
/* UNDOCUMENTED! The MS rasterizer does that with */ |
|
|
|
|
/* twilight points (confirmed by Greg Hitchcock) */ |
|
|
|
|
if ( CUR.GS.gep1 == 0 ) |
|
|
|
|
{ |
|
|
|
|
CUR.zp1.org[point] = CUR.zp0.org[CUR.GS.rp0]; |
|
|
|
|
CUR_Func_move_orig( &CUR.zp1, point, args[1] ); |
|
|
|
@ -5965,8 +5969,6 @@ |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* XXX: Is there some undocumented feature while in the */ |
|
|
|
|
/* twilight zone? ? */ |
|
|
|
|
if ( ( CUR.opcode & 1 ) != 0 ) |
|
|
|
|
{ |
|
|
|
|
cur_dist = CUR_fast_project( &CUR.zp0.cur[point] ); |
|
|
|
@ -6009,34 +6011,34 @@ |
|
|
|
|
goto Fail; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* XXX: UNDOCUMENTED! */ |
|
|
|
|
/* */ |
|
|
|
|
/* The behaviour of an MIAP instruction is quite */ |
|
|
|
|
/* different when used in the twilight zone. */ |
|
|
|
|
/* */ |
|
|
|
|
/* First, no control value cut-in test is performed */ |
|
|
|
|
/* as it would fail anyway. Second, the original */ |
|
|
|
|
/* point, i.e. (org_x,org_y) of zp0.point, is set */ |
|
|
|
|
/* to the absolute, unrounded distance found in */ |
|
|
|
|
/* the CVT. */ |
|
|
|
|
/* */ |
|
|
|
|
/* This is used in the CVT programs of the Microsoft */ |
|
|
|
|
/* fonts Arial, Times, etc., in order to re-adjust */ |
|
|
|
|
/* some key font heights. It allows the use of the */ |
|
|
|
|
/* IP instruction in the twilight zone, which */ |
|
|
|
|
/* otherwise would be `illegal' according to the */ |
|
|
|
|
/* specification. */ |
|
|
|
|
/* */ |
|
|
|
|
/* We implement it with a special sequence for the */ |
|
|
|
|
/* twilight zone. This is a bad hack, but it seems */ |
|
|
|
|
/* to work. */ |
|
|
|
|
/* UNDOCUMENTED! */ |
|
|
|
|
/* */ |
|
|
|
|
/* The behaviour of an MIAP instruction is quite different when used */ |
|
|
|
|
/* in the twilight zone. */ |
|
|
|
|
/* */ |
|
|
|
|
/* First, no control value cut-in test is performed as it would fail */ |
|
|
|
|
/* anyway. Second, the original point, i.e. (org_x,org_y) of */ |
|
|
|
|
/* zp0.point, is set to the absolute, unrounded distance found in the */ |
|
|
|
|
/* CVT. */ |
|
|
|
|
/* */ |
|
|
|
|
/* This is used in the CVT programs of the Microsoft fonts Arial, */ |
|
|
|
|
/* Times, etc., in order to re-adjust some key font heights. It */ |
|
|
|
|
/* allows the use of the IP instruction in the twilight zone, which */ |
|
|
|
|
/* otherwise would be invalid according to the specification. */ |
|
|
|
|
/* */ |
|
|
|
|
/* We implement it with a special sequence for the twilight zone. */ |
|
|
|
|
/* This is a bad hack, but it seems to work. */ |
|
|
|
|
/* */ |
|
|
|
|
/* Confirmed by Greg Hitchcock. */ |
|
|
|
|
|
|
|
|
|
distance = CUR_Func_read_cvt( cvtEntry ); |
|
|
|
|
|
|
|
|
|
if ( CUR.GS.gep0 == 0 ) /* If in twilight zone */ |
|
|
|
|
{ |
|
|
|
|
CUR.zp0.org[point].x = TT_MulFix14( (FT_UInt32)distance, CUR.GS.freeVector.x ); |
|
|
|
|
CUR.zp0.org[point].y = TT_MulFix14( (FT_UInt32)distance, CUR.GS.freeVector.y ), |
|
|
|
|
CUR.zp0.org[point].x = TT_MulFix14( (FT_UInt32)distance, |
|
|
|
|
CUR.GS.freeVector.x ); |
|
|
|
|
CUR.zp0.org[point].y = TT_MulFix14( (FT_UInt32)distance, |
|
|
|
|
CUR.GS.freeVector.y ), |
|
|
|
|
CUR.zp0.cur[point] = CUR.zp0.org[point]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -6220,19 +6222,17 @@ |
|
|
|
|
cvt_dist = -CUR.GS.single_width_value; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* XXX: UNDOCUMENTED! -- twilight zone */ |
|
|
|
|
|
|
|
|
|
/* UNDOCUMENTED! The MS rasterizer does that with */ |
|
|
|
|
/* twilight points (confirmed by Greg Hitchcock) */ |
|
|
|
|
if ( CUR.GS.gep1 == 0 ) |
|
|
|
|
{ |
|
|
|
|
CUR.zp1.org[point].x = CUR.zp0.org[CUR.GS.rp0].x + |
|
|
|
|
TT_MulFix14( (FT_UInt32)cvt_dist, |
|
|
|
|
CUR.GS.freeVector.x ); |
|
|
|
|
|
|
|
|
|
CUR.zp1.org[point].y = CUR.zp0.org[CUR.GS.rp0].y + |
|
|
|
|
TT_MulFix14( (FT_UInt32)cvt_dist, |
|
|
|
|
CUR.GS.freeVector.y ); |
|
|
|
|
|
|
|
|
|
CUR.zp1.cur[point] = CUR.zp0.cur[point]; |
|
|
|
|
CUR.zp1.cur[point] = CUR.zp0.cur[point]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
org_dist = CUR_Func_dualproj( &CUR.zp1.org[point], |
|
|
|
|