tests: replace lcmsMAT3 with weston_mat3f

Replace an ad hoc 3x3 matrix, that was supposed to match LittleCMS matrix
but did not, with our new consistent weston_mat3f API.

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
This commit is contained in:
Pekka Paalanen 2025-03-25 14:08:53 +02:00
parent 3fefb5ba44
commit adfe772db2
5 changed files with 25 additions and 102 deletions

View file

@ -27,6 +27,7 @@
#include "config.h" #include "config.h"
#include <lcms2.h> #include <lcms2.h>
#include <libweston/linalg-3.h>
#include "weston-test-client-helper.h" #include "weston-test-client-helper.h"
#include "weston-test-assert.h" #include "weston-test-assert.h"
@ -57,9 +58,7 @@ const struct lcms_pipeline pipeline_sRGB = {
.Blue = { 0.150, 0.060, 1.0 } .Blue = { 0.150, 0.060, 1.0 }
}, },
.pre_fn = TRANSFER_FN_SRGB_EOTF, .pre_fn = TRANSFER_FN_SRGB_EOTF,
.mat = LCMSMAT3(1.0, 0.0, 0.0, .mat = WESTON_MAT3F_IDENTITY,
0.0, 1.0, 0.0,
0.0, 0.0, 1.0),
.post_fn = TRANSFER_FN_SRGB_EOTF_INVERSE .post_fn = TRANSFER_FN_SRGB_EOTF_INVERSE
}; };
@ -71,7 +70,8 @@ const struct lcms_pipeline pipeline_adobeRGB = {
.Blue = { 0.150, 0.060, 1.0 } .Blue = { 0.150, 0.060, 1.0 }
}, },
.pre_fn = TRANSFER_FN_SRGB_EOTF, .pre_fn = TRANSFER_FN_SRGB_EOTF,
.mat = LCMSMAT3( 0.715127, 0.284868, 0.000005, .mat = WESTON_MAT3F(
0.715127, 0.284868, 0.000005,
0.000001, 0.999995, 0.000004, 0.000001, 0.999995, 0.000004,
-0.000003, 0.041155, 0.958848), -0.000003, 0.041155, 0.958848),
.post_fn = TRANSFER_FN_ADOBE_RGB_EOTF_INVERSE .post_fn = TRANSFER_FN_ADOBE_RGB_EOTF_INVERSE
@ -85,7 +85,8 @@ const struct lcms_pipeline pipeline_BT2020 = {
.Blue = { 0.131, 0.046, 1.0 } .Blue = { 0.131, 0.046, 1.0 }
}, },
.pre_fn = TRANSFER_FN_SRGB_EOTF, .pre_fn = TRANSFER_FN_SRGB_EOTF,
.mat = LCMSMAT3(0.627402, 0.329292, 0.043306, .mat = WESTON_MAT3F(
0.627402, 0.329292, 0.043306,
0.069095, 0.919544, 0.011360, 0.069095, 0.919544, 0.011360,
0.016394, 0.088028, 0.895578), 0.016394, 0.088028, 0.895578),
/* this is equivalent to BT.1886 with zero black level */ /* this is equivalent to BT.1886 with zero black level */
@ -354,7 +355,7 @@ process_pipeline_comparison(const struct buffer *src_buf,
pix_shot = a8r8g8b8_to_float(row_ptr_shot[x]); pix_shot = a8r8g8b8_to_float(row_ptr_shot[x]);
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,
arg->vcgt_exponents, arg->vcgt_exponents,
&pix_src, &pix_src_pipeline); &pix_src, &pix_src_pipeline);
@ -437,7 +438,7 @@ convert_to_blending_space(const struct lcms_pipeline *pip,
* or simply output space without the non-linear encoding * or simply output space without the non-linear encoding
*/ */
cf = color_float_apply_curve(pip->pre_fn, cf); cf = color_float_apply_curve(pip->pre_fn, cf);
return color_float_apply_matrix(&pip->mat, cf); return color_float_apply_matrix(pip->mat, cf);
} }
static void static void

View file

