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

📄 ftobjs.c

📁 qt-embedded-2.3.8.tar.gz源码
💻 C
📖 第 1 页 / 共 5 页
字号:
  /* documentation is in freetype.h */  FT_EXPORT_DEF( FT_Error )  FT_Get_Glyph_Name( FT_Face     face,                                                FT_UInt     glyph_index,                                                FT_Pointer  buffer,                                                FT_UInt     buffer_max )  {    FT_Error  error = FT_Err_Invalid_Argument;    /* clean up buffer */    if ( buffer && buffer_max > 0 )      ((FT_Byte*)buffer)[0] = 0;    if ( face                                    &&         glyph_index < (FT_UInt)face->num_glyphs &&         FT_HAS_GLYPH_NAMES( face )              )    {      /* now, lookup for glyph name */      FT_Driver        driver = face->driver;      FT_Module_Class* clazz  = FT_MODULE_CLASS( driver );      if ( clazz->get_interface )      {        FT_Glyph_Name_Requester  requester;        requester = (FT_Glyph_Name_Requester)clazz->get_interface(                      FT_MODULE( driver ), "glyph_name" );        if ( requester )          error = requester( face, glyph_index, buffer, buffer_max );      }    }    return error;  }  /* documentation is in tttables.h */  FT_EXPORT_DEF( void* )  FT_Get_Sfnt_Table( FT_Face      face,                                             FT_Sfnt_Tag  tag )  {    void*                   table = 0;    FT_Get_Sfnt_Table_Func  func;    FT_Driver               driver;    if ( !face || !FT_IS_SFNT( face ) )      goto Exit;    driver = face->driver;    func = (FT_Get_Sfnt_Table_Func)driver->root.clazz->get_interface(                                     FT_MODULE( driver ), "get_sfnt" );    if ( func )      table = func( face, tag );  Exit:    return table;  }  /*************************************************************************/  /*************************************************************************/  /*************************************************************************/  /****                                                                 ****/  /****                                                                 ****/  /****                        R E N D E R E R S                        ****/  /****                                                                 ****/  /****                                                                 ****/  /*************************************************************************/  /*************************************************************************/  /*************************************************************************/  /* lookup a renderer by glyph format in the library's list */  FT_BASE_DEF( FT_Renderer )  FT_Lookup_Renderer( FT_Library       library,                                                  FT_Glyph_Format  format,                                                  FT_ListNode*     node )  {    FT_ListNode   cur;    FT_Renderer   result = 0;    if ( !library )      goto Exit;    cur = library->renderers.head;    if ( node )    {      if ( *node )        cur = (*node)->next;      *node = 0;    }    while ( cur )    {      FT_Renderer  renderer = FT_RENDERER( cur->data );      if ( renderer->glyph_format == format )      {        if ( node )          *node = cur;        result = renderer;        break;      }      cur = cur->next;    }  Exit:    return result;  }  static  FT_Renderer  ft_lookup_glyph_renderer( FT_GlyphSlot  slot )  {    FT_Face      face    = slot->face;    FT_Library   library = FT_FACE_LIBRARY( face );    FT_Renderer  result  = library->cur_renderer;    if ( !result || result->glyph_format != slot->format )      result = FT_Lookup_Renderer( library, slot->format, 0 );    return result;  }  static  void  ft_set_current_renderer( FT_Library  library )  {    FT_Renderer  renderer;    renderer = FT_Lookup_Renderer( library, ft_glyph_format_outline, 0 );    library->cur_renderer = renderer;  }  static  FT_Error  ft_add_renderer( FT_Module  module )  {    FT_Library   library = module->library;    FT_Memory    memory  = library->memory;    FT_Error     error;    FT_ListNode  node;    if ( ALLOC( node, sizeof ( *node ) ) )      goto Exit;    {      FT_Renderer         render = FT_RENDERER( module );      FT_Renderer_Class*  clazz  = (FT_Renderer_Class*)module->clazz;      render->clazz        = clazz;      render->glyph_format = clazz->glyph_format;      /* allocate raster object if needed */      if ( clazz->glyph_format == ft_glyph_format_outline &&           clazz->raster_class->raster_new )      {        error = clazz->raster_class->raster_new( memory, &render->raster );        if ( error )          goto Fail;        render->raster_render = clazz->raster_class->raster_render;        render->render        = clazz->render_glyph;      }      /* add to list */      node->data = module;      FT_List_Add( &library->renderers, node );      ft_set_current_renderer( library );    }  Fail:    if ( error )      FREE( node );  Exit:    return error;  }  static  void  ft_remove_renderer( FT_Module  module )  {    FT_Library   library = module->library;    FT_Memory    memory  = library->memory;    FT_ListNode  node;    node = FT_List_Find( &library->renderers, module );    if ( node )    {      FT_Renderer  render = FT_RENDERER( module );      /* release raster object, if any */      if ( render->raster )        render->clazz->raster_class->raster_done( render->raster );      /* remove from list */      FT_List_Remove( &library->renderers, node );      FREE( node );      ft_set_current_renderer( library );    }  }  /* documentation is in ftrender.h */  FT_EXPORT_DEF( FT_Renderer )  FT_Get_Renderer( FT_Library       library,                                                 FT_Glyph_Format  format )  {    /* test for valid `library' delayed to FT_Lookup_Renderer() */    return  FT_Lookup_Renderer( library, format, 0 );  }  /* documentation is in ftrender.h */  FT_EXPORT_DEF( FT_Error )  FT_Set_Renderer( FT_Library     library,                                              FT_Renderer    renderer,                                              FT_UInt        num_params,                                              FT_Parameter*  parameters )  {    FT_ListNode  node;    FT_Error     error = FT_Err_Ok;    if ( !library )      return FT_Err_Invalid_Library_Handle;    if ( !renderer )      return FT_Err_Invalid_Argument;    node = FT_List_Find( &library->renderers, renderer );    if ( !node )    {      error = FT_Err_Invalid_Argument;      goto Exit;    }    FT_List_Up( &library->renderers, node );    if ( renderer->glyph_format == ft_glyph_format_outline )      library->cur_renderer = renderer;    if ( num_params > 0 )    {      FTRenderer_setMode  set_mode = renderer->clazz->set_mode;      for ( ; num_params > 0; num_params-- )      {        error = set_mode( renderer, parameters->tag, parameters->data );        if ( error )          break;      }    }  Exit:    return error;  }  FT_LOCAL_DEF  FT_Error  FT_Render_Glyph_Internal( FT_Library    library,                                      FT_GlyphSlot  slot,                                      FT_UInt       render_mode )  {    FT_Error     error = FT_Err_Ok;    FT_Renderer  renderer;    /* if it is already a bitmap, no need to do anything */    switch ( slot->format )    {    case ft_glyph_format_bitmap:   /* already a bitmap, don't do anything */      break;    default:      {        FT_ListNode  node   = 0;        FT_Bool      update = 0;        /* small shortcut for the very common case */        if ( slot->format == ft_glyph_format_outline )        {          renderer = library->cur_renderer;          node     = library->renderers.head;        }        else          renderer = FT_Lookup_Renderer( library, slot->format, &node );        error = FT_Err_Unimplemented_Feature;        while ( renderer )        {          error = renderer->render( renderer, slot, render_mode, 0 );          if ( !error || error != FT_Err_Cannot_Render_Glyph )            break;          /* FT_Err_Cannot_Render_Glyph is returned if the render mode   */          /* is unsupported by the current renderer for this glyph image */          /* format.                                                     */          /* now, look for another renderer that supports the same */          /* format.                                               */          renderer = FT_Lookup_Renderer( library, slot->format, &node );          update   = 1;        }        /* if we changed the current renderer for the glyph image format */        /* we need to select it as the next current one                  */        if ( !error && update && renderer )          FT_Set_Renderer( library, renderer, 0, 0 );      }    }    return error;  }  /* documentation is in freetype.h */  FT_EXPORT_DEF( FT_Error )  FT_Render_Glyph( FT_GlyphSlot  slot,                                              FT_UInt       render_mode )  {    FT_Library   library;    if ( !slot )      return FT_Err_Invalid_Argument;    library = FT_FACE_LIBRARY( slot->face );    return FT_Render_Glyph_Internal( library, slot, render_mode );  }  /*************************************************************************/  /*************************************************************************/  /*************************************************************************/  /****                                                                 ****/  /****                                                                 ****/  /****                         M O D U L E S                           ****/  /****                                                                 ****/  /****                                                                 ****/  /*************************************************************************/  /*************************************************************************/  /*************************************************************************/  /*************************************************************************/  /*                                                                       */  /* <Function>                                                            */  /*    Destroy_Module                                                     */  /*                                                                       */  /* <Description>                                                         */  /*    Destroys a given module object.  For drivers, this also destroys   */  /*    all child faces.                                                   */  /*                                                                       */  /* <InOut>                                                               */  /*     module :: A handle to the target driver object.                   */  /*                                                                       */  /* <Note>                                                                */  /*     The driver _must_ be LOCKED!                                      */  /*                                                                       */  static  void  Destroy_Module( FT_Module  module )  {    FT_Memory         memory  = module->memory;    FT_Module_Class*  clazz   = module->clazz;    FT_Library        library = module->library;    /* finalize client-data - before anything else */    if ( module->generic.finalizer )      module->generic.finalizer( module );    if ( library && library->auto_hinter == module )      library->auto_hinter = 0;    /* if the module is a renderer */    if ( FT_MODULE_IS_RENDERER( module ) )      ft_remove_renderer( module );    /* if the module is a font driver, add some steps */    if ( FT_MODULE_IS_DRIVER( module ) )      Destroy_Driver( FT_DRIVER( module ) );    /* finalize the module object */    if ( clazz->module_done )      clazz->module_done( module );    /* discard it */    FREE( module );  }  /* documentation is in ftmodule.h */  FT_EXPORT_DEF( FT_Error )  FT_Add_Module( FT_Library              library,                                            const FT_Module_Class*  clazz )  {    FT_Error   error;    FT_Memory  memory;    FT_Module  module;    FT_UInt    nn;#define FREETYPE_VER_FIXED  ( ( (FT_Long)FREETYPE_MAJOR << 16 ) | \                                FREETYPE_MINOR                  )    if ( !library )      return FT_Err_Invalid_Library_Handle;    if ( !clazz )      return FT_Err_Invalid_Argument;    /* check freetype version */    if ( clazz->module_requires > FREETYPE_VER_FIXED )      return FT_Err_Invalid_Version;    /* look for a module with the same name in the library's table */    for ( nn = 0; nn < library->num_modules; nn++ )    {      module = library->modules[nn];      if ( strcmp( module->clazz->module_name, clazz->module_name ) == 0 )      {        /* this installed module has the same name, compare their versions */        if ( clazz->module_version <= module->clazz->module_version )          return FT_Err_Lower_Module_Version;        /* remove the module from our list, then exit the loop to replace */        /*

⌨️ 快捷键说明

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