Skip to content

Commit

Permalink
(Said Max Horn on the SDL mailing list...)
Browse files Browse the repository at this point in the history
Hi folks,

based on Eric Wing's patch, I created the attached patch which fixes
the OpenGL coordinate inversion bug in SDL. It works fine over here on
10.3 with Ryan's test program (which I also attached).

There is another change in it: I removed the "- 1" in the two lines
using CGDisplayPixelsHigh()... while I understand from a logical point
of view why they *should* be correct, I checked the actual values
computed that way, and they were off-by-one. After removing the " - 1",
the returned mouse coordinates are correct. I checked this by moving
the mouse to the screen top/bottom in fullscreen mode, BTW. With the
change, the proper values 0 and 479 are returned (in 640x480 mode).

Sam, you may still want to test on 10.1, it's very simple using Ryan's
minimal test code :-)

Cheers,

Max




(Here is the reproduction case for revision history's sake...)


/*
 * To compile:
 *   gcc -o test test.c `sdl-config --cflags` `sdl-config --libs` -framework OpenGL
 *
 *  --ryan.
 */

#include <stdio.h>
#include "SDL.h"
#include "SDL_opengl.h"

int main(int argc, char **argv)
{
    Uint32 flags = SDL_OPENGL /* | SDL_FULLSCREEN */;
    SDL_Surface *screen;
    SDL_Event event;
    int done = 0;
    GLfloat ratio;

    SDL_Init(SDL_INIT_VIDEO);
    SDL_ShowCursor(0);
    if ((argv[1]) && (strcmp(argv[1], "--grab") == 0))
        SDL_WM_GrabInput(SDL_GRAB_ON);
    screen = SDL_SetVideoMode(640, 480, 0, flags);
    if (!screen)
        return(42);

    ratio = ((GLfloat) screen->w) / ((GLfloat) screen->h);
    glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
    glClearDepth( 1.0f );
    glEnable( GL_DEPTH_TEST );
    glDepthFunc( GL_LEQUAL );
    glViewport( 0, 0, screen->w, screen->h);
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    gluPerspective( 45.0f, ratio, 0.1f, 100.0f );
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    SDL_GL_SwapBuffers();


    // eh, close enough.
    #define MAX_X 6.12
    #define MAX_Y 4.50

    while (!done)
    {
        int x, y;
        GLfloat glx, gly;

        if (!SDL_WaitEvent(&event))
            break;

        switch (event.type)
        {
            case SDL_KEYUP:
                if (event.key.keysym.sym == SDLK_ESCAPE)
                    done = 1;
                break;
        }

        SDL_GetMouseState(&x, &y);
        glx = ((((GLfloat) x) / ((GLfloat) screen->w)) - 0.5f) * MAX_X;
        gly = ((((GLfloat) y) / ((GLfloat) screen->h)) - 0.5f) * MAX_Y;

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    	glLoadIdentity();
        glTranslatef(glx,-gly,-6.0f);

        glBegin(GL_TRIANGLES);
            glColor3f(1,0,0); glVertex3f( 0.00f,  0.25f, 0.00f);
            glColor3f(0,1,0); glVertex3f(-0.25f, -0.25f, 0.00f);
            glColor3f(0,0,1); glVertex3f( 0.25f, -0.25f, 0.00f);
	    glEnd();

        SDL_GL_SwapBuffers();
    }

    SDL_Quit();
    return(0);
}

/* end of test.c ... */
  • Loading branch information
icculus committed Mar 22, 2004
1 parent 0b213ca commit f973431
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 2 deletions.
2 changes: 2 additions & 0 deletions src/video/quartz/SDL_QuartzVideo.h
Expand Up @@ -107,6 +107,7 @@ typedef struct SDL_PrivateVideoData {
SDL_sem *sem1, *sem2; /* synchronization for async screen updates */
Uint8 *current_buffer; /* the buffer being copied to the screen */
BOOL quit_thread; /* used to quit the async blitting thread */
SInt32 system_version; /* used to dis-/enable workarounds depending on the system version */

ImageDescriptionHandle yuv_idh;
MatrixRecordPtr yuv_matrix;
Expand Down Expand Up @@ -152,6 +153,7 @@ typedef struct SDL_PrivateVideoData {
#define sem2 (this->hidden->sem2)
#define current_buffer (this->hidden->current_buffer)
#define quit_thread (this->hidden->quit_thread)
#define system_version (this->hidden->system_version)

/* grab states - the input is in one of these states */
enum {
Expand Down
3 changes: 3 additions & 0 deletions src/video/quartz/SDL_QuartzVideo.m
Expand Up @@ -205,6 +205,9 @@ static int QZ_VideoInit (_THIS, SDL_PixelFormat *video_format) {
cursor_visible = YES;
current_mods = 0;

if ( Gestalt(gestaltSystemVersion, &system_version) != noErr )
system_version = 0;

/* register for sleep notifications so wake from sleep generates SDL_VIDEOEXPOSE */
QZ_RegisterForSleepNotifications (this);

Expand Down
9 changes: 7 additions & 2 deletions src/video/quartz/SDL_QuartzWM.m
Expand Up @@ -135,7 +135,7 @@ void QZ_PrivateSDLToCocoa (_THIS, NSPoint *p) {

if ( CGDisplayIsCaptured (display_id) ) { /* capture signals fullscreen */

p->y = CGDisplayPixelsHigh (display_id) - p->y - 1;
p->y = CGDisplayPixelsHigh (display_id) - p->y;
}
else {

Expand All @@ -152,7 +152,7 @@ void QZ_PrivateCocoaToSDL (_THIS, NSPoint *p) {

if ( CGDisplayIsCaptured (display_id) ) { /* capture signals fullscreen */

p->y = CGDisplayPixelsHigh (display_id) - p->y - 1;
p->y = CGDisplayPixelsHigh (display_id) - p->y;
}
else {

Expand All @@ -161,6 +161,11 @@ void QZ_PrivateCocoaToSDL (_THIS, NSPoint *p) {
newPoint = [ window_view convertPoint:*p fromView:[ qz_window contentView ] ];

*p = newPoint;

/* If OSX version is 10.3.0 or later, we need a workaround in OpenGL mode */
if( system_version >= 0x1030 && (SDL_VideoSurface->flags & (SDL_OPENGL | SDL_OPENGLBLIT)) ) {
p->y = [window_view frame].size.height - p->y - 1;
}
}
}

Expand Down

0 comments on commit f973431

Please sign in to comment.