Exemplo n.º 1
0
// Subtract rectangle from q
void paint_q_sub( rect_t *r )
{
    pqel_t *pqel;

    ASSERT_LOCKED_MUTEX( &rect_list_lock );

again:
    queue_iterate( &rect_list, pqel, pqel_t *, chain )
    {

        // r includes qe - delete qe
        if( rect_includes( r, &pqel->r ) )
        {
            queue_remove( &rect_list, pqel, pqel_t *, chain );
            goto again;
        }

        // r intersects w qe - divide in two
        if( rect_intersects( r, &pqel->r ) )
        {
            rect_t out1, out2;

            rect_sub( &out1, &out2, r, &pqel->r );

            if( !rect_empty( &out1 ) )
            {
                pqel_t *new1 = mkel( &out1 );  if( !new1 ) return;
                queue_enter(&rect_list, new1, pqel_t *, chain);
            }
Exemplo n.º 2
0
int do_test_rectangles(const char *test_parm)
{
    (void) test_parm;

    rect_t out1, out2, oldw, neww;

    oldw.x = 1;
    oldw.y = 1;
    oldw.xsize = 10;
    oldw.ysize = 10;

    neww.x = 2;
    neww.y = 2;
    neww.xsize = 10;
    neww.ysize = 10;

    //int o2 =
    rect_sub( &out1, &out2, &oldw, &neww );

    //rect_dump( &out1 );
    //rect_dump( &out2 );

    test_check_eq(out1.x,1);
    test_check_eq(out1.y,1);
    test_check_eq(out1.xsize,1);
    test_check_eq(out1.ysize,10);

    test_check_eq(out2.x,1);
    test_check_eq(out2.y,1);
    test_check_eq(out2.xsize,10);
    test_check_eq(out2.ysize,1);

    rect_t a, b;

    a.x     = 10; a.y     = 10;
    a.xsize = 10; a.ysize = 10;

    b.x     = 15; b.y     = 15;
    b.xsize = 10; b.ysize = 10;

    test_check_false( rect_includes( &a, &b ) );
    test_check_true( rect_intersects( &a, &b ) );

    b.xsize = 2;  b.ysize = 2;

    test_check_true( rect_includes( &a, &b ) );
    test_check_true( rect_intersects( &a, &b ) );

    b.x     = 35; b.y     = 35;

    test_check_false( rect_includes( &a, &b ) );
    test_check_false( rect_intersects( &a, &b ) );

    return 0;
}