📄 ftview.c
字号:
{
case LCD_MODE_AA:
status.header = (char *)"normal anti-aliased rendering on";
break;
case LCD_MODE_LIGHT:
status.header = (char *)"light anti-aliased rendering on";
break;
case LCD_MODE_RGB:
status.header = (char *)"horizontal LCD-optimized rendering on (RGB)";
break;
case LCD_MODE_BGR:
status.header = (char *)"horizontal LCD-optimized rendering on (BGR)";
break;
case LCD_MODE_VRGB:
status.header = (char *)"vertical LCD-optimized rendering on (RGB)";
break;
case LCD_MODE_VBGR:
status.header = (char *)"vertical LCD-optimized rendering on (BGR)";
break;
}
FTDemo_Update_Current_Flags( handle );
break;
case grKEY( ' ' ):
event_render_mode_change( 1 );
break;
case grKEY( 'G' ):
event_gamma_grid();
break;
case grKEY( 'g' ):
event_gamma_change( 0.1 );
break;
case grKEY( 'v' ):
event_gamma_change( -0.1 );
break;
case grKEY( 'n' ):
event_font_change( 1 );
break;
case grKEY( 'p' ):
event_font_change( -1 );
break;
case grKeyUp: event_size_change( 1 ); break;
case grKeyDown: event_size_change( -1 ); break;
case grKeyPageUp: event_size_change( 10 ); break;
case grKeyPageDown: event_size_change( -10 ); break;
case grKeyLeft: event_index_change( -1 ); break;
case grKeyRight: event_index_change( 1 ); break;
case grKeyF7: event_index_change( -10 ); break;
case grKeyF8: event_index_change( 10 ); break;
case grKeyF9: event_index_change( -100 ); break;
case grKeyF10: event_index_change( 100 ); break;
case grKeyF11: event_index_change( -1000 ); break;
case grKeyF12: event_index_change( 1000 ); break;
default:
;
}
return ret;
}
static void
write_header( FT_Error error_code )
{
FT_Face face;
const char* basename;
const char* format;
error = FTC_Manager_LookupFace( handle->cache_manager,
handle->image_type.face_id, &face );
if ( error )
PanicZ( "can't access font file" );
if ( !status.header )
{
basename = ft_basename( handle->current_font->filepathname );
switch ( error_code )
{
case FT_Err_Ok:
sprintf( status.header_buffer, "%s %s (file `%s')", face->family_name,
face->style_name, basename );
break;
case FT_Err_Invalid_Pixel_Size:
sprintf( status.header_buffer, "Invalid pixel size (file `%s')", basename );
break;
case FT_Err_Invalid_PPem:
sprintf( status.header_buffer, "Invalid ppem value (file `%s')", basename );
break;
default:
sprintf( status.header_buffer, "File `%s': error 0x%04x", basename,
(FT_UShort)error_code );
break;
}
status.header = status.header_buffer;
}
grWriteCellString( display->bitmap, 0, 0, status.header, display->fore_color );
format = ( status.encoding != FT_ENCODING_NONE )
? "at %d points, first char code = 0x%x"
: "at %d points, first glyph index = %d";
snprintf( status.header_buffer, 256, format, status.ptsize, status.Num );
if ( FT_HAS_GLYPH_NAMES( face ) )
{
char* p;
int format_len, gindex, size;
size = strlen( status.header_buffer );
p = status.header_buffer + size;
size = 256 - size;
format = ", name = ";
format_len = strlen( format );
if ( size >= format_len + 2 )
{
gindex = status.Num;
if ( status.encoding != FT_ENCODING_NONE )
gindex = FTDemo_Get_Index( handle, status.Num );
strcpy( p, format );
if ( FT_Get_Glyph_Name( face, gindex, p + format_len, size - format_len ) )
*p = '\0';
}
}
status.header = status.header_buffer;
grWriteCellString( display->bitmap, 0, HEADER_HEIGHT, status.header_buffer,
display->fore_color );
grRefreshSurface( display->surface );
}
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 [status 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, " -m text use `text' for rendering\n" );
fprintf( stderr, " -l nn change rendering mode (0 <= nn <= %d)\n",
N_LCD_MODES );
fprintf( stderr, " -p preload file in memory, simulates memory-mapped file\n" );
fprintf( stderr, "\n" );
exit( 1 );
}
static void
parse_cmdline( int* argc,
char** argv[] )
{
char* execname;
int option;
execname = ft_basename( (*argv)[0] );
while ( 1 )
{
option = getopt( *argc, *argv, "Dde:f:L:l:r:m:p" );
if ( option == -1 )
break;
switch ( option )
{
case 'd':
status.debug = 1;
break;
case 'D':
status.dump_cache_stats = 1;
break;
case 'e':
status.encoding = FTDemo_Make_Encoding_Tag( optarg );
break;
case 'f':
status.Num = atoi( optarg );
break;
case 'L':
status.trace_level = atoi( optarg );
if ( status.trace_level < 1 || status.trace_level > 7 )
usage( execname );
break;
case 'l':
status.lcd_mode = atoi( optarg );
if ( status.lcd_mode < 0 || status.lcd_mode > N_LCD_MODES )
{
fprintf( stderr, "argument to `l' must be between 0 and %d\n",
N_LCD_MODES );
exit( 3 );
}
break;
case 'm':
Text = (unsigned char*)optarg;
status.render_mode = RENDER_MODE_TEXT;
break;
case 'r':
status.res = atoi( optarg );
if ( status.res < 1 )
usage( execname );
break;
case 'p':
status.preload = 1;
break;
default:
usage( execname );
break;
}
}
*argc -= optind;
*argv += optind;
if ( *argc <= 1 )
usage( execname );
status.ptsize = atoi( *argv[0] );
if ( status.ptsize == 0 )
status.ptsize = 64;
(*argc)--;
(*argv)++;
}
int
main( int argc,
char* argv[] )
{
grEvent event;
parse_cmdline( &argc, &argv );
#if FREETYPE_MAJOR == 2 && FREETYPE_MINOR == 0 && FREETYPE_PATCH <= 8
if ( status.debug )
{
# ifdef FT_DEBUG_LEVEL_TRACE
FT_SetTraceLevel( trace_any, (FT_Byte)status.trace_level );
# else
status.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 ( status.debug )
{
char temp[32];
sprintf( temp, "any=%d", status.trace_level );
setenv( "FT2_DEBUG", temp );
}
#endif
/* Initialize engine */
handle = FTDemo_New( status.encoding );
if ( status.preload )
FTDemo_Set_Preload( handle, 1 );
for ( ; argc > 0; argc--, argv++ )
FTDemo_Install_Font( handle, argv[0] );
if ( handle->num_fonts == 0 )
PanicZ( "could not find/open any font file" );
display = FTDemo_Display_New( gr_pixel_mode_rgb24 );
if ( !display )
PanicZ( "could not allocate display surface" );
memset( display->fore_color.chroma, 0, 4 );
memset( display->back_color.chroma, 0xff, 4 );
grSetTitle( display->surface, "FreeType Glyph Viewer - press F1 for help" );
status.Fail = 0;
event_font_change( 0 );
if ( status.lcd_mode >= 0 )
handle->lcd_mode = status.lcd_mode;
FTDemo_Update_Current_Flags( handle );
for ( ;; )
{
FTDemo_Display_Clear( display );
switch ( status.render_mode )
{
case RENDER_MODE_ALL:
error = Render_All( handle->current_font->num_indices, status.Num );
break;
case RENDER_MODE_EMBOLDEN:
error = Render_Embolden( handle->current_font->num_indices, status.Num );
break;
case RENDER_MODE_STROKE:
error = Render_Stroke( handle->current_font->num_indices, status.Num );
break;
case RENDER_MODE_TEXT:
error = Render_Text( -1, status.Num );
break;
case RENDER_MODE_WATERFALL:
error = Render_Waterfall( status.ptsize );
break;
}
write_header( error );
#if FREETYPE_MAJOR == 2 && FREETYPE_MINOR < 2
if ( status.dump_cache_stats )
{
/* dump simple cache manager statistics */
fprintf( stderr, "cache manager [ nodes, bytes, average ] = "
" [ %d, %ld, %f ]\n",
handle->cache_manager->num_nodes,
handle->cache_manager->cur_weight,
handle->cache_manager->num_nodes > 0
? handle->cache_manager->cur_weight * 1.0 /
handle->cache_manager->num_nodes
: 0.0 );
}
#endif
status.header = 0;
grListenSurface( display->surface, 0, &event );
if ( Process_Event( &event ) )
break;
}
printf( "Execution completed successfully.\n" );
printf( "Fails = %d\n", status.Fail );
FTDemo_Display_Done( display );
FTDemo_Done( handle );
exit( 0 ); /* for safety reasons */
return 0; /* never reached */
}
/* End */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -