summaryrefslogtreecommitdiff
path: root/src/rhd_edid.c
diff options
context:
space:
mode:
authorLuc Verhaegen <libv@skynet.be>2007-12-05 21:00:33 +0100
committerLuc Verhaegen <libv@skynet.be>2007-12-05 21:00:33 +0100
commit29af4f3dcfc6756f9f82691c0b65c1eb0a82f5f7 (patch)
treef76a7dcf83394a458175dde2df9f1566748b6060 /src/rhd_edid.c
parent732dea0e3545485e758a4e49ea014b3f1a8d73ba (diff)
Modes: Add DPI calculation.
This adds code to provide useful DPI calculation. It follows a server argument, or uses the newly introduced option forcedpi, or tries to average out the DPI of the various monitors. This is of course a stopgap solution, as no DPI calculation can ever be valid throughout the whole server life, as it varies with varying resolutions and varying monitors. But at least it is better than having nothing at all.
Diffstat (limited to 'src/rhd_edid.c')
-rw-r--r--src/rhd_edid.c31
1 files changed, 30 insertions, 1 deletions
diff --git a/src/rhd_edid.c b/src/rhd_edid.c
index 4fc2c42..cb38152 100644
--- a/src/rhd_edid.c
+++ b/src/rhd_edid.c
@@ -297,8 +297,15 @@ RHDMonitorEDIDSet(struct rhdMonitor *Monitor, xf86MonPtr EDID)
Mode = EDIDModeFromDetailedTiming(Monitor->scrnIndex,
&EDID->det_mon[i].section.d_timings);
if (Mode) {
- if (preferred)
+ if (preferred) {
Mode->type |= M_T_PREFERRED;
+
+ /* also grab the DPI while we are at it */
+ Monitor->xDpi = (Mode->HDisplay * 25.4) /
+ ((float) EDID->det_mon[i].section.d_timings.h_size) + 0.5;
+ Monitor->yDpi = (Mode->VDisplay * 25.4) /
+ ((float) EDID->det_mon[i].section.d_timings.v_size) + 0.5;
+ }
preferred = FALSE;
Modes = RHDModesAdd(Modes, Mode);
@@ -323,4 +330,26 @@ RHDMonitorEDIDSet(struct rhdMonitor *Monitor, xf86MonPtr EDID)
EDIDReducedAllowed(Monitor, Modes);
Monitor->Modes = RHDModesAdd(Monitor->Modes, Modes);
}
+
+ /* Calculate DPI when we still don't have this */
+ if (!Monitor->xDpi || !Monitor->yDpi) {
+ int HDisplay = 0, VDisplay = 0;
+
+ for (Mode = Monitor->Modes; Mode; Mode = Mode->next) {
+ if (Mode->HDisplay > HDisplay)
+ HDisplay = Mode->HDisplay;
+ if (Mode->VDisplay > VDisplay)
+ VDisplay = Mode->VDisplay;
+ }
+
+ if (HDisplay && EDID->features.hsize)
+ Monitor->xDpi = (HDisplay * 2.54) / ((float) EDID->features.hsize) + 0.5;
+ if (VDisplay && EDID->features.vsize)
+ Monitor->yDpi = (VDisplay * 2.54) / ((float) EDID->features.vsize) + 0.5;
+
+ if (!Monitor->xDpi && Monitor->yDpi)
+ Monitor->xDpi = Monitor->yDpi;
+ if (!Monitor->yDpi && Monitor->xDpi)
+ Monitor->yDpi = Monitor->xDpi;
+ }
}