📄 ftmulti.c
字号:
Process_Event( grEvent* event )
{
int i, axis;
switch ( event->key )
{
case grKeyEsc: /* ESC or q */
case grKEY( 'q' ):
return 0;
case grKeyF1:
case grKEY( '?' ):
Help();
return 1;
/* mode keys */
case grKEY( 'a' ):
antialias = !antialias;
new_header = antialias ? (char *)"anti-aliasing is now on"
: (char *)"anti-aliasing is now off";
return 1;
case grKEY( 'b' ):
use_sbits = !use_sbits;
new_header = use_sbits
? (char *)"embedded bitmaps are now used if available"
: (char *)"embedded bitmaps are now ignored";
return 1;
case grKEY( 'n' ):
case grKEY( 'p' ):
return (int)event->key;
case grKEY( 'l' ):
low_prec = !low_prec;
new_header = low_prec
? (char *)"rendering precision is now forced to low"
: (char *)"rendering precision is now normal";
break;
case grKEY( 'h' ):
hinted = !hinted;
new_header = hinted ? (char *)"glyph hinting is now active"
: (char *)"glyph hinting is now ignored";
break;
case grKEY( ' ' ):
render_mode ^= 1;
new_header = render_mode ? (char *)"rendering all glyphs in font"
: (char *)"rendering test text string";
break;
/* MM related keys */
case grKeyF3:
i = -20;
axis = 0;
goto Do_Axis;
case grKeyF4:
i = 20;
axis = 0;
goto Do_Axis;
case grKeyF5:
i = -20;
axis = 1;
goto Do_Axis;
case grKeyF6:
i = 20;
axis = 1;
goto Do_Axis;
case grKeyF7:
i = -20;
axis = 2;
goto Do_Axis;
case grKeyF8:
i = 20;
axis = 2;
goto Do_Axis;
/* scaling related keys */
case grKeyPageUp:
i = 10;
goto Do_Scale;
case grKeyPageDown:
i = -10;
goto Do_Scale;
case grKeyUp:
i = 1;
goto Do_Scale;
case grKeyDown:
i = -1;
goto Do_Scale;
/* glyph index related keys */
case grKeyLeft:
i = -1;
goto Do_Glyph;
case grKeyRight:
i = 1;
goto Do_Glyph;
case grKeyF9:
i = -100;
goto Do_Glyph;
case grKeyF10:
i = 100;
goto Do_Glyph;
case grKeyF11:
i = -1000;
goto Do_Glyph;
case grKeyF12:
i = 1000;
goto Do_Glyph;
default:
;
}
return 1;
Do_Axis:
if ( axis < (int)multimaster->num_axis )
{
FT_Var_Axis* a = multimaster->axis + axis;
FT_Fixed pos = design_pos[axis];
/* Normalize i. changing by 20 is all very well for PostScript fonts */
/* which tend to have a range of ~1000 per axis, but it's not useful */
/* for mac fonts which have a range of ~3. */
/* And it's rather extreme for optical size even in PS */
pos += FT_MulDiv( i, a->maximum-a->minimum, 1000 );
if ( pos < a->minimum ) pos = a->minimum;
if ( pos > a->maximum ) pos = a->maximum;
design_pos[axis] = pos;
FT_Set_Var_Design_Coordinates( face, multimaster->num_axis, design_pos );
}
return 1;
Do_Scale:
ptsize += i;
if ( ptsize < 1 ) ptsize = 1;
if ( ptsize > MAXPTSIZE ) ptsize = MAXPTSIZE;
return 1;
Do_Glyph:
Num += i;
if ( Num < 0 ) Num = 0;
if ( Num >= num_glyphs ) Num = num_glyphs - 1;
return 1;
}
static void
usage( char* execname )
{
fprintf( stderr, "\n" );
fprintf( stderr, "ftmulti: multiple masters font viewer - part of FreeType\n" );
fprintf( stderr, "--------------------------------------------------------\n" );
fprintf( stderr, "\n" );
fprintf( stderr, "Usage: %s [options below] ppem fontname[.pfb|.ttf] ...\n",
execname );
fprintf( stderr, "\n" );
fprintf( stderr, " -e encoding select encoding (default: no encoding)\n" );
fprintf( stderr, " -r R use resolution R dpi (default: 72 dpi)\n" );
fprintf( stderr, " -f index specify first glyph index to display\n" );
fprintf( stderr, " -d \"axis1 axis2 ...\"\n"
" specify the design coordinates for each axis\n" );
fprintf( stderr, "\n" );
exit( 1 );
}
int
main( int argc,
char* argv[] )
{
int old_ptsize, orig_ptsize, file;
int first_glyph = 0;
int XisSetup = 0;
char* execname;
int option;
int file_loaded;
grEvent event;
execname = ft_basename( argv[0] );
while ( 1 )
{
option = getopt( argc, argv, "d:e:f:r:" );
if ( option == -1 )
break;
switch ( option )
{
case 'd':
parse_design_coords( optarg );
break;
case 'e':
encoding = (FT_Encoding)make_tag( optarg );
break;
case 'f':
first_glyph = atoi( optarg );
break;
case 'r':
res = atoi( optarg );
if ( res < 1 )
usage( execname );
break;
default:
usage( execname );
break;
}
}
argc -= optind;
argv += optind;
if ( argc <= 1 )
usage( execname );
if ( sscanf( argv[0], "%d", &orig_ptsize ) != 1 )
orig_ptsize = 64;
file = 1;
/* Initialize engine */
error = FT_Init_FreeType( &library );
if ( error )
PanicZ( "Could not initialize FreeType library" );
NewFile:
ptsize = orig_ptsize;
hinted = 1;
file_loaded = 0;
/* Load face */
error = FT_New_Face( library, argv[file], 0, &face );
if ( error )
goto Display_Font;
if ( encoding != FT_ENCODING_NONE )
{
error = FT_Select_Charmap( face, encoding );
if ( error )
goto Display_Font;
}
/* retrieve multiple master information */
error = FT_Get_MM_Var( face, &multimaster );
if ( error )
goto Display_Font;
/* if the user specified a position, use it, otherwise */
/* set the current position to the median of each axis */
{
int n;
for ( n = 0; n < (int)multimaster->num_axis; n++ )
{
design_pos[n] = n < requested_cnt ? requested_pos[n]
: multimaster->axis[n].def;
if ( design_pos[n] < multimaster->axis[n].minimum )
design_pos[n] = multimaster->axis[n].minimum;
else if ( design_pos[n] > multimaster->axis[n].maximum )
design_pos[n] = multimaster->axis[n].maximum;
}
}
error = FT_Set_Var_Design_Coordinates( face,
multimaster->num_axis,
design_pos );
if ( error )
goto Display_Font;
file_loaded++;
Reset_Scale( ptsize );
num_glyphs = face->num_glyphs;
glyph = face->glyph;
size = face->size;
Display_Font:
/* initialize graphics if needed */
if ( !XisSetup )
{
XisSetup = 1;
Init_Display();
}
grSetTitle( surface, "FreeType Glyph Viewer - press F1 for help" );
old_ptsize = ptsize;
if ( file_loaded >= 1 )
{
Fail = 0;
Num = first_glyph;
if ( Num >= num_glyphs )
Num = num_glyphs - 1;
if ( Num < 0 )
Num = 0;
}
for ( ;; )
{
int key;
Clear_Display();
if ( file_loaded >= 1 )
{
switch ( render_mode )
{
case 0:
Render_Text( Num );
break;
default:
Render_All( Num, ptsize );
}
sprintf( Header, "%s %s (file %s)",
face->family_name,
face->style_name,
ft_basename( argv[file] ) );
if ( !new_header )
new_header = Header;
grWriteCellString( &bit, 0, 0, new_header, fore_color );
new_header = 0;
sprintf( Header, "axis: " );
{
int n;
for ( n = 0; n < (int)multimaster->num_axis; n++ )
{
char temp[32];
sprintf( temp, " %s:%g",
multimaster->axis[n].name,
design_pos[n]/65536. );
strcat( Header, temp );
}
}
grWriteCellString( &bit, 0, 16, Header, fore_color );
sprintf( Header, "at %d points, first glyph = %d",
ptsize,
Num );
}
else
{
sprintf( Header, "%s: not an MM font file, or could not be opened",
ft_basename( argv[file] ) );
}
grWriteCellString( &bit, 0, 8, Header, fore_color );
grRefreshSurface( surface );
grListenSurface( surface, 0, &event );
if ( !( key = Process_Event( &event ) ) )
goto End;
if ( key == 'n' )
{
if ( file_loaded >= 1 )
FT_Done_Face( face );
if ( file < argc - 1 )
file++;
goto NewFile;
}
if ( key == 'p' )
{
if ( file_loaded >= 1 )
FT_Done_Face( face );
if ( file > 1 )
file--;
goto NewFile;
}
if ( ptsize != old_ptsize )
{
Reset_Scale( ptsize );
old_ptsize = ptsize;
}
}
End:
#if 0
grDoneSurface( surface );
grDone();
#endif
free ( multimaster );
FT_Done_Face ( face );
FT_Done_FreeType( library );
printf( "Execution completed successfully.\n" );
printf( "Fails = %d\n", Fail );
exit( 0 ); /* for safety reasons */
return 0; /* never reached */
}
/* End */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -