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

📄 sfobjs.c

📁 奇趣公司比较新的qt/emd版本
💻 C
📖 第 1 页 / 共 3 页
字号:
      /*                                                                   */      if ( has_outline == TRUE )        flags |= FT_FACE_FLAG_SCALABLE;   /* scalable outlines */      /* The sfnt driver only supports bitmap fonts natively, thus we */      /* don't set FT_FACE_FLAG_HINTER.                               */      flags |= FT_FACE_FLAG_SFNT       |  /* SFNT file format  */               FT_FACE_FLAG_HORIZONTAL;   /* horizontal data   */#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES      if ( psnames_error == SFNT_Err_Ok &&           face->postscript.FormatType != 0x00030000L )        flags |= FT_FACE_FLAG_GLYPH_NAMES;#endif      /* fixed width font? */      if ( face->postscript.isFixedPitch )        flags |= FT_FACE_FLAG_FIXED_WIDTH;      /* vertical information? */      if ( face->vertical_info )        flags |= FT_FACE_FLAG_VERTICAL;      /* kerning available ? */      if ( TT_FACE_HAS_KERNING( face ) )        flags |= FT_FACE_FLAG_KERNING;#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT      /* Don't bother to load the tables unless somebody asks for them. */      /* No need to do work which will (probably) not be used.          */      if ( tt_face_lookup_table( face, TTAG_glyf ) != 0 &&           tt_face_lookup_table( face, TTAG_fvar ) != 0 &&           tt_face_lookup_table( face, TTAG_gvar ) != 0 )        flags |= FT_FACE_FLAG_MULTIPLE_MASTERS;#endif      root->face_flags = flags;      /*********************************************************************/      /*                                                                   */      /* Compute style flags.                                              */      /*                                                                   */      flags = 0;      if ( has_outline == TRUE && face->os2.version != 0xFFFFU )      {        /* we have an OS/2 table; use the `fsSelection' field */        if ( face->os2.fsSelection & 1 )          flags |= FT_STYLE_FLAG_ITALIC;        if ( face->os2.fsSelection & 32 )          flags |= FT_STYLE_FLAG_BOLD;      }      else      {        /* this is an old Mac font, use the header field */        if ( face->header.Mac_Style & 1 )          flags |= FT_STYLE_FLAG_BOLD;        if ( face->header.Mac_Style & 2 )          flags |= FT_STYLE_FLAG_ITALIC;      }      root->style_flags = flags;      /*********************************************************************/      /*                                                                   */      /* Polish the charmaps.                                              */      /*                                                                   */      /*   Try to set the charmap encoding according to the platform &     */      /*   encoding ID of each charmap.                                    */      /*                                                                   */      tt_face_build_cmaps( face );  /* ignore errors */      /* set the encoding fields */      {        FT_Int  m;        for ( m = 0; m < root->num_charmaps; m++ )        {          FT_CharMap  charmap = root->charmaps[m];          charmap->encoding = sfnt_find_encoding( charmap->platform_id,                                                  charmap->encoding_id );#if 0          if ( root->charmap     == NULL &&               charmap->encoding == FT_ENCODING_UNICODE )          {            /* set 'root->charmap' to the first Unicode encoding we find */            root->charmap = charmap;          }#endif        }      }      /*********************************************************************/      /*                                                                   */      /*  Set up metrics.                                                  */      /*                                                                   */      if ( has_outline == TRUE )      {        /* XXX What about if outline header is missing */        /*     (e.g. sfnt wrapped bitmap)?             */        root->bbox.xMin    = face->header.xMin;        root->bbox.yMin    = face->header.yMin;        root->bbox.xMax    = face->header.xMax;        root->bbox.yMax    = face->header.yMax;        root->units_per_EM = face->header.Units_Per_EM;        /* XXX: Computing the ascender/descender/height is very different */        /*      from what the specification tells you.  Apparently, we    */        /*      must be careful because                                   */        /*                                                                */        /*      - not all fonts have an OS/2 table; in this case, we take */        /*        the values in the horizontal header.  However, these    */        /*        values very often are not reliable.                     */        /*                                                                */        /*      - otherwise, the correct typographic values are in the    */        /*        sTypoAscender, sTypoDescender & sTypoLineGap fields.    */        /*                                                                */        /*        However, certain fonts have these fields set to 0.      */        /*        Rather, they have usWinAscent & usWinDescent correctly  */        /*        set (but with different values).                        */        /*                                                                */        /*      As an example, Arial Narrow is implemented through four   */        /*      files ARIALN.TTF, ARIALNI.TTF, ARIALNB.TTF & ARIALNBI.TTF */        /*                                                                */        /*      Strangely, all fonts have the same values in their        */        /*      sTypoXXX fields, except ARIALNB which sets them to 0.     */        /*                                                                */        /*      On the other hand, they all have different                */        /*      usWinAscent/Descent values -- as a conclusion, the OS/2   */        /*      table cannot be used to compute the text height reliably! */        /*                                                                */        /* The ascender/descender/height are computed from the OS/2 table */        /* when found.  Otherwise, they're taken from the horizontal      */        /* header.                                                        */        /*                                                                */        root->ascender  = face->horizontal.Ascender;        root->descender = face->horizontal.Descender;        root->height    = (FT_Short)( root->ascender - root->descender +                                      face->horizontal.Line_Gap );#if 0        /* if the line_gap is 0, we add an extra 15% to the text height --  */        /* this computation is based on various versions of Times New Roman */        if ( face->horizontal.Line_Gap == 0 )          root->height = (FT_Short)( ( root->height * 115 + 50 ) / 100 );#endif#if 0        /* some fonts have the OS/2 "sTypoAscender", "sTypoDescender" & */        /* "sTypoLineGap" fields set to 0, like ARIALNB.TTF             */        if ( face->os2.version != 0xFFFFU && root->ascender )        {          FT_Int  height;          root->ascender  =  face->os2.sTypoAscender;          root->descender = -face->os2.sTypoDescender;          height = root->ascender + root->descender + face->os2.sTypoLineGap;          if ( height > root->height )            root->height = height;        }#endif /* 0 */        root->max_advance_width   = face->horizontal.advance_Width_Max;        root->max_advance_height  = (FT_Short)( face->vertical_info                                      ? face->vertical.advance_Height_Max                                      : root->height );        root->underline_position  = face->postscript.underlinePosition;        root->underline_thickness = face->postscript.underlineThickness;      }#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS      /*       *  Now allocate the root array of FT_Bitmap_Size records and       *  populate them.  Unfortunately, it isn't possible to indicate bit       *  depths in the FT_Bitmap_Size record.  This is a design error.       */      {        FT_UInt  i, count;#if !defined FT_CONFIG_OPTION_OLD_INTERNALS        count = face->sbit_num_strikes;#else        count = (FT_UInt)face->num_sbit_strikes;#endif        if ( count > 0 )        {          FT_Memory        memory   = face->root.stream->memory;          FT_UShort        em_size  = face->header.Units_Per_EM;          FT_Short         avgwidth = face->os2.xAvgCharWidth;          FT_Size_Metrics  metrics;          if ( em_size == 0 || face->os2.version == 0xFFFFU )          {            avgwidth = 0;            em_size = 1;          }          if ( FT_NEW_ARRAY( root->available_sizes, count ) )            goto Exit;          for ( i = 0; i < count; i++ )          {            FT_Bitmap_Size*  bsize = root->available_sizes + i;            error = sfnt->load_strike_metrics( face, i, &metrics );            if ( error )              goto Exit;            bsize->height = (FT_Short)( metrics.height >> 6 );            bsize->width = (FT_Short)(                ( avgwidth * metrics.x_ppem + em_size / 2 ) / em_size );            bsize->x_ppem = metrics.x_ppem << 6;            bsize->y_ppem = metrics.y_ppem << 6;            /* assume 72dpi */            bsize->size   = metrics.y_ppem << 6;          }          root->face_flags     |= FT_FACE_FLAG_FIXED_SIZES;          root->num_fixed_sizes = (FT_Int)count;        }      }#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */    }  Exit:    FT_TRACE2(( "sfnt_load_face: done\n" ));    return error;  }#undef LOAD_#undef LOADM_  FT_LOCAL_DEF( void )  sfnt_done_face( TT_Face  face )  {    FT_Memory     memory = face->root.memory;    SFNT_Service  sfnt   = (SFNT_Service)face->sfnt;    if ( sfnt )    {      /* destroy the postscript names table if it is loaded */      if ( sfnt->free_psnames )        sfnt->free_psnames( face );      /* destroy the embedded bitmaps table if it is loaded */      if ( sfnt->free_eblc )        sfnt->free_eblc( face );    }#ifdef TT_CONFIG_OPTION_BDF    /* freeing the embedded BDF properties */    tt_face_free_bdf_props( face );#endif    /* freeing the kerning table */    tt_face_done_kern( face );    /* freeing the collection table */    FT_FREE( face->ttc_header.offsets );    face->ttc_header.count = 0;    /* freeing table directory */    FT_FREE( face->dir_tables );    face->num_tables = 0;    {      FT_Stream  stream = FT_FACE_STREAM( face );      /* simply release the 'cmap' table frame */      FT_FRAME_RELEASE( face->cmap_table );      face->cmap_size = 0;    }    /* freeing the horizontal metrics */#if !defined FT_CONFIG_OPTION_OLD_INTERNALS    {      FT_Stream  stream = FT_FACE_STREAM( face );      FT_FRAME_RELEASE( face->horz_metrics );      FT_FRAME_RELEASE( face->vert_metrics );      face->horz_metrics_size = 0;      face->vert_metrics_size = 0;    }#else    FT_FREE( face->horizontal.long_metrics );    FT_FREE( face->horizontal.short_metrics );#endif    /* freeing the vertical ones, if any */    if ( face->vertical_info )    {      FT_FREE( face->vertical.long_metrics  );      FT_FREE( face->vertical.short_metrics );      face->vertical_info = 0;    }    /* freeing the gasp table */    FT_FREE( face->gasp.gaspRanges );    face->gasp.numRanges = 0;    /* freeing the name table */    sfnt->free_name( face );    /* freeing family and style name */    FT_FREE( face->root.family_name );    FT_FREE( face->root.style_name );    /* freeing sbit size table */    FT_FREE( face->root.available_sizes );    face->root.num_fixed_sizes = 0;    FT_FREE( face->postscript_name );    face->sfnt = 0;  }/* END */

⌨️ 快捷键说明

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