📄 ftstring.c
字号:
break;
case grKEY( 'V' ):
sc->vertical = !sc->vertical;
status.header = sc->vertical
? (char *)"using vertical layout"
: (char *)"using horizontal layout";
break;
case grKEY( 'G' ):
sc->gamma_ramp = sc->gamma_ramp ? NULL : status.gamma_ramp;
status.header = sc->gamma_ramp
? (char *)"gamma correction is now on"
: (char *)"gamma correction is now off";
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_angle_change( -3 ); break;
case grKeyRight: event_angle_change( 3 ); break;
case grKeyF7: event_angle_change( -30 ); break;
case grKeyF8: event_angle_change( 30 ); break;
default:
break;
}
return ret;
}
static void
gamma_ramp_draw( FT_Byte gamma_ramp[256],
grBitmap* bitmap )
{
int i, x, y;
FT_Byte* p = (FT_Byte*)bitmap->buffer;
if ( bitmap->pitch < 0 )
p += -bitmap->pitch * ( bitmap->rows - 1 );
x = ( bitmap->width - 256 ) / 2;
y = ( bitmap->rows + 256 ) / 2;
for (i = 0; i < 256; i++)
p[bitmap->pitch * ( y - gamma_ramp[i] ) + ( x + i )] = 80;
}
static void
write_header( FT_Error error_code )
{
FT_Face face;
const char* basename;
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 );
sprintf( status.header_buffer, "at %d points, angle = %d",
status.ptsize, status.angle );
grWriteCellString( display->bitmap, 0, CELLSTRING_HEIGHT,
status.header_buffer, display->fore_color );
grRefreshSurface( display->surface );
}
static void
usage( char* execname )
{
fprintf( stderr, "\n" );
fprintf( stderr, "ftstring: string 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, " -e enc specify encoding tag (default: unic)\n" );
fprintf( stderr, " -r R use resolution R dpi (default: 72 dpi)\n" );
fprintf( stderr, " -m message message to display\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, "e:m:r:" );
if ( option == -1 )
break;
switch ( option )
{
case 'e':
status.encoding = FTDemo_Make_Encoding_Tag( optarg );
break;
case 'r':
status.res = atoi( optarg );
if ( status.res < 1 )
usage( execname );
break;
case 'm':
if ( *argc < 3 )
usage( execname );
Text = optarg;
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 );
/* Initialize engine */
handle = FTDemo_New( status.encoding );
handle->use_sbits = 0;
FTDemo_Update_Current_Flags( handle );
for ( ; argc > 0; argc--, argv++ )
{
error = FTDemo_Install_Font( handle, argv[0] );
if ( error )
{
fprintf( stderr, "failed to install %s", argv[0] );
if ( error == FT_Err_Invalid_CharMap_Handle )
fprintf( stderr, ": missing valid charmap\n" );
else
fprintf( stderr, "\n" );
}
}
if ( handle->num_fonts == 0 )
PanicZ( "could not open any font file" );
display = FTDemo_Display_New( gr_pixel_mode_gray );
display->back_color.value = 0;
display->fore_color.value = 0xff;
if ( !display )
PanicZ( "could not allocate display surface" );
grSetTitle( display->surface,
"FreeType String Viewer - press F1 for help" );
event_gamma_change( 0 );
event_font_change( 0 );
status.header = 0;
for ( ;; )
{
FTDemo_Display_Clear( display );
switch ( status.render_mode )
{
case RENDER_MODE_STRING:
status.sc.center = 1L << 15;
error = FTDemo_String_Draw( handle, display,
&status.sc,
display->bitmap->width / 2,
display->bitmap->rows / 2 );
break;
case RENDER_MODE_KERNCMP:
{
FTDemo_String_Context sc = status.sc;
FT_Int x, y;
FT_UInt height;
x = 55;
/* whatever.. */
height = status.ptsize * status.res / 72;
if ( height < CELLSTRING_HEIGHT )
height = CELLSTRING_HEIGHT;
/* First line: none */
sc.center = 0;
sc.kerning_mode = 0;
sc.kerning_degree = 0;
sc.vertical = 0;
sc.matrix = NULL;
y = CELLSTRING_HEIGHT * 2 + display->bitmap->rows / 4 + height;
grWriteCellString( display->bitmap, 5,
y - ( height + CELLSTRING_HEIGHT ) / 2,
"none", display->fore_color );
error = FTDemo_String_Draw( handle, display, &sc, x, y );
/* Second line: track kern only */
sc.kerning_degree = status.sc.kerning_degree;
y += height;
grWriteCellString( display->bitmap, 5,
y - ( height + CELLSTRING_HEIGHT ) / 2,
"track", display->fore_color );
error = FTDemo_String_Draw( handle, display, &sc, x, y );
/* Third line: track kern + pair kern */
sc.kerning_mode = status.sc.kerning_mode;
y += height;
grWriteCellString( display->bitmap, 5,
y - ( height + CELLSTRING_HEIGHT ) / 2,
"both", display->fore_color );
error = FTDemo_String_Draw( handle, display, &sc, x, y );
}
break;
}
if ( !error && status.sc.gamma_ramp )
gamma_ramp_draw( status.gamma_ramp, display->bitmap );
write_header( error );
status.header = 0;
grListenSurface( display->surface, 0, &event );
if ( Process_Event( &event ) )
break;
}
printf( "Execution completed successfully.\n" );
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 + -