2022-10-14 10:03:35 +02:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stdint.h>
|
2023-07-06 12:06:36 +02:00
|
|
|
#include <assert.h>
|
2022-10-14 10:03:35 +02:00
|
|
|
|
|
|
|
#include <libdisplay-info/info.h>
|
|
|
|
|
|
|
|
static const char *
|
|
|
|
str_or_null(const char *str)
|
|
|
|
{
|
|
|
|
return str ? str : "{null}";
|
|
|
|
}
|
|
|
|
|
2023-07-06 12:06:36 +02:00
|
|
|
static void
|
|
|
|
print_chromaticity(const char *prefix, const struct di_chromaticity_cie1931 *c)
|
|
|
|
{
|
|
|
|
printf("%s: %.3f, %.3f\n", prefix, c->x, c->y);
|
|
|
|
}
|
|
|
|
|
2022-10-14 10:03:35 +02:00
|
|
|
static void
|
|
|
|
print_info(const struct di_info *info)
|
|
|
|
{
|
2023-07-06 12:06:36 +02:00
|
|
|
const struct di_color_primaries *primaries;
|
2022-10-14 10:03:35 +02:00
|
|
|
char *str;
|
|
|
|
|
|
|
|
str = di_info_get_make(info);
|
|
|
|
printf("make: %s\n", str_or_null(str));
|
|
|
|
free(str);
|
|
|
|
|
|
|
|
str = di_info_get_model(info);
|
|
|
|
printf("model: %s\n", str_or_null(str));
|
|
|
|
free(str);
|
|
|
|
|
|
|
|
str = di_info_get_serial(info);
|
|
|
|
printf("serial: %s\n", str_or_null(str));
|
|
|
|
free(str);
|
2023-07-06 12:06:36 +02:00
|
|
|
|
|
|
|
primaries = di_info_get_default_color_primaries(info);
|
|
|
|
assert(primaries);
|
|
|
|
printf("default color primaries:\n");
|
|
|
|
print_chromaticity(" red", &primaries->primary[0]);
|
|
|
|
print_chromaticity(" green", &primaries->primary[1]);
|
|
|
|
print_chromaticity(" blue", &primaries->primary[2]);
|
|
|
|
print_chromaticity("default white", &primaries->default_white);
|
2022-10-14 10:03:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
main(int argc, char *argv[])
|
|
|
|
{
|
|
|
|
FILE *in;
|
|
|
|
static uint8_t raw[32 * 1024];
|
|
|
|
size_t size = 0;
|
|
|
|
struct di_info *info;
|
|
|
|
|
|
|
|
in = stdin;
|
|
|
|
if (argc > 1) {
|
|
|
|
in = fopen(argv[1], "r");
|
|
|
|
if (!in) {
|
|
|
|
perror("failed to open input file");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
while (!feof(in)) {
|
|
|
|
size += fread(&raw[size], 1, sizeof(raw) - size, in);
|
|
|
|
if (ferror(in)) {
|
|
|
|
perror("fread failed");
|
|
|
|
return 1;
|
|
|
|
} else if (size >= sizeof(raw)) {
|
|
|
|
fprintf(stderr, "input too large\n");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fclose(in);
|
|
|
|
|
|
|
|
info = di_info_parse_edid(raw, size);
|
|
|
|
if (!info) {
|
|
|
|
perror("di_edid_parse failed");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
print_info(info);
|
|
|
|
di_info_destroy(info);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|