simple update to allow several rendering modes (useful for testing the Unicode charmaps)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
diff --git a/demos/src/ftview.c b/demos/src/ftview.c
index 9313903..54f2973 100644
--- a/demos/src/ftview.c
+++ b/demos/src/ftview.c
@@ -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,