Browse Source

Add new metric to VisualTests comparison report: max pixel difference

Michael Ragazzon 1 year ago
parent
commit
60d50936da

+ 3 - 0
Tests/Source/VisualTests/CaptureScreen.cpp

@@ -148,6 +148,7 @@ ComparisonResult CompareScreenToPreviousCapture(Rml::RenderInterface* render_int
 
 	const Rml::Colourb highlight_color(255, 0, 255, 255);
 	size_t sum_diff = 0;
+	size_t max_pixel_diff = 0;
 	for (int y = 0; y < (int)h_ref; y++)
 	{
 		const int y_flipped_screen = screen.height - y - 1;
@@ -170,6 +171,7 @@ ComparisonResult CompareScreenToPreviousCapture(Rml::RenderInterface* render_int
 			diff.data[i0_diff + 2] = (pixel_diff ? highlight_color[2] : screen.data[i0_screen + 2]);
 			diff.data[i0_diff + 3] = highlight_color[3];
 			sum_diff += (size_t)pixel_diff;
+			max_pixel_diff = Rml::Math::Max(max_pixel_diff, (size_t)pixel_diff);
 		}
 	}
 
@@ -178,6 +180,7 @@ ComparisonResult CompareScreenToPreviousCapture(Rml::RenderInterface* render_int
 	result.success = true;
 	result.is_equal = (sum_diff == 0);
 	result.absolute_difference_sum = sum_diff;
+	result.max_absolute_difference_single_pixel = max_pixel_diff;
 
 	const size_t max_diff = size_t(3 * 255) * size_t(w_ref) * size_t(h_ref);
 	result.similarity_score = (sum_diff == 0 ? 1.0 : 1.0 - std::log(double(sum_diff)) / std::log(double(max_diff)));

+ 2 - 1
Tests/Source/VisualTests/CaptureScreen.h

@@ -38,7 +38,8 @@ struct ComparisonResult {
 	bool success = false;
 	bool is_equal = false;
 	double similarity_score = 0;
-	std::size_t absolute_difference_sum = 0;
+	size_t absolute_difference_sum = 0;
+	size_t max_absolute_difference_single_pixel = 0;
 	Rml::String error_msg;
 };
 

+ 4 - 5
Tests/Source/VisualTests/TestNavigator.cpp

@@ -43,9 +43,7 @@
 constexpr int iteration_wait_frame_count = 2;
 
 TestNavigator::TestNavigator(Rml::RenderInterface* render_interface, Rml::Context* context, TestViewer* viewer, TestSuiteList _test_suites,
-	int start_suite, int start_case) :
-	render_interface(render_interface),
-	context(context), viewer(viewer), test_suites(std::move(_test_suites))
+	int start_suite, int start_case) : render_interface(render_interface), context(context), viewer(viewer), test_suites(std::move(_test_suites))
 {
 	RMLUI_ASSERT(context);
 	RMLUI_ASSERTMSG(!test_suites.empty(), "At least one test suite is required.");
@@ -539,11 +537,12 @@ void TestNavigator::StopTestSuiteIteration()
 		log += "\n\nNot Equal:\n";
 
 		if (!not_equal.empty())
-			log += "Percentages are similarity scores.\n\n";
+			log += "    #   similarity scores (%)   max pixel difference   filename\n\n";
 		for (int i : not_equal)
 		{
 			suite.SetIndex(i);
-			log += Rml::CreateString(512, "%5d   %5.1f%%   %s\n", i + 1, comparison_results[i].similarity_score * 100.0, suite.GetFilename().c_str());
+			log += Rml::CreateString(512, "%5d   %5.1f%%  %4d   %s\n", i + 1, comparison_results[i].similarity_score * 100.0,
+				(int)comparison_results[i].max_absolute_difference_single_pixel, suite.GetFilename().c_str());
 			if (!comparison_results[i].error_msg.empty())
 				log += "          " + comparison_results[i].error_msg + "\n";
 		}