backend/test: Add support for gamma getting/setting
The set gamma is just stored in the object, nothing else. It's initialized to a linear gamma ramp from 0 to UINT16_MAX for each color channel. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2165>
This commit is contained in:
parent
b7d3c9e3c5
commit
a232eb263f
2 changed files with 90 additions and 2 deletions
|
@ -483,12 +483,93 @@ meta_output_test_class_init (MetaOutputTestClass *klass)
|
|||
{
|
||||
}
|
||||
|
||||
static void
|
||||
meta_crtc_test_init (MetaCrtcTest *crtc_test)
|
||||
#define GAMMA_SIZE 256
|
||||
|
||||
static size_t
|
||||
meta_crtc_test_get_gamma_lut_size (MetaCrtc *crtc)
|
||||
{
|
||||
return GAMMA_SIZE;
|
||||
}
|
||||
|
||||
static MetaGammaLut *
|
||||
meta_crtc_test_get_gamma_lut (MetaCrtc *crtc)
|
||||
{
|
||||
MetaCrtcTest *crtc_test = META_CRTC_TEST (crtc);
|
||||
MetaGammaLut *lut;
|
||||
|
||||
lut = g_new0 (MetaGammaLut, 1);
|
||||
lut->size = crtc_test->gamma.size;
|
||||
lut->red = g_memdup2 (crtc_test->gamma.red,
|
||||
lut->size * sizeof (uint16_t));
|
||||
lut->green = g_memdup2 (crtc_test->gamma.green,
|
||||
lut->size * sizeof (uint16_t));
|
||||
lut->blue = g_memdup2 (crtc_test->gamma.blue,
|
||||
lut->size * sizeof (uint16_t));
|
||||
return lut;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_crtc_test_set_gamma_lut (MetaCrtc *crtc,
|
||||
const MetaGammaLut *lut)
|
||||
{
|
||||
MetaCrtcTest *crtc_test = META_CRTC_TEST (crtc);
|
||||
|
||||
g_assert_cmpint (crtc_test->gamma.size, ==, lut->size);
|
||||
|
||||
g_free (crtc_test->gamma.red);
|
||||
g_free (crtc_test->gamma.green);
|
||||
g_free (crtc_test->gamma.blue);
|
||||
|
||||
crtc_test->gamma.red = g_memdup2 (lut->red,
|
||||
sizeof (uint16_t) * lut->size);
|
||||
crtc_test->gamma.green = g_memdup2 (lut->green,
|
||||
sizeof (uint16_t) * lut->size);
|
||||
crtc_test->gamma.blue = g_memdup2 (lut->blue,
|
||||
sizeof (uint16_t) * lut->size);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_crtc_test_finalize (GObject *object)
|
||||
{
|
||||
MetaCrtcTest *crtc_test = META_CRTC_TEST (object);
|
||||
|
||||
g_free (crtc_test->gamma.red);
|
||||
g_free (crtc_test->gamma.green);
|
||||
g_free (crtc_test->gamma.blue);
|
||||
|
||||
G_OBJECT_CLASS (meta_crtc_test_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_crtc_test_class_init (MetaCrtcTestClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
MetaCrtcClass *crtc_class = META_CRTC_CLASS (klass);
|
||||
|
||||
object_class->finalize = meta_crtc_test_finalize;
|
||||
|
||||
crtc_class->get_gamma_lut_size = meta_crtc_test_get_gamma_lut_size;
|
||||
crtc_class->get_gamma_lut = meta_crtc_test_get_gamma_lut;
|
||||
crtc_class->set_gamma_lut = meta_crtc_test_set_gamma_lut;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_crtc_test_init (MetaCrtcTest *crtc_test)
|
||||
{
|
||||
int i;
|
||||
|
||||
crtc_test->gamma.size = GAMMA_SIZE;
|
||||
crtc_test->gamma.red = g_new0 (uint16_t, GAMMA_SIZE);
|
||||
crtc_test->gamma.green = g_new0 (uint16_t, GAMMA_SIZE);
|
||||
crtc_test->gamma.blue = g_new0 (uint16_t, GAMMA_SIZE);
|
||||
|
||||
for (i = 0; i < GAMMA_SIZE; i++)
|
||||
{
|
||||
uint16_t gamma;
|
||||
|
||||
gamma = ((float) i / GAMMA_SIZE) * UINT16_MAX;
|
||||
crtc_test->gamma.red[i] = gamma;
|
||||
crtc_test->gamma.green[i] = gamma;
|
||||
crtc_test->gamma.blue[i] = gamma;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -35,6 +35,13 @@ typedef struct _MetaMonitorTestSetup
|
|||
struct _MetaCrtcTest
|
||||
{
|
||||
MetaCrtc parent;
|
||||
|
||||
struct {
|
||||
size_t size;
|
||||
uint16_t *red;
|
||||
uint16_t *green;
|
||||
uint16_t *blue;
|
||||
} gamma;
|
||||
};
|
||||
|
||||
struct _MetaOutputTest
|
||||
|
|
Loading…
Reference in a new issue