// 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); }
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; }