libdisplay-info/test/di-edid-print.c

88 lines
1.7 KiB
C
Raw Normal View History

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <assert.h>
#include <libdisplay-info/info.h>
static const char *
str_or_null(const char *str)
{
return str ? str : "{null}";
}
static void
print_chromaticity(const char *prefix, const struct di_chromaticity_cie1931 *c)
{
printf("%s: %.3f, %.3f\n", prefix, c->x, c->y);
}
static void
print_info(const struct di_info *info)
{
const struct di_color_primaries *primaries;
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);
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);
}
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;
}