[truetype ] Remove unusued code. Add minor fixes.

This commit is contained in:
Infinality 2012-12-16 19:52:01 -06:00
parent 309b8b31e0
commit 71f242c26a
6 changed files with 117 additions and 140 deletions

View File

@ -1,4 +1,36 @@
2012-12-16 Werner Lemberg <wl@gnu.org>
2012-12-16 Infinality <infinality@infinality.net>
[truetype] Remove unusued code and variables. Add minor fixes.
* src/truetype/ttsubpix.h: Updated.
(SKIP_NONPIXEL_Y_MOVES_Rules_Exceptions): Add Trebuchet MS.
(ALLOW_X_DMOVEX_Rules): Remove Arial characters.
(ALLOW_X_DMOVE_Rules): Remove Arial characters.
(RASTERIZER_35_Rules): Verdana no longer needs to be here.
(SKIP_IUP_Rules): Formatting fix.
(DELTAP_SKIP_EXAGGERATED_VALUES_Rules): Remove Segoe UI.
(COMPATIBLE_WIDTHS_Rules): Add Monaco and Trebuchet MS.
(X_SCALING_Rules): Add misc. corrective fixes.
* src/truetype/ttgload.c: (TT_Process_Simple_Glyph): Adjust correction
factor for emboldening during scaling.
* src/truetype/ttinterp.h: Updated.
(TT_ExecContextRec): Remove unused variables.
* src/truetype/ttobjs.h: Updated.
(TT_SizeRec): Add ttfautohinted variable.
* src/truetype/ttinterp.c: Updated.
(Ins_FDEF): Rework code to fix bugs and add more detection.
(Ins_CALL): Remove unused code.
(Ins_LOOPCALL): Remove unused code.
(TT_RunIns): Remove unusued code.
(Ins_SHPIX): Add logic to handle ttfautohinted fonts.
(Ins_MIRP): Don't round x in cut-in calculation. Add logic to handle
ttfautohinted fonts.
2012-12-16 Werner Lemberg <wl@gnu.org>
[sfnt] Fix Savannah bug #37936.

View File

