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

📄 ftstring.c

📁 freetype库的应用demo,里面包含freetype的很多实例
💻 C
📖 第 1 页 / 共 2 页
字号:
    num_glyphs = expect = 0;    while ( *p )    {      in_code = *p++ ;      if ( in_code >= 0xC0 )      {        if ( in_code < 0xE0 )           /*  U+0080 - U+07FF   */        {          expect = 1;          codepoint = in_code & 0x1F;        }        else if ( in_code < 0xF0 )      /*  U+0800 - U+FFFF   */        {          expect = 2;          codepoint = in_code & 0x0F;        }        else if ( in_code < 0xF8 )      /* U+10000 - U+10FFFF */        {          expect = 3;          codepoint = in_code & 0x07;        }        continue;      }      else if ( in_code >= 0x80 )      {        --expect;        if ( expect >= 0 )        {          codepoint <<= 6;          codepoint  += in_code & 0x3F;        }        if ( expect >  0 )          continue;        expect = 0;      }      else                              /* ASCII, U+0000 - U+007F */        codepoint = in_code;      if ( encoding )        glyph_index = FT_Get_Char_Index( face, codepoint );      else        glyph_index = codepoint;      glyph->glyph_index = glyph_index;      glyph++;      num_glyphs++;      if ( num_glyphs >= MAX_GLYPHS )        break;    }  }  static void  reset_transform( void )  {    double    angle   = Rotation * 3.14159 / 64.0;    FT_Fixed  cosinus = (FT_Fixed)( cos( angle ) * 65536.0 );    FT_Fixed  sinus   = (FT_Fixed)( sin( angle ) * 65536.0 );    transform       = ( angle != 0 );    trans_matrix.xx = cosinus;    trans_matrix.yx = sinus;    trans_matrix.xy = -sinus;    trans_matrix.yy = cosinus;  }/****************************************************************************//****************************************************************************//****************************************************************************//****                                                                    ****//****                     E V E N T   H A N D L I N G                    ****//****                                                                    ****//****************************************************************************//****************************************************************************//****************************************************************************/  static void  Help( void )  {    grEvent  dummy_event;    clear_display();    grGotoxy( 0, 0 );    grSetMargin( 2, 1 );    grGotobitmap( &bit );    grWriteln("FreeType String Viewer - part of the FreeType test suite" );    grLn();    grWriteln("This program is used to display a string of text using" );    grWriteln("the new convenience API of the FreeType 2 library.");    grLn();    grWriteln("Use the following keys :");    grLn();    grWriteln("  F1 or ?   : display this help screen" );    grWriteln("  a         : toggle anti-aliasing" );    grWriteln("  f         : toggle forced auto-hinting" );    grWriteln("  h         : toggle outline hinting" );    grWriteln("  k         : toggle kerning" );    grWriteln("  g         : toggle gamma correction" );    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     : rotate counter-clockwise" );    grWriteln("  Left      : rotate clockwise" );    grWriteln("  F7        : big rotate counter-clockwise");    grWriteln("  F8        : big rotate clockwise");    grLn();    grWriteln("  F9        : decrease gamma by 0.1" );    grWriteln("  F10       : increase gamma by 0.1" );    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( 'f' ):      autohint = !autohint;      new_header = autohint ? (char *)"forced auto-hinting is now on"                            : (char *)"forced auto-hinting is now off";      return 1;    case grKEY( 'k' ):      kerning = ( kerning + 1 ) % 3;      new_header =        kerning == 2          ? (char *)"kerning and side bearing correction is now active"          : kerning == 1 ? (char *)"kerning is now active"                         : (char *)"kerning is now ignored";      return 1;    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' ):#if 0      use_sbits  = !use_sbits;      new_header = use_sbits                     ? (char *)"embedded bitmaps are now used when available"                     : (char *)"embedded bitmaps are now ignored";#else      new_header = (char *)"embedded bitmaps can't be rotated/transformed";#endif      return 1;    case grKEY( 'n' ):    case grKEY( 'p' ):      return (int)event->key;    case grKEY( 'h' ):      hinted     = !hinted;      new_header = hinted ? (char *)"glyph hinting is now active"                          : (char *)"glyph hinting is now ignored";      break;    case grKEY( 'g' ):      use_gamma = !use_gamma;      new_header = use_gamma ? (char *)"gamma correction is now on"                             : (char *)"gamma correction is now off";      return 1;    case grKeyF1:    case grKEY( '?' ):      Help();      return 1;#if 0    case grKeyF3: i =  16; goto Do_Rotate;    case grKeyF4: i = -16; goto Do_Rotate;    case grKeyF5: i =   1; goto Do_Rotate;    case grKeyF6: i =  -1; goto Do_Rotate;#endif    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_Rotate;    case grKeyRight: i =   1; goto Do_Rotate;    case grKeyF7:    i = -10; goto Do_Rotate;    case grKeyF8:    i =  10; goto Do_Rotate;    case grKeyF9 : if (gamma_value > 0.1f) gamma_value -= 0.1f; goto Do_Gamma_Set;    case grKeyF10:                         gamma_value += 0.1f; goto Do_Gamma_Set;    default:      ;    }    return 1;  Do_Rotate:    Rotation = ( Rotation + i ) & 127;    return 1;  Do_Gamma_Set:  {    static char header_buffer[64];    sprintf(header_buffer, "gamma is %.1f", gamma_value);    new_header = header_buffer;    init_gamma();    return 1;  }  Do_Scale:    ptsize += i;    if ( ptsize < 1 )         ptsize = 1;    if ( ptsize > MAXPTSIZE ) ptsize = MAXPTSIZE;    return 1;#if 0  Do_Glyph:    Num += i;    if ( Num < 0 )           Num = 0;    if ( Num >= num_glyphs ) Num = num_glyphs - 1;    return 1;#endif  }/****************************************************************************//****************************************************************************//****************************************************************************//****                                                                    ****//****                       M A I N   P R O G R A M                      ****//****                                                                    ****//****************************************************************************//****************************************************************************//****************************************************************************/  static void  usage( char*  execname )  {    fprintf( stderr,  "\n" );    fprintf( stderr,  "ftstring: string 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,  "  -e enc      specify encoding tag (default: unic)\n" );    fprintf( stderr,  "  -r R        use resolution R dpi (default: 72 dpi)\n" );    fprintf( stderr,  "  -m message  message to display\n" );    fprintf( stderr,  "\n" );    exit( 1 );  }  int  main( int     argc,        char**  argv )  {    int     i, old_ptsize, orig_ptsize, file;    int     first_glyph = 0;    int     XisSetup = 0;    char    filename[128 + 4];    char    alt_filename[128 + 4];    char*   execname;    int     option;    int     file_loaded;    PGlyph  glyph;    grEvent   event;    execname = ft_basename( argv[0] );    while ( 1 )    {      option = getopt( argc, argv, "e:m:r:" );      if ( option == -1 )        break;      switch ( option )      {      case 'e':        encoding = (FT_Encoding)make_tag( optarg );        break;      case 'r':        res = atoi( optarg );        if ( res < 1 )          usage( execname );        break;      case 'm':        if ( argc < 3 )          usage( execname );        Text = optarg;        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;#ifndef macintosh    i = strlen( argv[file] );    while ( i > 0 && argv[file][i] != '\\' && argv[file][i] != '/' )    {      if ( argv[file][i] == '.' )        i = 0;      i--;    }#endif    filename[128] = '\0';    alt_filename[128] = '\0';    strncpy( filename, argv[file], 128 );    strncpy( alt_filename, argv[file], 128 );    /* first, try to load the glyph name as-is */    error = FT_New_Face( library, filename, 0, &face );    if ( !error )      goto Success;#ifndef macintosh    if ( i >= 0 )    {      strncpy( filename + strlen( filename ), ".ttf", 4 );      strncpy( alt_filename + strlen( alt_filename ), ".ttc", 4 );    }#endif    /* if it didn't work, try to add ".ttf" at the end */    error = FT_New_Face( library, filename, 0, &face );    if ( error )      goto Display_Font;  Success:    init_gamma();    /* prepare the text to be rendered */    prepare_text( (unsigned char*)Text );    file_loaded++;    reset_scale( ptsize );  Display_Font:    /* initialise graphics if needed */    if ( !XisSetup )    {      XisSetup = 1;      init_display();    }    grSetTitle( surface, "FreeType String 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 )      {        /* layout & render string */        {          reset_transform();          layout_glyphs();          if (use_gamma)            draw_gamma_ramp();          render_string( bit.width/2, bit.rows/2 );        }        sprintf( Header, "%s %s (file %s)",                         face->family_name,                         face->style_name,                         ft_basename( filename ) );        if (!new_header)          new_header = Header;        grWriteCellString( &bit, 0, 0, new_header, fore_color );        new_header = 0;        sprintf( Header, "at %d points, rotation = %d",                         ptsize,                         Rotation );      }      else      {        sprintf( Header, "`%s' is not a font file or could not be opened",                         ft_basename(filename) );      }      grWriteCellString( &bit, 0, 8, Header, fore_color );      grRefreshSurface( surface );      grListenSurface( surface, 0, &event );      if ( !( key = Process_Event( &event ) ) )        goto Fin;      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;      }    }  Fin:    glyph = glyphs;    for ( i = 0; i < MAX_GLYPHS; i++, glyph++ )      if ( glyph->image )        FT_Done_Glyph( glyph->image );    FT_Done_Face    ( face    );    FT_Done_FreeType( library );#if 0    grDoneSurface( surface );    grDone();#endif    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 + -