ftcalc.c
上传用户:yisoukefu
上传日期:2020-08-09
资源大小:39506k
文件大小:17k
源码类别:

其他游戏

开发平台:

Visual C++

  1. /***************************************************************************/
  2. /*                                                                         */
  3. /*  ftcalc.c                                                               */
  4. /*                                                                         */
  5. /*    Arithmetic computations (body).                                      */
  6. /*                                                                         */
  7. /*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006 by                   */
  8. /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
  9. /*                                                                         */
  10. /*  This file is part of the FreeType project, and may only be used,       */
  11. /*  modified, and distributed under the terms of the FreeType project      */
  12. /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
  13. /*  this file you indicate that you have read the license and              */
  14. /*  understand and accept it fully.                                        */
  15. /*                                                                         */
  16. /***************************************************************************/
  17.   /*************************************************************************/
  18.   /*                                                                       */
  19.   /* Support for 1-complement arithmetic has been totally dropped in this  */
  20.   /* release.  You can still write your own code if you need it.           */
  21.   /*                                                                       */
  22.   /*************************************************************************/
  23.   /*************************************************************************/
  24.   /*                                                                       */
  25.   /* Implementing basic computation routines.                              */
  26.   /*                                                                       */
  27.   /* FT_MulDiv(), FT_MulFix(), FT_DivFix(), FT_RoundFix(), FT_CeilFix(),   */
  28.   /* and FT_FloorFix() are declared in freetype.h.                         */
  29.   /*                                                                       */
  30.   /*************************************************************************/
  31. #include <ft2build.h>
  32. #include FT_INTERNAL_CALC_H
  33. #include FT_INTERNAL_DEBUG_H
  34. #include FT_INTERNAL_OBJECTS_H
  35. /* we need to define a 64-bits data type here */
  36. #ifdef FT_LONG64
  37.   typedef FT_INT64  FT_Int64;
  38. #else
  39.   typedef struct  FT_Int64_
  40.   {
  41.     FT_UInt32  lo;
  42.     FT_UInt32  hi;
  43.   } FT_Int64;
  44. #endif /* FT_LONG64 */
  45.   /*************************************************************************/
  46.   /*                                                                       */
  47.   /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
  48.   /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
  49.   /* messages during execution.                                            */
  50.   /*                                                                       */
  51. #undef  FT_COMPONENT
  52. #define FT_COMPONENT  trace_calc
  53.   /* The following three functions are available regardless of whether */
  54.   /* FT_LONG64 is defined.                                             */
  55.   /* documentation is in freetype.h */
  56.   FT_EXPORT_DEF( FT_Fixed )
  57.   FT_RoundFix( FT_Fixed  a )
  58.   {
  59.     return ( a >= 0 ) ?   ( a + 0x8000L ) & ~0xFFFFL
  60.                       : -((-a + 0x8000L ) & ~0xFFFFL );
  61.   }
  62.   /* documentation is in freetype.h */
  63.   FT_EXPORT_DEF( FT_Fixed )
  64.   FT_CeilFix( FT_Fixed  a )
  65.   {
  66.     return ( a >= 0 ) ?   ( a + 0xFFFFL ) & ~0xFFFFL
  67.                       : -((-a + 0xFFFFL ) & ~0xFFFFL );
  68.   }
  69.   /* documentation is in freetype.h */
  70.   FT_EXPORT_DEF( FT_Fixed )
  71.   FT_FloorFix( FT_Fixed  a )
  72.   {
  73.     return ( a >= 0 ) ?   a & ~0xFFFFL
  74.                       : -((-a) & ~0xFFFFL );
  75.   }
  76. #ifdef FT_CONFIG_OPTION_OLD_INTERNALS
  77.   /* documentation is in ftcalc.h */
  78.   FT_EXPORT_DEF( FT_Int32 )
  79.   FT_Sqrt32( FT_Int32  x )
  80.   {
  81.     FT_ULong  val, root, newroot, mask;
  82.     root = 0;
  83.     mask = 0x40000000L;
  84.     val  = (FT_ULong)x;
  85.     do
  86.     {
  87.       newroot = root + mask;
  88.       if ( newroot <= val )
  89.       {
  90.         val -= newroot;
  91.         root = newroot + mask;
  92.       }
  93.       root >>= 1;
  94.       mask >>= 2;
  95.     } while ( mask != 0 );
  96.     return root;
  97.   }
  98. #endif /* FT_CONFIG_OPTION_OLD_INTERNALS */
  99. #ifdef FT_LONG64
  100.   /* documentation is in freetype.h */
  101.   FT_EXPORT_DEF( FT_Long )
  102.   FT_MulDiv( FT_Long  a,
  103.              FT_Long  b,
  104.              FT_Long  c )
  105.   {
  106.     FT_Int   s;
  107.     FT_Long  d;
  108.     s = 1;
  109.     if ( a < 0 ) { a = -a; s = -1; }
  110.     if ( b < 0 ) { b = -b; s = -s; }
  111.     if ( c < 0 ) { c = -c; s = -s; }
  112.     d = (FT_Long)( c > 0 ? ( (FT_Int64)a * b + ( c >> 1 ) ) / c
  113.                          : 0x7FFFFFFFL );
  114.     return ( s > 0 ) ? d : -d;
  115.   }
  116. #ifdef TT_USE_BYTECODE_INTERPRETER
  117.   /* documentation is in ftcalc.h */
  118.   FT_BASE_DEF( FT_Long )
  119.   FT_MulDiv_No_Round( FT_Long  a,
  120.                       FT_Long  b,
  121.                       FT_Long  c )
  122.   {
  123.     FT_Int   s;
  124.     FT_Long  d;
  125.     s = 1;
  126.     if ( a < 0 ) { a = -a; s = -1; }
  127.     if ( b < 0 ) { b = -b; s = -s; }
  128.     if ( c < 0 ) { c = -c; s = -s; }
  129.     d = (FT_Long)( c > 0 ? (FT_Int64)a * b / c
  130.                          : 0x7FFFFFFFL );
  131.     return ( s > 0 ) ? d : -d;
  132.   }
  133. #endif /* TT_USE_BYTECODE_INTERPRETER */
  134.   /* documentation is in freetype.h */
  135.   FT_EXPORT_DEF( FT_Long )
  136.   FT_MulFix( FT_Long  a,
  137.              FT_Long  b )
  138.   {
  139.     FT_Int   s = 1;
  140.     FT_Long  c;
  141.     if ( a < 0 ) { a = -a; s = -1; }
  142.     if ( b < 0 ) { b = -b; s = -s; }
  143.     c = (FT_Long)( ( (FT_Int64)a * b + 0x8000L ) >> 16 );
  144.     return ( s > 0 ) ? c : -c ;
  145.   }
  146.   /* documentation is in freetype.h */
  147.   FT_EXPORT_DEF( FT_Long )
  148.   FT_DivFix( FT_Long  a,
  149.              FT_Long  b )
  150.   {
  151.     FT_Int32   s;
  152.     FT_UInt32  q;
  153.     s = 1;
  154.     if ( a < 0 ) { a = -a; s = -1; }
  155.     if ( b < 0 ) { b = -b; s = -s; }
  156.     if ( b == 0 )
  157.       /* check for division by 0 */
  158.       q = 0x7FFFFFFFL;
  159.     else
  160.       /* compute result directly */
  161.       q = (FT_UInt32)( ( ( (FT_Int64)a << 16 ) + ( b >> 1 ) ) / b );
  162.     return ( s < 0 ? -(FT_Long)q : (FT_Long)q );
  163.   }
  164. #else /* !FT_LONG64 */
  165.   static void
  166.   ft_multo64( FT_UInt32  x,
  167.               FT_UInt32  y,
  168.               FT_Int64  *z )
  169.   {
  170.     FT_UInt32  lo1, hi1, lo2, hi2, lo, hi, i1, i2;
  171.     lo1 = x & 0x0000FFFFU;  hi1 = x >> 16;
  172.     lo2 = y & 0x0000FFFFU;  hi2 = y >> 16;
  173.     lo = lo1 * lo2;
  174.     i1 = lo1 * hi2;
  175.     i2 = lo2 * hi1;
  176.     hi = hi1 * hi2;
  177.     /* Check carry overflow of i1 + i2 */
  178.     i1 += i2;
  179.     hi += (FT_UInt32)( i1 < i2 ) << 16;
  180.     hi += i1 >> 16;
  181.     i1  = i1 << 16;
  182.     /* Check carry overflow of i1 + lo */
  183.     lo += i1;
  184.     hi += ( lo < i1 );
  185.     z->lo = lo;
  186.     z->hi = hi;
  187.   }
  188.   static FT_UInt32
  189.   ft_div64by32( FT_UInt32  hi,
  190.                 FT_UInt32  lo,
  191.                 FT_UInt32  y )
  192.   {
  193.     FT_UInt32  r, q;
  194.     FT_Int     i;
  195.     q = 0;
  196.     r = hi;
  197.     if ( r >= y )
  198.       return (FT_UInt32)0x7FFFFFFFL;
  199.     i = 32;
  200.     do
  201.     {
  202.       r <<= 1;
  203.       q <<= 1;
  204.       r  |= lo >> 31;
  205.       if ( r >= (FT_UInt32)y )
  206.       {
  207.         r -= y;
  208.         q |= 1;
  209.       }
  210.       lo <<= 1;
  211.     } while ( --i );
  212.     return q;
  213.   }
  214.   static void
  215.   FT_Add64( FT_Int64*  x,
  216.             FT_Int64*  y,
  217.             FT_Int64  *z )
  218.   {
  219.     register FT_UInt32  lo, hi;
  220.     lo = x->lo + y->lo;
  221.     hi = x->hi + y->hi + ( lo < x->lo );
  222.     z->lo = lo;
  223.     z->hi = hi;
  224.   }
  225.   /* documentation is in freetype.h */
  226.   /* The FT_MulDiv function has been optimized thanks to ideas from      */
  227.   /* Graham Asher.  The trick is to optimize computation when everything */
  228.   /* fits within 32-bits (a rather common case).                         */
  229.   /*                                                                     */
  230.   /*  we compute 'a*b+c/2', then divide it by 'c'. (positive values)     */
  231.   /*                                                                     */
  232.   /*  46340 is FLOOR(SQRT(2^31-1)).                                      */
  233.   /*                                                                     */
  234.   /*  if ( a <= 46340 && b <= 46340 ) then ( a*b <= 0x7FFEA810 )         */
  235.   /*                                                                     */
  236.   /*  0x7FFFFFFF - 0x7FFEA810 = 0x157F0                                  */
  237.   /*                                                                     */
  238.   /*  if ( c < 0x157F0*2 ) then ( a*b+c/2 <= 0x7FFFFFFF )                */
  239.   /*                                                                     */
  240.   /*  and 2*0x157F0 = 176096                                             */
  241.   /*                                                                     */
  242.   FT_EXPORT_DEF( FT_Long )
  243.   FT_MulDiv( FT_Long  a,
  244.              FT_Long  b,
  245.              FT_Long  c )
  246.   {
  247.     long  s;
  248.     if ( a == 0 || b == c )
  249.       return a;
  250.     s  = a; a = FT_ABS( a );
  251.     s ^= b; b = FT_ABS( b );
  252.     s ^= c; c = FT_ABS( c );
  253.     if ( a <= 46340L && b <= 46340L && c <= 176095L && c > 0 )
  254.       a = ( a * b + ( c >> 1 ) ) / c;
  255.     else if ( c > 0 )
  256.     {
  257.       FT_Int64  temp, temp2;
  258.       ft_multo64( a, b, &temp );
  259.       temp2.hi = 0;
  260.       temp2.lo = (FT_UInt32)(c >> 1);
  261.       FT_Add64( &temp, &temp2, &temp );
  262.       a = ft_div64by32( temp.hi, temp.lo, c );
  263.     }
  264.     else
  265.       a = 0x7FFFFFFFL;
  266.     return ( s < 0 ? -a : a );
  267.   }
  268. #ifdef TT_USE_BYTECODE_INTERPRETER
  269.   FT_BASE_DEF( FT_Long )
  270.   FT_MulDiv_No_Round( FT_Long  a,
  271.                       FT_Long  b,
  272.                       FT_Long  c )
  273.   {
  274.     long  s;
  275.     if ( a == 0 || b == c )
  276.       return a;
  277.     s  = a; a = FT_ABS( a );
  278.     s ^= b; b = FT_ABS( b );
  279.     s ^= c; c = FT_ABS( c );
  280.     if ( a <= 46340L && b <= 46340L && c > 0 )
  281.       a = a * b / c;
  282.     else if ( c > 0 )
  283.     {
  284.       FT_Int64  temp;
  285.       ft_multo64( a, b, &temp );
  286.       a = ft_div64by32( temp.hi, temp.lo, c );
  287.     }
  288.     else
  289.       a = 0x7FFFFFFFL;
  290.     return ( s < 0 ? -a : a );
  291.   }
  292. #endif /* TT_USE_BYTECODE_INTERPRETER */
  293.   /* documentation is in freetype.h */
  294.   FT_EXPORT_DEF( FT_Long )
  295.   FT_MulFix( FT_Long  a,
  296.              FT_Long  b )
  297.   {
  298.     /* use inline assembly to speed up things a bit */
  299. #if defined( __GNUC__ ) && defined( i386 )
  300.     FT_Long  result;
  301.     __asm__ __volatile__ (
  302.       "imul  %%edxn"
  303.       "movl  %%edx, %%ecxn"
  304.       "sarl  $31, %%ecxn"
  305.       "addl  $0x8000, %%ecxn"
  306.       "addl  %%ecx, %%eaxn"
  307.       "adcl  $0, %%edxn"
  308.       "shrl  $16, %%eaxn"
  309.       "shll  $16, %%edxn"
  310.       "addl  %%edx, %%eaxn"
  311.       "mov   %%eax, %0n"
  312.       : "=r"(result)
  313.       : "a"(a), "d"(b)
  314.       : "%ecx"
  315.     );
  316.     return result;
  317. #elif 1
  318.     FT_Long   sa, sb;
  319.     FT_ULong  ua, ub;
  320.     if ( a == 0 || b == 0x10000L )
  321.       return a;
  322.     sa = ( a >> ( sizeof ( a ) * 8 - 1 ) );
  323.     a  = ( a ^ sa ) - sa;
  324.     sb = ( b >> ( sizeof ( b ) * 8 - 1 ) );
  325.     b  = ( b ^ sb ) - sb;
  326.     ua = (FT_ULong)a;
  327.     ub = (FT_ULong)b;
  328.     if ( ua <= 2048 && ub <= 1048576L )
  329.       ua = ( ua * ub + 0x8000U ) >> 16;
  330.     else
  331.     {
  332.       FT_ULong  al = ua & 0xFFFFU;
  333.       ua = ( ua >> 16 ) * ub +  al * ( ub >> 16 ) +
  334.            ( ( al * ( ub & 0xFFFFU ) + 0x8000U ) >> 16 );
  335.     }
  336.     sa ^= sb,
  337.     ua  = (FT_ULong)(( ua ^ sa ) - sa);
  338.     return (FT_Long)ua;
  339. #else /* 0 */
  340.     FT_Long   s;
  341.     FT_ULong  ua, ub;
  342.     if ( a == 0 || b == 0x10000L )
  343.       return a;
  344.     s  = a; a = FT_ABS( a );
  345.     s ^= b; b = FT_ABS( b );
  346.     ua = (FT_ULong)a;
  347.     ub = (FT_ULong)b;
  348.     if ( ua <= 2048 && ub <= 1048576L )
  349.       ua = ( ua * ub + 0x8000UL ) >> 16;
  350.     else
  351.     {
  352.       FT_ULong  al = ua & 0xFFFFUL;
  353.       ua = ( ua >> 16 ) * ub +  al * ( ub >> 16 ) +
  354.            ( ( al * ( ub & 0xFFFFUL ) + 0x8000UL ) >> 16 );
  355.     }
  356.     return ( s < 0 ? -(FT_Long)ua : (FT_Long)ua );
  357. #endif /* 0 */
  358.   }
  359.   /* documentation is in freetype.h */
  360.   FT_EXPORT_DEF( FT_Long )
  361.   FT_DivFix( FT_Long  a,
  362.              FT_Long  b )
  363.   {
  364.     FT_Int32   s;
  365.     FT_UInt32  q;
  366.     s  = a; a = FT_ABS(a);
  367.     s ^= b; b = FT_ABS(b);
  368.     if ( b == 0 )
  369.     {
  370.       /* check for division by 0 */
  371.       q = 0x7FFFFFFFL;
  372.     }
  373.     else if ( ( a >> 16 ) == 0 )
  374.     {
  375.       /* compute result directly */
  376.       q = (FT_UInt32)( (a << 16) + (b >> 1) ) / (FT_UInt32)b;
  377.     }
  378.     else
  379.     {
  380.       /* we need more bits; we have to do it by hand */
  381.       FT_Int64  temp, temp2;
  382.       temp.hi  = (FT_Int32) (a >> 16);
  383.       temp.lo  = (FT_UInt32)(a << 16);
  384.       temp2.hi = 0;
  385.       temp2.lo = (FT_UInt32)( b >> 1 );
  386.       FT_Add64( &temp, &temp2, &temp );
  387.       q = ft_div64by32( temp.hi, temp.lo, b );
  388.     }
  389.     return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );
  390.   }
  391. #if 0
  392.   /* documentation is in ftcalc.h */
  393.   FT_EXPORT_DEF( void )
  394.   FT_MulTo64( FT_Int32   x,
  395.               FT_Int32   y,
  396.               FT_Int64  *z )
  397.   {
  398.     FT_Int32  s;
  399.     s  = x; x = FT_ABS( x );
  400.     s ^= y; y = FT_ABS( y );
  401.     ft_multo64( x, y, z );
  402.     if ( s < 0 )
  403.     {
  404.       z->lo = (FT_UInt32)-(FT_Int32)z->lo;
  405.       z->hi = ~z->hi + !( z->lo );
  406.     }
  407.   }
  408.   /* apparently, the second version of this code is not compiled correctly */
  409.   /* on Mac machines with the MPW C compiler..  tsk, tsk, tsk...           */
  410. #if 1
  411.   FT_EXPORT_DEF( FT_Int32 )
  412.   FT_Div64by32( FT_Int64*  x,
  413.                 FT_Int32   y )
  414.   {
  415.     FT_Int32   s;
  416.     FT_UInt32  q, r, i, lo;
  417.     s  = x->hi;
  418.     if ( s < 0 )
  419.     {
  420.       x->lo = (FT_UInt32)-(FT_Int32)x->lo;
  421.       x->hi = ~x->hi + !x->lo;
  422.     }
  423.     s ^= y;  y = FT_ABS( y );
  424.     /* Shortcut */
  425.     if ( x->hi == 0 )
  426.     {
  427.       if ( y > 0 )
  428.         q = x->lo / y;
  429.       else
  430.         q = 0x7FFFFFFFL;
  431.       return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );
  432.     }
  433.     r  = x->hi;
  434.     lo = x->lo;
  435.     if ( r >= (FT_UInt32)y ) /* we know y is to be treated as unsigned here */
  436.       return ( s < 0 ? 0x80000001UL : 0x7FFFFFFFUL );
  437.                              /* Return Max/Min Int32 if division overflow. */
  438.                              /* This includes division by zero!            */
  439.     q = 0;
  440.     for ( i = 0; i < 32; i++ )
  441.     {
  442.       r <<= 1;
  443.       q <<= 1;
  444.       r  |= lo >> 31;
  445.       if ( r >= (FT_UInt32)y )
  446.       {
  447.         r -= y;
  448.         q |= 1;
  449.       }
  450.       lo <<= 1;
  451.     }
  452.     return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );
  453.   }
  454. #else /* 0 */
  455.   FT_EXPORT_DEF( FT_Int32 )
  456.   FT_Div64by32( FT_Int64*  x,
  457.                 FT_Int32   y )
  458.   {
  459.     FT_Int32   s;
  460.     FT_UInt32  q;
  461.     s  = x->hi;
  462.     if ( s < 0 )
  463.     {
  464.       x->lo = (FT_UInt32)-(FT_Int32)x->lo;
  465.       x->hi = ~x->hi + !x->lo;
  466.     }
  467.     s ^= y;  y = FT_ABS( y );
  468.     /* Shortcut */
  469.     if ( x->hi == 0 )
  470.     {
  471.       if ( y > 0 )
  472.         q = ( x->lo + ( y >> 1 ) ) / y;
  473.       else
  474.         q = 0x7FFFFFFFL;
  475.       return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );
  476.     }
  477.     q = ft_div64by32( x->hi, x->lo, y );
  478.     return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );
  479.   }
  480. #endif /* 0 */
  481. #endif /* 0 */
  482. #endif /* FT_LONG64 */
  483.   /* documentation is in ftcalc.h */
  484.   FT_BASE_DEF( FT_Int32 )
  485.   FT_SqrtFixed( FT_Int32  x )
  486.   {
  487.     FT_UInt32  root, rem_hi, rem_lo, test_div;
  488.     FT_Int     count;
  489.     root = 0;
  490.     if ( x > 0 )
  491.     {
  492.       rem_hi = 0;
  493.       rem_lo = x;
  494.       count  = 24;
  495.       do
  496.       {
  497.         rem_hi   = ( rem_hi << 2 ) | ( rem_lo >> 30 );
  498.         rem_lo <<= 2;
  499.         root   <<= 1;
  500.         test_div = ( root << 1 ) + 1;
  501.         if ( rem_hi >= test_div )
  502.         {
  503.           rem_hi -= test_div;
  504.           root   += 1;
  505.         }
  506.       } while ( --count );
  507.     }
  508.     return (FT_Int32)root;
  509.   }
  510.   /* documentation is in ftcalc.h */
  511.   FT_BASE_DEF( FT_Int )
  512.   ft_corner_orientation( FT_Pos  in_x,
  513.                          FT_Pos  in_y,
  514.                          FT_Pos  out_x,
  515.                          FT_Pos  out_y )
  516.   {
  517.     FT_Int  result;
  518.     /* deal with the trivial cases quickly */
  519.     if ( in_y == 0 )
  520.     {
  521.       if ( in_x >= 0 )
  522.         result = out_y;
  523.       else
  524.         result = -out_y;
  525.     }
  526.     else if ( in_x == 0 )
  527.     {
  528.       if ( in_y >= 0 )
  529.         result = -out_x;
  530.       else
  531.         result = out_x;
  532.     }
  533.     else if ( out_y == 0 )
  534.     {
  535.       if ( out_x >= 0 )
  536.         result = in_y;
  537.       else
  538.         result = -in_y;
  539.     }
  540.     else if ( out_x == 0 )
  541.     {
  542.       if ( out_y >= 0 )
  543.         result = -in_x;
  544.       else
  545.         result =  in_x;
  546.     }
  547.     else /* general case */
  548.     {
  549. #ifdef FT_LONG64
  550.       FT_Int64  delta = (FT_Int64)in_x * out_y - (FT_Int64)in_y * out_x;
  551.       if ( delta == 0 )
  552.         result = 0;
  553.       else
  554.         result = 1 - 2 * ( delta < 0 );
  555. #else
  556.       FT_Int64  z1, z2;
  557.       ft_multo64( in_x, out_y, &z1 );
  558.       ft_multo64( in_y, out_x, &z2 );
  559.       if ( z1.hi > z2.hi )
  560.         result = +1;
  561.       else if ( z1.hi < z2.hi )
  562.         result = -1;
  563.       else if ( z1.lo > z2.lo )
  564.         result = +1;
  565.       else if ( z1.lo < z2.lo )
  566.         result = -1;
  567.       else
  568.         result = 0;
  569. #endif
  570.     }
  571.     return result;
  572.   }
  573.   /* documentation is in ftcalc.h */
  574.   FT_BASE_DEF( FT_Int )
  575.   ft_corner_is_flat( FT_Pos  in_x,
  576.                      FT_Pos  in_y,
  577.                      FT_Pos  out_x,
  578.                      FT_Pos  out_y )
  579.   {
  580.     FT_Pos  ax = in_x;
  581.     FT_Pos  ay = in_y;
  582.     FT_Pos  d_in, d_out, d_corner;
  583.     if ( ax < 0 )
  584.       ax = -ax;
  585.     if ( ay < 0 )
  586.       ay = -ay;
  587.     d_in = ax + ay;
  588.     ax = out_x;
  589.     if ( ax < 0 )
  590.       ax = -ax;
  591.     ay = out_y;
  592.     if ( ay < 0 )
  593.       ay = -ay;
  594.     d_out = ax + ay;
  595.     ax = out_x + in_x;
  596.     if ( ax < 0 )
  597.       ax = -ax;
  598.     ay = out_y + in_y;
  599.     if ( ay < 0 )
  600.       ay = -ay;
  601.     d_corner = ax + ay;
  602.     return ( d_in + d_out - d_corner ) < ( d_corner >> 4 );
  603.   }
  604. /* END */