⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ftview.c

📁 freetype库的应用demo,里面包含freetype的很多实例
💻 C
📖 第 1 页 / 共 2 页
字号:
          x += x_advance + 1;          if ( x + size->metrics.x_ppem > bit.width )            break;        }        else          Fail++;        p++;      }    }    set_current_pointsize( first_size );    return FT_Err_Ok;  }  /*************************************************************************/  /*************************************************************************/  /*****                                                               *****/  /*****                REST OF THE APPLICATION/PROGRAM                *****/  /*****                                                               *****/  /*************************************************************************/  /*************************************************************************/  static void  Help( void )  {    grEvent  dummy_event;    Clear_Display();    grGotoxy( 0, 0 );    grSetMargin( 2, 1 );    grGotobitmap( &bit );    grWriteln( "FreeType Glyph Viewer - part of the FreeType test suite" );    grLn();    grWriteln( "This program is used to display all glyphs from one or" );    grWriteln( "several font files, with the FreeType library." );    grLn();    grWriteln( "Use the following keys:" );    grLn();    grWriteln( "  F1 or ?   : display this help screen" );    grWriteln( "  a         : toggle anti-aliasing" );    grWriteln( "  L         : cycle through rendering modes" );    grWriteln( "  h         : toggle outline hinting" );    grWriteln( "  b         : toggle embedded bitmaps" );    grWriteln( "  l         : toggle low precision rendering" );    grWriteln( "  f         : toggle forced auto-hinting" );    grWriteln( "  space     : toggle rendering mode" );    grLn();    grWriteln( "  c         : toggle between cache modes" );    grLn();    grWriteln( "  n         : next font" );    grWriteln( "  p         : previous font" );    grLn();    grWriteln( "  g         : increase gamma by 0.1" );    grWriteln( "  v         : decrease gamma by 0.1" );    grLn();    grWriteln( "  K         : show gamma ramp" );    grLn();    grWriteln( "  Up        : increase pointsize by 1 unit" );    grWriteln( "  Down      : decrease pointsize by 1 unit" );    grWriteln( "  Page Up   : increase pointsize by 10 units" );    grWriteln( "  Page Down : decrease pointsize by 10 units" );    grLn();    grWriteln( "  Right     : increment index" );    grWriteln( "  Left      : decrement index" );    grLn();    grWriteln( "  F7        : decrement index by 10" );    grWriteln( "  F8        : increment index by 10" );    grWriteln( "  F9        : decrement index by 100" );    grWriteln( "  F10       : increment index by 100" );    grWriteln( "  F11       : decrement index by 1000" );    grWriteln( "  F12       : increment index by 1000" );    grLn();    grWriteln( "press any key to exit this help screen" );    grRefreshSurface( surface );    grListenSurface( surface, gr_event_key, &dummy_event );  }  static int  Process_Event( grEvent*  event )  {    int  i;    switch ( event->key )    {    case grKeyEsc:            /* ESC or q */    case grKEY( 'q' ):      return 0;    case grKEY( 'a' ):      antialias  = !antialias;      new_header = antialias ? (char *)"anti-aliasing is now on"                             : (char *)"anti-aliasing is now off";      set_current_image_type();      return 1;    case grKEY( 'g' ):      if ( the_gamma >= 3.0 )        the_gamma = 3.0;      else        the_gamma += 0.1;      goto SetGamma;    case grKEY( 'v' ):      if ( the_gamma <= 0 )        the_gamma = 0;      else        the_gamma -= 0.1;      goto SetGamma;    SetGamma:      grSetGlyphGamma( the_gamma );      sprintf( Header, "gamma changed to %.1f %s", the_gamma, the_gamma == 0.0 ? "(sRGB mode)" : "" );      new_header = Header;      break;    case grKEY( 'L' ):      lcd_mode = ( lcd_mode + 1 ) % 6;      switch ( lcd_mode )      {      case 0:        new_header = (char *)"normal anti-aliased rendering on";        break;      case 1:        new_header = (char *)"light anti-aliased rendering on";        break;      case 2:        new_header = (char *)"horizontal LCD-optimized rendering on (RGB)";        break;      case 3:        new_header = (char *)"horizontal LCD-optimized rendering on (BGR)";        break;      case 4:        new_header = (char *)"vertical LCD-optimized rendering on (RGB)";        break;      case 5:        new_header = (char *)"vertical LCD-optimized rendering on (BGR)";        break;      default:        ;      }      set_current_image_type();      return 1;    case grKEY( 'c' ):      use_sbits_cache = !use_sbits_cache;      new_header = use_sbits_cache ? (char *)"now using sbits cache"                                   : (char *)"now using normal cache";      return 1;    case grKEY( 'f' ):      autohint = !autohint;      new_header = autohint ? (char *)"forced auto-hinting is now on"                            : (char *)"forced auto-hinting is now off";      set_current_image_type();      return 1;    case grKEY( 'b' ):      use_sbits  = !use_sbits;      new_header = use_sbits                     ? (char *)"embedded bitmaps are now used when available"                     : (char *)"embedded bitmaps are now ignored";      set_current_image_type();      return 1;    case grKEY( 'n' ):    case grKEY( 'p' ):      return (int)event->key;    case grKEY( 'l' ):      low_prec   = !low_prec;      new_header = low_prec                     ? (char *)"rendering precision is now forced to low"                     : (char *)"rendering precision is now normal";      break;    case grKEY( 'h' ):      hinted     = !hinted;      new_header = hinted ? (char *)"glyph hinting is now active"                          : (char *)"glyph hinting is now ignored";      set_current_image_type();      break;    case grKEY( 'K' ):      render_mode = RENDER_MODE_GAMMAGRID;      new_header = (char*)"rendering gamma grid";      break;    case grKEY( ' ' ):      render_mode = ( render_mode + 1 ) % RENDER_MODE_GAMMAGRID;      switch ( render_mode )      {      case RENDER_MODE_ALL:        new_header = (char*)"rendering all glyphs in font";        break;      case RENDER_MODE_EMBOLDEN:        new_header = (char*)"rendering emboldened text";        break;      case RENDER_MODE_STROKE:        new_header = (char*)"rendering stroked text";        break;      case RENDER_MODE_TEXT:        new_header = (char*)"rendering test text string";        break;      case RENDER_MODE_WATERFALL:        new_header = (char*)"rendering glyph waterfall";        break;      case RENDER_MODE_GAMMAGRID: /* never happen */        new_header = (char*)"rendering gamma grid";        break;      }      break;    case grKeyF1:    case grKEY( '?' ):      Help();      return 1;    case grKeyPageUp:   i =    10; goto Do_Scale;    case grKeyPageDown: i =   -10; goto Do_Scale;    case grKeyUp:       i =     1; goto Do_Scale;    case grKeyDown:     i =    -1; goto Do_Scale;    case grKeyLeft:     i =    -1; goto Do_Glyph;    case grKeyRight:    i =     1; goto Do_Glyph;    case grKeyF7:       i =   -10; goto Do_Glyph;    case grKeyF8:       i =    10; goto Do_Glyph;    case grKeyF9:       i =  -100; goto Do_Glyph;    case grKeyF10:      i =   100; goto Do_Glyph;    case grKeyF11:      i = -1000; goto Do_Glyph;    case grKeyF12:      i =  1000; goto Do_Glyph;    default:      ;    }    return 1;  Do_Scale:    ptsize += i;    if ( ptsize < 1 )         ptsize = 1;    if ( ptsize > MAXPTSIZE ) ptsize = MAXPTSIZE;    return 1;  Do_Glyph:    Num += i;    if ( Num < 0 )            Num = 0;    if ( Num >= num_indices ) Num = num_indices - 1;    return 1;  }  static void  usage( char*  execname )  {    fprintf( stderr,  "\n" );    fprintf( stderr,  "ftview: simple glyph viewer -- part of the FreeType project\n" );    fprintf( stderr,  "-----------------------------------------------------------\n" );    fprintf( stderr,  "\n" );    fprintf( stderr,  "Usage: %s [options below] ppem fontname[.ttf|.ttc] ...\n",             execname );    fprintf( stderr,  "\n" );    fprintf( stderr,  "  -r R      use resolution R dpi (default: 72 dpi)\n" );    fprintf( stderr,  "  -f index  specify first index to display\n" );    fprintf( stderr,  "  -e enc    specify encoding tag (default: no encoding)\n" );    fprintf( stderr,  "  -D        dump cache usage statistics\n" );    fprintf( stderr,  "\n" );    exit( 1 );  }  int  main( int    argc,        char*  argv[] )  {    int          old_ptsize, orig_ptsize, font_index;    int          first_index = 0;    int          XisSetup = 0;    char*        execname;    int          option;    const char*  Header_format;    grEvent      event;    execname = ft_basename( argv[0] );    while ( 1 )    {      option = getopt( argc, argv, "Dde:f:l:r:" );      if ( option == -1 )        break;      switch ( option )      {      case 'd':        debug = 1;        break;      case 'D':        dump_cache_stats = 1;        break;      case 'e':        encoding = (FT_Encoding)make_tag( optarg );        break;      case 'f':        first_index = atoi( optarg );        break;      case 'l':        trace_level = atoi( optarg );        if ( trace_level < 1 || trace_level > 7 )          usage( execname );        break;      case 'r':        res = atoi( optarg );        if ( res < 1 )          usage( execname );        break;      default:        usage( execname );        break;      }    }    argc -= optind;    argv += optind;    Header_format = encoding != FT_ENCODING_NONE                      ? "at %d points, first char code = 0x%x"                      : "at %d points, first glyph index = %d";    if ( argc <= 1 )      usage( execname );    if ( sscanf( argv[0], "%d", &orig_ptsize ) != 1 )      orig_ptsize = 64;#if FREETYPE_MAJOR == 2 && FREETYPE_MINOR == 0 && FREETYPE_PATCH <= 8    if ( debug )    {#  ifdef FT_DEBUG_LEVEL_TRACE      FT_SetTraceLevel( trace_any, (FT_Byte)trace_level );#  else      trace_level = 0;#  endif    }#elif 0       /* "setenv/putenv" is not ANSI and I don't want to mess */       /* with this portability issue right now..              */    if ( debug )    {      char  temp[32];      sprintf( temp, "any=%d", trace_level );      setenv( "FT2_DEBUG", temp );    }#endif    /* Initialize engine */    init_freetype();    argc--;    argv++;    for ( ; argc > 0; argc--, argv++ )      install_font_file( argv[0] );    if ( num_fonts == 0 )      PanicZ( "could not find/open any font file" );    font_index = 0;    ptsize     = orig_ptsize;  NewFile:    set_current_face( fonts[font_index] );    set_current_pointsize( ptsize );    set_current_image_type();    num_indices = fonts[font_index]->num_indices;    error = FTC_Manager_LookupFace( cache_manager,                                    current_font.face_id, &face );    if ( error )    {      /* can't access the font file; do not render anything */      fprintf( stderr, "can't access font file %p\n",               current_font.face_id );      exit( 1 );    }    /* initialize graphics if needed */    if ( !XisSetup )    {      XisSetup = 1;      Init_Display();    }    grSetTitle( surface, "FreeType Glyph Viewer - press F1 for help" );    old_ptsize = ptsize;    if ( num_fonts >= 1 )    {      Fail = 0;      Num  = first_index;      if ( Num >= num_indices )        Num = num_indices - 1;      if ( Num < 0 )        Num = 0;    }    for ( ;; )    {      int  key;      Clear_Display();      if ( num_fonts >= 1 )      {        error = FT_Err_Ok;        switch ( render_mode )        {        case RENDER_MODE_ALL:          error = Render_All( Num );          break;        case RENDER_MODE_EMBOLDEN:          error = Render_Embolden( Num );          break;        case RENDER_MODE_STROKE:          error = Render_Stroke( Num );          break;        case RENDER_MODE_TEXT:          error = Render_Text( Num );          break;        case RENDER_MODE_WATERFALL:          error = Render_Waterfall( ptsize );          break;        case RENDER_MODE_GAMMAGRID:          error = Render_GammaGrid();          render_mode = RENDER_MODE_ALL;        }        if ( !new_header )        {          if ( size )            sprintf( Header, "%s %s (file `%s')",              face->family_name,              face->style_name,              ft_basename( ((PFont)current_font.face_id)->filepathname ) );          else          {            if ( error == FT_Err_Invalid_Pixel_Size )              sprintf( Header, "Invalid pixel size (file `%s')",                ft_basename( ((PFont)current_font.face_id)->filepathname ) );            else if ( error == FT_Err_Invalid_PPem )              sprintf( Header, "Invalid ppem value (file `%s')",                ft_basename( ((PFont)current_font.face_id)->filepathname ) );            else              sprintf( Header, "File `%s': error 0x%04x",                ft_basename( ((PFont)current_font.face_id)->filepathname ),                (FT_UShort)error );          }          new_header = Header;        }        grWriteCellString( &bit, 0, 0, new_header, fore_color );        new_header = 0;        sprintf( Header, Header_format, ptsize, Num );      }      grWriteCellString( &bit, 0, 8, Header, fore_color );      grRefreshSurface( surface );      if ( dump_cache_stats )      {        /* dump simple cache manager statistics */        fprintf( stderr, "cache manager [ nodes, bytes, average ] = "                         " [ %d, %ld, %f ]\n",                         cache_manager->num_nodes,                         cache_manager->cur_weight,                         cache_manager->num_nodes > 0                           ? cache_manager->cur_weight * 1.0 /                               cache_manager->num_nodes                           : 0.0 );      }      grListenSurface( surface, 0, &event );      if ( !( key = Process_Event( &event ) ) )        goto End;      if ( key == 'n' )      {        if ( font_index + 1 < num_fonts )          font_index++;        goto NewFile;      }      if ( key == 'p' )      {        if ( font_index > 0 )          font_index--;        goto NewFile;      }      if ( ptsize != old_ptsize )      {        set_current_pointsize( ptsize );        old_ptsize = ptsize;      }    }  End:    printf( "Execution completed successfully.\n" );    printf( "Fails = %d\n", Fail );    done_freetype();    exit( 0 );      /* for safety reasons */    return 0;       /* never reached */  }/* End */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -