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

📄 oltypes.c

📁 Qt/Embedded是一个多平台的C++图形用户界面应用程序框架
💻 C
字号:
#include <oltypes.h>  LOCAL_FUNC  TT_Error  OTL_Table_Init( OTL_Table*  table,                            FT_Memory   memory )  {    MEM_Set( table, 0, sizeof(*table) );    table->memory = memory;  } /* read a script list table */ /* use with any table       */  LOCAL_FUNC  TT_Error  OTL_Table_Set_Scripts( OTL_Table*  table,                                   TT_Byte*    bytes,                                   TT_Long     len,                                   OTL_Type    otl_type )  {    TT_Byte*  p;    TT_Byte*  start = bytes;    TT_UInt   count, max_langs;    TT_Error  error;    /* skip version of the JSTF table */        if (otl_type == otl_jstf)      start += 4;          p = start;          /* we must allocate the script_tags and language_tags arrays     */    /* this requires that we compute the maximum number of languages */    /* per script..                                                  */        count     = table->num_scripts = OTL_UShort(p);    max_langs = 0;    for ( ; count > 0; count++ )    {      TT_Byte*  script;      TT_UInt   num_langs;            p += 4; /* skip tag */      script = bytes + OTL_UShort(p);      /* skip the baseValues or extenders field of the BASE and JSTF table */      if (otl_type == otl_type_base || otl_type == otl_type_jstf)        script += 2;      /* test if there is a default language system */      if ( OTL_UShort(script) )        num_langs++;            /* test other language systems */      num_langs += OTL_UShort(script); /* add other lang sys */            if (num_langs > max_langs)        max_langs = num_langs;    }    /* good, now allocate the tag arrays */    if ( !ALLOC_ARRAY( table->script_tags,                      table->num_scripts + max_langs,                      TT_ULong ) )    {      table->language_tags = table->script_tags + table->num_scripts;      table->max_languages = max_langs;      table->num_languages = 0;      table->otl_type      = otl_type;        table->scripts_table = bytes;      table->scripts_len   = len;            /* fill the script_tags array */      {        TT_UInt  n;        TT_Byte* p = start + 2; /* skip count */                for ( n = 0; n < table->num_scripts; n++ )        {          table->script_tags[n] = OTL_ULong(p);          p += 2; /* skip offset */        }      }    }    return error;  } /* add a features list to the table   */ /* use only with a GSUB or GPOS table */  LOCAL_FUNC  TT_Error  OTL_Table_Set_Features( OTL_Table*  table,                                    TT_Byte*    bytes,                                    TT_Long     len )  {    TT_Error  error;    TT_Byte*  p = bytes;    TT_UInt   count;        table->max_features = count = OTL_UShort(p);    if ( !ALLOC_ARRAY( table->feature_tags, count, TT_ULong ) &&         !ALLOC_ARRAY( table->features,     count, TT_Bool  ) )    {      table->features_table = bytes;      table->features_len   = len;    }    return error;       } /* add a lookup list to the table     */ /* use only with a GSUB or GPOS table */  LOCAL_FUNC  TT_Error  OTL_Table_Set_Lookups( OTL_Table*  table,                                   TT_Byte*    bytes,                                   TT_Long     len )  {    TT_Error  error;    TT_Byte*  p = bytes;    TT_UInt   count;        table->max_lookups = count = OTL_UShort(p);    if ( !ALLOC_ARRAY( table->lookups, count, TT_Bool ) )    {      table->lookups_table = bytes;      table->lookups_len   = len;    }    return error;       } /* discard table arrays */  LOCAL_FUNC  void      OTL_Table_Done( OTL_Table*  table )  {    FREE( table->scrip_tags );    FREE( table->language_tags );    FREE( table->feature_tags );    FREE( table->lookups );  } /* return the list of available languages for a given script */ /* use with any table..                                      */  LOCAL_FUNC  void  OTL_Get_Languages_List( OTL_Table*  table,                                TT_ULong    script_tag )  {    TT_UInt  n;    TT_Byte* p;    TT_Byte* script = 0;    TT_Byte* start = table->scripts_table;        if ( table->otl_type == otl_type_jstf )  /* skip version for JSTF */      start += 4;          p = start + 6; /* skip count+first tag */        for ( n = 0; n < table->num_scripts; n++, p += 6 )    {      if ( table->script_tags[n] == script_tag )      {        script = table->scripts_table + OTL_UShort(p);        break;      }    }        table->cur_script = script;    if (!script)      table->num_languages = 0;    else    {      /* now fill the language_tags array with the appropriate values    */      /* not that we put a '0' tag in front of the list to indicate that */      /* there is a default language for this script..                   */      TT_ULong* tags = table->language_tags;            switch (table->otl_type)      {        case otl_type_base:        case otl_type_jstf:          script += 2;    /* skip basevalue or extenders */          /* fall-through */                  default:          if ( OTL_UShort(script) )            *tags++ = 0;      }            count = OTL_UShort(script);      for ( ; count > 0; count-- )      {        *tags++ = OTL_ULong(script);        script += 2; /* skip offset */      }            table->num_langs = tags - table->language_tags;    }  }   /* return the list of available features for the current script/language */ /* use with a GPOS or GSUB script table                                  */  LOCAL_FUNC  void OTL_Get_Features_List( OTL_Table*  table,                              TT_ULong    language_tag )  {    TT_UInt   n;    TT_Byte*  script   = table->cur_script;    TT_Byte*  language = 0;    TT_UShort offset;    /* clear feature selection table */    for ( n = 0; n < table->max_features; n++ )      table->features[n] = 0;    /* now, look for the current language */    if ( language_tag == 0 )    {      offset = OTL_UShort(script);      if (!offset) return; /* if there is no default language, exit */              language = script - 2 + offset;    }    else    {      TT_Byte*  p = script + 8; /* skip default+count+1st tag */      TT_UShort index;            for ( n = 0; n < table->num_languages; n++, p+=6 )      {        if ( table->language_tags[n] == language_tag )        {          language = script + OTL_UShort(p);          break;        }      }      table->cur_language = language;       if (!language) return;            p     = language + 2;   /* skip lookup order */      index = OTL_UShort(p);  /* required feature index */      if (index != 0xFFFF)      {        if (index < table->max_features)          table->features[index] = 1;      }            count = OTL_UShort(p);      for ( ; count > 0; count-- )      {        index = OTL_UShort(p);        if (index < table->max_features)          table->features[index] = 1;      }    }  } /* return the list of lookups for the current features list */ /* use only with a GSUB or GPOS table                       */  LOCAL_FUNC  void  OTL_Get_Lookups_List( OTL_Table*  table )  {    TT_UInt  n;    TT_Byte* features = table->features_table;    TT_Byte* p        = features + 6; /* skip count+1st tag */        /* clear lookup list */    for ( n = 0; n < table->max_lookups; n++ )      table->lookups[n] = 0;          /* now, parse the features list */    for ( n = 0; n < table->features; n++ )    {      if (table->features[n])      {        TT_UInt   count;        TT_UShort index;        TT_Byte*  feature;                feature = features + OTL_UShort(p);        p      += 4;  /* skip tag */                /* now, select all lookups from this feature */        count = OTL_UShort(feature);        for ( ; count > 0; count-- )        {          index = OTL_UShort(feature);          if (index < table->max_lookups)            table->lookups[index] = 1;        }      }    }  }   /* find the basevalues and minmax for the current script/language */   /* only use it with a BASE table..                                */  LOCAL_FUNC  void OTL_Get_Baseline_Values( OTL_Table*  table,                                TT_ULong    language_tag )  {    TT_Byte*  script   = table->cur_script;    TT_Byte*  p        = script;    TT_UShort offset, count;    table->cur_basevalues = 0;    table->cur_minmax     = 0;        /* read basevalues */        offset = OTL_UShort(p);    if (offset)      table->cur_basevalues = script + offset;          offset = OTL_UShort(p);    if (offset)      table->cur_minmax = script + offset;    count = OTL_UShort(p);    for ( ; count > 0; count-- )    {      TT_ULong  tag;            tag = OTL_ULong(p);      if ( language_tag == tag )      {        table->cur_minmax = script + OTL_UShort(p);        break;      }      p += 2; /* skip offset */    }  } /* compute the coverage value of a given glyph id */  LOCAL_FUNC  TT_Long  OTL_Get_Coverage_Index( TT_Byte*  coverage,                                   TT_UInt   glyph_id )  {    TT_Long    result = -1;    TT_UInt    count, index, start, end;    TT_Byte*   p = coverage;        switch ( OTL_UShort(p) )    {      case 1:  /* coverage format 1 - array of glyph indices */        {          count = OTL_UShort(p);          for ( index = 0; index < count; index++ )          {            if ( OTL_UShort(p) == glyph_id )            {              result = index;              break;            }          }        }        break;              case 2:        {          count = OTL_UShort(p);          for ( ; count > 0; count-- )          {            start = OTL_UShort(p);            end   = OTL_UShort(p);            index = OTL_UShort(p);            if (start <= glyph_id && glyph_id <= end)            {              result = glyph_id - start + index;              break;            }          }        }        break;    }    return result;  } /* compute the class value of a given glyph_id */  LOCAL_FUNC  TT_UInt  OTL_Get_Glyph_Class( TT_Byte*  class_def,                                TT_UInt   glyph_id )  {    TT_Byte*  p = class_def;    TT_UInt   result = 0;    TT_UInt   start, end, count, index;        switch ( OTL_UShort(p) )    {      case 1:        {          start = OTL_UShort(p);          count = OTL_UShort(p);                    glyph_id -= start;          if (glyph_id < count)          {            p += 2*glyph_id;            result = OTL_UShort(p);          }        }        break;            case 2:        {          count = OTL_UShort(p);          for ( ; count > 0; count-- )          {            start = OTL_UShort(p);            end   = OTL_UShort(p);            index = OTL_UShort(p);            if ( start <= glyph_id && glyph_id <= end )            {              result = index;              break;            }          }        }        break;    }    return result;  } /* compute the adjustement necessary for a given device size */  LOCAL_FUNC  TT_Int  OTL_Get_Device_Adjustment( TT_Byte* device,                                     TT_UInt  size )  {    TT_Byte*  p = device;    TT_Int    result = 0;    TT_UInt   start, end;    TT_Short  value;        start = OTL_UShort(p);    end   = OTL_UShort(p);    if (size >= start && size <= end)    {      /* I know we could do all of this without a switch, with */      /* clever shifts and everything, but it makes the code   */      /* really difficult to understand..                      */            size -= start;      switch ( OTL_UShort(p) )      {        case 1: /* 2-bits per value */          {            p     += 2*(size >> 3);            size   = (size & 7) << 1;            value  = (TT_Short)((TT_Short)OTL_UShort(p) << size);            result = value >> 14;          }          break;                  case 2: /* 4-bits per value */          {            p     += 2*(size >> 2);            size   = (size & 3) << 2;            value  = (TT_Short)((TT_Short)OTL_UShort(p) << size);            result = value >> 12;          }          break;                  case 3: /* 8-bits per value */          {            p     += 2*(size >> 1);            size   = (size & 1) << 3;            value  = (TT_Short)((TT_Short)OTL_UShort(p) << size);            result = value >> 8;          }          break;      }    }    return result;  }   /* compute a BaseCoord value */  LOCAL_FUNC  TT_Int  OTL_Get_Base_Coordinate( TT_Byte*   base_coord,                                   TT_UShort *format                                   TT_UShort *ref_glyph_id,                                   TT_Byte*  *device )  {    TT_Byte*  p =base_coord;    TT_Int    result = 0;        *format = OTL_UShort(p);        switch (*format)    {      case    }  }

⌨️ 快捷键说明

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