static void diff_rects (Rect r1, Rect r2, int *count, Rect result[4]) { g_assert (count != NULL); g_assert (result != NULL); *count = 0; if (rects_intersect (r1, r2)) { diff_rects_guts (r1, r2, count, result); diff_rects_guts (r2, r1, count, result); } else { if (!rect_empty (&r1)) { result[(*count)++] = r1; } if (!rect_empty (&r2)) { result[(*count)++] = r2; } } }
// 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); }