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

📄 ttobjs.c

📁 Qt/Embedded是一个多平台的C++图形用户界面应用程序框架
💻 C
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************//*                                                                         *//*  ttobjs.c                                                               *//*                                                                         *//*    Objects manager (body).                                              *//*                                                                         *//*  Copyright 1996-1999 by                                                 *//*  David Turner, Robert Wilhelm, and Werner Lemberg.                      *//*                                                                         *//*  This file is part of the FreeType project, and may only be used        *//*  modified and distributed under the terms of the FreeType project       *//*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     *//*  this file you indicate that you have read the license and              *//*  understand and accept it fully.                                        *//*                                                                         *//***************************************************************************/#include <freetype.h>#include <ftdebug.h>#include <ftcalc.h>#include <ftstream.h>#include <ttnameid.h>#include <tttags.h>#include <sfnt.h>#include <psnames.h>#include <ttobjs.h>#include <ttpload.h>#include <tterrors.h>#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER#include <ttinterp.h>#endif/* required by tracing mode */#undef   FT_COMPONENT#define  FT_COMPONENT  trace_ttobjs  /*************************************************************************/  /*                                                                       */  /*                       GLYPH ZONE FUNCTIONS                            */  /*                                                                       */  /*************************************************************************/  /*************************************************************************/  /*                                                                       */  /* <Function>                                                            */  /*    Get_Name                                                           */  /*                                                                       */  /* <Description>                                                         */  /*    Returns a given ENGLISH name record in ASCII.                      */  /*                                                                       */  /* <Input>                                                               */  /*    face   :: A handle to the source face object.                      */  /*                                                                       */  /*    nameid :: The name id of the name record to return.                */  /*                                                                       */  /* <Return>                                                              */  /*    Char string.  NULL if no name is present.                          */  /*                                                                       */  static  FT_String*  Get_Name( TT_Face    face,                        TT_UShort  nameid )  {    FT_Memory    memory = face->root.memory;    TT_UShort    n;    TT_NameRec*  rec;    TT_Bool      wide_chars = 1;    /* first pass, look for a given name record */    rec = face->name_table.names;    for ( n = 0; n < face->name_table.numNameRecords; n++, rec++ )    {      if ( rec->nameID == nameid )      {        /* found the name - now create an ASCII string from it */        TT_Bool  found = 0;        /* Test for Microsoft English language */        if ( rec->platformID == TT_PLATFORM_MICROSOFT &&             rec->encodingID <= TT_MS_ID_UNICODE_CS   &&             (rec->languageID & 0x3FF) == 0x009 )          found = 1;        /* Test for Apple Unicode encoding */        else if ( rec->platformID == TT_PLATFORM_APPLE_UNICODE )          found = 1;                /* Test for Apple Roman */        else if ( rec->platformID == TT_PLATFORM_MACINTOSH &&                  rec->languageID == TT_MAC_ID_ROMAN       )        {          found      = 1;          wide_chars = 0;        }        /* Found a Unicode Name */        if ( found )        {          TT_String*  string;          TT_UInt     len;          if ( wide_chars )          {            TT_UInt   m;                        len = (TT_UInt)rec->stringLength / 2;            if ( MEM_Alloc( string, len + 1 ) )              return NULL;                for ( m = 0; m < len; m ++ )              string[m] = rec->string[2*m + 1];          }          else          {            len = rec->stringLength;            if ( MEM_Alloc( string, len + 1 ) )              return NULL;            MEM_Copy( string, rec->string, len );          }          string[len] = '\0';          return string;        }      }    }    return NULL;  }#undef  LOAD_#define LOAD_(x)   ( (error = sfnt->load_##x( face, stream )) != TT_Err_Ok )  /*************************************************************************/  /*                                                                       */  /* <Function>                                                            */  /*    TT_Init_Face                                                       */  /*                                                                       */  /* <Description>                                                         */  /*    Initializes a given TrueType face object.                          */  /*                                                                       */  /* <Input>                                                               */  /*    resource   :: The source font resource.                            */  /*    face_index :: The index of the font face in the resource.          */  /*    face       :: The newly built face object.                         */  /*                                                                       */  /* <Return>                                                              */  /*    TrueType error code.  0 means success.                             */  /*                                                                       */  LOCAL_DEF  TT_Error  TT_Init_Face( FT_Stream  stream,                          TT_Long    face_index,                          TT_Face    face )  {    TT_Error           error;    TT_ULong           format_tag;    SFNT_Interface*    sfnt;    PSNames_Interface* psnames;    sfnt = (SFNT_Interface*)face->sfnt;    if (!sfnt)    {      /* look-up the SFNT driver */      FT_Driver  sfnt_driver;            sfnt_driver = FT_Get_Driver( face->root.driver->library, "sfnt" );      if (!sfnt_driver)        return FT_Err_Invalid_File_Format;              sfnt = (SFNT_Interface*)(sfnt_driver->interface.format_interface);      if (!sfnt)        return FT_Err_Invalid_File_Format;              face->sfnt       = sfnt;      face->goto_table = sfnt->goto_table;    }        psnames = (PSNames_Interface*)face->psnames;    if (!psnames)    {      /* look-up the PSNames driver */      FT_Driver  psnames_driver;            psnames_driver = FT_Get_Driver( face->root.driver->library, "psnames" );      if (psnames_driver)        face->psnames = (PSNames_Interface*)                            (psnames_driver->interface.format_interface);    }        /* create input stream from resource */    if ( FILE_Seek(0) )      goto Exit;    /* check that we have a valid TrueType file */    error = sfnt->load_format_tag( face, stream, face_index, &format_tag );    if (error) goto Exit;        /* We must also be able to accept Mac/GX fonts, as well as OT ones */    if ( format_tag != 0x00010000 &&    /* MS fonts  */         format_tag != TTAG_true  )     /* Mac fonts */    {      FT_TRACE2(( "[not a valid TTF font]" ));      error = TT_Err_Invalid_File_Format;      goto Exit;    }    /* Load font directory */    error = sfnt->load_directory( face, stream, face_index );    if ( error ) goto Exit;    face->root.num_faces = face->ttc_header.DirCount;    if ( face->root.num_faces < 1 )      face->root.num_faces = 1;    /* If we're performing a simple font format check, exit immediately */    if ( face_index < 0 )      return TT_Err_Ok;    /* Load tables */    if ( LOAD_( header )        ||         LOAD_( max_profile )   ||         (error = sfnt->load_metrics( face, stream, 0 )) != TT_Err_Ok  ||         /* load the `hhea' & `hmtx' tables at once */         (error = sfnt->load_metrics( face, stream, 1 )) != TT_Err_Ok ||         /* try to load the `vhea' & `vmtx' at once if present */         LOAD_( charmaps )      ||         LOAD_( names )         ||         LOAD_( os2 )           ||         LOAD_( psnames )       )     goto Exit;    /* the optional tables */        /* embedded bitmap support. */#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS    if (sfnt->load_sbits && LOAD_(sbits)) goto Exit;#endif    if ( LOAD_( hdmx )          ||         LOAD_( gasp )          ||         LOAD_( kerning )       ||         (error = TT_Load_Locations( face, stream )) != TT_Err_Ok ||         (error = TT_Load_CVT      ( face, stream )) != TT_Err_Ok ||         (error = TT_Load_Programs ( face, stream )) != TT_Err_Ok )      goto Exit;#ifdef TT_CONFIG_OPTION_EXTEND_ENGINE    if ( ( error = TT_Extension_Create( face ) ) != TT_Err_Ok )      goto Exit;#endif    face->root.family_name = Get_Name( face, TT_NAME_ID_FONT_FAMILY );    face->root.style_name  = Get_Name( face, TT_NAME_ID_FONT_SUBFAMILY );  Exit:    return error;  }#undef LOAD_  /*************************************************************************/  /*                                                                       */  /* <Function>                                                            */  /*    TT_Done_Face                                                       */  /*                                                                       */  /* <Description>                                                         */  /*    Finalizes a given face object.                                     */  /*                                                                       */  /* <Input>                                                               */  /*    face :: A pointer to the face object to destroy.                   */  /*                                                                       */  LOCAL_DEF  void  TT_Done_Face( TT_Face  face )  {    TT_UShort  n;    FT_Memory  memory = face->root.memory;    SFNT_Interface*  sfnt = face->sfnt;        if (sfnt)    {      /* destroy the postscript names table if it is supported */      if (sfnt->free_psnames)        sfnt->free_psnames( face );              /* destroy the embedded bitmaps table if it is supported */      if (sfnt->free_sbits)        sfnt->free_sbits( face );    }    /* freeing the kerning table */    FREE( face->kern_pairs );    face->num_kern_pairs = 0;    /* freeing the collection table */    FREE( face->ttc_header.TableDirectory );    face->ttc_header.DirCount = 0;    /* freeing table directory */    FREE( face->dir_tables );    face->num_tables = 0;    /* freeing the locations table */    FREE( face->glyph_locations );    face->num_locations = 0;    /* freeing the character mapping tables */    if (sfnt && sfnt->load_charmaps )    {      for ( n = 0; n < face->num_charmaps; n++ )        sfnt->free_charmap( face, &face->charmaps[n].cmap );    }    FREE( face->charmaps );    face->num_charmaps = 0;    FREE( face->root.charmaps );    face->root.num_charmaps = 0;    face->root.charmap      = 0;    /* freeing the CVT */    FREE( face->cvt );    face->cvt_size = 0;    /* freeing the horizontal metrics */    FREE( face->horizontal.long_metrics );    FREE( face->horizontal.short_metrics );    /* freeing the vertical ones, if any */    if ( face->vertical_info )    {      FREE( face->vertical.long_metrics  );      FREE( face->vertical.short_metrics );      face->vertical_info = 0;    }    /* freeing the programs */    FREE( face->font_program );    FREE( face->cvt_program );    face->font_program_size = 0;    face->cvt_program_size  = 0;    /* freeing the gasp table */    FREE( face->gasp.gaspRanges );    face->gasp.numRanges = 0;    /* freeing the name table */    sfnt->free_names( face );    /* freeing the hdmx table */    sfnt->free_hdmx( face );    /* freeing family and style name */    FREE( face->root.family_name );    FREE( face->root.style_name );        face->sfnt = 0;  }  /*************************************************************************/  /*                                                                       */  /*                           SIZE  FUNCTIONS                             */  /*                                                                       */  /*************************************************************************/  /*************************************************************************/  /*                                                                       */  /* <Function>                                                            */  /*    TT_Init_Size                                                       */  /*                                                                       */  /* <Description>                                                         */  /*    Initializes a new TrueType size object.                            */  /*                                                                       */  /* <InOut>                                                               */  /*    size :: A handle to the size object.                               */  /*                                                                       */  /* <Return>                                                              */  /*    TrueType error code.  0 means success.                             */  /*                                                                       */  LOCAL_DEF  TT_Error  TT_Init_Size( TT_Size  size )  {    TT_Error   error = 0;    #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER    TT_Face    face   = (TT_Face)size->root.face;    FT_Memory  memory = face->root.memory;    TT_Int     i;    TT_ExecContext  exec;    TT_UShort       n_twilight;    TT_MaxProfile*  maxp = &face->max_profile;    size->ttmetrics.valid = FALSE;    size->max_function_defs    = maxp->maxFunctionDefs;    size->max_instruction_defs = maxp->maxInstructionDefs;    size->num_function_defs    = 0;    size->num_instruction_defs = 0;    size->max_func = 0;    size->max_ins  = 0;    size->cvt_size     = face->cvt_size;    size->storage_size = maxp->maxStorage;    /* Set default metrics */    {      FT_Size_Metrics*  metrics  = &size->root.metrics;      TT_Size_Metrics*  metrics2 = &size->ttmetrics;      metrics->x_ppem = 0;      metrics->y_ppem = 0;      metrics2->rotated   = FALSE;      metrics2->stretched = FALSE;      /* set default compensation (all 0) */      for ( i = 0; i < 4; i++ )        metrics2->compensations[i] = 0;    }

⌨️ 快捷键说明

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