📄 ftview.c
字号:
/****************************************************************************/
/* */
/* The FreeType project -- a free and portable quality TrueType renderer. */
/* */
/* Copyright 1996-2000, 2003, 2004, 2005, 2006 by */
/* D. Turner, R.Wilhelm, and W. Lemberg */
/* */
/* */
/* FTView - a simple font viewer. */
/* */
/* This is a new version using the MiGS graphics subsystem for */
/* blitting and display. */
/* */
/* Press F1 when running this program to have a list of key-bindings */
/* */
/****************************************************************************/
#include "ftcommon.h"
#include "common.h"
#include <math.h>
/* the following header shouldn't be used in normal programs */
#include FT_INTERNAL_DEBUG_H
#include FT_STROKER_H
#include FT_SYNTHESIS_H
#define MAXPTSIZE 500 /* dtp */
#define HEADER_HEIGHT 8
#ifdef CEIL
#undef CEIL
#endif
#define CEIL( x ) ( ( (x) + 63 ) >> 6 )
#define INIT_SIZE( size, start_x, start_y, step_x, step_y, x, y ) \
do { \
start_x = 4; \
start_y = CEIL( size->metrics.height ) + 2 * HEADER_HEIGHT; \
step_x = CEIL( size->metrics.max_advance ); \
step_y = CEIL( size->metrics.height ) + 4; \
\
x = start_x; \
y = start_y; \
} while ( 0 )
#define X_TOO_LONG( x, size, display) \
( ( x ) + ( ( size )->metrics.max_advance >> 6 ) > ( display )->bitmap->width )
#define Y_TOO_LONG( y, size, display) \
( ( y ) >= ( display )->bitmap->rows )
enum
{
RENDER_MODE_ALL = 0,
RENDER_MODE_EMBOLDEN,
RENDER_MODE_STROKE,
RENDER_MODE_TEXT,
RENDER_MODE_WATERFALL,
N_RENDER_MODES
};
static struct status_
{
int render_mode;
FT_Encoding encoding;
int res;
int ptsize; /* current point size */
int lcd_mode;
double gamma;
int debug;
int trace_level;
int font_index;
int dump_cache_stats; /* do we need to dump cache statistics? */
int Num; /* current first index */
char* header;
char header_buffer[256];
int Fail;
int preload;
} status = { RENDER_MODE_ALL, FT_ENCODING_NONE, 72, 48, -1, 1.0 };
static FTDemo_Display* display;
static FTDemo_Handle* handle;
static const unsigned char* Text = (unsigned char*)
"The quick brown fox jumps over the lazy dog 0123456789 "
"\342\352\356\373\364\344\353\357\366\374\377\340\371\351\350\347 "
"&#~\"\'(-`_^@)=+\260 ABCDEFGHIJKLMNOPQRSTUVWXYZ "
"$\243^\250*\265\371%!\247:/;.,?<>";
static FT_Error
Render_Stroke( int num_indices,
int first_index )
{
int start_x, start_y, step_x, step_y, x, y;
int i;
FT_Size size;
FT_Stroker stroker = NULL;
error = FTDemo_Get_Size( handle, &size );
if ( error )
{
/* probably a non-existent bitmap font size */
return error;
}
INIT_SIZE( size, start_x, start_y, step_x, step_y, x, y );
i = first_index;
error = FT_Stroker_New( handle->library, &stroker );
if ( error )
goto Exit;
FT_Stroker_Set( stroker, 64,
FT_STROKER_LINECAP_ROUND,
FT_STROKER_LINEJOIN_ROUND,
0 );
while ( i < num_indices )
{
int gindex;
FT_GlyphSlot slot;
if ( handle->encoding == FT_ENCODING_NONE )
gindex = i;
else
gindex = FTDemo_Get_Index( handle, i );
error = FT_Load_Glyph( size->face, gindex,
handle->image_type.flags | FT_LOAD_NO_BITMAP );
slot = size->face->glyph;
if ( !error && slot->format == FT_GLYPH_FORMAT_OUTLINE )
{
FT_Glyph glyph;
error = FT_Get_Glyph( slot, &glyph );
if ( error )
goto Next;
error = FT_Glyph_Stroke( &glyph, stroker, 1 );
if ( error )
{
FT_Done_Glyph( glyph );
goto Next;
}
error = FTDemo_Draw_Glyph( handle, display, glyph, &x, &y );
FT_Done_Glyph( glyph );
if ( error )
status.Fail++;
else if ( X_TOO_LONG( x, size, display ) )
{
x = start_x;
y += step_y;
if ( Y_TOO_LONG( y, size, display ) )
break;
}
}
else
{
Next:
status.Fail++;
}
i++;
}
Exit:
if ( stroker )
FT_Stroker_Done( stroker );
return error;
}
static FT_Error
Render_Embolden( int num_indices,
int first_index )
{
int start_x, start_y, step_x, step_y, x, y;
int i;
FT_Size size;
error = FTDemo_Get_Size( handle, &size );
if ( error )
{
/* probably a non-existent bitmap font size */
return error;
}
INIT_SIZE( size, start_x, start_y, step_x, step_y, x, y );
i = first_index;
while ( i < num_indices )
{
int gindex;
FT_Face face = size->face;
if ( handle->encoding == FT_ENCODING_NONE )
gindex = i;
else
gindex = FTDemo_Get_Index( handle, i );
error = FT_Load_Glyph( face, gindex, handle->image_type.flags );
if ( !error )
{
FT_GlyphSlot_Embolden( face->glyph );
error = FTDemo_Draw_Slot( handle, display, face->glyph, &x, &y );
if ( error )
status.Fail++;
else if ( X_TOO_LONG( x, size, display ) )
{
x = start_x;
y += step_y;
if ( Y_TOO_LONG( y, size, display ) )
break;
}
}
else
status.Fail++;
i++;
}
return error;
}
static FT_Error
Render_All( int num_indices,
int first_index )
{
int start_x, start_y, step_x, step_y, x, y;
int i;
FT_Size size;
error = FTDemo_Get_Size( handle, &size );
if ( error )
{
/* probably a non-existent bitmap font size */
return error;
}
INIT_SIZE( size, start_x, start_y, step_x, step_y, x, y );
i = first_index;
while ( i < num_indices )
{
int gindex;
if ( handle->encoding == FT_ENCODING_NONE )
gindex = i;
else
gindex = FTDemo_Get_Index( handle, i );
error = FTDemo_Draw_Index( handle, display, gindex, &x, &y );
if ( error )
status.Fail++;
else if ( X_TOO_LONG( x, size, display ) )
{
x = start_x;
y += step_y;
if ( Y_TOO_LONG( y, size, display ) )
break;
}
i++;
}
return FT_Err_Ok;
}
static FT_Error
Render_Text( int num_indices,
int first_index )
{
int start_x, start_y, step_x, step_y, x, y;
int i;
FT_Size size;
const unsigned char* p;
num_indices = num_indices; /* pacify compiler */
error = FTDemo_Get_Size( handle, &size );
if ( error )
{
/* probably a non-existent bitmap font size */
return error;
}
INIT_SIZE( size, start_x, start_y, step_x, step_y, x, y );
i = first_index;
p = Text;
while ( i > 0 && *p )
{
p++;
i--;
}
while ( *p && num_indices != 0 )
{
FT_UInt gindex;
gindex = FTDemo_Get_Index( handle, *p );
error = FTDemo_Draw_Index( handle, display, gindex, &x, &y );
if ( error )
status.Fail++;
else
{
/* Draw_Index adds one pixel space */
x--;
if ( X_TOO_LONG( x, size, display ) )
{
x = start_x;
y += step_y;
if ( Y_TOO_LONG( y, size, display ) )
break;
}
}
p++;
if ( num_indices > 0 )
num_indices -= 1;
}
return FT_Err_Ok;
}
static FT_Error
Render_Waterfall( int first_size )
{
int start_x, start_y, step_x, step_y, x, y;
int pt_size, max_size = 100000;
FT_Size size;
FT_Face face;
unsigned char text[256];
const unsigned char* p;
{
error = FTC_Manager_LookupFace( handle->cache_manager,
handle->image_type.face_id, &face );
if ( error )
{
/* can't access the font file. do not render anything */
fprintf( stderr, "can't access font file %p\n", handle->image_type.face_id );
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -