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

📄 pfrload.c

📁 a very goog book
💻 C
📖 第 1 页 / 共 2 页
字号:
    if ( flags0 & PFR_STRIKE_2BYTE_COUNT )      size1++;    strike = phy_font->strikes + phy_font->num_strikes;    PFR_CHECK( count * size1 );    for ( n = 0; n < count; n++, strike++ )    {      strike->x_ppm       = ( flags0 & PFR_STRIKE_2BYTE_XPPM )                            ? PFR_NEXT_USHORT( p )                            : PFR_NEXT_BYTE( p );      strike->y_ppm       = ( flags0 & PFR_STRIKE_2BYTE_YPPM )                            ? PFR_NEXT_USHORT( p )                            : PFR_NEXT_BYTE( p );      strike->flags       = PFR_NEXT_BYTE( p );      strike->bct_size    = ( flags0 & PFR_STRIKE_3BYTE_SIZE )                            ? PFR_NEXT_ULONG( p )                            : PFR_NEXT_USHORT( p );      strike->bct_offset  = ( flags0 & PFR_STRIKE_3BYTE_OFFSET )                            ? PFR_NEXT_ULONG( p )                            : PFR_NEXT_USHORT( p );      strike->num_bitmaps = ( flags0 & PFR_STRIKE_2BYTE_COUNT )                            ? PFR_NEXT_USHORT( p )                            : PFR_NEXT_BYTE( p );    }    phy_font->num_strikes += count;      Exit:    return error;      Too_Short:    error = PFR_Err_Invalid_Table;    FT_ERROR(( "pfr_extra_item_load_bitmap_info: invalid bitmap info table\n" ));    goto Exit;  }                                    /* load font ID, i.e. name */  FT_CALLBACK_DEF( FT_Error )  pfr_extra_item_load_font_id( FT_Byte*     p,                               FT_Byte*     limit,                               PFR_PhyFont  phy_font )  {    FT_Error   error  = 0;    FT_Memory  memory = phy_font->memory;    FT_UInt    len    = (FT_UInt)( limit - p );        if ( phy_font->font_id != NULL )      goto Exit;        if ( FT_ALLOC( phy_font->font_id, len+1 ) )      goto Exit;    /* copy font ID name, and terminate it for safety */    FT_MEM_COPY( phy_font->font_id, p, len );    phy_font->font_id[len] = 0;      Exit:    return error;  }  /* load stem snap tables */  FT_CALLBACK_DEF( FT_Error )  pfr_extra_item_load_stem_snaps( FT_Byte*     p,                                  FT_Byte*     limit,                                  PFR_PhyFont  phy_font )  {    FT_UInt    count, num_vert, num_horz;    FT_Int*    snaps;    FT_Error   error  = 0;    FT_Memory  memory = phy_font->memory;    if ( phy_font->vertical.stem_snaps != NULL )      goto Exit;        PFR_CHECK( 1 );    count = PFR_NEXT_BYTE( p );        num_vert = count & 15;    num_horz = count >> 4;    count    = num_vert + num_horz;        PFR_CHECK( count * 2 );        if ( FT_NEW_ARRAY( snaps, count ) )      goto Exit;        phy_font->vertical.stem_snaps = snaps;    phy_font->horizontal.stem_snaps = snaps + num_vert;        for ( ; count > 0; count--, snaps++ )      *snaps = FT_NEXT_SHORT( p );      Exit:    return error;    Too_Short:    error = PFR_Err_Invalid_Table;    FT_ERROR(( "pfr_exta_item_load_stem_snaps: invalid stem snaps table\n" ));    goto Exit;  }                                   /* load kerning pair data */  FT_CALLBACK_DEF( FT_Error )  pfr_extra_item_load_kerning_pairs( FT_Byte*     p,                                     FT_Byte*     limit,                                     PFR_PhyFont  phy_font )  {    FT_Int        count;    FT_UShort     base_adj;    FT_UInt       flags;    FT_UInt       num_pairs;    PFR_KernPair  pairs;    FT_Error      error  = 0;    FT_Memory     memory = phy_font->memory;    /* XXX: there may be multiple extra items for kerning */    if ( phy_font->kern_pairs != NULL )      goto Exit;    FT_TRACE2(( "pfr_extra_item_load_kerning_pairs()\n" ));        PFR_CHECK( 4 );    num_pairs = PFR_NEXT_BYTE( p );    base_adj  = PFR_NEXT_SHORT( p );    flags     = PFR_NEXT_BYTE( p );    #ifndef PFR_CONFIG_NO_CHECKS    count = 3;        if ( flags & PFR_KERN_2BYTE_CHAR )      count += 2;        if ( flags & PFR_KERN_2BYTE_ADJ )      count += 1;    PFR_CHECK( num_pairs * count );#endif    if ( FT_NEW_ARRAY( pairs, num_pairs ) )      goto Exit;        phy_font->num_kern_pairs = num_pairs;    phy_font->kern_pairs     = pairs;        for (count = num_pairs ; count > 0; count--, pairs++ )    {      if ( flags & PFR_KERN_2BYTE_CHAR )      {        pairs->glyph1 = PFR_NEXT_USHORT( p );        pairs->glyph2 = PFR_NEXT_USHORT( p );      }      else      {        pairs->glyph1 = PFR_NEXT_BYTE( p );        pairs->glyph2 = PFR_NEXT_BYTE( p );      }           if ( flags & PFR_KERN_2BYTE_ADJ )        pairs->kerning.x = base_adj + PFR_NEXT_SHORT( p );      else        pairs->kerning.x = base_adj + PFR_NEXT_INT8( p );      pairs->kerning.y = 0;      FT_TRACE2(( "kerning %d <-> %d : %ld\n",                   pairs->glyph1, pairs->glyph2, pairs->kerning.x ));    }        Exit:    return error;    Too_Short:    error = PFR_Err_Invalid_Table;    FT_ERROR(( "pfr_extra_item_load_kerning_pairs: "               "invalid kerning pairs table\n" ));    goto Exit;  }                                   static const PFR_ExtraItemRec  pfr_phy_font_extra_items[] =  {    { 1, (PFR_ExtraItem_ParseFunc) pfr_extra_item_load_bitmap_info },    { 2, (PFR_ExtraItem_ParseFunc) pfr_extra_item_load_font_id },    { 3, (PFR_ExtraItem_ParseFunc) pfr_extra_item_load_stem_snaps },    { 4, (PFR_ExtraItem_ParseFunc) pfr_extra_item_load_kerning_pairs },    { 0, NULL }  };  FT_LOCAL_DEF( void )  pfr_phy_font_done( PFR_PhyFont  phy_font,                     FT_Memory    memory )  {    if ( phy_font->font_id )      FT_FREE( phy_font->font_id );    FT_FREE( phy_font->vertical.stem_snaps );    phy_font->vertical.num_stem_snaps = 0;    phy_font->horizontal.stem_snaps     = NULL;    phy_font->horizontal.num_stem_snaps = 0;    FT_FREE( phy_font->strikes );    phy_font->num_strikes = 0;    phy_font->max_strikes = 0;      FT_FREE( phy_font->chars );    phy_font->num_chars    = 0;    phy_font->chars_offset = 0;    FT_FREE( phy_font->blue_values );    phy_font->num_blue_values = 0;    FT_FREE( phy_font->kern_pairs );    phy_font->num_kern_pairs = 0;  }    FT_LOCAL_DEF( FT_Error )  pfr_phy_font_load( PFR_PhyFont  phy_font,                     FT_Stream    stream,                     FT_UInt32    offset,                     FT_UInt32    size )  {    FT_Error   error;    FT_Memory  memory = stream->memory;    FT_UInt    flags, num_aux;    FT_Byte*   p;    FT_Byte*   limit;    phy_font->memory = memory;    phy_font->offset = offset;    if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( size ) )      goto Exit;    p     = stream->cursor;    limit = p + size;    PFR_CHECK( 15 );    phy_font->font_ref_number    = PFR_NEXT_USHORT( p );    phy_font->outline_resolution = PFR_NEXT_USHORT( p );    phy_font->metrics_resolution = PFR_NEXT_USHORT( p );    phy_font->bbox.xMin          = PFR_NEXT_SHORT( p );    phy_font->bbox.yMin          = PFR_NEXT_SHORT( p );    phy_font->bbox.xMax          = PFR_NEXT_SHORT( p );    phy_font->bbox.yMax          = PFR_NEXT_SHORT( p );    phy_font->flags      = flags = PFR_NEXT_BYTE( p );    /* get the standard advance for non-proprotional fonts */    if ( !(flags & PFR_PHY_PROPORTIONAL) )    {      PFR_CHECK( 2 );      phy_font->standard_advance = PFR_NEXT_SHORT( p );    }    /* load the extra items when present */    if ( flags & PFR_PHY_EXTRA_ITEMS )    {      error =  pfr_extra_items_parse( &p, limit,                                      pfr_phy_font_extra_items, phy_font );              if ( error )        goto Fail;    }        /* skip the aux bytes */    PFR_CHECK( 3 );    num_aux = PFR_NEXT_ULONG( p );        PFR_CHECK( num_aux );    p += num_aux;    /* read the blue values */    {      FT_UInt  n, count;      PFR_CHECK( 1 );      phy_font->num_blue_values = count = PFR_NEXT_BYTE( p );      PFR_CHECK( count * 2 );            if ( FT_NEW_ARRAY( phy_font->blue_values, count ) )        goto Fail;      for ( n = 0; n < count; n++ )        phy_font->blue_values[n] = PFR_NEXT_SHORT( p );    }    PFR_CHECK( 8 );    phy_font->blue_fuzz  = PFR_NEXT_BYTE( p );    phy_font->blue_scale = PFR_NEXT_BYTE( p );    phy_font->vertical.standard   = PFR_NEXT_USHORT( p );    phy_font->horizontal.standard = PFR_NEXT_USHORT( p );    /* read the character descriptors */    {      FT_UInt  n, count, Size;      phy_font->num_chars    = count = PFR_NEXT_USHORT( p );      phy_font->chars_offset = offset + ( p - stream->cursor );      if ( FT_NEW_ARRAY( phy_font->chars, count ) )        goto Fail;      Size = 1 + 1 + 2;      if ( flags & PFR_PHY_2BYTE_CHARCODE )        Size += 1;            if ( flags & PFR_PHY_PROPORTIONAL )        Size += 2;            if ( flags & PFR_PHY_ASCII_CODE )        Size += 1;              if ( flags & PFR_PHY_2BYTE_GPS_SIZE )        Size += 1;              if ( flags & PFR_PHY_3BYTE_GPS_OFFSET )        Size += 1;            PFR_CHECK( count * Size );      for ( n = 0; n < count; n++ )      {        PFR_Char  cur = &phy_font->chars[n];        cur->char_code = ( flags & PFR_PHY_2BYTE_CHARCODE )                         ? PFR_NEXT_USHORT( p )                         : PFR_NEXT_BYTE( p );        cur->advance   = ( flags & PFR_PHY_PROPORTIONAL )                         ? PFR_NEXT_SHORT( p )                         : (FT_Int)phy_font->standard_advance;#if 0        cur->ascii     = ( flags & PFR_PHY_ASCII_CODE )                         ? PFR_NEXT_BYTE( p )                         : 0;#else        if ( flags & PFR_PHY_ASCII_CODE )          p += 1;#endif        cur->gps_size  = ( flags & PFR_PHY_2BYTE_GPS_SIZE )                         ? PFR_NEXT_USHORT( p )                         : PFR_NEXT_BYTE( p );        cur->gps_offset = ( flags & PFR_PHY_3BYTE_GPS_OFFSET )                          ? PFR_NEXT_ULONG( p )                          : PFR_NEXT_USHORT( p );      }    }    /* that's it !! */  Fail:    FT_FRAME_EXIT();  Exit:    return error;    Too_Short:    error = PFR_Err_Invalid_Table;    FT_ERROR(( "pfr_phy_font_load: invalid physical font table\n" ));    goto Fail;  }/* END */

⌨️ 快捷键说明

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