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

📄 ftcalc.c

📁 奇趣公司比较新的qt/emd版本
💻 C
📖 第 1 页 / 共 2 页
字号:
             FT_Long  b )  {    /* use inline assembly to speed up things a bit */#if defined( __GNUC__ ) && defined( i386 )    FT_Long  result;    __asm__ __volatile__ (      "imul  %%edx\n"      "movl  %%edx, %%ecx\n"      "sarl  $31, %%ecx\n"      "addl  $0x8000, %%ecx\n"      "addl  %%ecx, %%eax\n"      "adcl  $0, %%edx\n"      "shrl  $16, %%eax\n"      "shll  $16, %%edx\n"      "addl  %%edx, %%eax\n"      "mov   %%eax, %0\n"      : "=r"(result)      : "a"(a), "d"(b)      : "%ecx"    );    return result;#elif 1    FT_Long   sa, sb;    FT_ULong  ua, ub;    if ( a == 0 || b == 0x10000L )      return a;    sa = ( a >> ( sizeof ( a ) * 8 - 1 ) );    a  = ( a ^ sa ) - sa;    sb = ( b >> ( sizeof ( b ) * 8 - 1 ) );    b  = ( b ^ sb ) - sb;    ua = (FT_ULong)a;    ub = (FT_ULong)b;    if ( ua <= 2048 && ub <= 1048576L )      ua = ( ua * ub + 0x8000U ) >> 16;    else    {      FT_ULong  al = ua & 0xFFFFU;      ua = ( ua >> 16 ) * ub +  al * ( ub >> 16 ) +           ( ( al * ( ub & 0xFFFFU ) + 0x8000U ) >> 16 );    }    sa ^= sb,    ua  = (FT_ULong)(( ua ^ sa ) - sa);    return (FT_Long)ua;#else /* 0 */    FT_Long   s;    FT_ULong  ua, ub;    if ( a == 0 || b == 0x10000L )      return a;    s  = a; a = FT_ABS( a );    s ^= b; b = FT_ABS( b );    ua = (FT_ULong)a;    ub = (FT_ULong)b;    if ( ua <= 2048 && ub <= 1048576L )      ua = ( ua * ub + 0x8000UL ) >> 16;    else    {      FT_ULong  al = ua & 0xFFFFUL;      ua = ( ua >> 16 ) * ub +  al * ( ub >> 16 ) +           ( ( al * ( ub & 0xFFFFUL ) + 0x8000UL ) >> 16 );    }    return ( s < 0 ? -(FT_Long)ua : (FT_Long)ua );#endif /* 0 */  }  /* documentation is in freetype.h */  FT_EXPORT_DEF( FT_Long )  FT_DivFix( FT_Long  a,             FT_Long  b )  {    FT_Int32   s;    FT_UInt32  q;    s  = a; a = FT_ABS(a);    s ^= b; b = FT_ABS(b);    if ( b == 0 )    {      /* check for division by 0 */      q = 0x7FFFFFFFL;    }    else if ( ( a >> 16 ) == 0 )    {      /* compute result directly */      q = (FT_UInt32)( (a << 16) + (b >> 1) ) / (FT_UInt32)b;    }    else    {      /* we need more bits; we have to do it by hand */      FT_Int64  temp, temp2;      temp.hi  = (FT_Int32) (a >> 16);      temp.lo  = (FT_UInt32)(a << 16);      temp2.hi = 0;      temp2.lo = (FT_UInt32)( b >> 1 );      FT_Add64( &temp, &temp2, &temp );      q = ft_div64by32( temp.hi, temp.lo, b );    }    return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );  }#if 0  /* documentation is in ftcalc.h */  FT_EXPORT_DEF( void )  FT_MulTo64( FT_Int32   x,              FT_Int32   y,              FT_Int64  *z )  {    FT_Int32  s;    s  = x; x = FT_ABS( x );    s ^= y; y = FT_ABS( y );    ft_multo64( x, y, z );    if ( s < 0 )    {      z->lo = (FT_UInt32)-(FT_Int32)z->lo;      z->hi = ~z->hi + !( z->lo );    }  }  /* apparently, the second version of this code is not compiled correctly */  /* on Mac machines with the MPW C compiler..  tsk, tsk, tsk...           */#if 1  FT_EXPORT_DEF( FT_Int32 )  FT_Div64by32( FT_Int64*  x,                FT_Int32   y )  {    FT_Int32   s;    FT_UInt32  q, r, i, lo;    s  = x->hi;    if ( s < 0 )    {      x->lo = (FT_UInt32)-(FT_Int32)x->lo;      x->hi = ~x->hi + !x->lo;    }    s ^= y;  y = FT_ABS( y );    /* Shortcut */    if ( x->hi == 0 )    {      if ( y > 0 )        q = x->lo / y;      else        q = 0x7FFFFFFFL;      return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );    }    r  = x->hi;    lo = x->lo;    if ( r >= (FT_UInt32)y ) /* we know y is to be treated as unsigned here */      return ( s < 0 ? 0x80000001UL : 0x7FFFFFFFUL );                             /* Return Max/Min Int32 if division overflow. */                             /* This includes division by zero!            */    q = 0;    for ( i = 0; i < 32; i++ )    {      r <<= 1;      q <<= 1;      r  |= lo >> 31;      if ( r >= (FT_UInt32)y )      {        r -= y;        q |= 1;      }      lo <<= 1;    }    return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );  }#else /* 0 */  FT_EXPORT_DEF( FT_Int32 )  FT_Div64by32( FT_Int64*  x,                FT_Int32   y )  {    FT_Int32   s;    FT_UInt32  q;    s  = x->hi;    if ( s < 0 )    {      x->lo = (FT_UInt32)-(FT_Int32)x->lo;      x->hi = ~x->hi + !x->lo;    }    s ^= y;  y = FT_ABS( y );    /* Shortcut */    if ( x->hi == 0 )    {      if ( y > 0 )        q = ( x->lo + ( y >> 1 ) ) / y;      else        q = 0x7FFFFFFFL;      return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );    }    q = ft_div64by32( x->hi, x->lo, y );    return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );  }#endif /* 0 */#endif /* 0 */#endif /* FT_LONG64 */  /* documentation is in ftcalc.h */  FT_BASE_DEF( FT_Int32 )  FT_SqrtFixed( FT_Int32  x )  {    FT_UInt32  root, rem_hi, rem_lo, test_div;    FT_Int     count;    root = 0;    if ( x > 0 )    {      rem_hi = 0;      rem_lo = x;      count  = 24;      do      {        rem_hi   = ( rem_hi << 2 ) | ( rem_lo >> 30 );        rem_lo <<= 2;        root   <<= 1;        test_div = ( root << 1 ) + 1;        if ( rem_hi >= test_div )        {          rem_hi -= test_div;          root   += 1;        }      } while ( --count );    }    return (FT_Int32)root;  }  /* documentation is in ftcalc.h */  FT_BASE_DEF( FT_Int )  ft_corner_orientation( FT_Pos  in_x,                         FT_Pos  in_y,                         FT_Pos  out_x,                         FT_Pos  out_y )  {    FT_Int  result;    /* deal with the trivial cases quickly */    if ( in_y == 0 )    {      if ( in_x >= 0 )        result = out_y;      else        result = -out_y;    }    else if ( in_x == 0 )    {      if ( in_y >= 0 )        result = -out_x;      else        result = out_x;    }    else if ( out_y == 0 )    {      if ( out_x >= 0 )        result = in_y;      else        result = -in_y;    }    else if ( out_x == 0 )    {      if ( out_y >= 0 )        result = -in_x;      else        result =  in_x;    }    else /* general case */    {#ifdef FT_LONG64      FT_Int64  delta = (FT_Int64)in_x * out_y - (FT_Int64)in_y * out_x;      if ( delta == 0 )        result = 0;      else        result = 1 - 2 * ( delta < 0 );#else      FT_Int64  z1, z2;      ft_multo64( in_x, out_y, &z1 );      ft_multo64( in_y, out_x, &z2 );      if ( z1.hi > z2.hi )        result = +1;      else if ( z1.hi < z2.hi )        result = -1;      else if ( z1.lo > z2.lo )        result = +1;      else if ( z1.lo < z2.lo )        result = -1;      else        result = 0;#endif    }    return result;  }  /* documentation is in ftcalc.h */  FT_BASE_DEF( FT_Int )  ft_corner_is_flat( FT_Pos  in_x,                     FT_Pos  in_y,                     FT_Pos  out_x,                     FT_Pos  out_y )  {    FT_Pos  ax = in_x;    FT_Pos  ay = in_y;    FT_Pos  d_in, d_out, d_corner;    if ( ax < 0 )      ax = -ax;    if ( ay < 0 )      ay = -ay;    d_in = ax + ay;    ax = out_x;    if ( ax < 0 )      ax = -ax;    ay = out_y;    if ( ay < 0 )      ay = -ay;    d_out = ax + ay;    ax = out_x + in_x;    if ( ax < 0 )      ax = -ax;    ay = out_y + in_y;    if ( ay < 0 )      ay = -ay;    d_corner = ax + ay;    return ( d_in + d_out - d_corner ) < ( d_corner >> 4 );  }/* END */

⌨️ 快捷键说明

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