[truetype] Fix some comments in the bytecode interpreter.
Thanks to Greg Hitchcock!
This commit is contained in:
parent
29a7965fd1
commit
f2573a0611
@ -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],
|
||||
|
Loading…
Reference in New Issue
Block a user