mirror of
https://gitlab.freedesktop.org/wayland/weston.git
synced 2025-12-20 03:30:19 +01:00
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:
parent
3fefb5ba44
commit
adfe772db2
5 changed files with 25 additions and 102 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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().
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue