ref: c740c19112373983c5ef56d653f9d19515b61f09
parent: a37745bad4e46c5ad0e690150b0ec8081ff81c90
author: Werner Lemberg <[email protected]>
date: Wed Mar 23 12:44:34 EST 2005
* tests/*: Removed.
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
2005-03-23 Werner Lemberg <[email protected]>
+ * tests/*: Removed.
+
+2005-03-23 Werner Lemberg <[email protected]>
+
* docs/CHANGES, docs/INSTALL.ANY: Updated.
* include/freetype/ftmoderr.h: Replace `Autohint' with `Autofit'.
--- a/tests/Jamfile
+++ /dev/null
@@ -1,41 +1,0 @@
-# FreeType 2 src Jamfile (c) 2001 David Turner
-#
-
-SubDir FT2_TOP tests ;
-
-test_programs = gview ;
-
-SubDirHdrs [ FT2_SubDir .. nirvana include ] ;
-
-NV_TOP = [ FT2_SubDir .. .. nirvana ] ;
-
-NIRVANA_LINKLIBS = $(NV_TOP)/objs/libnirvana$(SUFLIB) ;
-
-{
- local t ;
-
- for t in $(test_programs)
- {
- Main $(t) : $(t).c ;
-
- LinkLibraries $(t) : $(FT2_LIB) ;
-
- if $(WIN)
- {
- if $(TOOLSET) = MINGW
- {
- LINKKLIBS on $(t)$(SUFEXE) = "-luser32 -lgdi32" ;
- }
- else
- {
- LINKLIBS on $(t)$(SUFEXE) = user32.lib gdi32.lib ;
- }
- }
- else
- {
- LINKLIBS on $(t)$(SUFEXE) = -L/usr/X11R6/lib -lX11 -lm ;
- }
-
- NEEDLIBS on $(t)$(SUFEXE) += $(NIRVANA_LINKLIBS) ;
- }
-}
--- a/tests/gview.c
+++ /dev/null
@@ -1,1292 +1,0 @@
-#include <nirvana.h>
-#include NV_VIEWPORT_H
-#include <stdio.h>
-
-#include <ft2build.h>
-#include FT_FREETYPE_H
-
-/* include FreeType internals to debug hints */
-#include <../src/pshinter/pshrec.h>
-#include <../src/pshinter/pshalgo.h>
-
-#include <../src/autohint/ahtypes.h>
-
- /************************************************************************/
- /************************************************************************/
- /***** *****/
- /***** ROOT DEFINITIONS *****/
- /***** *****/
- /************************************************************************/
- /************************************************************************/
-
-
-#include <time.h> /* for clock() */
-
- /* SunOS 4.1.* does not define CLOCKS_PER_SEC, so include <sys/param.h> */
- /* to get the HZ macro which is the equivalent. */
-#if defined( __sun__ ) && !defined( SVR4 ) && !defined( __SVR4 )
-#include <sys/param.h>
-#define CLOCKS_PER_SEC HZ
-#endif
-
-static int first_glyph = 0;
-
-static NV_Renderer renderer;
-static NV_Painter painter;
-static NV_Pixmap target;
-static NV_Error error;
-static NV_Memory memory;
-static NVV_Display display;
-static NVV_Surface surface;
-
-static FT_Library freetype;
-static FT_Face face;
-
-
-static NV_Pos glyph_scale;
-static NV_Pos glyph_org_x;
-static NV_Pos glyph_org_y;
-static NV_Transform glyph_transform; /* font units -> device pixels */
-static NV_Transform size_transform; /* subpixels -> device pixels */
-
-static NV_Scale grid_scale = 1.0;
-
-static int glyph_index;
-static int pixel_size = 12;
-
-
- /************************************************************************/
- /************************************************************************/
- /***** *****/
- /***** OPTIONS, COLORS and OTHERS *****/
- /***** *****/
- /************************************************************************/
- /************************************************************************/
-
-static int option_show_axis = 1;
-static int option_show_dots = 1;
-static int option_show_stroke = 0;
-static int option_show_glyph = 1;
-static int option_show_grid = 1;
-static int option_show_em = 0;
-static int option_show_smooth = 1;
-static int option_show_blues = 0;
-static int option_show_edges = 0;
-static int option_show_segments = 1;
-static int option_show_links = 1;
-static int option_show_indices = 0;
-
-static int option_show_ps_hints = 1;
-static int option_show_horz_hints = 1;
-static int option_show_vert_hints = 1;
-
-
-static int option_hinting = 1;
-
-static char temp_message[1024];
-
-static NV_Path symbol_dot = NULL;
-static NV_Path symbol_circle = NULL;
-static NV_Path symbol_square = NULL;
-static NV_Path symbol_rect_h = NULL;
-static NV_Path symbol_rect_v = NULL;
-
-
-
-#define AXIS_COLOR 0xFFFF0000
-#define GRID_COLOR 0xFFD0D0D0
-#define ON_COLOR 0xFFFF2000
-#define OFF_COLOR 0xFFFF0080
-#define STRONG_COLOR 0xFF404040
-#define INTERP_COLOR 0xFF206040
-#define SMOOTH_COLOR 0xF000B040
-#define BACKGROUND_COLOR 0xFFFFFFFF
-#define TEXT_COLOR 0xFF000000
-#define EM_COLOR 0x80008000
-#define BLUES_TOP_COLOR 0x4000008F
-#define BLUES_BOT_COLOR 0x40008F00
-
-#define GHOST_HINT_COLOR 0xE00000FF
-#define STEM_HINT_COLOR 0xE02020FF
-#define STEM_JOIN_COLOR 0xE020FF20
-
-#define EDGE_COLOR 0xF0704070
-#define SEGMENT_COLOR 0xF0206040
-#define LINK_COLOR 0xF0FFFF00
-#define SERIF_LINK_COLOR 0xF0FF808F
-
-
-/* print message and abort program */
-static void
-Panic( const char* message )
-{
- fprintf( stderr, "PANIC: %s\n", message );
- exit(1);
-}
-
-
-static void
-init_symbols( void )
-{
- nv_path_new_rectangle( renderer, -1, -1, 3, 3, 0, 0, &symbol_square );
- nv_path_new_rectangle( renderer, -1, -6, 2, 12, 0, 0, &symbol_rect_v );
- nv_path_new_rectangle( renderer, -6, -1, 12, 2, 0, 0, &symbol_rect_h );
-
- nv_path_new_circle( renderer, 0, 0, 3., &symbol_dot );
-
- nv_path_stroke( symbol_dot, 0.6,
- nv_path_linecap_butt,
- nv_path_linejoin_miter, 1.,
- &symbol_circle );
-
- nv_path_destroy( symbol_dot );
-
- nv_path_new_circle( renderer, 0, 0, 2., &symbol_dot );
- }
-
-
-static void
-done_symbols( void )
-{
- nv_path_destroy( symbol_circle );
- nv_path_destroy( symbol_dot );
- nv_path_destroy( symbol_rect_v );
- nv_path_destroy( symbol_rect_h );
- nv_path_destroy( symbol_square );
-}
-
-
- /************************************************************************/
- /************************************************************************/
- /***** *****/
- /***** COMMON GRID DRAWING ROUTINES *****/
- /***** *****/
- /************************************************************************/
- /************************************************************************/
-
-static void
-reset_scale( NV_Scale scale )
-{
- /* compute font units -> grid pixels scale factor */
- glyph_scale = target->width*0.75 / face->units_per_EM * scale;
-
- /* setup font units -> grid pixels transform */
- nv_transform_set_scale( &glyph_transform, glyph_scale, -glyph_scale );
- glyph_org_x = glyph_transform.delta.x = target->width*0.125;
- glyph_org_y = glyph_transform.delta.y = target->height*0.875;
-
- /* setup subpixels -> grid pixels transform */
- nv_transform_set_scale(
- &size_transform,
- glyph_scale / nv_fromfixed( face->size->metrics.x_scale ),
- -glyph_scale / nv_fromfixed( face->size->metrics.y_scale ) );
-
- size_transform.delta = glyph_transform.delta;
-}
-
-
-static void
-reset_size( int pixel_size,
- NV_Scale scale )
-{
- FT_Set_Pixel_Sizes( face, pixel_size, pixel_size );
- reset_scale( scale );
-}
-
-
-static void
-clear_background( void )
-{
- nv_pixmap_fill_rect( target, 0, 0, target->width, target->height,
- BACKGROUND_COLOR );
-}
-
-
-static void
-draw_grid( void )
-{
- int x = (int)glyph_org_x;
- int y = (int)glyph_org_y;
-
-
- /* draw grid */
- if ( option_show_grid )
- {
- NV_Scale min, max, x, step;
-
-
- /* draw vertical grid bars */
- step = 64. * size_transform.matrix.xx;
- if ( step > 1. )
- {
- min = max = glyph_org_x;
- while ( min - step >= 0 ) min -= step;
- while ( max + step < target->width ) max += step;
-
- for ( x = min; x <= max; x += step )
- nv_pixmap_fill_rect( target, (NV_Int)(x + .5), 0,
- 1, target->height, GRID_COLOR );
- }
-
- /* draw horizontal grid bars */
- step = -64. * size_transform.matrix.yy;
- if ( step > 1. )
- {
- min = max = glyph_org_y;
- while ( min - step >= 0 ) min -= step;
- while ( max + step < target->height ) max += step;
-
- for ( x = min; x <= max; x += step )
- nv_pixmap_fill_rect( target, 0, (NV_Int)(x + .5),
- target->width, 1, GRID_COLOR );
- }
- }
-
- /* draw axis */
- if ( option_show_axis )
- {
- nv_pixmap_fill_rect( target, x, 0, 1, target->height, AXIS_COLOR );
- nv_pixmap_fill_rect( target, 0, y, target->width, 1, AXIS_COLOR );
- }
-
- if ( option_show_em )
- {
- NV_Path path;
- NV_Path stroke;
- NV_UInt units = (NV_UInt)face->units_per_EM;
-
-
- nv_path_new_rectangle( renderer, 0, 0, units, units, 0, 0, &path );
- nv_path_transform( path, &glyph_transform );
-
- nv_path_stroke( path, 1.5, nv_path_linecap_butt, nv_path_linejoin_miter,
- 4.0, &stroke );
-
- nv_painter_set_color( painter, EM_COLOR, 256 );
- nv_painter_fill_path( painter, NULL, 0, stroke );
-
- nv_path_destroy( stroke );
- nv_path_destroy( path );
- }
-
-}
-
-
- /************************************************************************/
- /************************************************************************/
- /***** *****/
- /***** POSTSCRIPT GLOBALS ROUTINES *****/
- /***** *****/
- /************************************************************************/
- /************************************************************************/
-
-#include <../src/pshinter/pshglob.h>
-
-static void
-draw_ps_blue_zones( void )
-{
- if ( option_show_blues && ps_debug_globals )
- {
- PSH_Blues blues = &ps_debug_globals->blues;
- PSH_Blue_Table table;
- NV_Vector v;
- FT_Int y1, y2;
- FT_UInt count;
- PSH_Blue_Zone zone;
-
-
- /* draw top zones */
- table = &blues->normal_top;
- count = table->count;
- zone = table->zones;
-
- for ( ; count > 0; count--, zone++ )
- {
- v.x = 0;
- if ( !ps_debug_no_horz_hints )
- {
- v.y = zone->cur_ref + zone->cur_delta;
- nv_vector_transform( &v, &size_transform );
- }
- else
- {
- v.y = zone->org_ref + zone->org_delta;
- nv_vector_transform( &v, &glyph_transform );
- }
- y1 = (int)(v.y + 0.5);
-
- v.x = 0;
- if ( !ps_debug_no_horz_hints )
- {
- v.y = zone->cur_ref;
- nv_vector_transform( &v, &size_transform );
- }
- else
- {
- v.y = zone->org_ref;
- nv_vector_transform( &v, &glyph_transform );
- }
- y2 = (int)(v.y + 0.5);
-
- nv_pixmap_fill_rect( target, 0, y1,
- target->width, y2-y1+1,
- BLUES_TOP_COLOR );
-
-#if 0
- printf( "top [%.3f %.3f]\n", zone->cur_bottom/64.0, zone->cur_top/64.0 );
-#endif
- }
-
-
- /* draw bottom zones */
- table = &blues->normal_bottom;
- count = table->count;
- zone = table->zones;
-
- for ( ; count > 0; count--, zone++ )
- {
- v.x = 0;
- v.y = zone->cur_ref;
- nv_vector_transform( &v, &size_transform );
- y1 = (int)(v.y + 0.5);
-
- v.x = 0;
- v.y = zone->cur_ref + zone->cur_delta;
- nv_vector_transform( &v, &size_transform );
- y2 = (int)(v.y + 0.5);
-
- nv_pixmap_fill_rect( target, 0, y1,
- target->width, y2 - y1 + 1,
- BLUES_BOT_COLOR );
-
-#if 0
- printf( "bot [%.3f %.3f]\n", zone->cur_bottom/64.0, zone->cur_top/64.0 );
-#endif
- }
- }
-}
-
-
- /************************************************************************/
- /************************************************************************/
- /***** *****/
- /***** POSTSCRIPT HINTER ALGORITHM ROUTINES *****/
- /***** *****/
- /************************************************************************/
- /************************************************************************/
-
-#include <../src/pshinter/pshalgo.h>
-
-static void
-draw_ps_hint( PSH_Hint hint,
- FT_Bool vertical )
-{
- int x1, x2;
- NV_Vector v;
-
-
- if ( pshint_vertical != vertical )
- {
- if ( vertical )
- pshint_cpos = 40;
- else
- pshint_cpos = 10;
-
- pshint_vertical = vertical;
- }
-
- if ( !vertical )
- {
- if ( !option_show_vert_hints )
- return;
-
- v.x = hint->cur_pos;
- v.y = 0;
- nv_vector_transform( &v, &size_transform );
- x1 = (int)(v.x + 0.5);
-
- v.x = hint->cur_pos + hint->cur_len;
- v.y = 0;
- nv_vector_transform( &v, &size_transform );
- x2 = (int)(v.x + 0.5);
-
- nv_pixmap_fill_rect( target, x1, 0, 1, target->height,
- psh_hint_is_ghost( hint )
- ? GHOST_HINT_COLOR : STEM_HINT_COLOR );
-
- if ( psh_hint_is_ghost( hint ) )
- {
- x1 --;
- x2 = x1 + 2;
- }
- else
- nv_pixmap_fill_rect( target, x2, 0, 1, target->height,
- psh_hint_is_ghost( hint )
- ? GHOST_HINT_COLOR : STEM_HINT_COLOR );
-
- nv_pixmap_fill_rect( target, x1, pshint_cpos, x2 + 1 - x1, 1,
- STEM_JOIN_COLOR );
- }
- else
- {
- if ( !option_show_horz_hints )
- return;
-
- v.y = hint->cur_pos;
- v.x = 0;
- nv_vector_transform( &v, &size_transform );
- x1 = (int)(v.y + 0.5);
-
- v.y = hint->cur_pos + hint->cur_len;
- v.x = 0;
- nv_vector_transform( &v, &size_transform );
- x2 = (int)(v.y + 0.5);
-
- nv_pixmap_fill_rect( target, 0, x1, target->width, 1,
- psh_hint_is_ghost( hint )
- ? GHOST_HINT_COLOR : STEM_HINT_COLOR );
-
- if ( psh_hint_is_ghost( hint ) )
- {
- x1 --;
- x2 = x1 + 2;
- }
- else
- nv_pixmap_fill_rect( target, 0, x2, target->width, 1,
- psh_hint_is_ghost(hint)
- ? GHOST_HINT_COLOR : STEM_HINT_COLOR );
-
- nv_pixmap_fill_rect( target, pshint_cpos, x2, 1, x1 + 1 - x2,
- STEM_JOIN_COLOR );
- }
-
-#if 0
- printf( "[%7.3f %7.3f] %c\n", hint->cur_pos/64.0, (hint->cur_pos+hint->cur_len)/64.0, vertical ? 'v' : 'h' );
-#endif
-
- pshint_cpos += 10;
-}
-
-
-static void
-ps_draw_control_points( void )
-{
- if ( ps_debug_glyph )
- {
- PSH_Glyph glyph = ps_debug_glyph;
- PSH_Point point = glyph->points;
- FT_UInt count = glyph->num_points;
- NV_Transform transform, *trans = &transform;
- NV_Path vert_rect;
- NV_Path horz_rect;
- NV_Path dot, circle;
-
-
- for ( ; count > 0; count--, point++ )
- {
- NV_Vector vec;
-
-
- vec.x = point->cur_x;
- vec.y = point->cur_y;
- nv_vector_transform( &vec, &size_transform );
-
- nv_transform_set_translate( trans, vec.x, vec.y );
-
- if ( option_show_smooth && !psh_point_is_smooth(point) )
- {
- nv_painter_set_color( painter, SMOOTH_COLOR, 256 );
- nv_painter_fill_path( painter, trans, 0, symbol_circle );
- }
-
- if ( option_show_horz_hints )
- {
- if ( point->flags_y & PSH_POINT_STRONG )
- {
- nv_painter_set_color( painter, STRONG_COLOR, 256 );
- nv_painter_fill_path( painter, trans, 0, symbol_rect_h );
- }
- }
-
- if ( option_show_vert_hints )
- {
- if ( point->flags_x & PSH_POINT_STRONG )
- {
- nv_painter_set_color( painter, STRONG_COLOR, 256 );
- nv_painter_fill_path( painter, trans, 0, symbol_rect_v );
- }
- }
- }
- }
-}
-
-
-static void
-ps_print_hints( void )
-{
- if ( ps_debug_hints )
- {
- FT_Int dimension;
-
-
- for ( dimension = 1; dimension >= 0; dimension-- )
- {
- PS_Dimension dim = &ps_debug_hints->dimension[ dimension ];
- PS_Mask mask = dim->masks.masks;
- FT_UInt count = dim->masks.num_masks;
-
-
- printf( "%s hints -------------------------\n",
- dimension ? "vertical" : "horizontal" );
-
- for ( ; count > 0; count--, mask++ )
- {
- FT_UInt index;
-
-
- printf( "mask -> %d\n", mask->end_point );
- for ( index = 0; index < mask->num_bits; index++ )
- {
- if ( mask->bytes[ index >> 3 ] & (0x80 >> (index & 7)) )
- {
- PS_Hint hint = dim->hints.hints + index;
-
-
- printf( "%c [%3d %3d (%4d)]\n", dimension ? "v" : "h",
- hint->pos, hint->pos + hint->len, hint->len );
- }
- }
- }
- }
- }
-}
-
-
- /************************************************************************/
- /************************************************************************/
- /***** *****/
- /***** AUTOHINTER DRAWING ROUTINES *****/
- /***** *****/
- /************************************************************************/
- /************************************************************************/
-
-static NV_Path
-ah_link_path( NV_Vector* p1,
- NV_Vector* p4,
- NV_Bool vertical )
-{
- NV_PathWriter writer;
- NV_Vector p2, p3;
- NV_Path path, stroke;
-
-
- if ( vertical )
- {
- p2.x = p4->x;
- p2.y = p1->y;
-
- p3.x = p1->x;
- p3.y = p4->y;
- }
- else
- {
- p2.x = p1->x;
- p2.y = p4->y;
-
- p3.x = p4->x;
- p3.y = p1->y;
- }
-
- nv_path_writer_new( renderer, &writer );
- nv_path_writer_moveto( writer, p1 );
- nv_path_writer_cubicto( writer, &p2, &p3, p4 );
- nv_path_writer_end( writer );
-
- path = nv_path_writer_get_path( writer );
- nv_path_writer_destroy( writer );
-
- nv_path_stroke( path, 1.,
- nv_path_linecap_butt, nv_path_linejoin_round,
- 1., &stroke );
-
- nv_path_destroy( path );
-
- return stroke;
-}
-
-
-static void
-ah_draw_smooth_points( void )
-{
- if ( ah_debug_hinter && option_show_smooth )
- {
- AH_Outline glyph = ah_debug_hinter->glyph;
- FT_UInt count = glyph->num_points;
- AH_Point point = glyph->points;
-
-
- nv_painter_set_color( painter, SMOOTH_COLOR, 256 );
-
- for ( ; count > 0; count--, point++ )
- {
- if ( !( point->flags & AH_FLAG_WEAK_INTERPOLATION ) )
- {
- NV_Transform transform, *trans = &transform;
- NV_Vector vec;
-
-
- vec.x = point->x - ah_debug_hinter->pp1.x;
- vec.y = point->y;
- nv_vector_transform( &vec, &size_transform );
-
- nv_transform_set_translate( &transform, vec.x, vec.y );
- nv_painter_fill_path( painter, trans, 0, symbol_circle );
- }
- }
- }
-}
-
-
-static void
-ah_draw_edges( void )
-{
- if ( ah_debug_hinter )
- {
- AH_Outline glyph = ah_debug_hinter->glyph;
- FT_UInt count;
- AH_Edge edge;
- FT_Pos pp1 = ah_debug_hinter->pp1.x;
-
-
- nv_painter_set_color( painter, EDGE_COLOR, 256 );
-
- if ( option_show_edges )
- {
- /* draw vertical edges */
- if ( option_show_vert_hints )
- {
- count = glyph->num_vedges;
- edge = glyph->vert_edges;
- for ( ; count > 0; count--, edge++ )
- {
- NV_Vector vec;
- NV_Pos x;
-
-
- vec.x = edge->pos - pp1;
- vec.y = 0;
-
- nv_vector_transform( &vec, &size_transform );
- x = (FT_Pos)( vec.x + 0.5 );
-
- nv_pixmap_fill_rect( target, x, 0, 1, target->height, EDGE_COLOR );
- }
- }
-
- /* draw horizontal edges */
- if ( option_show_horz_hints )
- {
- count = glyph->num_hedges;
- edge = glyph->horz_edges;
- for ( ; count > 0; count--, edge++ )
- {
- NV_Vector vec;
- NV_Pos x;
-
-
- vec.x = 0;
- vec.y = edge->pos;
-
- nv_vector_transform( &vec, &size_transform );
- x = (FT_Pos)( vec.y + 0.5 );
-
- nv_pixmap_fill_rect( target, 0, x, target->width, 1, EDGE_COLOR );
- }
- }
- }
-
- if ( option_show_segments )
- {
- /* draw vertical segments */
- if ( option_show_vert_hints )
- {
- AH_Segment seg = glyph->vert_segments;
- FT_UInt count = glyph->num_vsegments;
-
-
- for ( ; count > 0; count--, seg++ )
- {
- AH_PointRec *first, *last;
- NV_Vector v1, v2;
- NV_Pos y1, y2, x;
-
-
- first = seg->first;
- last = seg->last;
-
- v1.x = v2.x = first->x - pp1;
-
- if ( first->y <= last->y )
- {
- v1.y = first->y;
- v2.y = last->y;
- }
- else
- {
- v1.y = last->y;
- v2.y = first->y;
- }
-
- nv_vector_transform( &v1, &size_transform );
- nv_vector_transform( &v2, &size_transform );
-
- y1 = (NV_Pos)( v1.y + 0.5 );
- y2 = (NV_Pos)( v2.y + 0.5 );
- x = (NV_Pos)( v1.x + 0.5 );
-
- nv_pixmap_fill_rect( target, x - 1, y2, 3,
- FT_ABS( y1 - y2 ) + 1, SEGMENT_COLOR );
- }
- }
-
- /* draw horizontal segments */
- if ( option_show_horz_hints )
- {
- AH_Segment seg = glyph->horz_segments;
- FT_UInt count = glyph->num_hsegments;
-
-
- for ( ; count > 0; count--, seg++ )
- {
- AH_PointRec *first, *last;
- NV_Vector v1, v2;
- NV_Pos y1, y2, x;
-
-
- first = seg->first;
- last = seg->last;
-
- v1.y = v2.y = first->y;
-
- if ( first->x <= last->x )
- {
- v1.x = first->x - pp1;
- v2.x = last->x - pp1;
- }
- else
- {
- v1.x = last->x - pp1;
- v2.x = first->x - pp1;
- }
-
- nv_vector_transform( &v1, &size_transform );
- nv_vector_transform( &v2, &size_transform );
-
- y1 = (NV_Pos)( v1.x + 0.5 );
- y2 = (NV_Pos)( v2.x + 0.5 );
- x = (NV_Pos)( v1.y + 0.5 );
-
- nv_pixmap_fill_rect( target, y1, x - 1,
- FT_ABS( y1 - y2 ) + 1, 3, SEGMENT_COLOR );
- }
- }
-
- if ( option_show_vert_hints && option_show_links )
- {
- AH_Segment seg = glyph->vert_segments;
- FT_UInt count = glyph->num_vsegments;
-
-
- for ( ; count > 0; count--, seg++ )
- {
- AH_Segment seg2 = NULL;
- NV_Path link;
- NV_Vector v1, v2;
-
-
- if ( seg->link )
- {
- if ( seg->link > seg )
- seg2 = seg->link;
- }
- else if ( seg->serif )
- seg2 = seg->serif;
-
- if ( seg2 )
- {
- v1.x = seg->first->x - pp1;
- v2.x = seg2->first->x - pp1;
- v1.y = ( seg->first->y + seg->last->y ) / 2;
- v2.y = ( seg2->first->y + seg2->last->y ) / 2;
-
- link = ah_link_path( &v1, &v2, 1 );
-
- nv_painter_set_color( painter,
- seg->serif ? SERIF_LINK_COLOR : LINK_COLOR,
- 256 );
- nv_painter_fill_path( painter, &size_transform, 0, link );
-
- nv_path_destroy( link );
- }
- }
- }
-
- if ( option_show_horz_hints && option_show_links )
- {
- AH_Segment seg = glyph->horz_segments;
- FT_UInt count = glyph->num_hsegments;
-
-
- for ( ; count > 0; count--, seg++ )
- {
- AH_Segment seg2 = NULL;
- NV_Path link;
- NV_Vector v1, v2;
-
-
- if ( seg->link )
- {
- if ( seg->link > seg )
- seg2 = seg->link;
- }
- else if ( seg->serif )
- seg2 = seg->serif;
-
- if ( seg2 )
- {
- v1.y = seg->first->y;
- v2.y = seg2->first->y;
- v1.x = ( seg->first->x + seg->last->x ) / 2 - pp1;
- v2.x = ( seg2->first->x + seg2->last->x ) / 2 - pp1;
-
- link = ah_link_path( &v1, &v2, 0 );
-
- nv_painter_set_color( painter,
- seg->serif ? SERIF_LINK_COLOR : LINK_COLOR,
- 256 );
- nv_painter_fill_path( painter, &size_transform, 0, link );
-
- nv_path_destroy( link );
- }
- }
- }
- }
- }
-}
-
-
- /************************************************************************/
- /************************************************************************/
- /***** *****/
- /***** MAIN LOOP(S) *****/
- /***** *****/
- /************************************************************************/
- /************************************************************************/
-
-static void
-draw_glyph( int glyph_index )
-{
- NV_Path path;
-
-
- pshint_vertical = -1;
-
- ps_debug_hint_func = option_show_ps_hints ? draw_ps_hint : 0;
-
- ah_debug_hinter = NULL;
-
- error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_BITMAP );
- if ( error )
- Panic( "could not load glyph" );
-
- if ( face->glyph->format != FT_GLYPH_FORMAT_OUTLINE )
- Panic( "could not load glyph outline" );
-
- error = nv_path_new_from_outline( renderer,
- (NV_Outline*)&face->glyph->outline,
- &size_transform,
- &path );
- if ( error )
- Panic( "could not create glyph path" );
-
- /* trac� du glyphe plein */
- if ( option_show_glyph )
- {
- nv_painter_set_color( painter, 0xFF404080, 128 );
- nv_painter_fill_path( painter, 0, 0, path );
- }
-
- if ( option_show_stroke )
- {
- NV_Path stroke;
-
-
- error = nv_path_stroke( path, 0.6,
- nv_path_linecap_butt,
- nv_path_linejoin_miter,
- 1.0, &stroke );
- if ( error )
- Panic( "could not stroke glyph path" );
-
- nv_painter_set_color( painter, 0xFF000040, 256 );
- nv_painter_fill_path( painter, 0, 0, stroke );
-
- nv_path_destroy( stroke );
- }
-
- /* trac� des points de controle */
- if ( option_show_dots )
- {
- NV_Path plot;
- NV_Outline out;
- NV_Scale r = 2;
- NV_Int n, first, last;
-
-
- nv_path_get_outline( path, NULL, memory, &out );
-
- first = 0;
- for ( n = 0; n < out.n_contours; n++ )
- {
- int m;
- NV_Transform trans;
- NV_Color color;
- NV_SubVector* vec;
-
-
- last = out.contours[n];
-
- for ( m = first; m <= last; m++ )
- {
- color = (out.tags[m] & FT_CURVE_TAG_ON)
- ? ON_COLOR
- : OFF_COLOR;
-
- vec = out.points + m;
-
- nv_transform_set_translate( &trans, vec->x / 64.0, vec->y / 64.0 );
-
- nv_painter_set_color( painter, color, 256 );
- nv_painter_fill_path( painter, &trans, 0, symbol_dot );
-
- if ( option_show_indices )
- {
- char temp[5];
-
-
- sprintf( temp, "%d", m );
- nv_pixmap_cell_text( target, vec->x / 64 + 4, vec->y / 64 - 4,
- temp, TEXT_COLOR );
- }
- }
-
- first = last + 1;
- }
- }
-
- ah_draw_smooth_points();
- ah_draw_edges();
-
- nv_path_destroy( path );
-
- /* autre infos */
- {
- char temp[1024];
- char temp2[64];
-
-
- sprintf( temp, "font name : %s (%s)", face->family_name,
- face->style_name );
- nv_pixmap_cell_text( target, 0, 0, temp, TEXT_COLOR );
-
- FT_Get_Glyph_Name( face, glyph_index, temp2, 63 );
- temp2[63] = 0;
-
- sprintf( temp, "glyph %4d: %s", glyph_index, temp2 );
- nv_pixmap_cell_text( target, 0, 8, temp, TEXT_COLOR );
-
- if ( temp_message[0] )
- {
- nv_pixmap_cell_text( target, 0, 16, temp_message, TEXT_COLOR );
- temp_message[0] = 0;
- }
- }
-}
-
-
-#define TOGGLE_OPTION(var,prefix) \
- do \
- { \
- var = !var; \
- sprintf( temp_message, prefix " is now %s", \
- var ? "on" : "off" ); \
- } \
- while()
-
-
-#define TOGGLE_OPTION_NEG(var,prefix) \
- do \
- { \
- var = !var; \
- sprintf( temp_message, prefix " is now %s", \
- !var ? "on" : "off" ); \
- } \
- while
-
-
-static void
-handle_event( NVV_EventRec* ev )
-{
- switch ( ev->key )
- {
- case NVV_Key_Left:
- if ( glyph_index > 0 )
- glyph_index--;
- break;
-
- case NVV_Key_Right:
- if ( glyph_index + 1 < face->num_glyphs )
- glyph_index++;
- break;
-
- case NVV_KEY( 'x' ):
- TOGGLE_OPTION( option_show_axis, "grid axis display" );
- break;
-
- case NVV_KEY( 's' ):
- TOGGLE_OPTION( option_show_stroke, "glyph stroke display" );
- break;
-
- case NVV_KEY( 'g' ):
- TOGGLE_OPTION( option_show_glyph, "glyph fill display" );
- break;
-
- case NVV_KEY( 'd' ):
- TOGGLE_OPTION( option_show_dots, "control points display" );
- break
-
- case NVV_KEY( 'e' ):
- TOGGLE_OPTION( option_show_em, "EM square display" );
- break;
-
- case NVV_KEY( '+' ):
- grid_scale *= 1.2;
- reset_scale( grid_scale );
- break;
-
- case NVV_KEY( '-' ):
- if ( grid_scale > 0.3 )
- {
- grid_scale /= 1.2;
- reset_scale( grid_scale );
- }
- break;
-
- case NVV_Key_Up:
- pixel_size++;
- reset_size( pixel_size, grid_scale );
- sprintf( temp_message, "pixel size = %d", pixel_size );
- break;
-
- case NVV_Key_Down:
- if ( pixel_size > 1 )
- {
- pixel_size--;
- reset_size( pixel_size, grid_scale );
- sprintf( temp_message, "pixel size = %d", pixel_size );
- }
- break;
-
- case NVV_KEY( 'z' ):
- TOGGLE_OPTION_NEG( ps_debug_no_vert_hints, "vertical hints processing" );
- break;
-
- case NVV_KEY( 'a' ):
- TOGGLE_OPTION_NEG( ps_debug_no_horz_hints, "horizontal hints processing" );
- break;
-
- case NVV_KEY( 'Z' ):
- TOGGLE_OPTION( option_show_vert_hints, "vertical hints display" );
- break;
-
- case NVV_KEY( 'A' ):
- TOGGLE_OPTION( option_show_horz_hints, "horizontal hints display" );
- break;
-
- case NVV_KEY( 'S' ):
- TOGGLE_OPTION( option_show_smooth, "smooth points display" );
- break;
-
- case NVV_KEY( 'i' ):
- TOGGLE_OPTION( option_show_indices, "point index display" );
- break;
-
- case NVV_KEY( 'b' ):
- TOGGLE_OPTION( option_show_blues, "blue zones display" );
- break;
-
- case NVV_KEY( 'h' ):
- ps_debug_no_horz_hints = option_hinting;
- ps_debug_no_vert_hints = option_hinting;
-
- TOGGLE_OPTION( option_hinting, "hinting" );
- break;
-
- case NVV_KEY( 'H' ):
- ps_print_hints();
- break;
-
- default:
- ;
- }
-}
-
-
-static void
-usage()
-{
- Panic( "no usage" );
-}
-
-
-#define OPTION1(n,code) \
- case n : \
- code \
- argc--; \
- argv++; \
- break;
-
-#define OPTION2(n,code) \
- case n : \
- code \
- argc -= 2; \
- argv += 2; \
- break;
-
-
-static void
-parse_options( int* argc_p,
- char*** argv_p )
-{
- int argc = *argc_p;
- char** argv = *argv_p;
-
-
- while ( argc > 2 && argv[1][0] == '-' )
- {
- switch ( argv[1][1] )
- {
- OPTION2( 'f', first_glyph = atoi( argv[2] ); )
-
- OPTION2( 's', pixel_size = atoi( argv[2] ); )
-
- default:
- usage();
- }
- }
-
- *argc_p = argc;
- *argv_p = argv;
-}
-
-
-int
-main( int argc,
- char** argv )
-{
- char* filename = "/winnt/fonts/arial.ttf";
-
-
- parse_options( &argc, &argv );
-
- if ( argc >= 2 )
- filename = argv[1];
-
-
- /* create library */
- error = nv_renderer_new( 0, &renderer );
- if ( error )
- Panic( "could not create Nirvana renderer" );
-
- memory = nv_renderer_get_memory( renderer );
- init_symbols();
-
- error = nvv_display_new( renderer, &display );
- if ( error )
- Panic( "could not create display" );
-
- error = nvv_surface_new( display, 460, 460, nv_pixmap_type_argb, &surface );
- if ( error )
- Panic( "could not create surface" );
-
- target = nvv_surface_get_pixmap( surface );
-
- error = nv_painter_new( renderer, &painter );
- if ( error )
- Panic( "could not create painter" );
-
- nv_painter_set_target( painter, target );
-
- clear_background();
-
- error = FT_Init_FreeType( &freetype );
- if ( error )
- Panic( "could not initialize FreeType" );
-
- error = FT_New_Face( freetype, filename, 0, &face );
- if ( error )
- Panic( "could not open font face" );
-
- reset_size( pixel_size, grid_scale );
-
- nvv_surface_set_title( surface, "FreeType Glyph Viewer" );
-
- {
- NVV_EventRec event;
-
-
- glyph_index = first_glyph;
- for ( ;; )
- {
- clear_background();
- draw_grid();
-
- ps_debug_hints = 0;
- ah_debug_hinter = 0;
-
- ah_debug_disable_vert = ps_debug_no_vert_hints;
- ah_debug_disable_horz = ps_debug_no_horz_hints;
-
- draw_ps_blue_zones();
- draw_glyph( glyph_index );
- ps_draw_control_points();
-
- nvv_surface_refresh( surface, NULL );
-
- nvv_surface_listen( surface, 0, &event );
- if ( event.key == NVV_Key_Esc )
- break;
-
- handle_event( &event );
- switch ( event.key )
- {
- case NVV_Key_Esc:
- goto Exit;
-
- default:
- ;
- }
- }
- }
-
-Exit:
- /* wait for escape */
-
- /* destroy display (and surface) */
- nvv_display_unref( display );
-
- done_symbols();
- nv_renderer_unref( renderer );
-
- return 0;
-}