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

📄 psobjs.c

📁 奇趣公司比较新的qt/emd版本
💻 C
📖 第 1 页 / 共 4 页
字号:
    parser->cursor = old_cursor;    parser->limit  = old_limit;  Exit:    return error;  }  FT_LOCAL_DEF( FT_Long )  ps_parser_to_int( PS_Parser  parser )  {    ps_parser_skip_spaces( parser );    return PS_Conv_ToInt( &parser->cursor, parser->limit );  }  /* first character must be `<' if `delimiters' is non-zero */  FT_LOCAL_DEF( FT_Error )  ps_parser_to_bytes( PS_Parser  parser,                      FT_Byte*   bytes,                      FT_Long    max_bytes,                      FT_Long*   pnum_bytes,                      FT_Bool    delimiters )  {    FT_Error  error = PSaux_Err_Ok;    FT_Byte*  cur;    ps_parser_skip_spaces( parser );    cur = parser->cursor;    if ( cur >= parser->limit )      goto Exit;    if ( delimiters )    {      if ( *cur != '<' )      {        FT_ERROR(( "ps_parser_to_bytes: Missing starting delimiter `<'\n" ));        error = PSaux_Err_Invalid_File_Format;        goto Exit;      }      cur++;    }    *pnum_bytes = PS_Conv_ASCIIHexDecode( &cur,                                          parser->limit,                                          bytes,                                          max_bytes );    if ( delimiters )    {      if ( cur < parser->limit && *cur != '>' )      {        FT_ERROR(( "ps_tobytes: Missing closing delimiter `>'\n" ));        error = PSaux_Err_Invalid_File_Format;        goto Exit;      }      cur++;    }    parser->cursor = cur;  Exit:    return error;  }  FT_LOCAL_DEF( FT_Fixed )  ps_parser_to_fixed( PS_Parser  parser,                      FT_Int     power_ten )  {    ps_parser_skip_spaces( parser );    return PS_Conv_ToFixed( &parser->cursor, parser->limit, power_ten );  }  FT_LOCAL_DEF( FT_Int )  ps_parser_to_coord_array( PS_Parser  parser,                            FT_Int     max_coords,                            FT_Short*  coords )  {    ps_parser_skip_spaces( parser );    return ps_tocoordarray( &parser->cursor, parser->limit,                            max_coords, coords );  }  FT_LOCAL_DEF( FT_Int )  ps_parser_to_fixed_array( PS_Parser  parser,                            FT_Int     max_values,                            FT_Fixed*  values,                            FT_Int     power_ten )  {    ps_parser_skip_spaces( parser );    return ps_tofixedarray( &parser->cursor, parser->limit,                            max_values, values, power_ten );  }#if 0  FT_LOCAL_DEF( FT_String* )  T1_ToString( PS_Parser  parser )  {    return ps_tostring( &parser->cursor, parser->limit, parser->memory );  }  FT_LOCAL_DEF( FT_Bool )  T1_ToBool( PS_Parser  parser )  {    return ps_tobool( &parser->cursor, parser->limit );  }#endif /* 0 */  FT_LOCAL_DEF( void )  ps_parser_init( PS_Parser  parser,                  FT_Byte*   base,                  FT_Byte*   limit,                  FT_Memory  memory )  {    parser->error  = PSaux_Err_Ok;    parser->base   = base;    parser->limit  = limit;    parser->cursor = base;    parser->memory = memory;    parser->funcs  = ps_parser_funcs;  }  FT_LOCAL_DEF( void )  ps_parser_done( PS_Parser  parser )  {    FT_UNUSED( parser );  }  /*************************************************************************/  /*************************************************************************/  /*****                                                               *****/  /*****                            T1 BUILDER                         *****/  /*****                                                               *****/  /*************************************************************************/  /*************************************************************************/  /*************************************************************************/  /*                                                                       */  /* <Function>                                                            */  /*    t1_builder_init                                                    */  /*                                                                       */  /* <Description>                                                         */  /*    Initializes a given glyph builder.                                 */  /*                                                                       */  /* <InOut>                                                               */  /*    builder :: A pointer to the glyph builder to initialize.           */  /*                                                                       */  /* <Input>                                                               */  /*    face    :: The current face object.                                */  /*                                                                       */  /*    size    :: The current size object.                                */  /*                                                                       */  /*    glyph   :: The current glyph object.                               */  /*                                                                       */  /*    hinting :: Whether hinting should be applied.                      */  /*                                                                       */  FT_LOCAL_DEF( void )  t1_builder_init( T1_Builder    builder,                   FT_Face       face,                   FT_Size       size,                   FT_GlyphSlot  glyph,                   FT_Bool       hinting )  {    builder->parse_state = T1_Parse_Start;    builder->load_points = 1;    builder->face   = face;    builder->glyph  = glyph;    builder->memory = face->memory;    if ( glyph )    {      FT_GlyphLoader  loader = glyph->internal->loader;      builder->loader  = loader;      builder->base    = &loader->base.outline;      builder->current = &loader->current.outline;      FT_GlyphLoader_Rewind( loader );      builder->hints_globals = size->internal;      builder->hints_funcs   = 0;      if ( hinting )        builder->hints_funcs = glyph->internal->glyph_hints;    }    if ( size )    {      builder->scale_x = size->metrics.x_scale;      builder->scale_y = size->metrics.y_scale;    }    builder->pos_x = 0;    builder->pos_y = 0;    builder->left_bearing.x = 0;    builder->left_bearing.y = 0;    builder->advance.x      = 0;    builder->advance.y      = 0;    builder->funcs = t1_builder_funcs;  }  /*************************************************************************/  /*                                                                       */  /* <Function>                                                            */  /*    t1_builder_done                                                    */  /*                                                                       */  /* <Description>                                                         */  /*    Finalizes a given glyph builder.  Its contents can still be used   */  /*    after the call, but the function saves important information       */  /*    within the corresponding glyph slot.                               */  /*                                                                       */  /* <Input>                                                               */  /*    builder :: A pointer to the glyph builder to finalize.             */  /*                                                                       */  FT_LOCAL_DEF( void )  t1_builder_done( T1_Builder  builder )  {    FT_GlyphSlot  glyph = builder->glyph;    if ( glyph )      glyph->outline = *builder->base;  }  /* check that there is enough space for `count' more points */  FT_LOCAL_DEF( FT_Error )  t1_builder_check_points( T1_Builder  builder,                           FT_Int      count )  {    return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 );  }  /* add a new point, do not check space */  FT_LOCAL_DEF( void )  t1_builder_add_point( T1_Builder  builder,                        FT_Pos      x,                        FT_Pos      y,                        FT_Byte     flag )  {    FT_Outline*  outline = builder->current;    if ( builder->load_points )    {      FT_Vector*  point   = outline->points + outline->n_points;      FT_Byte*    control = (FT_Byte*)outline->tags + outline->n_points;      if ( builder->shift )      {        x >>= 16;        y >>= 16;      }      point->x = x;      point->y = y;      *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC );      builder->last = *point;    }    outline->n_points++;  }  /* check space for a new on-curve point, then add it */  FT_LOCAL_DEF( FT_Error )  t1_builder_add_point1( T1_Builder  builder,                         FT_Pos      x,                         FT_Pos      y )  {    FT_Error  error;    error = t1_builder_check_points( builder, 1 );    if ( !error )      t1_builder_add_point( builder, x, y, 1 );    return error;  }  /* check space for a new contour, then add it */  FT_LOCAL_DEF( FT_Error )  t1_builder_add_contour( T1_Builder  builder )  {    FT_Outline*  outline = builder->current;    FT_Error     error;    if ( !builder->load_points )    {      outline->n_contours++;      return PSaux_Err_Ok;    }    error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 );    if ( !error )    {      if ( outline->n_contours > 0 )        outline->contours[outline->n_contours - 1] =          (short)( outline->n_points - 1 );      outline->n_contours++;    }    return error;  }  /* if a path was begun, add its first on-curve point */  FT_LOCAL_DEF( FT_Error )  t1_builder_start_point( T1_Builder  builder,                          FT_Pos      x,                          FT_Pos      y )  {    FT_Error  error = PSaux_Err_Invalid_File_Format;    /* test whether we are building a new contour */    if ( builder->parse_state == T1_Parse_Have_Path )      error = PSaux_Err_Ok;    else if ( builder->parse_state == T1_Parse_Have_Moveto )    {      builder->parse_state = T1_Parse_Have_Path;      error = t1_builder_add_contour( builder );      if ( !error )        error = t1_builder_add_point1( builder, x, y );    }    return error;  }  /* close the current contour */  FT_LOCAL_DEF( void )  t1_builder_close_contour( T1_Builder  builder )  {    FT_Outline*  outline = builder->current;    if ( !outline )      return;    /* XXXX: We must not include the last point in the path if it */    /*       is located on the first point.                       */    if ( outline->n_points > 1 )    {      FT_Int      first   = 0;      FT_Vector*  p1      = outline->points + first;      FT_Vector*  p2      = outline->points + outline->n_points - 1;      FT_Byte*    control = (FT_Byte*)outline->tags + outline->n_points - 1;      if ( outline->n_contours > 1 )      {        first = outline->contours[outline->n_contours - 2] + 1;        p1    = outline->points + first;      }      /* `delete' last point only if it coincides with the first */      /* point and it is not a control point (which can happen). */      if ( p1->x == p2->x && p1->y == p2->y )        if ( *control == FT_CURVE_TAG_ON )          outline->n_points--;    }    if ( outline->n_contours > 0 )      outline->contours[outline->n_contours - 1] =        (short)( outline->n_points - 1 );  }  /*************************************************************************/  /*************************************************************************/  /*****                                                               *****/  /*****                            OTHER                              *****/  /*****                                                               *****/  /*************************************************************************/  /*************************************************************************/  FT_LOCAL_DEF( void )  t1_decrypt( FT_Byte*   buffer,              FT_Offset  length,              FT_UShort  seed )  {    PS_Conv_EexecDecode( &buffer,                         buffer + length,                         buffer,                         length,                         &seed );  }/* END */

⌨️ 快捷键说明

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