static int orig_intersect(uint8_t x1, uint8_t y1,  /* First line segment */
                          uint8_t x2, uint8_t y2,
                          uint8_t x3, uint8_t y3,   /* Second line segment */
                          uint8_t x4, uint8_t y4) {
    int16_t b1, b2;
    int32_t a1, a2, c1, c2; /* Coefficients of line eqns. */
    int32_t r1, r2, r3, r4;         /* 'Sign' values */
    int32_t denom;     /* Intermediate values */

#define SAME_SIGNS( a, b ) (((a)^(b)) >= 0)

//#define SAME_SIGNS( a, b )                                        \
//		(((long) ((unsigned long) a ^ (unsigned long) b)) >= 0 )

    /* Compute a1, b1, c1, where line joining points 1 and 2
     * is "a1 x  +  b1 y  +  c1  =  0".
     */

    a1 = y2 - y1;
    b1 = x1 - x2;
    c1 = x2 * y1 - x1 * y2;

    /* Compute r3 and r4. */

    r3 = a1 * x3 + b1 * y3 + c1;
    r4 = a1 * x4 + b1 * y4 + c1;

    /* Check signs of r3 and r4.  If both point 3 and point 4 lie on
     * same side of line 1, the line segments do not intersect.
     */

    if ( r3 != 0 &&
         r4 != 0 &&
         SAME_SIGNS( r3, r4 ))
        return ( DONT_INTERSECT );

    /* Compute a2, b2, c2 */

    a2 = y4 - y3;
    b2 = x3 - x4;
    c2 = x4 * y3 - x3 * y4;

    /* Compute r1 and r2 */

    r1 = a2 * x1 + b2 * y1 + c2;
    r2 = a2 * x2 + b2 * y2 + c2;

    /* Check signs of r1 and r2.  If both point 1 and point 2 lie
     * on same side of second line segment, the line segments do
     * not intersect.
     */

    if ( r1 != 0 &&
         r2 != 0 &&
         SAME_SIGNS( r1, r2 ))
        return ( DONT_INTERSECT );

    /* Line segments intersect: compute intersection point. */

    denom = a1 * b2 - a2 * b1;
    if ( denom == 0 )
        return ( COLLINEAR );

    return ( DO_INTERSECT ); /* lines_intersect */
#undef SAME_SIGNS
}
