]> git.pld-linux.org Git - packages/SDL.git/commitdiff
- use best mode available
authorArkadiusz Miśkiewicz <arekm@maven.pl>
Tue, 15 Apr 2003 18:39:26 +0000 (18:39 +0000)
committercvs2git <feedback@pld-linux.org>
Sun, 24 Jun 2012 12:13:13 +0000 (12:13 +0000)
Changed files:
    SDL-refresh_rates.patch -> 1.1

SDL-refresh_rates.patch [new file with mode: 0644]

diff --git a/SDL-refresh_rates.patch b/SDL-refresh_rates.patch
new file mode 100644 (file)
index 0000000..d571a8a
--- /dev/null
@@ -0,0 +1,159 @@
+diff -urN SDL-1.2.5.old/src/video/x11/SDL_x11modes.c SDL-1.2.5/src/video/x11/SDL_x11modes.c
+--- SDL-1.2.5.old/src/video/x11/SDL_x11modes.c 2002-09-29 17:35:25.000000000 -0700
++++ SDL-1.2.5/src/video/x11/SDL_x11modes.c     2003-04-13 22:03:43.000000000 -0700
+@@ -44,6 +44,8 @@
+ #endif 
+ #define MAX(a, b)        (a > b ? a : b)
++#define V_INTERLACE      0x010
++#define V_DBLSCAN        0x020
+ #ifdef XFREE86_VM
+ Bool SDL_NAME(XF86VidModeGetModeInfo)(Display *dpy, int scr, SDL_NAME(XF86VidModeModeInfo) *info)
+@@ -91,6 +93,77 @@
+ }
+ #endif
++#ifdef XFREE86_VM
++static int get_vidmode_filter(SDL_NAME(XF86VidModeModeInfo) **modes, int nmodes, char **bitmap)
++{
++    int i, result = 0;
++    int use_all_modes, use_specific_mode;
++    const char *variable;
++    char *temp;
++
++    if (!nmodes)
++        return 0;
++
++    temp = (char *)malloc((nmodes)*sizeof(char));
++    if (!temp)
++        return 0;
++
++    for ( i = 0; i < nmodes; ++i )
++        temp[i] = 0;
++
++    variable = getenv("SDL_VIDEO_X11_USE_ALL_MODES");
++    use_all_modes = variable ? atoi(variable) : 0;
++    variable = getenv("SDL_VIDEO_X11_USE_SPECIFIC_MODE");
++    use_specific_mode = variable ? atoi(variable) : 0;
++
++    qsort(modes, nmodes, sizeof *modes, cmpmodes);
++
++    if ( use_all_modes ) {
++        for ( i = 0; i < nmodes; ++i )
++            temp[i] = 1;
++        result  = 1;
++/*    } else if ( use_specific_mode ) { ... */
++    } else {
++        int previous_refresh, current_refresh;
++        SDL_NAME(XF86VidModeModeInfo) *previous, *current;
++
++        previous = modes[0];
++        previous_refresh = (int)(previous->dotclock * 1000.0 /
++          (previous->htotal * previous->vtotal));
++        if ( previous->flags & V_INTERLACE ) previous_refresh *= 2;
++        else if ( previous->flags & V_DBLSCAN ) previous_refresh /= 2;
++
++        temp[0] = 1;
++        for ( i = 1; i < nmodes; ++i ) {
++            current = modes[i];
++            current_refresh = (int)(current->dotclock * 1000.0 /
++              (current->htotal * current->vtotal));
++            if ( current->flags & V_INTERLACE ) current_refresh *= 2;
++            else if ( current->flags & V_DBLSCAN ) current_refresh /= 2;
++
++            /* Compare this mode to the previous one */
++            if ( current->hdisplay == previous->hdisplay &&
++                 current->vdisplay == previous->vdisplay ) {
++                if ( current_refresh > previous_refresh ) {
++                    temp[i-1] = 0;
++                    temp[i]   = 1;
++                }
++                else
++                    temp[i] = 0;
++            }
++            else
++                temp[i] = 1;
++
++            previous = current;
++            previous_refresh = current_refresh;
++        }
++        result = 1;
++    }
++    *bitmap = temp;
++    return result;
++}
++#endif
++
+ static void get_real_resolution(_THIS, int* w, int* h);
+ static void set_best_resolution(_THIS, int width, int height)
+@@ -101,10 +174,11 @@
+         SDL_NAME(XF86VidModeModeInfo) **modes;
+         int i;
+         int nmodes;
++        char *bitmap;
+         if ( SDL_NAME(XF86VidModeGetModeLine)(SDL_Display, SDL_Screen, &i, &mode) &&
+-             SDL_NAME(XF86VidModeGetAllModeLines)(SDL_Display,SDL_Screen,&nmodes,&modes)){
+-            qsort(modes, nmodes, sizeof *modes, cmpmodes);
++             SDL_NAME(XF86VidModeGetAllModeLines)(SDL_Display,SDL_Screen,&nmodes,&modes) &&
++             get_vidmode_filter(modes, nmodes, &bitmap) ) {
+ #ifdef XFREE86_DEBUG
+             printf("Available modes:\n");
+             for ( i = 0; i < nmodes; ++i ) {
+@@ -114,7 +188,8 @@
+ #endif
+             for ( i = nmodes-1; i > 0 ; --i ) {
+                 if ( (modes[i]->hdisplay >= width) &&
+-                     (modes[i]->vdisplay >= height) )
++                     (modes[i]->vdisplay >= height) &&
++                     (bitmap[i] == 1) )
+                     break;
+             }
+             if ( (modes[i]->hdisplay != mode.hdisplay) ||
+@@ -122,6 +197,7 @@
+                 SDL_NAME(XF86VidModeSwitchToMode)(SDL_Display, SDL_Screen, modes[i]);
+             }
+             XFree(modes);
++            if (bitmap) free(bitmap);
+         }
+     }
+ #endif /* XFREE86_VM */
+@@ -269,6 +345,7 @@
+     int vm_major, vm_minor;
+     int nmodes;
+     SDL_NAME(XF86VidModeModeInfo) **modes;
++    char *bitmap = (char*)0;
+ #endif
+ #ifdef HAVE_XIGXME
+     int xme_major, xme_minor;
+@@ -330,15 +407,18 @@
+         }
+     }
+     if ( ! buggy_X11 &&
+-         SDL_NAME(XF86VidModeGetAllModeLines)(SDL_Display, SDL_Screen,&nmodes,&modes) ) {
++         SDL_NAME(XF86VidModeGetAllModeLines)(SDL_Display, SDL_Screen,&nmodes,&modes) &&
++         get_vidmode_filter(modes, nmodes, &bitmap) ) {
+-        qsort(modes, nmodes, sizeof *modes, cmpmodes);
+         SDL_modelist = (SDL_Rect **)malloc((nmodes+2)*sizeof(SDL_Rect *));
+         if ( SDL_modelist ) {
+             n = 0;
+             for ( i=0; i<nmodes; ++i ) {
+                 int w, h;
++                /* Exclude those vidmodes that have been filtered out */
++                if (!bitmap[i]) continue;
++
+                 /* Check to see if we should add the screen size (Xinerama) */
+                 w = modes[i]->hdisplay;
+                 h = modes[i]->vdisplay;
+@@ -371,6 +451,7 @@
+             SDL_modelist[n] = NULL;
+         }
+         XFree(modes);
++        if (bitmap) free(bitmap);
+         use_vidmode = vm_major * 100 + vm_minor;
+         save_mode(this);
This page took 0.034473 seconds and 4 git commands to generate.