int main (int argc, char *argv[]) { struct videomode m; if (argc != 4) { printf("usage: %s x y refresh\n", argv[0]); exit(1); } vesagtf_mode(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), &m); print_xf86_mode(&m); return 0; }
static int edid_std_timing(uint8_t *data, struct videomode *vmp) { unsigned x, y, f; const struct videomode *lookup; char name[80]; if ((data[0] == 1 && data[1] == 1) || (data[0] == 0 && data[1] == 0) || (data[0] == 0x20 && data[1] == 0x20)) return 0; x = EDID_STD_TIMING_HRES(data); switch (EDID_STD_TIMING_RATIO(data)) { case EDID_STD_TIMING_RATIO_16_10: y = x * 10 / 16; break; case EDID_STD_TIMING_RATIO_4_3: y = x * 3 / 4; break; case EDID_STD_TIMING_RATIO_5_4: y = x * 4 / 5; break; case EDID_STD_TIMING_RATIO_16_9: default: y = x * 9 / 16; break; } f = EDID_STD_TIMING_VFREQ(data); /* first try to lookup the mode as a DMT timing */ snprintf(name, sizeof(name), "%dx%dx%d", x, y, f); if ((lookup = edid_mode_lookup_list(name)) != NULL) { *vmp = *lookup; } else { /* failing that, calculate it using gtf */ /* * Hmm. I'm not using alternate GTF timings, which * could, in theory, be present. */ vesagtf_mode(x, y, f, vmp); } return 1; }