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

📄 ttcmap.c

📁 下载来的一个看图软件的源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
/***************************************************************************//*                                                                         *//*  ttcmap.c                                                               *//*                                                                         *//*    TrueType character mapping table (cmap) support (body).              *//*                                                                         *//*  Copyright 1996-2001, 2002 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 <ft2build.h>#include FT_INTERNAL_DEBUG_H#include "ttload.h"#include "ttcmap.h"#include "sferrors.h"  /*************************************************************************/  /*                                                                       */  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */  /* messages during execution.                                            */  /*                                                                       */#undef  FT_COMPONENT#define FT_COMPONENT  trace_ttcmap  FT_CALLBACK_DEF( FT_UInt )  code_to_index0( TT_CMapTable  charmap,                  FT_ULong      char_code );  FT_CALLBACK_DEF( FT_ULong )  code_to_next0( TT_CMapTable  charmap,                 FT_ULong      char_code );  FT_CALLBACK_DEF( FT_UInt )  code_to_index2( TT_CMapTable  charmap,                  FT_ULong      char_code );  FT_CALLBACK_DEF( FT_ULong )  code_to_next2( TT_CMapTable  charmap,                 FT_ULong      char_code );  FT_CALLBACK_DEF( FT_UInt )  code_to_index4( TT_CMapTable  charmap,                  FT_ULong      char_code );  FT_CALLBACK_DEF( FT_ULong )  code_to_next4( TT_CMapTable  charmap,                 FT_ULong      char_code );  FT_CALLBACK_DEF( FT_UInt )  code_to_index6( TT_CMapTable  charmap,                  FT_ULong      char_code );  FT_CALLBACK_DEF( FT_ULong )  code_to_next6( TT_CMapTable  charmap,                 FT_ULong      char_code );  FT_CALLBACK_DEF( FT_UInt )  code_to_index8_12( TT_CMapTable  charmap,                     FT_ULong      char_code );  FT_CALLBACK_DEF( FT_ULong )  code_to_next8_12( TT_CMapTable  charmap,                    FT_ULong      char_code );  FT_CALLBACK_DEF( FT_UInt )  code_to_index10( TT_CMapTable  charmap,                   FT_ULong      char_code );  FT_CALLBACK_DEF( FT_ULong )  code_to_next10( TT_CMapTable  charmap,                  FT_ULong      char_code );  /*************************************************************************/  /*                                                                       */  /* <Function>                                                            */  /*    tt_face_load_charmap                                               */  /*                                                                       */  /* <Description>                                                         */  /*    Loads a given TrueType character map into memory.                  */  /*                                                                       */  /* <Input>                                                               */  /*    face   :: A handle to the parent face object.                      */  /*                                                                       */  /*    stream :: A handle to the current stream object.                   */  /*                                                                       */  /* <InOut>                                                               */  /*    table  :: A pointer to a cmap object.                              */  /*                                                                       */  /* <Return>                                                              */  /*    FreeType error code.  0 means success.                             */  /*                                                                       */  /* <Note>                                                                */  /*    The function assumes that the stream is already in use (i.e.,      */  /*    opened).  In case of error, all partially allocated tables are     */  /*    released.                                                          */  /*                                                                       */  FT_LOCAL_DEF( FT_Error )  tt_face_load_charmap( TT_Face       face,                        TT_CMapTable  cmap,                        FT_Stream     stream )  {    FT_Error     error;    FT_Memory    memory;    FT_UShort    num_SH, num_Seg, i;    FT_ULong     j, n;    FT_UShort    u, l;    TT_CMap0     cmap0;    TT_CMap2     cmap2;    TT_CMap4     cmap4;    TT_CMap6     cmap6;    TT_CMap8_12  cmap8_12;    TT_CMap10    cmap10;    TT_CMap2SubHeader  cmap2sub;    TT_CMap4Segment    segments;    TT_CMapGroup       groups;    if ( cmap->loaded )      return SFNT_Err_Ok;    memory = stream->memory;    if ( FT_STREAM_SEEK( cmap->offset ) )      return error;    switch ( cmap->format )    {    case 0:      cmap0 = &cmap->c.cmap0;      if ( FT_READ_USHORT( cmap0->language )           ||           FT_ALLOC( cmap0->glyphIdArray, 256L )       ||           FT_STREAM_READ( cmap0->glyphIdArray, 256L ) )        goto Fail;      cmap->get_index     = code_to_index0;      cmap->get_next_char = code_to_next0;      break;    case 2:      num_SH = 0;      cmap2  = &cmap->c.cmap2;      /* allocate subheader keys */      if ( FT_NEW_ARRAY( cmap2->subHeaderKeys, 256 ) ||           FT_FRAME_ENTER( 2L + 512L )               )        goto Fail;      cmap2->language = FT_GET_USHORT();      for ( i = 0; i < 256; i++ )      {        u = (FT_UShort)( FT_GET_USHORT() / 8 );        cmap2->subHeaderKeys[i] = u;        if ( num_SH < u )          num_SH = u;      }      FT_FRAME_EXIT();      /* load subheaders */      cmap2->numGlyphId = l = (FT_UShort)(        ( ( cmap->length - 2L * ( 256 + 3 ) - num_SH * 8L ) & 0xFFFFU ) / 2 );      if ( FT_NEW_ARRAY( cmap2->subHeaders, num_SH + 1 ) ||           FT_FRAME_ENTER( ( num_SH + 1 ) * 8L )         )      {        FT_FREE( cmap2->subHeaderKeys );        goto Fail;      }      cmap2sub = cmap2->subHeaders;      for ( i = 0; i <= num_SH; i++ )      {        cmap2sub->firstCode     = FT_GET_USHORT();        cmap2sub->entryCount    = FT_GET_USHORT();        cmap2sub->idDelta       = FT_GET_SHORT();        /* we apply the location offset immediately */        cmap2sub->idRangeOffset = (FT_UShort)(          FT_GET_USHORT() - ( num_SH - i ) * 8 - 2 );        cmap2sub++;      }      FT_FRAME_EXIT();      /* load glyph IDs */      if ( FT_NEW_ARRAY( cmap2->glyphIdArray, l ) ||           FT_FRAME_ENTER( l * 2L )               )      {        FT_FREE( cmap2->subHeaders );        FT_FREE( cmap2->subHeaderKeys );        goto Fail;      }      for ( i = 0; i < l; i++ )        cmap2->glyphIdArray[i] = FT_GET_USHORT();      FT_FRAME_EXIT();      cmap->get_index = code_to_index2;      cmap->get_next_char = code_to_next2;      break;    case 4:      cmap4 = &cmap->c.cmap4;      /* load header */      if ( FT_FRAME_ENTER( 10L ) )        goto Fail;      cmap4->language      = FT_GET_USHORT();      cmap4->segCountX2    = FT_GET_USHORT();      cmap4->searchRange   = FT_GET_USHORT();      cmap4->entrySelector = FT_GET_USHORT();      cmap4->rangeShift    = FT_GET_USHORT();      num_Seg = (FT_UShort)( cmap4->segCountX2 / 2 );      FT_FRAME_EXIT();      /* load segments */      if ( FT_NEW_ARRAY( cmap4->segments, num_Seg )   ||           FT_FRAME_ENTER( ( num_Seg * 4 + 1 ) * 2L ) )        goto Fail;      segments = cmap4->segments;      for ( i = 0; i < num_Seg; i++ )        segments[i].endCount = FT_GET_USHORT();      (void)FT_GET_USHORT();      for ( i = 0; i < num_Seg; i++ )        segments[i].startCount = FT_GET_USHORT();      for ( i = 0; i < num_Seg; i++ )        segments[i].idDelta = FT_GET_SHORT();      for ( i = 0; i < num_Seg; i++ )        segments[i].idRangeOffset = FT_GET_USHORT();      FT_FRAME_EXIT();      cmap4->numGlyphId = l = (FT_UShort)(        ( ( cmap->length - ( 16L + 8L * num_Seg ) ) & 0xFFFFU ) / 2 );      /* load IDs */      if ( FT_NEW_ARRAY( cmap4->glyphIdArray, l ) ||           FT_FRAME_ENTER( l * 2L )               )      {        FT_FREE( cmap4->segments );        goto Fail;      }      for ( i = 0; i < l; i++ )        cmap4->glyphIdArray[i] = FT_GET_USHORT();      FT_FRAME_EXIT();      cmap4->last_segment = cmap4->segments;      cmap->get_index     = code_to_index4;      cmap->get_next_char = code_to_next4;      break;    case 6:      cmap6 = &cmap->c.cmap6;      if ( FT_FRAME_ENTER( 6L ) )        goto Fail;      cmap6->language   = FT_GET_USHORT();      cmap6->firstCode  = FT_GET_USHORT();      cmap6->entryCount = FT_GET_USHORT();      FT_FRAME_EXIT();      l = cmap6->entryCount;      if ( FT_NEW_ARRAY( cmap6->glyphIdArray, l ) ||           FT_FRAME_ENTER( l * 2L )               )        goto Fail;      for ( i = 0; i < l; i++ )        cmap6->glyphIdArray[i] = FT_GET_USHORT();      FT_FRAME_EXIT();      cmap->get_index     = code_to_index6;      cmap->get_next_char = code_to_next6;      break;    case 8:    case 12:      cmap8_12 = &cmap->c.cmap8_12;      if ( FT_FRAME_ENTER( 8L ) )        goto Fail;      cmap->length       = FT_GET_ULONG();      cmap8_12->language = FT_GET_ULONG();      FT_FRAME_EXIT();      if ( cmap->format == 8 )        if ( FT_STREAM_SKIP( 8192L ) )          goto Fail;      if ( FT_READ_ULONG( cmap8_12->nGroups ) )        goto Fail;      n = cmap8_12->nGroups;      if ( FT_NEW_ARRAY( cmap8_12->groups, n ) ||           FT_FRAME_ENTER( n * 3 * 4L )        )        goto Fail;      groups = cmap8_12->groups;      for ( j = 0; j < n; j++ )      {        groups[j].startCharCode = FT_GET_ULONG();        groups[j].endCharCode   = FT_GET_ULONG();        groups[j].startGlyphID  = FT_GET_ULONG();      }      FT_FRAME_EXIT();      cmap8_12->last_group = cmap8_12->groups;      cmap->get_index     = code_to_index8_12;      cmap->get_next_char = code_to_next8_12;      break;    case 10:      cmap10 = &cmap->c.cmap10;      if ( FT_FRAME_ENTER( 16L ) )        goto Fail;      cmap->length          = FT_GET_ULONG();      cmap10->language      = FT_GET_ULONG();      cmap10->startCharCode = FT_GET_ULONG();      cmap10->numChars      = FT_GET_ULONG();      FT_FRAME_EXIT();

⌨️ 快捷键说明

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