📄 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 + -