From ee98a88b16133b1e2b8532678ea9e06868db7407 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Thu, 13 Mar 2008 14:06:18 -0400 Subject: [PATCH] Fix xf86TargetAspect() to, er, work. nextAspectMode() was always skipping the first mode in the mode list, which was problematic if that was the best possible mode... --- hw/xfree86/modes/xf86Crtc.c | 51 ++++++++++++++++++++++-------------------- 1 files changed, 27 insertions(+), 24 deletions(-) diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c index 0bef5b4..2b07421 100644 --- a/hw/xfree86/modes/xf86Crtc.c +++ b/hw/xfree86/modes/xf86Crtc.c @@ -1674,14 +1674,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; @@ -1691,31 +1696,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 */ -- 1.5.4.3