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

📄 cffdrivr.c

📁 a very goog book
💻 C
📖 第 1 页 / 共 2 页
字号:
    if ( buffer_max > 0 )    {      FT_UInt  len = ft_strlen( gname );      if ( len >= buffer_max )        len = buffer_max - 1;      FT_MEM_COPY( buffer, gname, len );      ((FT_Byte*)buffer)[len] = 0;    }    FT_FREE ( gname );    error = CFF_Err_Ok;    Exit:      return error;  }  /*************************************************************************/  /*                                                                       */  /* <Function>                                                            */  /*    cff_get_char_index                                                 */  /*                                                                       */  /* <Description>                                                         */  /*    Uses a charmap to return a given character code's glyph index.     */  /*                                                                       */  /* <Input>                                                               */  /*    charmap  :: A handle to the source charmap object.                 */  /*    charcode :: The character code.                                    */  /*                                                                       */  /* <Return>                                                              */  /*    Glyph index.  0 means `undefined character code'.                  */  /*                                                                       */  static FT_UInt  cff_get_char_index( TT_CharMap  charmap,                      FT_Long     charcode )  {    FT_Error      error;    CFF_Face      face;    TT_CMapTable  cmap;    cmap = &charmap->cmap;    face = (CFF_Face)charmap->root.face;    /* Load table if needed */    if ( !cmap->loaded )    {      SFNT_Service  sfnt = (SFNT_Service)face->sfnt;      error = sfnt->load_charmap( face, cmap, face->root.stream );      if ( error )        return 0;      cmap->loaded = TRUE;    }    return ( cmap->get_index ? cmap->get_index( cmap, charcode ) : 0 );  }  /*************************************************************************/  /*                                                                       */  /* <Function>                                                            */  /*    cff_get_next_char                                                  */  /*                                                                       */  /* <Description>                                                         */  /*    Uses a charmap to return the next encoded charcode.                */  /*                                                                       */  /* <Input>                                                               */  /*    charmap  :: A handle to the source charmap object.                 */  /*    charcode :: The character code.                                    */  /*                                                                       */  /* <Return>                                                              */  /*    Char code.  0 means `no encoded chars above the given one'.        */  /*                                                                       */  static FT_Long  cff_get_next_char( TT_CharMap  charmap,                     FT_Long     charcode )  {    FT_Error      error;    CFF_Face      face;    TT_CMapTable  cmap;    cmap = &charmap->cmap;    face = (CFF_Face)charmap->root.face;    /* Load table if needed */    if ( !cmap->loaded )    {      SFNT_Service  sfnt = (SFNT_Service)face->sfnt;      error = sfnt->load_charmap( face, cmap, face->root.stream );      if ( error )        return 0;      cmap->loaded = TRUE;    }    return ( cmap->get_next_char ? cmap->get_next_char( cmap, charcode )                                 : 0 );  }  /*************************************************************************/  /*                                                                       */  /* <Function>                                                            */  /*    cff_get_name_index                                                 */  /*                                                                       */  /* <Description>                                                         */  /*    Uses the psnames module and the CFF font's charset to to return a  */  /*    a given glyph name's glyph index.                                  */  /*                                                                       */  /* <Input>                                                               */  /*    face       :: A handle to the source face object.                  */  /*                                                                       */  /*    glyph_name :: The glyph name.                                      */  /*                                                                       */  /* <Return>                                                              */  /*    Glyph index.  0 means `undefined character code'.                  */  /*                                                                       */  static FT_UInt  cff_get_name_index( CFF_Face    face,                      FT_String*  glyph_name )  {    CFF_Font         cff;    CFF_Charset      charset;    PSNames_Service  psnames;    FT_Memory        memory = FT_FACE_MEMORY( face );    FT_String*       name;    FT_UShort        sid;    FT_UInt          i;    FT_Int           result;    cff     = (CFF_FontRec *)face->extra.data;    charset = &cff->charset;    psnames = (PSNames_Service)FT_Get_Module_Interface(                face->root.driver->root.library, "psnames" );    for ( i = 0; i < cff->num_glyphs; i++ )    {      sid = charset->sids[i];      if ( sid > 390 )        name = CFF_Get_Name( &cff->string_index, sid - 391 );      else        name = (FT_String *)psnames->adobe_std_strings( sid );      result = ft_strcmp( glyph_name, name );      if ( sid > 390 )        FT_FREE( name );      if ( !result )        return i;    }    return 0;  }  /*************************************************************************/  /*************************************************************************/  /*************************************************************************/  /****                                                                 ****/  /****                                                                 ****/  /****                D R I V E R  I N T E R F A C E                   ****/  /****                                                                 ****/  /****                                                                 ****/  /*************************************************************************/  /*************************************************************************/  /*************************************************************************/  static FT_Module_Interface  cff_get_interface( CFF_Driver   driver,                     const char*  module_interface )  {    FT_Module  sfnt;#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES    if ( ft_strcmp( (const char*)module_interface, "glyph_name" ) == 0 )      return (FT_Module_Interface)cff_get_glyph_name;    if ( ft_strcmp( (const char*)module_interface, "name_index" ) == 0 )      return (FT_Module_Interface)cff_get_name_index;#endif    /* we simply pass our request to the `sfnt' module */    sfnt = FT_Get_Module( driver->root.root.library, "sfnt" );    return sfnt ? sfnt->clazz->get_interface( sfnt, module_interface ) : 0;  }  /* The FT_DriverInterface structure is defined in ftdriver.h. */  FT_CALLBACK_TABLE_DEF  const FT_Driver_ClassRec  cff_driver_class =  {    /* begin with the FT_Module_Class fields */    {      ft_module_font_driver       |      ft_module_driver_scalable   |      ft_module_driver_has_hinter,            sizeof( CFF_DriverRec ),      "cff",      0x10000L,      0x20000L,      0,   /* module-specific interface */      (FT_Module_Constructor)CFF_Driver_Init,      (FT_Module_Destructor) CFF_Driver_Done,      (FT_Module_Requester)  cff_get_interface,    },    /* now the specific driver fields */    sizeof( TT_FaceRec ),    sizeof( FT_SizeRec ),    sizeof( CFF_GlyphSlotRec ),    (FT_Face_InitFunc)        CFF_Face_Init,    (FT_Face_DoneFunc)        CFF_Face_Done,    (FT_Size_InitFunc)        CFF_Size_Init,    (FT_Size_DoneFunc)        CFF_Size_Done,    (FT_Slot_InitFunc)        CFF_GlyphSlot_Init,    (FT_Slot_DoneFunc)        CFF_GlyphSlot_Done,    (FT_Size_ResetPointsFunc) CFF_Size_Reset,    (FT_Size_ResetPixelsFunc) CFF_Size_Reset,    (FT_Slot_LoadFunc)        Load_Glyph,    (FT_CharMap_CharIndexFunc)cff_get_char_index,    (FT_Face_GetKerningFunc)  Get_Kerning,    (FT_Face_AttachFunc)      0,    (FT_Face_GetAdvancesFunc) 0,        (FT_CharMap_CharNextFunc) cff_get_next_char  };/* END */

⌨️ 快捷键说明

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