|
|
|
@ -38,6 +38,10 @@ |
|
|
|
|
char Header[128]; |
|
|
|
|
char* new_header = 0; |
|
|
|
|
|
|
|
|
|
const unsigned char* Text = |
|
|
|
|
"The quick brown fox jumped over the lazy dog 0123456789 \
|
|
|
|
|
âêîûôäëïöüÿàùéèç &#~\"'(-`_^@)=+° ABCDEFGHIJKLMNOPQRSTUVWXYZ $£^¨*µù%!§:/;.,?<>"; |
|
|
|
|
|
|
|
|
|
FT_Library library; /* the FreeType library */ |
|
|
|
|
FT_Face face; /* the font face */ |
|
|
|
|
FT_Size size; /* the font size */ |
|
|
|
@ -66,6 +70,8 @@ |
|
|
|
|
|
|
|
|
|
int graph_init = 0; |
|
|
|
|
|
|
|
|
|
int render_mode = 1; |
|
|
|
|
|
|
|
|
|
#define DEBUGxxx |
|
|
|
|
|
|
|
|
|
#ifdef DEBUG |
|
|
|
@ -188,7 +194,7 @@ |
|
|
|
|
bit3.buffer = glyph->bitmap.buffer; |
|
|
|
|
bit3.grays = 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Then, blit the image to the target surface */ |
|
|
|
|
x_top = x_offset + TRUNC(left); |
|
|
|
|
y_top = y_offset - TRUNC(top); |
|
|
|
@ -292,6 +298,68 @@ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static FT_Error Render_Text( int first_glyph, int ptsize ) |
|
|
|
|
{ |
|
|
|
|
FT_F26Dot6 start_x, start_y, step_x, step_y, x, y; |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
FT_Error error; |
|
|
|
|
const unsigned char* p; |
|
|
|
|
|
|
|
|
|
start_x = 4; |
|
|
|
|
start_y = 12 + size->metrics.y_ppem; |
|
|
|
|
|
|
|
|
|
step_x = size->metrics.x_ppem + 4; |
|
|
|
|
step_y = size->metrics.y_ppem + 10; |
|
|
|
|
|
|
|
|
|
x = start_x; |
|
|
|
|
y = start_y; |
|
|
|
|
|
|
|
|
|
i = first_glyph; |
|
|
|
|
p = Text; |
|
|
|
|
while (i > 0 && *p) { p++; i--; } |
|
|
|
|
|
|
|
|
|
while ( *p ) |
|
|
|
|
{ |
|
|
|
|
if ( !(error = LoadChar( FT_Get_Char_Index( face, (unsigned char)*p ), hinted )) ) |
|
|
|
|
{ |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
if (i <= first_glyph+6) |
|
|
|
|
{ |
|
|
|
|
LOG(( "metrics[%02d] = [%x %x]\n", |
|
|
|
|
i, |
|
|
|
|
glyph->metrics.horiBearingX, |
|
|
|
|
glyph->metrics.horiAdvance )); |
|
|
|
|
|
|
|
|
|
if (i == first_glyph+6) |
|
|
|
|
LOG(( "-------------------------\n")); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#endif |
|
|
|
|
Render_Glyph( x, y ); |
|
|
|
|
|
|
|
|
|
x += ( glyph->metrics.horiAdvance >> 6 ) + 1; |
|
|
|
|
|
|
|
|
|
if ( x + size->metrics.x_ppem > bit.width ) |
|
|
|
|
{ |
|
|
|
|
x = start_x; |
|
|
|
|
y += step_y; |
|
|
|
|
|
|
|
|
|
if ( y >= bit.rows ) |
|
|
|
|
return FT_Err_Ok; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
Fail++; |
|
|
|
|
|
|
|
|
|
i++; |
|
|
|
|
p++; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return FT_Err_Ok; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void Help( ) |
|
|
|
|
{ |
|
|
|
|
grEvent dummy_event; |
|
|
|
@ -313,6 +381,7 @@ |
|
|
|
|
grWriteln(" h : toggle outline hinting" ); |
|
|
|
|
grWriteln(" b : toggle embedded bitmaps" ); |
|
|
|
|
grWriteln(" l : toggle low precision rendering" ); |
|
|
|
|
grWriteln(" space : toggle rendering mode" ); |
|
|
|
|
grLn(); |
|
|
|
|
grWriteln(" Up : increase pointsize by 1 unit" ); |
|
|
|
|
grWriteln(" Down : decrease pointsize by 1 unit" ); |
|
|
|
@ -379,6 +448,13 @@ |
|
|
|
|
: "glyph hinting is now ignored" ); |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case grKEY(' '): |
|
|
|
|
render_mode ^= 1; |
|
|
|
|
new_header = ( render_mode |
|
|
|
|
? "rendering all glyphs in font" |
|
|
|
|
: "rendering test text string" ); |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case grKeyF1: |
|
|
|
|
case grKEY('?'): |
|
|
|
|
Help(); |
|
|
|
@ -575,7 +651,15 @@ |
|
|
|
|
|
|
|
|
|
if ( file_loaded >= 1 ) |
|
|
|
|
{ |
|
|
|
|
Render_All( Num, ptsize ); |
|
|
|
|
switch (render_mode) |
|
|
|
|
{ |
|
|
|
|
case 0: |
|
|
|
|
Render_Text( Num, ptsize ); |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
default: |
|
|
|
|
Render_All( Num, ptsize ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
sprintf( Header, "%s %s (file %s)", |
|
|
|
|
face->family_name, |
|
|
|
|