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

📄 pshrec.c

📁 奇趣公司比较新的qt/emd版本
💻 C
📖 第 1 页 / 共 3 页
字号:
    {    case PS_HINT_TYPE_1:    case PS_HINT_TYPE_2:      hints->error     = 0;      hints->hint_type = hint_type;      ps_dimension_init( &hints->dimension[0] );      ps_dimension_init( &hints->dimension[1] );      break;    default:      hints->error     = PSH_Err_Invalid_Argument;      hints->hint_type = hint_type;      FT_ERROR(( "ps_hints_open: invalid charstring type!\n" ));      break;    }  }  /* add one or more stems to the current hints table */  static void  ps_hints_stem( PS_Hints  hints,                 FT_Int    dimension,                 FT_UInt   count,                 FT_Long*  stems )  {    if ( !hints->error )    {      /* limit "dimension" to 0..1 */      if ( dimension < 0 || dimension > 1 )      {        FT_ERROR(( "ps_hints_stem: invalid dimension (%d) used\n",                   dimension ));        dimension = ( dimension != 0 );      }      /* record the stems in the current hints/masks table */      switch ( hints->hint_type )      {      case PS_HINT_TYPE_1:  /* Type 1 "hstem" or "vstem" operator */      case PS_HINT_TYPE_2:  /* Type 2 "hstem" or "vstem" operator */        {          PS_Dimension  dim = &hints->dimension[dimension];          for ( ; count > 0; count--, stems += 2 )          {            FT_Error   error;            FT_Memory  memory = hints->memory;            error = ps_dimension_add_t1stem(                      dim, (FT_Int)stems[0], (FT_Int)stems[1],                      memory, NULL );            if ( error )            {              FT_ERROR(( "ps_hints_stem: could not add stem"                         " (%d,%d) to hints table\n", stems[0], stems[1] ));              hints->error = error;              return;            }          }          break;        }      default:        FT_ERROR(( "ps_hints_stem: called with invalid hint type (%d)\n",                   hints->hint_type ));        break;      }    }  }  /* add one Type1 counter stem to the current hints table */  static void  ps_hints_t1stem3( PS_Hints  hints,                    FT_Int    dimension,                    FT_Long*  stems )  {    FT_Error  error = 0;    if ( !hints->error )    {      PS_Dimension  dim;      FT_Memory     memory = hints->memory;      FT_Int        count;      FT_Int        idx[3];      /* limit "dimension" to 0..1 */      if ( dimension < 0 || dimension > 1 )      {        FT_ERROR(( "ps_hints_t1stem3: invalid dimension (%d) used\n",                   dimension ));        dimension = ( dimension != 0 );      }      dim = &hints->dimension[dimension];      /* there must be 6 elements in the 'stem' array */      if ( hints->hint_type == PS_HINT_TYPE_1 )      {        /* add the three stems to our hints/masks table */        for ( count = 0; count < 3; count++, stems += 2 )        {          error = ps_dimension_add_t1stem(                    dim, (FT_Int)stems[0], (FT_Int)stems[1],                    memory, &idx[count] );          if ( error )            goto Fail;        }        /* now, add the hints to the counters table */        error = ps_dimension_add_counter( dim, idx[0], idx[1], idx[2],                                          memory );        if ( error )          goto Fail;      }      else      {        FT_ERROR(( "ps_hints_t1stem3: called with invalid hint type!\n" ));        error = PSH_Err_Invalid_Argument;        goto Fail;      }    }    return;  Fail:    FT_ERROR(( "ps_hints_t1stem3: could not add counter stems to table\n" ));    hints->error = error;  }  /* reset hints (only with Type 1 hints) */  static void  ps_hints_t1reset( PS_Hints  hints,                    FT_UInt   end_point )  {    FT_Error  error = 0;    if ( !hints->error )    {      FT_Memory  memory = hints->memory;      if ( hints->hint_type == PS_HINT_TYPE_1 )      {        error = ps_dimension_reset_mask( &hints->dimension[0],                                         end_point, memory );        if ( error )          goto Fail;        error = ps_dimension_reset_mask( &hints->dimension[1],                                         end_point, memory );        if ( error )          goto Fail;      }      else      {        /* invalid hint type */        error = PSH_Err_Invalid_Argument;        goto Fail;      }    }    return;  Fail:    hints->error = error;  }  /* Type2 "hintmask" operator, add a new hintmask to each direction */  static void  ps_hints_t2mask( PS_Hints        hints,                   FT_UInt         end_point,                   FT_UInt         bit_count,                   const FT_Byte*  bytes )  {    FT_Error  error;    if ( !hints->error )    {      PS_Dimension  dim    = hints->dimension;      FT_Memory     memory = hints->memory;      FT_UInt       count1 = dim[0].hints.num_hints;      FT_UInt       count2 = dim[1].hints.num_hints;      /* check bit count; must be equal to current total hint count */      if ( bit_count !=  count1 + count2 )      {        FT_ERROR(( "ps_hints_t2mask: "                   "called with invalid bitcount %d (instead of %d)\n",                   bit_count, count1 + count2 ));        /* simply ignore the operator */        return;      }      /* set-up new horizontal and vertical hint mask now */      error = ps_dimension_set_mask_bits( &dim[0], bytes, count2, count1,                                          end_point, memory );      if ( error )        goto Fail;      error = ps_dimension_set_mask_bits( &dim[1], bytes, 0, count2,                                          end_point, memory );      if ( error )        goto Fail;    }    return;  Fail:    hints->error = error;  }  static void  ps_hints_t2counter( PS_Hints        hints,                      FT_UInt         bit_count,                      const FT_Byte*  bytes )  {    FT_Error  error;    if ( !hints->error )    {      PS_Dimension  dim    = hints->dimension;      FT_Memory     memory = hints->memory;      FT_UInt       count1 = dim[0].hints.num_hints;      FT_UInt       count2 = dim[1].hints.num_hints;      /* check bit count, must be equal to current total hint count */      if ( bit_count !=  count1 + count2 )      {        FT_ERROR(( "ps_hints_t2counter: "                   "called with invalid bitcount %d (instead of %d)\n",                   bit_count, count1 + count2 ));        /* simply ignore the operator */        return;      }      /* set-up new horizontal and vertical hint mask now */      error = ps_dimension_set_mask_bits( &dim[0], bytes, 0, count1,                                          0, memory );      if ( error )        goto Fail;      error = ps_dimension_set_mask_bits( &dim[1], bytes, count1, count2,                                          0, memory );      if ( error )        goto Fail;    }    return;  Fail:    hints->error = error;  }  /* end recording session */  static FT_Error  ps_hints_close( PS_Hints  hints,                  FT_UInt   end_point )  {    FT_Error  error;    error = hints->error;    if ( !error )    {      FT_Memory     memory = hints->memory;      PS_Dimension  dim    = hints->dimension;      error = ps_dimension_end( &dim[0], end_point, memory );      if ( !error )      {        error = ps_dimension_end( &dim[1], end_point, memory );      }    }#ifdef DEBUG_HINTER    if ( !error )      ps_debug_hints = hints;#endif    return error;  }  /*************************************************************************/  /*************************************************************************/  /*****                                                               *****/  /*****                TYPE 1 HINTS RECORDING INTERFACE               *****/  /*****                                                               *****/  /*************************************************************************/  /*************************************************************************/  static void  t1_hints_open( T1_Hints  hints )  {    ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_1 );  }  static void  t1_hints_stem( T1_Hints  hints,                 FT_Int    dimension,                 FT_Long*  coords )  {    ps_hints_stem( (PS_Hints)hints, dimension, 1, coords );  }  FT_LOCAL_DEF( void )  t1_hints_funcs_init( T1_Hints_FuncsRec*  funcs )  {    FT_MEM_ZERO( (char*)funcs, sizeof ( *funcs ) );    funcs->open  = (T1_Hints_OpenFunc)    t1_hints_open;    funcs->close = (T1_Hints_CloseFunc)   ps_hints_close;    funcs->stem  = (T1_Hints_SetStemFunc) t1_hints_stem;    funcs->stem3 = (T1_Hints_SetStem3Func)ps_hints_t1stem3;    funcs->reset = (T1_Hints_ResetFunc)   ps_hints_t1reset;    funcs->apply = (T1_Hints_ApplyFunc)   ps_hints_apply;  }  /*************************************************************************/  /*************************************************************************/  /*****                                                               *****/  /*****                TYPE 2 HINTS RECORDING INTERFACE               *****/  /*****                                                               *****/  /*************************************************************************/  /*************************************************************************/  static void  t2_hints_open( T2_Hints  hints )  {    ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_2 );  }  static void  t2_hints_stems( T2_Hints   hints,                  FT_Int     dimension,                  FT_Int     count,                  FT_Fixed*  coords )  {    FT_Pos  stems[32], y, n;    FT_Int  total = count;    y = 0;    while ( total > 0 )    {      /* determine number of stems to write */      count = total;      if ( count > 16 )        count = 16;      /* compute integer stem positions in font units */      for ( n = 0; n < count * 2; n++ )      {        y       += coords[n];        stems[n] = ( y + 0x8000L ) >> 16;      }      /* compute lengths */      for ( n = 0; n < count * 2; n += 2 )        stems[n + 1] = stems[n + 1] - stems[n];      /* add them to the current dimension */      ps_hints_stem( (PS_Hints)hints, dimension, count, stems );      total -= count;    }  }  FT_LOCAL_DEF( void )  t2_hints_funcs_init( T2_Hints_FuncsRec*  funcs )  {    FT_MEM_ZERO( funcs, sizeof ( *funcs ) );    funcs->open    = (T2_Hints_OpenFunc)   t2_hints_open;    funcs->close   = (T2_Hints_CloseFunc)  ps_hints_close;    funcs->stems   = (T2_Hints_StemsFunc)  t2_hints_stems;    funcs->hintmask= (T2_Hints_MaskFunc)   ps_hints_t2mask;    funcs->counter = (T2_Hints_CounterFunc)ps_hints_t2counter;    funcs->apply   = (T2_Hints_ApplyFunc)  ps_hints_apply;  }/* END */

⌨️ 快捷键说明

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