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

📄 ftmulti.c

📁 freetype库的应用demo,里面包含freetype的很多实例
💻 C
📖 第 1 页 / 共 2 页
字号:
  Process_Event( grEvent*  event )  {    int  i, axis;    switch ( event->key )    {    case grKeyEsc:            /* ESC or q */    case grKEY( 'q' ):      return 0;    case grKeyF1:    case grKEY( '?' ):      Help();      return 1;    /* mode keys */    case grKEY( 'a' ):      antialias = !antialias;      new_header = antialias ? (char *)"anti-aliasing is now on"                             : (char *)"anti-aliasing is now off";      return 1;    case grKEY( 'b' ):      use_sbits  = !use_sbits;      new_header = use_sbits                     ? (char *)"embedded bitmaps are now used if available"                     : (char *)"embedded bitmaps are now ignored";      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";      break;    case grKEY( ' ' ):      render_mode ^= 1;      new_header = render_mode ? (char *)"rendering all glyphs in font"                               : (char *)"rendering test text string";      break;    /* MM related keys */    case grKeyF3:      i = -20;      axis = 0;      goto Do_Axis;    case grKeyF4:      i = 20;      axis = 0;      goto Do_Axis;    case grKeyF5:      i = -20;      axis = 1;      goto Do_Axis;    case grKeyF6:      i = 20;      axis = 1;      goto Do_Axis;    case grKeyF7:      i = -20;      axis = 2;      goto Do_Axis;    case grKeyF8:      i = 20;      axis = 2;      goto Do_Axis;    /* scaling related keys */    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;    /* glyph index related keys */    case grKeyLeft:      i = -1;      goto Do_Glyph;    case grKeyRight:      i = 1;      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_Axis:    if ( axis < (int)multimaster->num_axis )    {      FT_Var_Axis* a   = multimaster->axis + axis;      FT_Fixed     pos = design_pos[axis];      /* Normalize i. changing by 20 is all very well for PostScript fonts  */      /*  which tend to have a range of ~1000 per axis, but it's not useful */      /*  for mac fonts which have a range of ~3.                           */      /* And it's rather extreme for optical size even in PS                */      pos += FT_MulDiv( i, a->maximum-a->minimum, 1000 );      if ( pos < a->minimum ) pos = a->minimum;      if ( pos > a->maximum ) pos = a->maximum;      design_pos[axis] = pos;      FT_Set_Var_Design_Coordinates( face, multimaster->num_axis, design_pos );    }    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_glyphs ) Num = num_glyphs - 1;    return 1;  }  static void  usage( char*  execname )  {    fprintf( stderr,  "\n" );    fprintf( stderr,  "ftmulti: multiple masters font viewer - part of FreeType\n" );    fprintf( stderr,  "--------------------------------------------------------\n" );    fprintf( stderr,  "\n" );    fprintf( stderr,  "Usage: %s [options below] ppem fontname[.pfb|.ttf] ...\n",             execname );    fprintf( stderr,  "\n" );    fprintf( stderr,  "  -e encoding  select encoding (default: no encoding)\n" );    fprintf( stderr,  "  -r R         use resolution R dpi (default: 72 dpi)\n" );    fprintf( stderr,  "  -f index     specify first glyph index to display\n" );    fprintf( stderr,  "  -d \"axis1 axis2 ...\"\n"                      "               specify the design coordinates for each axis\n" );    fprintf( stderr,  "\n" );    exit( 1 );  }  int  main( int    argc,        char*  argv[] )  {    int    old_ptsize, orig_ptsize, file;    int    first_glyph = 0;    int    XisSetup = 0;    char*  execname;    int    option;    int    file_loaded;    grEvent  event;    execname = ft_basename( argv[0] );    while ( 1 )    {      option = getopt( argc, argv, "d:e:f:r:" );      if ( option == -1 )        break;      switch ( option )      {      case 'd':        parse_design_coords( optarg );        break;      case 'e':        encoding = (FT_Encoding)make_tag( optarg );        break;      case 'f':        first_glyph = atoi( optarg );        break;      case 'r':        res = atoi( optarg );        if ( res < 1 )          usage( execname );        break;      default:        usage( execname );        break;      }    }    argc -= optind;    argv += optind;    if ( argc <= 1 )      usage( execname );    if ( sscanf( argv[0], "%d", &orig_ptsize ) != 1 )      orig_ptsize = 64;    file = 1;    /* Initialize engine */    error = FT_Init_FreeType( &library );    if ( error )      PanicZ( "Could not initialize FreeType library" );  NewFile:    ptsize      = orig_ptsize;    hinted      = 1;    file_loaded = 0;    /* Load face */    error = FT_New_Face( library, argv[file], 0, &face );    if ( error )      goto Display_Font;    if ( encoding != FT_ENCODING_NONE )    {      error = FT_Select_Charmap( face, encoding );      if ( error )        goto Display_Font;    }    /* retrieve multiple master information */    error = FT_Get_MM_Var( face, &multimaster );    if ( error )      goto Display_Font;    /* if the user specified a position, use it, otherwise */    /* set the current position to the median of each axis */    {      int  n;      for ( n = 0; n < (int)multimaster->num_axis; n++ )      {        design_pos[n] = n < requested_cnt ? requested_pos[n]                                          : multimaster->axis[n].def;        if ( design_pos[n] < multimaster->axis[n].minimum )          design_pos[n] = multimaster->axis[n].minimum;        else if ( design_pos[n] > multimaster->axis[n].maximum )          design_pos[n] = multimaster->axis[n].maximum;      }    }    error = FT_Set_Var_Design_Coordinates( face,                                           multimaster->num_axis,                                           design_pos );    if ( error )      goto Display_Font;    file_loaded++;    Reset_Scale( ptsize );    num_glyphs = face->num_glyphs;    glyph      = face->glyph;    size       = face->size;  Display_Font:    /* initialize graphics if needed */    if ( !XisSetup )    {      XisSetup = 1;      Init_Display();    }    grSetTitle( surface, "FreeType Glyph Viewer - press F1 for help" );    old_ptsize = ptsize;    if ( file_loaded >= 1 )    {      Fail = 0;      Num  = first_glyph;      if ( Num >= num_glyphs )        Num = num_glyphs - 1;      if ( Num < 0 )        Num = 0;    }    for ( ;; )    {      int  key;      Clear_Display();      if ( file_loaded >= 1 )      {        switch ( render_mode )        {        case 0:          Render_Text( Num );          break;        default:          Render_All( Num, ptsize );        }        sprintf( Header, "%s %s (file %s)",                         face->family_name,                         face->style_name,                         ft_basename( argv[file] ) );        if ( !new_header )          new_header = Header;        grWriteCellString( &bit, 0, 0, new_header, fore_color );        new_header = 0;        sprintf( Header, "axis: " );        {          int  n;          for ( n = 0; n < (int)multimaster->num_axis; n++ )          {            char  temp[32];            sprintf( temp, "  %s:%g",                           multimaster->axis[n].name,                           design_pos[n]/65536. );            strcat( Header, temp );          }        }        grWriteCellString( &bit, 0, 16, Header, fore_color );        sprintf( Header, "at %d points, first glyph = %d",                         ptsize,                         Num );      }      else      {        sprintf( Header, "%s: not an MM font file, or could not be opened",                         ft_basename( argv[file] ) );      }      grWriteCellString( &bit, 0, 8, Header, fore_color );      grRefreshSurface( surface );      grListenSurface( surface, 0, &event );      if ( !( key = Process_Event( &event ) ) )        goto End;      if ( key == 'n' )      {        if ( file_loaded >= 1 )          FT_Done_Face( face );        if ( file < argc - 1 )          file++;        goto NewFile;      }      if ( key == 'p' )      {        if ( file_loaded >= 1 )          FT_Done_Face( face );        if ( file > 1 )          file--;        goto NewFile;      }      if ( ptsize != old_ptsize )      {        Reset_Scale( ptsize );        old_ptsize = ptsize;      }    }  End:#if 0    grDoneSurface( surface );    grDone();#endif    free            ( multimaster );    FT_Done_Face    ( face        );    FT_Done_FreeType( library     );    printf( "Execution completed successfully.\n" );    printf( "Fails = %d\n", Fail );    exit( 0 );      /* for safety reasons */    return 0;       /* never reached */  }/* End */

⌨️ 快捷键说明

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