@ -932,7 +932,7 @@
/* the amount was determined via experimentation */
if ( x_scale_factor != 1000 && ppem > 11 )
FT_Outline_EmboldenXY( outline,
FT_MulDiv( 16 * ppem,
FT_MulDiv( 80 * ppem,
1000 - x_scale_factor,
0x1000L ), 0 );
#else

View File

@ -4612,21 +4612,25 @@
TT_DefRecord* limit;
#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
#if 0
int opcode_pattern[4][12] = {
/* VacuFormRound function */
{0x45,0x23,0x46,0x60,0x20},
/* inline delta function 1 */
{0x4B,0x53,0x23,0x4B,0x51,0x5A,0x58,0x38,0x1B,0x21,0x21,0x59},
/* inline delta function 2 */
{0x4B,0x54,0x58,0x38,0x1B,0x5A,0x21,0x21,0x59},
/* diagonal stroke function */
{0x20,0x20,0x40,0x60,0x47,0x40,0x23,0x42},
};
int opcode_patterns = 4;
int i;
int opcode_pointer[4] = {0,0,0,0};
#endif /* 0 */
FT_Byte opcode_pattern[7][12] = {
/* inline delta function 1 */
{0x4B,0x53,0x23,0x4B,0x51,0x5A,0x58,0x38,0x1B,0x21,0x21,0x59},
/* inline delta function 2 */
{0x4B,0x54,0x58,0x38,0x1B,0x5A,0x21,0x21,0x59,},
/* diagonal stroke function */
{0x20,0x20,0x40,0x60,0x47,0x40,0x23,0x42,},
/* VacuFormRound function */
{0x45,0x23,0x46,0x60,0x20,},
/* ttfautohinted */
{0x20,0x64,0xb0,0x60,0x66,0x23,0xb0,},
/* spacing functions */
{0x01,0x41,0x43,0x58,},
{0x01,0x18,0x41,0x43,0x58,},
};
FT_UShort opcode_patterns = 7;
FT_UShort opcode_pointer[7] = {0,0,0,0,0,0,0};
FT_UShort opcode_size[7] = {12,9,8,5,7,4,5};
FT_UShort i;
#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
@ -4677,14 +4681,15 @@
while ( SKIP_Code() == SUCCESS )
{
#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
#if 0
#ifdef SPH_DEBUG_MORE_VERBOSE
printf ("Opcode: %d ", CUR.opcode);
printf ( "Opcode: %d ", CUR.opcode );
#endif
for ( i = 0; i < opcode_patterns; i++ )
{
if ( CUR.opcode == opcode_pattern[i][opcode_pointer[i]] )
if ( opcode_pointer[i] < opcode_size[i] &&
CUR.opcode == opcode_pattern[i][opcode_pointer[i]] )
{
#ifdef SPH_DEBUG_MORE_VERBOSE
printf( "function %d, opcode ptrn: %d"
@ -4693,51 +4698,33 @@
#endif
opcode_pointer[i] += 1;
if ( i == 0 && opcode_pointer[0] == 5 )
if ( opcode_pointer[i] == opcode_size[i] )
{
CUR.inline_delta_funcs[CUR.num_delta_funcs] = n;
CUR.num_delta_funcs++;
#ifdef SPH_DEBUG
printf( "Vacuform Round FUNCTION %d detected\n", n);
printf( "Function signature %d detected in FDEF %d\n", i, n);
#endif
/*rec->active = FALSE;*/
opcode_pointer[i] = 0;
}
if ( i == 1 && opcode_pointer[1] == 12 )
{
CUR.inline_delta_funcs[CUR.num_delta_funcs] = n;
CUR.num_delta_funcs++;
#ifdef SPH_DEBUG
printf( "inline delta FUNCTION1 %d detected\n",
n, CUR.num_delta_funcs);
#endif
rec->inline_delta = TRUE;
opcode_pointer[i] = 0;
}
switch ( i )
{
case 0:
case 1:
rec->inline_delta = TRUE;
break;
if ( i == 2 && opcode_pointer[1] == 9 )
{
CUR.inline_delta_funcs[CUR.num_delta_funcs] = n;
CUR.num_delta_funcs++;
rec->inline_delta = TRUE;
#ifdef SPH_DEBUG
printf( "inline delta2 FUNCTION2 %d detected\n",
n, CUR.num_delta_funcs);
#endif
opcode_pointer[i] = 0;
}
case 2:
case 3:
rec->active = FALSE;
break;
if ( i == 4 && opcode_pointer[1] == 8 )
{
CUR.inline_delta_funcs[CUR.num_delta_funcs] = n;
CUR.num_delta_funcs++;
/*rec->active = FALSE;*/
#ifdef SPH_DEBUG
printf( "diagonal stroke function %d detected\n",
n, CUR.num_delta_funcs);
#endif
case 4:
CUR.size->ttfautohinted = TRUE;
break;
case 5:
case 6:
rec->active = FALSE;
break;
}
opcode_pointer[i] = 0;
}
}
@ -4745,7 +4732,7 @@
else
opcode_pointer[i] = 0;
}
#endif /* 0 */
#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
switch ( CUR.opcode )
@ -4833,10 +4820,6 @@
TT_CallRec* pCrec;
TT_DefRecord* def;
#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
FT_Bool oldF;
#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
/* first of all, check the index */
@ -4874,16 +4857,6 @@
if ( !def->active )
goto Fail;
#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
/* This is test code used to detect inline delta functions */
oldF = def->inline_delta;
if ( CUR.ignore_x_mode && def->inline_delta )
CUR.in_delta_function = TRUE;
#ifdef SPH_DEBUG
printf("Entering function %d\n", F);
#endif
#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
/* check the call stack */
if ( CUR.callTop >= CUR.callSize )
@ -4906,13 +4879,6 @@
def->start );
CUR.step_ins = FALSE;
#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
CUR.in_delta_function = oldF;
#ifdef SPH_DEBUG
printf("Leaving function %d\n", F);
#endif
#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
return;
Fail:
@ -4933,10 +4899,6 @@
TT_CallRec* pCrec;
TT_DefRecord* def;
#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
FT_Bool oldF;
#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
/* first of all, check the index */
F = args[1];
@ -4973,13 +4935,6 @@
if ( !def->active )
goto Fail;
#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
oldF = def->inline_delta;
if ( CUR.ignore_x_mode && def->inline_delta )
CUR.in_delta_function = TRUE;
#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
/* check stack */
if ( CUR.callTop >= CUR.callSize )
{
@ -5004,10 +4959,6 @@
CUR.step_ins = FALSE;
}
#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
CUR.in_delta_function = oldF;
#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
return;
Fail:
@ -6147,7 +6098,8 @@
CUR.GS.freeVector.y != 0 &&
B1 % 64 == 0 &&
B2 % 64 != 0 &&
B1 != B2 ) )
B1 != B2 &&
!CUR.size->ttfautohinted ) )
{
#ifdef SPH_DEBUG
printf( "Reversing ZP2 move\n" );
@ -6645,13 +6597,6 @@
if ( FT_ABS( cvt_dist - org_dist ) > control_value_cutin )
cvt_dist = org_dist;
}
#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
if ( CUR.ignore_x_mode && CUR.GS.freeVector.x != 0 )
distance = ROUND_None(
cvt_dist,
CUR.tt_metrics.compensations[CUR.opcode & 3] );
else
#endif
distance = CUR_Func_round(
cvt_dist,
@ -6705,7 +6650,8 @@
if ( ( CUR.sph_tweak_flags & SPH_TWEAK_SKIP_OFFPIXEL_Y_MOVES ) &&
CUR.GS.freeVector.y != 0 &&
B1 % 64 == 0 &&
B2 % 64 != 0 )
B2 % 64 != 0 &&
!CUR.size->ttfautohinted )
reverse_move = TRUE;
if ( ( CUR.sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) &&
@ -7473,7 +7419,8 @@
( ( ( CUR.sph_tweak_flags &
SPH_TWEAK_SKIP_OFFPIXEL_Y_MOVES ) &&
B1 % 64 == 0 &&
B2 % 64 != 0 ) ||
B2 % 64 != 0 &&
!CUR.size->ttfautohinted ) ||
( ( CUR.sph_tweak_flags &
SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) &&
B1 % 64 != 0 &&
@ -8096,11 +8043,7 @@
#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
if ( CUR.ignore_x_mode )
{
/* ensure some variables are set for this run */
CUR.iup_called = FALSE;
CUR.in_delta_function = FALSE;
}
#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
/* set CVT functions */

View File

@ -285,14 +285,9 @@ FT_BEGIN_HEADER
FT_Int rasterizer_version; /* MS rasterizer version */
FT_Bool iup_called; /* IUP called for glyph? */
FT_Bool in_delta_function; /* inside an inline delta */
/* function? */
FT_ULong sph_tweak_flags; /* flags to control */
/* hint tweaks */
FT_Int num_delta_funcs;
FT_ULong inline_delta_funcs[5];
#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
} TT_ExecContextRec;

View File

@ -334,6 +334,7 @@ FT_BEGIN_HEADER
FT_Bool bytecode_ready;
FT_Bool cvt_ready;
FT_Bool ttfautohinted;
#endif /* TT_USE_BYTECODE_INTERPRETER */

View File

@ -259,6 +259,7 @@ FT_BEGIN_HEADER
"Lucida Console",
"Lucida Grande",
"Lucida Sans Unicode",
"Lucida Sans Typewriter",
"Microsoft Sans Serif",
"Monaco",
"Tahoma",
@ -414,7 +415,7 @@ FT_BEGIN_HEADER
};
#define SKIP_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE 5
#define SKIP_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE 6
SPH_TweakRule SKIP_NONPIXEL_Y_MOVES_Rules_Exceptions
[SKIP_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] =
@ -425,6 +426,7 @@ FT_BEGIN_HEADER
{ "Verdana", 11, "Bold", 'x' },
/* Cyrillic small letter I */
{ "Arial", 0, "", 0x438 },
{ "Trebuchet MS", 0, "Bold", 0 },
};
@ -477,26 +479,21 @@ FT_BEGIN_HEADER
/* Allow a Direct_Move_X along X freedom vector if matched. */
#define ALLOW_X_DMOVEX_RULES_SIZE 2
#define ALLOW_X_DMOVEX_RULES_SIZE 1
SPH_TweakRule ALLOW_X_DMOVEX_Rules
[ALLOW_X_DMOVEX_RULES_SIZE] =
{
/* Creates a more consistent appearance for these */
{ "Arial", 13, "Regular", 'e' },
{ "Arial", 13, "Regular", 'o' },
{ "-", 0, "Regular", 0 },
};
/* Allow a Direct_Move along X freedom vector if matched. */
#define ALLOW_X_DMOVE_RULES_SIZE 3
#define ALLOW_X_DMOVE_RULES_SIZE 1
SPH_TweakRule ALLOW_X_DMOVE_Rules
[ALLOW_X_DMOVE_RULES_SIZE] =
{
/* Creates a more consistent appearance for these */
{ "Arial", 13, "Regular", 'e' },
{ "Arial", 13, "Regular", 'o' },
/* Fixes vanishing diagonal in 4 */
{ "Verdana", 0, "Regular", '4' },
};
@ -514,7 +511,7 @@ FT_BEGIN_HEADER
/* Return MS rasterizer version 35 if matched. */
#define RASTERIZER_35_RULES_SIZE 9
#define RASTERIZER_35_RULES_SIZE 8
SPH_TweakRule RASTERIZER_35_Rules
[RASTERIZER_35_RULES_SIZE] =
@ -528,9 +525,6 @@ FT_BEGIN_HEADER
{ "Times New Roman", 0, "Regular", 'n' },
{ "Times New Roman", 0, "Regular", 'p' },
{ "Times", 0, "", 0 },
/* Verdana 5.05 from Windows 7 SP1 has issues at 37+ */
/* This is only a workaround */
{ "Verdana", 0, "", 0 },
};
@ -551,9 +545,9 @@ FT_BEGIN_HEADER
SPH_TweakRule SKIP_IUP_Rules
[SKIP_IUP_RULES_SIZE] =
{
{ "Arial", 13, "Regular", 'a' },
};
{
{ "Arial", 13, "Regular", 'a' },
};
/* Skip MIAP Twilight hack if matched. */
@ -567,7 +561,7 @@ FT_BEGIN_HEADER
/* Skip DELTAP instructions if matched. */
#define ALWAYS_SKIP_DELTAP_RULES_SIZE 14
#define ALWAYS_SKIP_DELTAP_RULES_SIZE 16
SPH_TweakRule ALWAYS_SKIP_DELTAP_Rules
[ALWAYS_SKIP_DELTAP_RULES_SIZE] =
@ -575,7 +569,10 @@ FT_BEGIN_HEADER
{ "Georgia", 0, "Regular", 'k' },
/* fixes problems with W M w */
{ "Trebuchet MS", 0, "Italic", 0 },
/* fix various problems with e in different versions */
{ "Trebuchet MS", 14, "Regular", 'e' },
{ "Trebuchet MS", 13, "Regular", 'e' },
{ "Trebuchet MS", 15, "Regular", 'e' },
{ "Arial", 11, "Regular", 's' },
{ "Verdana", 10, "Regular", 0 },
{ "Verdana", 9, "Regular", 0 },
@ -624,15 +621,13 @@ FT_BEGIN_HEADER
/* Skip moves that meet or exceed 1 pixel. */
#define DELTAP_SKIP_EXAGGERATED_VALUES_RULES_SIZE 2
#define DELTAP_SKIP_EXAGGERATED_VALUES_RULES_SIZE 1
SPH_TweakRule DELTAP_SKIP_EXAGGERATED_VALUES_Rules
[DELTAP_SKIP_EXAGGERATED_VALUES_RULES_SIZE] =
{
/* Fix vanishing stems */
{ "Ubuntu", 0, "Regular", 'M' },
/* Fix X at larger ppems */
{ "Segoe UI", 0, "Light", 0 },
};
@ -769,7 +764,7 @@ FT_BEGIN_HEADER
/* Use compatible widths with these glyphs. Compatible widths is always */
/* on when doing B/W TrueType instructing, but is used selectively here, */
/* typically on glyphs with 3 or more vertical stems. */
#define COMPATIBLE_WIDTHS_RULES_SIZE 36
#define COMPATIBLE_WIDTHS_RULES_SIZE 38
SPH_TweakRule COMPATIBLE_WIDTHS_Rules
[COMPATIBLE_WIDTHS_RULES_SIZE] =
@ -792,6 +787,7 @@ FT_BEGIN_HEADER
{ "Microsoft Sans Serif", 11, "Regular Class", 0 },
{ "Microsoft Sans Serif", 12, "Regular Class", 0 },
{ "Segoe UI", 11, "Regular Class", 0 },
{ "Monaco", 0, "Regular Class", 0 },
{ "Segoe UI", 12, "Regular Class", 'm' },
{ "Segoe UI", 14, "Regular Class", 'm' },
{ "Tahoma", 11, "Regular Class", 0 },
@ -799,6 +795,7 @@ FT_BEGIN_HEADER
{ "Times New Roman", 16, "Regular Class", 'm' },
{ "Times New Roman", 16, "Regular Class", 'o' },
{ "Times New Roman", 16, "Regular Class", 'w' },
{ "Trebuchet MS", 11, "Regular Class", 0 },
{ "Trebuchet MS", 12, "Regular Class", 0 },
{ "Trebuchet MS", 14, "Regular Class", 0 },
{ "Trebuchet MS", 15, "Regular Class", 0 },
@ -821,7 +818,7 @@ FT_BEGIN_HEADER
/* more visually pleasing glyphs in certain cases. */
/* This sometimes needs to be coordinated with compatible width rules. */
/* A value of 1000 corresponds to a scaled value of 1.0. */
#define X_SCALING_RULES_SIZE 41
#define X_SCALING_RULES_SIZE 50
SPH_ScaleRule X_SCALING_Rules
[X_SCALING_RULES_SIZE] =
@ -833,6 +830,8 @@ FT_BEGIN_HEADER
{ "Arial", 12, "Regular Class", 'm', 1050 },
/* Cyrillic small letter el */
{ "Arial", 13, "Regular Class", 0x43B, 950 },
{ "Arial", 13, "Regular Class", 'o', 950 },
{ "Arial", 13, "Regular Class", 'e', 950 },
{ "Arial", 14, "Regular Class", 'm', 950 },
/* Cyrillic small letter el */
{ "Arial", 15, "Regular Class", 0x43B, 925 },
@ -861,14 +860,21 @@ FT_BEGIN_HEADER
{ "Segoe UI", 12, "Regular Class", 'H', 1050 },
{ "Segoe UI", 12, "Regular Class", 'm', 1050 },
{ "Segoe UI", 14, "Regular Class", 'm', 1050 },
{ "Tahoma", 11, "Regular Class", 'm', 975 },
{ "Tahoma", 11, "Regular Class", 'i', 975 },
{ "Tahoma", 11, "Regular Class", 'l', 975 },
{ "Tahoma", 11, "Regular Class", 'j', 900 },
{ "Tahoma", 11, "Regular Class", 'm', 918 },
{ "Verdana", 10, "Regular/Italic Class", 0, 1100 },
{ "Verdana", 12, "Regular Class", 'm', 975 },
{ "Verdana", 12, "Regular/Italic Class", 0, 1050 },
{ "Verdana", 13, "Regular/Italic Class", 'i', 950 },
{ "Verdana", 13, "Regular/Italic Class", 'j', 950 },
{ "Verdana", 13, "Regular/Italic Class", 'l', 950 },
{ "Verdana", 16, "Regular Class", 0, 1050 },
{ "Verdana", 9, "Regular/Italic Class", 0, 1050 },
{ "Times New Roman", 16, "Regular Class", 'm', 950 },
{ "Trebuchet MS", 12, "Regular Class", 'm', 950 },
{ "Times New Roman", 16, "Regular Class", 'm', 918 },
{ "Trebuchet MS", 11, "Regular Class", 'm', 800 },
{ "Trebuchet MS", 12, "Regular Class", 'm', 800 },
};
#else