summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Jackson <ajax@redhat.com>2008-03-14 14:24:21 -0400
committerAdam Jackson <ajax@redhat.com>2008-03-14 14:24:21 -0400
commit824853772241acf64bc37ac8b85254194741ae13 (patch)
tree440ed0028b96068f3982800aea5931ac1711e47d
parent1b9878ffcfc0c0dbc4a6e674827fe508ba77db4b (diff)
RANDR 1.2: Fix initial mode aspect ratio match in a corner case.
Actually more like in the mainline case, where the ideal mode happens to be the very first aspect match on the first monitor. But let's not split hairs.
-rw-r--r--hw/xfree86/modes/xf86Crtc.c51
1 files changed, 27 insertions, 24 deletions
diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
index 39e84e641..6b845b7c9 100644
--- a/hw/xfree86/modes/xf86Crtc.c
+++ b/hw/xfree86/modes/xf86Crtc.c
@@ -1683,14 +1683,19 @@ aspectMatch(float a, float b)
}
static DisplayModePtr
-nextAspectMode(DisplayModePtr start, float aspect)
+nextAspectMode(xf86OutputPtr o, DisplayModePtr last, float aspect)
{
- DisplayModePtr m = start;
+ DisplayModePtr m = NULL;
- if (!m)
+ if (!o)
return NULL;
- for (m = m->next; m; m = m->next)
+ if (!last)
+ m = o->probed_modes;
+ else
+ m = last->next;
+
+ for (; m; m = m->next)
if (aspectMatch(aspect, (float)m->HDisplay / (float)m->VDisplay))
return m;
@@ -1700,31 +1705,29 @@ nextAspectMode(DisplayModePtr start, float aspect)
static DisplayModePtr
bestModeForAspect(xf86CrtcConfigPtr config, Bool *enabled, float aspect)
{
- int o, p;
- DisplayModePtr mode, test = NULL, match = NULL;
+ int o = -1, p;
+ DisplayModePtr mode = NULL, test = NULL, match = NULL;
- for (o = -1; nextEnabledOutput(config, enabled, &o); ) {
- mode = config->output[o]->probed_modes;
- while ((mode = nextAspectMode(mode, aspect))) {
- for (p = o; nextEnabledOutput(config, enabled, &p); ) {
- test = xf86OutputFindClosestMode(config->output[p], mode);
- if (!test)
- break;
- if (test->HDisplay != mode->HDisplay ||
+ nextEnabledOutput(config, enabled, &o);
+ while ((mode = nextAspectMode(config->output[o], mode, aspect))) {
+ for (p = o; nextEnabledOutput(config, enabled, &p); ) {
+ test = xf86OutputFindClosestMode(config->output[p], mode);
+ if (!test)
+ break;
+ if (test->HDisplay != mode->HDisplay ||
test->VDisplay != mode->VDisplay) {
- test = NULL;
- break;
- }
+ test = NULL;
+ break;
}
+ }
- /* if we didn't match it on all outputs, try the next one */
- if (!test)
- continue;
+ /* if we didn't match it on all outputs, try the next one */
+ if (!test)
+ continue;
- /* if it's bigger than the last one, save it */
- if (!match || (test->HDisplay > match->HDisplay))
- match = test;
- }
+ /* if it's bigger than the last one, save it */
+ if (!match || (test->HDisplay > match->HDisplay))
+ match = test;
}
/* return the biggest one found */