📄 ftview.c
字号:
x += x_advance + 1; if ( x + size->metrics.x_ppem > bit.width ) break; } else Fail++; p++; } } set_current_pointsize( first_size ); return FT_Err_Ok; } /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** REST OF THE APPLICATION/PROGRAM *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ static void Help( void ) { grEvent dummy_event; Clear_Display(); grGotoxy( 0, 0 ); grSetMargin( 2, 1 ); grGotobitmap( &bit ); grWriteln( "FreeType Glyph Viewer - part of the FreeType test suite" ); grLn(); grWriteln( "This program is used to display all glyphs from one or" ); grWriteln( "several font files, with the FreeType library." ); grLn(); grWriteln( "Use the following keys:" ); grLn(); grWriteln( " F1 or ? : display this help screen" ); grWriteln( " a : toggle anti-aliasing" ); grWriteln( " L : cycle through rendering modes" ); grWriteln( " h : toggle outline hinting" ); grWriteln( " b : toggle embedded bitmaps" ); grWriteln( " l : toggle low precision rendering" ); grWriteln( " f : toggle forced auto-hinting" ); grWriteln( " space : toggle rendering mode" ); grLn(); grWriteln( " c : toggle between cache modes" ); grLn(); grWriteln( " n : next font" ); grWriteln( " p : previous font" ); grLn(); grWriteln( " g : increase gamma by 0.1" ); grWriteln( " v : decrease gamma by 0.1" ); grLn(); grWriteln( " K : show gamma ramp" ); grLn(); grWriteln( " Up : increase pointsize by 1 unit" ); grWriteln( " Down : decrease pointsize by 1 unit" ); grWriteln( " Page Up : increase pointsize by 10 units" ); grWriteln( " Page Down : decrease pointsize by 10 units" ); grLn(); grWriteln( " Right : increment index" ); grWriteln( " Left : decrement index" ); grLn(); grWriteln( " F7 : decrement index by 10" ); grWriteln( " F8 : increment index by 10" ); grWriteln( " F9 : decrement index by 100" ); grWriteln( " F10 : increment index by 100" ); grWriteln( " F11 : decrement index by 1000" ); grWriteln( " F12 : increment index by 1000" ); grLn(); grWriteln( "press any key to exit this help screen" ); grRefreshSurface( surface ); grListenSurface( surface, gr_event_key, &dummy_event ); } static int Process_Event( grEvent* event ) { int i; switch ( event->key ) { case grKeyEsc: /* ESC or q */ case grKEY( 'q' ): return 0; case grKEY( 'a' ): antialias = !antialias; new_header = antialias ? (char *)"anti-aliasing is now on" : (char *)"anti-aliasing is now off"; set_current_image_type(); return 1; case grKEY( 'g' ): if ( the_gamma >= 3.0 ) the_gamma = 3.0; else the_gamma += 0.1; goto SetGamma; case grKEY( 'v' ): if ( the_gamma <= 0 ) the_gamma = 0; else the_gamma -= 0.1; goto SetGamma; SetGamma: grSetGlyphGamma( the_gamma ); sprintf( Header, "gamma changed to %.1f %s", the_gamma, the_gamma == 0.0 ? "(sRGB mode)" : "" ); new_header = Header; break; case grKEY( 'L' ): lcd_mode = ( lcd_mode + 1 ) % 6; switch ( lcd_mode ) { case 0: new_header = (char *)"normal anti-aliased rendering on"; break; case 1: new_header = (char *)"light anti-aliased rendering on"; break; case 2: new_header = (char *)"horizontal LCD-optimized rendering on (RGB)"; break; case 3: new_header = (char *)"horizontal LCD-optimized rendering on (BGR)"; break; case 4: new_header = (char *)"vertical LCD-optimized rendering on (RGB)"; break; case 5: new_header = (char *)"vertical LCD-optimized rendering on (BGR)"; break; default: ; } set_current_image_type(); return 1; case grKEY( 'c' ): use_sbits_cache = !use_sbits_cache; new_header = use_sbits_cache ? (char *)"now using sbits cache" : (char *)"now using normal cache"; return 1; case grKEY( 'f' ): autohint = !autohint; new_header = autohint ? (char *)"forced auto-hinting is now on" : (char *)"forced auto-hinting is now off"; set_current_image_type(); return 1; case grKEY( 'b' ): use_sbits = !use_sbits; new_header = use_sbits ? (char *)"embedded bitmaps are now used when available" : (char *)"embedded bitmaps are now ignored"; set_current_image_type(); 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"; set_current_image_type(); break; case grKEY( 'K' ): render_mode = RENDER_MODE_GAMMAGRID; new_header = (char*)"rendering gamma grid"; break; case grKEY( ' ' ): render_mode = ( render_mode + 1 ) % RENDER_MODE_GAMMAGRID; switch ( render_mode ) { case RENDER_MODE_ALL: new_header = (char*)"rendering all glyphs in font"; break; case RENDER_MODE_EMBOLDEN: new_header = (char*)"rendering emboldened text"; break; case RENDER_MODE_STROKE: new_header = (char*)"rendering stroked text"; break; case RENDER_MODE_TEXT: new_header = (char*)"rendering test text string"; break; case RENDER_MODE_WATERFALL: new_header = (char*)"rendering glyph waterfall"; break; case RENDER_MODE_GAMMAGRID: /* never happen */ new_header = (char*)"rendering gamma grid"; break; } break; case grKeyF1: case grKEY( '?' ): Help(); return 1; 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; case grKeyLeft: i = -1; goto Do_Glyph; case grKeyRight: i = 1; goto Do_Glyph; case grKeyF7: i = -10; goto Do_Glyph; case grKeyF8: i = 10; 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_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_indices ) Num = num_indices - 1; return 1; } static void usage( char* execname ) { fprintf( stderr, "\n" ); fprintf( stderr, "ftview: simple glyph viewer -- part of the FreeType project\n" ); fprintf( stderr, "-----------------------------------------------------------\n" ); fprintf( stderr, "\n" ); fprintf( stderr, "Usage: %s [options below] ppem fontname[.ttf|.ttc] ...\n", execname ); fprintf( stderr, "\n" ); fprintf( stderr, " -r R use resolution R dpi (default: 72 dpi)\n" ); fprintf( stderr, " -f index specify first index to display\n" ); fprintf( stderr, " -e enc specify encoding tag (default: no encoding)\n" ); fprintf( stderr, " -D dump cache usage statistics\n" ); fprintf( stderr, "\n" ); exit( 1 ); } int main( int argc, char* argv[] ) { int old_ptsize, orig_ptsize, font_index; int first_index = 0; int XisSetup = 0; char* execname; int option; const char* Header_format; grEvent event; execname = ft_basename( argv[0] ); while ( 1 ) { option = getopt( argc, argv, "Dde:f:l:r:" ); if ( option == -1 ) break; switch ( option ) { case 'd': debug = 1; break; case 'D': dump_cache_stats = 1; break; case 'e': encoding = (FT_Encoding)make_tag( optarg ); break; case 'f': first_index = atoi( optarg ); break; case 'l': trace_level = atoi( optarg ); if ( trace_level < 1 || trace_level > 7 ) usage( execname ); break; case 'r': res = atoi( optarg ); if ( res < 1 ) usage( execname ); break; default: usage( execname ); break; } } argc -= optind; argv += optind; Header_format = encoding != FT_ENCODING_NONE ? "at %d points, first char code = 0x%x" : "at %d points, first glyph index = %d"; if ( argc <= 1 ) usage( execname ); if ( sscanf( argv[0], "%d", &orig_ptsize ) != 1 ) orig_ptsize = 64;#if FREETYPE_MAJOR == 2 && FREETYPE_MINOR == 0 && FREETYPE_PATCH <= 8 if ( debug ) {# ifdef FT_DEBUG_LEVEL_TRACE FT_SetTraceLevel( trace_any, (FT_Byte)trace_level );# else trace_level = 0;# endif }#elif 0 /* "setenv/putenv" is not ANSI and I don't want to mess */ /* with this portability issue right now.. */ if ( debug ) { char temp[32]; sprintf( temp, "any=%d", trace_level ); setenv( "FT2_DEBUG", temp ); }#endif /* Initialize engine */ init_freetype(); argc--; argv++; for ( ; argc > 0; argc--, argv++ ) install_font_file( argv[0] ); if ( num_fonts == 0 ) PanicZ( "could not find/open any font file" ); font_index = 0; ptsize = orig_ptsize; NewFile: set_current_face( fonts[font_index] ); set_current_pointsize( ptsize ); set_current_image_type(); num_indices = fonts[font_index]->num_indices; error = FTC_Manager_LookupFace( cache_manager, current_font.face_id, &face ); if ( error ) { /* can't access the font file; do not render anything */ fprintf( stderr, "can't access font file %p\n", current_font.face_id ); exit( 1 ); } /* initialize graphics if needed */ if ( !XisSetup ) { XisSetup = 1; Init_Display(); } grSetTitle( surface, "FreeType Glyph Viewer - press F1 for help" ); old_ptsize = ptsize; if ( num_fonts >= 1 ) { Fail = 0; Num = first_index; if ( Num >= num_indices ) Num = num_indices - 1; if ( Num < 0 ) Num = 0; } for ( ;; ) { int key; Clear_Display(); if ( num_fonts >= 1 ) { error = FT_Err_Ok; switch ( render_mode ) { case RENDER_MODE_ALL: error = Render_All( Num ); break; case RENDER_MODE_EMBOLDEN: error = Render_Embolden( Num ); break; case RENDER_MODE_STROKE: error = Render_Stroke( Num ); break; case RENDER_MODE_TEXT: error = Render_Text( Num ); break; case RENDER_MODE_WATERFALL: error = Render_Waterfall( ptsize ); break; case RENDER_MODE_GAMMAGRID: error = Render_GammaGrid(); render_mode = RENDER_MODE_ALL; } if ( !new_header ) { if ( size ) sprintf( Header, "%s %s (file `%s')", face->family_name, face->style_name, ft_basename( ((PFont)current_font.face_id)->filepathname ) ); else { if ( error == FT_Err_Invalid_Pixel_Size ) sprintf( Header, "Invalid pixel size (file `%s')", ft_basename( ((PFont)current_font.face_id)->filepathname ) ); else if ( error == FT_Err_Invalid_PPem ) sprintf( Header, "Invalid ppem value (file `%s')", ft_basename( ((PFont)current_font.face_id)->filepathname ) ); else sprintf( Header, "File `%s': error 0x%04x", ft_basename( ((PFont)current_font.face_id)->filepathname ), (FT_UShort)error ); } new_header = Header; } grWriteCellString( &bit, 0, 0, new_header, fore_color ); new_header = 0; sprintf( Header, Header_format, ptsize, Num ); } grWriteCellString( &bit, 0, 8, Header, fore_color ); grRefreshSurface( surface ); if ( dump_cache_stats ) { /* dump simple cache manager statistics */ fprintf( stderr, "cache manager [ nodes, bytes, average ] = " " [ %d, %ld, %f ]\n", cache_manager->num_nodes, cache_manager->cur_weight, cache_manager->num_nodes > 0 ? cache_manager->cur_weight * 1.0 / cache_manager->num_nodes : 0.0 ); } grListenSurface( surface, 0, &event ); if ( !( key = Process_Event( &event ) ) ) goto End; if ( key == 'n' ) { if ( font_index + 1 < num_fonts ) font_index++; goto NewFile; } if ( key == 'p' ) { if ( font_index > 0 ) font_index--; goto NewFile; } if ( ptsize != old_ptsize ) { set_current_pointsize( ptsize ); old_ptsize = ptsize; } } End: printf( "Execution completed successfully.\n" ); printf( "Fails = %d\n", Fail ); done_freetype(); exit( 0 ); /* for safety reasons */ return 0; /* never reached */ }/* End */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -