tests/color-icc-output: compare_float() to rgb_diff_stat

compare_float() was an ad hoc max error logger with optional debug
logging.

Now that we have rgb_diff_stat, we can get the same statistics and more
with less code. It looks like we would lose the pixel index x, but that
can be recovered from the dump file line number.

This patch takes care to keep the test condition exactly the same as it
was before. The statistics print-out has more details now.

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
dev
Pekka Paalanen 2 years ago committed by Pekka Paalanen
parent baf7ab5795
commit 3acb1c4793
  1. 87
      tests/color-icc-output-test.c

@ -27,6 +27,7 @@
#include <math.h> #include <math.h>
#include <string.h> #include <string.h>
#include <stdio.h>
#include <linux/limits.h> #include <linux/limits.h>
#include <lcms2.h> #include <lcms2.h>
@ -513,67 +514,32 @@ gen_ramp_rgb(pixman_image_t *image, int bitwidth, int width_bar)
} }
static bool static bool
compare_float(float ref, float dst, int x, const char *chan, process_pipeline_comparison(const struct buffer *src_buf,
float *max_diff, float max_allow_diff) const struct buffer *shot_buf,
const struct setup_args * arg)
{ {
FILE *dump = NULL;
#if 0 #if 0
/* /*
* This file can be loaded in Octave for visualization. * This file can be loaded in Octave for visualization. Find the script
* * in tests/visualization/weston_plot_rgb_diff_stat.m and call it with
* S = load('compare_float_dump.txt');
* *
* rvec = S(S(:,1)==114, 2:3); * weston_plot_rgb_diff_stat('opaque_pixel_conversion-f05-dump.txt')
* gvec = S(S(:,1)==103, 2:3);
* bvec = S(S(:,1)==98, 2:3);
*
* figure
* subplot(3, 1, 1);
* plot(rvec(:,1), rvec(:,2) .* 255, 'r');
* subplot(3, 1, 2);
* plot(gvec(:,1), gvec(:,2) .* 255, 'g');
* subplot(3, 1, 3);
* plot(bvec(:,1), bvec(:,2) .* 255, 'b');
*/ */
static FILE *fp = NULL; dump = fopen_dump_file("dump");
if (!fp)
fp = fopen("compare_float_dump.txt", "w");
fprintf(fp, "%d %d %f\n", chan[0], x, dst - ref);
fflush(fp);
#endif #endif
float diff = fabsf(ref - dst);
if (diff > *max_diff)
*max_diff = diff;
if (diff <= max_allow_diff)
return true;
testlog("x=%d %s: ref %f != dst %f, delta %f\n",
x, chan, ref, dst, dst - ref);
return false;
}
static bool
process_pipeline_comparison(const struct buffer *src_buf,
const struct buffer *shot_buf,
const struct setup_args * arg)
{
const char *const chan_name[COLOR_CHAN_NUM] = { "r", "g", "b" };
const float max_pixel_value = 255.0; const float max_pixel_value = 255.0;
struct color_float max_diff_pipeline = { .rgb = { 0.0f, 0.0f, 0.0f } };
float max_allow_diff = arg->tolerance / max_pixel_value; float max_allow_diff = arg->tolerance / max_pixel_value;
float max_err = 0.0f;
bool ok = true; bool ok = true;
struct image_header ih_src = image_header_from(src_buf->image); struct image_header ih_src = image_header_from(src_buf->image);
struct image_header ih_shot = image_header_from(shot_buf->image); struct image_header ih_shot = image_header_from(shot_buf->image);
int y, x; int y, x;
int chan; unsigned i;
struct color_float pix_src; struct color_float pix_src;
struct color_float pix_src_pipeline; struct color_float pix_src_pipeline;
struct color_float pix_shot; struct color_float pix_shot;
struct rgb_diff_stat diffstat = { .dump = dump };
/* no point to compare different images */ /* no point to compare different images */
assert(ih_src.width == ih_shot.width); assert(ih_src.width == ih_shot.width);
@ -586,33 +552,34 @@ process_pipeline_comparison(const struct buffer *src_buf,
for (x = 0; x < ih_src.width; x++) { for (x = 0; x < ih_src.width; x++) {
pix_src = a8r8g8b8_to_float(row_ptr[x]); pix_src = a8r8g8b8_to_float(row_ptr[x]);
pix_shot = a8r8g8b8_to_float(row_ptr_shot[x]); pix_shot = a8r8g8b8_to_float(row_ptr_shot[x]);
/* do pipeline processing */
process_pixel_using_pipeline(arg->pipeline->pre_fn, process_pixel_using_pipeline(arg->pipeline->pre_fn,
&arg->pipeline->mat, &arg->pipeline->mat,
arg->pipeline->post_fn, arg->pipeline->post_fn,
&pix_src, &pix_src_pipeline); &pix_src, &pix_src_pipeline);
/* check if pipeline matches to shader variant */ rgb_diff_stat_update(&diffstat,
for (chan = 0; chan < COLOR_CHAN_NUM; chan++) { &pix_src_pipeline, &pix_shot,
ok &= compare_float(pix_src_pipeline.rgb[chan], &pix_src);
pix_shot.rgb[chan],
x, chan_name[chan],
&max_diff_pipeline.rgb[chan],
max_allow_diff);
}
} }
} }
for (chan = 0; chan < COLOR_CHAN_NUM; chan++) for (i = 0; i < COLOR_CHAN_NUM; i++) {
max_err = MAX(max_err, max_diff_pipeline.rgb[chan]); if (diffstat.rgb[i].min < -max_allow_diff ||
diffstat.rgb[i].max > max_allow_diff)
ok = false;
}
testlog("%s %s %s tol_req %d, tol_cal %f, max diff: r=%f, g=%f, b=%f %s\n", testlog("%s %s %s tol_req %d %s\n", __func__,
__func__, ok == true? "SUCCESS":"FAILURE", ok ? "SUCCESS" : "FAILURE",
arg->meta.name, arg->tolerance, arg->meta.name, arg->tolerance,
max_err * max_pixel_value,
max_diff_pipeline.r, max_diff_pipeline.g, max_diff_pipeline.b,
arg->type == PTYPE_MATRIX_SHAPER ? "matrix-shaper" : "cLUT"); arg->type == PTYPE_MATRIX_SHAPER ? "matrix-shaper" : "cLUT");
rgb_diff_stat_print(&diffstat, __func__, 8);
if (dump)
fclose(dump);
return ok; return ok;
} }

Loading…
Cancel
Save