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

📄 ttcmap.c

📁 qt-embedded-2.3.8.tar.gz源码
💻 C
📖 第 1 页 / 共 2 页
字号:
  Fail:    TT_CharMap_Free( face, cmap );    return error;  }  /*************************************************************************/  /*                                                                       */  /* <Function>                                                            */  /*    TT_CharMap_Free                                                    */  /*                                                                       */  /* <Description>                                                         */  /*    Destroys a character mapping table.                                */  /*                                                                       */  /* <Input>                                                               */  /*    face :: A handle to the parent face object.                        */  /*    cmap :: A handle to a cmap object.                                 */  /*                                                                       */  /* <Return>                                                              */  /*    FreeType error code.  0 means success.                             */  /*                                                                       */  FT_LOCAL_DEF  FT_Error  TT_CharMap_Free( TT_Face        face,                             TT_CMapTable*  cmap )  {    FT_Memory  memory;    if ( !cmap )      return TT_Err_Ok;    memory = face->root.driver->root.memory;    switch ( cmap->format )    {    case 0:      FREE( cmap->c.cmap0.glyphIdArray );      break;    case 2:      FREE( cmap->c.cmap2.subHeaderKeys );      FREE( cmap->c.cmap2.subHeaders );      FREE( cmap->c.cmap2.glyphIdArray );      break;    case 4:      FREE( cmap->c.cmap4.segments );      FREE( cmap->c.cmap4.glyphIdArray );      cmap->c.cmap4.segCountX2 = 0;      break;    case 6:      FREE( cmap->c.cmap6.glyphIdArray );      cmap->c.cmap6.entryCount = 0;      break;    default:      /* invalid table format, do nothing */      ;    }    cmap->loaded = FALSE;    return TT_Err_Ok;  }  /*************************************************************************/  /*                                                                       */  /* <Function>                                                            */  /*    code_to_index0                                                     */  /*                                                                       */  /* <Description>                                                         */  /*    Converts the character code into a glyph index.  Uses format 0.    */  /*    `charCode' must be in the range 0x00-0xFF (otherwise 0 is          */  /*    returned).                                                         */  /*                                                                       */  /* <Input>                                                               */  /*    charCode :: The wanted character code.                             */  /*    cmap0    :: A pointer to a cmap table in format 0.                 */  /*                                                                       */  /* <Return>                                                              */  /*    Glyph index into the glyphs array.  0 if the glyph does not exist. */  /*                                                                       */  FT_CALLBACK_DEF  FT_UInt  code_to_index0( TT_CMapTable*  cmap,                           FT_ULong       charCode )  {    TT_CMap0*  cmap0 = &cmap->c.cmap0;    return ( charCode <= 0xFF ? cmap0->glyphIdArray[charCode] : 0 );  }  /*************************************************************************/  /*                                                                       */  /* <Function>                                                            */  /*    code_to_index2                                                     */  /*                                                                       */  /* <Description>                                                         */  /*    Converts the character code into a glyph index.  Uses format 2.    */  /*                                                                       */  /* <Input>                                                               */  /*    charCode :: The wanted character code.                             */  /*    cmap2    :: A pointer to a cmap table in format 2.                 */  /*                                                                       */  /* <Return>                                                              */  /*    Glyph index into the glyphs array.  0 if the glyph does not exist. */  /*                                                                       */  FT_CALLBACK_DEF  FT_UInt  code_to_index2( TT_CMapTable*  cmap,                           FT_ULong       charCode )  {    FT_UInt             result, index1, offset;    FT_UInt             char_lo;    FT_ULong            char_hi;    TT_CMap2SubHeader*  sh2;    TT_CMap2*           cmap2;    cmap2   = &cmap->c.cmap2;    result  = 0;    char_lo = (FT_UInt)( charCode & 0xFF );    char_hi = charCode >> 8;    if ( char_hi == 0 )    {      /* an 8-bit character code -- we use the subHeader 0 in this case */      /* to test whether the character code is in the charmap           */      if ( cmap2->subHeaderKeys[char_lo] == 0 )        result = cmap2->glyphIdArray[char_lo];    }    else    {      /* a 16-bit character code */      index1 = cmap2->subHeaderKeys[char_hi & 0xFF];      if ( index1 )      {        sh2      = cmap2->subHeaders + index1;        char_lo -= sh2->firstCode;        if ( char_lo < (FT_UInt)sh2->entryCount )        {          offset = sh2->idRangeOffset / 2 + char_lo;          if ( offset < (FT_UInt)cmap2->numGlyphId )          {            result = cmap2->glyphIdArray[offset];            if ( result )              result = ( result + sh2->idDelta ) & 0xFFFF;          }        }      }    }    return result;  }  /*************************************************************************/  /*                                                                       */  /* <Function>                                                            */  /*    code_to_index4                                                     */  /*                                                                       */  /* <Description>                                                         */  /*    Converts the character code into a glyph index.  Uses format 4.    */  /*                                                                       */  /* <Input>                                                               */  /*    charCode :: The wanted character code.                             */  /*    cmap4    :: A pointer to a cmap table in format 4.                 */  /*                                                                       */  /* <Return>                                                              */  /*    Glyph index into the glyphs array.  0 if the glyph does not exist. */  /*                                                                       */  FT_CALLBACK_DEF  FT_UInt  code_to_index4( TT_CMapTable*  cmap,                           FT_ULong       charCode )  {    FT_UInt          result, index1, segCount;    TT_CMap4*        cmap4;    TT_CMap4Segment  *seg4, *limit;    cmap4    = &cmap->c.cmap4;    result   = 0;    segCount = cmap4->segCountX2 / 2;    seg4     = cmap4->segments;    limit    = seg4 + segCount;    /* check against the last segment */    seg4 = cmap4->last_segment;    /* the following is equivalent to performing two tests, as in         */    /*                                                                    */    /*  if ( charCode >= seg4->startCount && charCode <= seg4->endCount ) */    /*                                                                    */    /* Yes, that's a bit strange, but it's faster, and the idea behind    */    /* the cache is to significantly speed up charcode to glyph index     */    /* conversion.                                                        */    if ( (FT_ULong)(charCode       - seg4->startCount) <         (FT_ULong)(seg4->endCount - seg4->startCount) )      goto Found;    for ( seg4 = cmap4->segments; seg4 < limit; seg4++ )    {      /* the ranges are sorted in increasing order.  If we are out of */      /* the range here, the char code isn't in the charmap, so exit. */      if ( charCode > (FT_UInt)seg4->endCount )        continue;      if ( charCode >= (FT_UInt)seg4->startCount )        goto Found;    }    return 0; Found:    cmap4->last_segment = seg4;    /* if the idRangeOffset is 0, we can compute the glyph index */    /* directly                                                  */    if ( seg4->idRangeOffset == 0 )      result = ( charCode + seg4->idDelta ) & 0xFFFF;    else    {      /* otherwise, we must use the glyphIdArray to do it */      index1 = seg4->idRangeOffset / 2               + ( charCode - seg4->startCount )               + ( seg4 - cmap4->segments )               - segCount;      if ( index1 < (FT_UInt)cmap4->numGlyphId       &&           cmap4->glyphIdArray[index1] != 0 )        result = ( cmap4->glyphIdArray[index1] + seg4->idDelta ) & 0xFFFF;    }    return result;  }  /*************************************************************************/  /*                                                                       */  /* <Function>                                                            */  /*    code_to_index6                                                     */  /*                                                                       */  /* <Description>                                                         */  /*    Converts the character code into a glyph index.  Uses format 6.    */  /*                                                                       */  /* <Input>                                                               */  /*    charCode :: The wanted character code.                             */  /*    cmap6    :: A pointer to a cmap table in format 6.                 */  /*                                                                       */  /* <Return>                                                              */  /*    Glyph index into the glyphs array.  0 if the glyph does not exist. */  /*                                                                       */  FT_CALLBACK_DEF  FT_UInt  code_to_index6( TT_CMapTable*  cmap,                           FT_ULong       charCode )  {    TT_CMap6*  cmap6;    FT_UInt    result = 0;    cmap6     = &cmap->c.cmap6;    result    = 0;    charCode -= cmap6->firstCode;    if ( charCode < (FT_UInt)cmap6->entryCount )      result =  cmap6->glyphIdArray[charCode];    return result;  }/* END */

⌨️ 快捷键说明

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