On 04/20/2011 02:52 PM, Werner LEMBERG wrote:
Are there any tool which visually present segments of autofit module? Something like stems shown in the glyph view of fontforge.No, but I'll probably add this to ftgrid since it would be helpful for my work on the ttfautohint stuff. But it isn't an urgent issue, and in case you have time to implement it I would be very grateful :-)
OK, I made a simple patch to draw the segment data. I have to copy afhints.h and aftypes.h to the src/ directory because I really need some structs from autofit/.
Besides, the vertical segments are abnormal. There are some non-uniform drift from where it supposed to be. I don't know where the problem are.
Attach a image to show ftgrid with arphic uming font. You can use 'h' to toggle ignoring the hinting and 's' to toggle drawing stems.
<<attachment: ftgrid-wrong-vstem.png>>
diff --git a/src/ftgrid.c b/src/ftgrid.c index 13858dd..f45133a 100644 --- a/src/ftgrid.c +++ b/src/ftgrid.c @@ -15,6 +15,7 @@ #include "ftcommon.h" #include "common.h" +#include "afhints.h" #include <math.h> /* the following header shouldn't be used in normal programs */ @@ -39,17 +40,12 @@ #define snprintf _snprintf #endif - - /* these variables, structures and declarations are for */ - /* communication with the debugger in the autofit module; */ - /* normal programs don't need this */ - struct AF_GlyphHintsRec_; - typedef struct AF_GlyphHintsRec_* AF_GlyphHints; - +/* these variables, structures and declarations are for */ +/* communication with the debugger in the autofit module; */ +/* normal programs don't need this */ int _af_debug_disable_horz_hints; int _af_debug_disable_vert_hints; int _af_debug_disable_blue_hints; - AF_GlyphHints _af_debug_hints; #ifdef __cplusplus extern "C" { @@ -87,12 +83,14 @@ typedef struct status_ grColor on_color; grColor conic_color; grColor cubic_color; + grColor stem_color; int do_horz_hints; int do_vert_hints; int do_blue_hints; int do_outline; int do_dots; + int do_stem; double gamma; const char* header; @@ -116,6 +114,7 @@ grid_status_init( GridStatus st, st->on_color = grFindColor( display->bitmap, 64, 64, 255, 255 ); st->conic_color = grFindColor( display->bitmap, 0, 128, 0, 255 ); st->cubic_color = grFindColor( display->bitmap, 255, 64, 255, 255 ); + st->stem_color = grFindColor( display->bitmap, 64, 255, 128, 64 ); st->disp_width = display->bitmap->width; st->disp_height = display->bitmap->rows; st->disp_bitmap = display->bitmap; @@ -125,6 +124,7 @@ grid_status_init( GridStatus st, st->do_blue_hints = 1; st->do_dots = 1; st->do_outline = 1; + st->do_stem = 0; st->Num = 0; st->gamma = 1.0; @@ -218,6 +218,42 @@ grid_status_draw_grid( GridStatus st ) grFillHLine( st->disp_bitmap, 0, y_org, st->disp_width, st->axis_color ); } +static void +grid_hint_draw_stem( GridStatus st, + AF_GlyphHints hints ) +{ + FT_Int dimension; + int x_org = (int)st->x_origin; + int y_org = (int)st->y_origin; + + + for ( dimension = 1; dimension >= 0; dimension-- ) + { + AF_AxisHints axis = &hints->axis[dimension]; + AF_Segment segments = axis->segments; + AF_Segment limit = segments + axis->num_segments; + AF_Segment seg; + + + for ( seg = segments; seg < limit; seg++ ) + { + FT_Pos pos; + + if ( dimension == AF_DIMENSION_HORZ ) + { + pos = x_org + (int)seg->first->ox * st->scale; + grFillVLine( st->disp_bitmap, (int)pos, 0, + st->disp_height, st->stem_color ); + } + else + { + pos = y_org - (int)seg->first->oy * st->scale; + grFillHLine( st->disp_bitmap, 0, (int)pos, + st->disp_width, st->stem_color ); + } + } + } +} static void ft_bitmap_draw( FT_Bitmap* bitmap, @@ -403,6 +439,10 @@ grid_status_draw_outline( GridStatus st, handle->load_flags | FT_LOAD_NO_BITMAP ) ) return; + /* Draw stem before draw glyph. */ + if ( status.do_stem && handle->autohint ) + grid_hint_draw_stem ( &status, _af_debug_hints ); + slot = size->face->glyph; if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) { @@ -501,6 +541,7 @@ grid_status_draw_outline( GridStatus st, grLn(); grWriteln( " a : toggle anti-aliasing" ); grWriteln( " f : toggle forced autofit mode" ); + grWriteln( " h : toggle ignore hinting mode" ); grWriteln( " left/right : decrement/increment glyph index" ); grWriteln( " up/down : change character size" ); grLn(); @@ -522,6 +563,7 @@ grid_status_draw_outline( GridStatus st, grWriteln( " H : toggle horizontal hinting" ); grWriteln( " V : toggle vertical hinting" ); grWriteln( " B : toggle blue zone hinting" ); + grWriteln( " s : toggle draw hinting stems" ); #endif grWriteln( " d : toggle dots display" ); grWriteln( " o : toggle outline display" ); @@ -780,6 +822,17 @@ grid_status_draw_outline( GridStatus st, else status.header = "need autofit mode to toggle blue zone hinting"; break; + + case grKEY('s'): + if (handle->autohint) + { + status.do_stem = !status.do_stem; + status.header = status.do_stem ? "stem drawing enabled" + : "stem drawing disabled"; + } + else + status.header = "need autofit mode to draw hinting stem"; + break; #endif /* FT_DEBUG_AUTOFIT */
_______________________________________________ Freetype-devel mailing list Freetype-devel@nongnu.org https://lists.nongnu.org/mailman/listinfo/freetype-devel