NATRON_NAMESPACE_USING TEST(BitmapTest, SimpleRect) { RectI rod(0, 0, 100, 100); Bitmap bm(rod); ///assert that the union of all the non rendered rects is the rod std::list<RectI> nonRenderedRects; bm.minimalNonMarkedRects(rod, nonRenderedRects); RectI nonRenderedRectsUnion; for (std::list<RectI>::iterator it = nonRenderedRects.begin(); it != nonRenderedRects.end(); ++it) { nonRenderedRectsUnion.merge(*it); } ASSERT_TRUE(rod == nonRenderedRectsUnion); ///assert that the "underlying" bitmap is clean const char* map = bm.getBitmap(); ASSERT_TRUE( !memchr( map, 1, rod.area() ) ); RectI halfRoD(0, 0, 100, 50); bm.markForRendered(halfRoD); ///assert that non of the rendered rects interesect the non rendered half RectI nonRenderedHalf(0, 50, 100, 100); bm.minimalNonMarkedRects(rod, nonRenderedRects); for (std::list<RectI>::iterator it = nonRenderedRects.begin(); it != nonRenderedRects.end(); ++it) { ASSERT_TRUE( (*it).intersects(nonRenderedHalf) ); } ///assert that the underlying bitmap is marked as expected const char* start = map; ///check that there are only ones in the rendered half ASSERT_TRUE( !memchr( start, 0, halfRoD.area() ) ); ///check that there are only 0s in the non rendered half start = map + halfRoD.area(); ASSERT_TRUE( !memchr( start, 1, halfRoD.area() ) ); ///mark for renderer the other half of the rod bm.markForRendered(nonRenderedHalf); ///assert that the bm is rendered totally nonRenderedRects.clear(); bm.minimalNonMarkedRects(rod, nonRenderedRects); ASSERT_TRUE( nonRenderedRects.empty() ); ASSERT_TRUE( !memchr( map, 0, rod.area() ) ); ///More complex example where A,B,C,D are not rendered check that both trimap & bitmap yield the same result // BBBBBBBBBBBBBB // BBBBBBBBBBBBBB // CXXXXXXXXXXDDD // CXXXXXXXXXXDDD // CXXXXXXXXXXDDD // CXXXXXXXXXXDDD // AAAAAAAAAAAAAA bm.clear(rod); RectI xBox(20, 20, 80, 80); bm.markForRendered(xBox); nonRenderedRects.clear(); bm.minimalNonMarkedRects(rod, nonRenderedRects); EXPECT_TRUE(nonRenderedRects.size() == 4); nonRenderedRects.clear(); bool beingRenderedElseWhere = false; bm.minimalNonMarkedRects_trimap(rod, nonRenderedRects, &beingRenderedElseWhere); EXPECT_TRUE(nonRenderedRects.size() == 4); ASSERT_TRUE(beingRenderedElseWhere == false); nonRenderedRects.clear(); //Mark the A rectangle as being rendered RectI aBox(0, 0, 20, 20); bm.markForRendering(aBox); bm.minimalNonMarkedRects_trimap(rod, nonRenderedRects, &beingRenderedElseWhere); ASSERT_TRUE(beingRenderedElseWhere == true); EXPECT_TRUE(nonRenderedRects.size() == 3); } // TEST