@ -25,6 +25,8 @@
#include "config.h" #include "config.h"
#include <libweston/linalg-3.h>
#include "color-properties.h" #include "color-properties.h"
#include "weston-test-client-helper.h" #include "weston-test-client-helper.h"
#include "weston-test-fixture-compositor.h" #include "weston-test-fixture-compositor.h"
@ -60,9 +62,7 @@ const struct lcms_pipeline pipeline_sRGB = {
.Blue = { 0.150, 0.060, 1.0 } .Blue = { 0.150, 0.060, 1.0 }
}, },
.pre_fn = TRANSFER_FN_SRGB_EOTF, .pre_fn = TRANSFER_FN_SRGB_EOTF,
.mat = LCMSMAT3(1.0, 0.0, 0.0, .mat = WESTON_MAT3F_IDENTITY,
0.0, 1.0, 0.0,
0.0, 0.0, 1.0),
.post_fn = TRANSFER_FN_SRGB_EOTF_INVERSE .post_fn = TRANSFER_FN_SRGB_EOTF_INVERSE
}; };

View file

@ -32,7 +32,7 @@
#include <string.h> #include <string.h>
#include <stddef.h> #include <stddef.h>
#include <libweston/matrix.h> #include <libweston/linalg-3.h>
#include "color_util.h" #include "color_util.h"
#include "weston-test-runner.h" #include "weston-test-runner.h"
#include "weston-test-assert.h" #include "weston-test-assert.h"
@ -303,23 +303,14 @@ color_float_unpremult(struct color_float in)
* Returns the result of the matrix-vector multiplication mat * c. * Returns the result of the matrix-vector multiplication mat * c.
*/ */
struct color_float struct color_float
color_float_apply_matrix(const struct lcmsMAT3 *mat, struct color_float c) color_float_apply_matrix(struct weston_mat3f mat, struct color_float c)
{ {
struct color_float result; struct weston_vec3f v = weston_m3f_mul_v3f(mat, WESTON_VEC3F(c.r, c.g, c.b));
unsigned i, j;
/* return (struct color_float){
* The matrix has an array of columns, hence i indexes to rows and .rgb = { v.r, v.g, v.b },
* j indexes to columns. .a = c.a,
*/ };
for (i = 0; i < 3; i++) {
result.rgb[i] = 0.0f;
for (j = 0; j < 3; j++)
result.rgb[i] += mat->v[j].n[i] * c.rgb[j];
}
result.a = c.a;
return result;
} }
bool bool
@ -336,7 +327,7 @@ should_include_vcgt(const double vcgt_exponents[COLOR_CHAN_NUM])
void void
process_pixel_using_pipeline(enum transfer_fn pre_curve, process_pixel_using_pipeline(enum transfer_fn pre_curve,
const struct lcmsMAT3 *mat, struct weston_mat3f mat,
enum transfer_fn post_curve, enum transfer_fn post_curve,
const double vcgt_exponents[COLOR_CHAN_NUM], const double vcgt_exponents[COLOR_CHAN_NUM],
const struct color_float *in, const struct color_float *in,
@ -356,44 +347,6 @@ process_pixel_using_pipeline(enum transfer_fn pre_curve,
*out = cf; *out = cf;
} }
static void
weston_matrix_from_lcmsMAT3(struct weston_matrix *w, const struct lcmsMAT3 *m)
{
unsigned r, c;
/* column-major */
weston_matrix_init(w);
for (c = 0; c < 3; c++) {
for (r = 0; r < 3; r++)
w->M.col[c].el[r] = m->v[c].n[r];
}
}
static void
lcmsMAT3_from_weston_matrix(struct lcmsMAT3 *m, const struct weston_matrix *w)
{
unsigned r, c;
for (c = 0; c < 3; c++) {
for (r = 0; r < 3; r++)
m->v[c].n[r] = w->M.col[c].el[r];
}
}
void
lcmsMAT3_invert(struct lcmsMAT3 *result, const struct lcmsMAT3 *mat)
{
struct weston_matrix inv;
struct weston_matrix w;
int ret;
weston_matrix_from_lcmsMAT3(&w, mat);
ret = weston_matrix_invert(&inv, &w);
test_assert_int_eq(ret, 0);
lcmsMAT3_from_weston_matrix(result, &inv);
}
/** Update scalar statistics /** Update scalar statistics
* *
* \param stat The statistics structure to update. * \param stat The statistics structure to update.

View file

@ -30,6 +30,8 @@
#include <stdbool.h> #include <stdbool.h>
#include <stdio.h> #include <stdio.h>
#include <libweston/linalg-types.h>
enum color_chan_index { enum color_chan_index {
COLOR_CHAN_R = 0, COLOR_CHAN_R = 0,
COLOR_CHAN_G, COLOR_CHAN_G,
@ -48,19 +50,6 @@ struct color_float {
float a; float a;
}; };
/* column vector */
struct lcmsVEC3 {
float n[3];
};
/*
* While LittleCMS' cmsMAT3 is row-major, this here is colum-major.
*/
struct lcmsMAT3 {
/* array of columns */
struct lcmsVEC3 v[3];
};
enum transfer_fn { enum transfer_fn {
TRANSFER_FN_IDENTITY, TRANSFER_FN_IDENTITY,
TRANSFER_FN_SRGB_EOTF, TRANSFER_FN_SRGB_EOTF,
@ -71,24 +60,6 @@ enum transfer_fn {
TRANSFER_FN_POWER2_4_EOTF_INVERSE, TRANSFER_FN_POWER2_4_EOTF_INVERSE,
}; };
/*
* A helper to lay out a matrix in the natural writing order in code
* instead of needing to transpose in your mind every time you read it.
* The matrix is laid out as written:
* a11 a12 a13
* a21 a22 a23
* a31 a32 a33
* where the first digit is row and the second digit is column.
*/
#define LCMSMAT3(a11, a12, a13, \
a21, a22, a23, \
a31, a32, a33) ((struct lcmsMAT3) \
{ /* Each vector is a column => looks like a transpose */ \
.v[0] = { .n = { a11, a21, a31} }, \
.v[1] = { .n = { a12, a22, a32} }, \
.v[2] = { .n = { a13, a23, a33} }, \
})
void void
sRGB_linearize(struct color_float *cf); sRGB_linearize(struct color_float *cf);
@ -109,7 +80,7 @@ should_include_vcgt(const double vcgt_exponents[COLOR_CHAN_NUM]);
void void
process_pixel_using_pipeline(enum transfer_fn pre_curve, process_pixel_using_pipeline(enum transfer_fn pre_curve,
const struct lcmsMAT3 *mat, struct weston_mat3f mat,
enum transfer_fn post_curve, enum transfer_fn post_curve,
const double vcgt_exponents[COLOR_CHAN_NUM], const double vcgt_exponents[COLOR_CHAN_NUM],
const struct color_float *in, const struct color_float *in,
@ -122,7 +93,7 @@ struct color_float
color_float_apply_curve(enum transfer_fn fn, struct color_float c); color_float_apply_curve(enum transfer_fn fn, struct color_float c);
struct color_float struct color_float
color_float_apply_matrix(const struct lcmsMAT3 *mat, struct color_float c); color_float_apply_matrix(struct weston_mat3f mat, struct color_float c);
enum transfer_fn enum transfer_fn
transfer_fn_invert(enum transfer_fn fn); transfer_fn_invert(enum transfer_fn fn);
@ -130,9 +101,6 @@ transfer_fn_invert(enum transfer_fn fn);
const char * const char *
transfer_fn_name(enum transfer_fn fn); transfer_fn_name(enum transfer_fn fn);
void
lcmsMAT3_invert(struct lcmsMAT3 *result, const struct lcmsMAT3 *mat);
/** Scalar statistics /** Scalar statistics
* *
* See scalar_stat_update(). * See scalar_stat_update().

View file

@ -26,6 +26,7 @@
#pragma once #pragma once
#include <lcms2.h> #include <lcms2.h>
#include <libweston/linalg-types.h>
#include "color_util.h" #include "color_util.h"
@ -46,7 +47,7 @@ struct lcms_pipeline {
/** /**
* Transform matrix from sRGB to target chromaticities in prim_output * Transform matrix from sRGB to target chromaticities in prim_output
*/ */
struct lcmsMAT3 mat; struct weston_mat3f mat;
/** /**
* tone curve enum * tone curve enum
*/ */