EDID: Catch monitors that encode aspect ratio for physical size.
This is not legal in either EDID 1.3 or 1.4, but hey, when did a little thing like legality stop anyone.
This commit is contained in:
parent
956a4ba40b
commit
0660dd9d70
|
@ -85,6 +85,47 @@ handle_edid_quirks(xf86MonPtr m)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* some monitors encode the aspect ratio instead of the physical size.
|
||||
* try to find the largest detailed timing that matches that aspect
|
||||
* ratio and use that to fill in the feature section.
|
||||
*/
|
||||
if ((m->features.hsize == 16 && m->features.vsize == 9) ||
|
||||
(m->features.hsize == 16 && m->features.vsize == 10) ||
|
||||
(m->features.hsize == 4 && m->features.vsize == 3) ||
|
||||
(m->features.hsize == 5 && m->features.vsize == 4)) {
|
||||
int real_hsize = 0, real_vsize = 0;
|
||||
float target_aspect, timing_aspect;
|
||||
|
||||
target_aspect = (float)m->features.hsize / (float)m->features.vsize;
|
||||
for (i = 0; i < 4; i++) {
|
||||
if (m->det_mon[i].type == DT) {
|
||||
struct detailed_timings *timing;
|
||||
timing = &m->det_mon[i].section.d_timings;
|
||||
|
||||
if (!timing->v_size)
|
||||
continue;
|
||||
|
||||
timing_aspect = (float)timing->h_size / (float)timing->v_size;
|
||||
if (fabs(1 - (timing_aspect / target_aspect)) < 0.05) {
|
||||
real_hsize = max(real_hsize, timing->h_size);
|
||||
real_vsize = max(real_vsize, timing->v_size);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (real_hsize && real_vsize) {
|
||||
/* convert mm to cm */
|
||||
m->features.hsize = (real_hsize + 5) / 10;
|
||||
m->features.vsize = (real_vsize + 5) / 10;
|
||||
} else {
|
||||
m->features.hsize = m->features.vsize = 0;
|
||||
}
|
||||
|
||||
xf86Msg(X_INFO, "Quirked EDID physical size to %dx%d cm\n",
|
||||
m->features.hsize, m->features.vsize);
|
||||
}
|
||||
}
|
||||
|
||||
xf86MonPtr
|
||||
|
|
Loading…
Reference in New Issue
Block a user