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

📄 t1parse.c

📁 奇趣公司比较新的qt/emd版本
💻 C
📖 第 1 页 / 共 2 页
字号:
  {    FT_Memory  memory = parser->root.memory;    /* always free the private dictionary */    FT_FREE( parser->private_dict );    /* free the base dictionary only when we have a disk stream */    if ( !parser->in_memory )      FT_FREE( parser->base_dict );    parser->root.funcs.done( &parser->root );  }  FT_LOCAL_DEF( FT_Error )  T1_Get_Private_Dict( T1_Parser      parser,                       PSAux_Service  psaux )  {    FT_Stream  stream = parser->stream;    FT_Memory  memory = parser->root.memory;    FT_Error   error  = T1_Err_Ok;    FT_Long    size;    if ( parser->in_pfb )    {      /* in the case of the PFB format, the private dictionary can be  */      /* made of several segments.  We thus first read the number of   */      /* segments to compute the total size of the private dictionary  */      /* then re-read them into memory.                                */      FT_Long    start_pos = FT_STREAM_POS();      FT_UShort  tag;      parser->private_len = 0;      for (;;)      {        error = read_pfb_tag( stream, &tag, &size );        if ( error )          goto Fail;        if ( tag != 0x8002U )          break;        parser->private_len += size;        if ( FT_STREAM_SKIP( size ) )          goto Fail;      }      /* Check that we have a private dictionary there */      /* and allocate private dictionary buffer        */      if ( parser->private_len == 0 )      {        FT_ERROR(( "T1_Get_Private_Dict:" ));        FT_ERROR(( " invalid private dictionary section\n" ));        error = T1_Err_Invalid_File_Format;        goto Fail;      }      if ( FT_STREAM_SEEK( start_pos )                             ||           FT_ALLOC( parser->private_dict, parser->private_len ) )        goto Fail;      parser->private_len = 0;      for (;;)      {        error = read_pfb_tag( stream, &tag, &size );        if ( error || tag != 0x8002U )        {          error = T1_Err_Ok;          break;        }        if ( FT_STREAM_READ( parser->private_dict + parser->private_len,                             size ) )          goto Fail;        parser->private_len += size;      }    }    else    {      /* We have already `loaded' the whole PFA font file into memory; */      /* if this is a memory resource, allocate a new block to hold    */      /* the private dict.  Otherwise, simply overwrite into the base  */      /* dictionary block in the heap.                                 */      /* first of all, look at the `eexec' keyword */      FT_Byte*  cur   = parser->base_dict;      FT_Byte*  limit = cur + parser->base_len;      FT_Byte   c;    Again:      for (;;)      {        c = cur[0];        if ( c == 'e' && cur + 9 < limit )  /* 9 = 5 letters for `eexec' + */                                            /* newline + 4 chars           */        {          if ( cur[1] == 'e' &&               cur[2] == 'x' &&               cur[3] == 'e' &&               cur[4] == 'c' )            break;        }        cur++;        if ( cur >= limit )        {          FT_ERROR(( "T1_Get_Private_Dict:" ));          FT_ERROR(( " could not find `eexec' keyword\n" ));          error = T1_Err_Invalid_File_Format;          goto Exit;        }      }      /* check whether `eexec' was real -- it could be in a comment */      /* or string (as e.g. in u003043t.gsf from ghostscript)       */      parser->root.cursor = parser->base_dict;      parser->root.limit  = cur + 9;      cur   = parser->root.cursor;      limit = parser->root.limit;      while ( cur < limit )      {        if ( *cur == 'e' && ft_strncmp( (char*)cur, "eexec", 5 ) == 0 )          goto Found;        T1_Skip_PS_Token( parser );        if ( parser->root.error )          break;        T1_Skip_Spaces  ( parser );        cur = parser->root.cursor;      }      /* we haven't found the correct `eexec'; go back and continue */      /* searching                                                  */      cur   = limit;      limit = parser->base_dict + parser->base_len;      goto Again;      /* now determine where to write the _encrypted_ binary private  */      /* dictionary.  We overwrite the base dictionary for disk-based */      /* resources and allocate a new block otherwise                 */    Found:      parser->root.limit = parser->base_dict + parser->base_len;      T1_Skip_PS_Token( parser );      cur = parser->root.cursor;      if ( *cur == '\r' )      {        cur++;        if ( *cur == '\n' )          cur++;      }      else if ( *cur == '\n' )        cur++;      else      {        FT_ERROR(( "T1_Get_Private_Dict:" ));        FT_ERROR(( " `eexec' not properly terminated\n" ));        error = T1_Err_Invalid_File_Format;        goto Exit;      }      size = (FT_Long)( parser->base_len - ( cur - parser->base_dict ) );      if ( parser->in_memory )      {        /* note that we allocate one more byte to put a terminating `0' */        if ( FT_ALLOC( parser->private_dict, size + 1 ) )          goto Fail;        parser->private_len = size;      }      else      {        parser->single_block = 1;        parser->private_dict = parser->base_dict;        parser->private_len  = size;        parser->base_dict    = 0;        parser->base_len     = 0;      }      /* now determine whether the private dictionary is encoded in binary */      /* or hexadecimal ASCII format -- decode it accordingly              */      /* we need to access the next 4 bytes (after the final \r following */      /* the `eexec' keyword); if they all are hexadecimal digits, then   */      /* we have a case of ASCII storage                                  */      if ( ft_isxdigit( cur[0] ) && ft_isxdigit( cur[1] ) &&           ft_isxdigit( cur[2] ) && ft_isxdigit( cur[3] ) )      {        /* ASCII hexadecimal encoding */        FT_Long  len;        parser->root.cursor = cur;        (void)psaux->ps_parser_funcs->to_bytes( &parser->root,                                                parser->private_dict,                                                parser->private_len,                                                &len,                                                0 );        parser->private_len = len;        /* put a safeguard */        parser->private_dict[len] = '\0';      }      else        /* binary encoding -- copy the private dict */        FT_MEM_MOVE( parser->private_dict, cur, size );    }    /* we now decrypt the encoded binary private dictionary */    psaux->t1_decrypt( parser->private_dict, parser->private_len, 55665U );    /* replace the four random bytes at the beginning with whitespace */    parser->private_dict[0] = ' ';    parser->private_dict[1] = ' ';    parser->private_dict[2] = ' ';    parser->private_dict[3] = ' ';    parser->root.base   = parser->private_dict;    parser->root.cursor = parser->private_dict;    parser->root.limit  = parser->root.cursor + parser->private_len;  Fail:  Exit:    return error;  }/* END */

⌨️ 快捷键说明

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