Mercurial > sdl-ios-xcode
view src/video/x11/SDL_x11opengles.h @ 3333:b334b4f7dfa0
[SDL] Bad math in SDL_RenderCopy
Mason Wheeler to sdl
When I tried to render an image using something other than NULL for srcrect, it got horribly distorted. I traced it down to the fact that the math in the rectangle adjustments performed just before the call to renderer->RenderCopy is written inside out. It should look like this:
if (dstrect->w != real_dstrect.w) {
int deltax = (dstrect->x - real_dstrect.x);
int deltaw = (dstrect->w - real_dstrect.w);
real_srcrect.x += (deltax * real_srcrect.w) / dstrect->w;
real_srcrect.w += (deltaw * real_srcrect.w) / dstrect->w;
}
if (dstrect->h != real_dstrect.h) {
int deltay = (dstrect->y - real_dstrect.y);
int deltah = (dstrect->h - real_dstrect.h);
real_srcrect.y += (deltay * real_srcrect.h) / dstrect->h;
real_srcrect.h += (deltah * real_srcrect.h) / dstrect->h;
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sat, 03 Oct 2009 16:23:16 +0000 |
parents | c68d2ca5970f |
children | f7b03b6838cb |
line wrap: on
line source
/* SDL - Simple DirectMedia Layer Copyright (C) 1997-2004 Sam Lantinga This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Sam Lantinga slouken@libsdl.org Open Pandora SDL driver Copyright (C) 2009 David Carré (cpasjuste@gmail.com) */ #include <GLES/gl.h> #include <GLES/egl.h> #include <dlfcn.h> #if defined(__OpenBSD__) && !defined(__ELF__) #define dlsym(x,y) dlsym(x, "_" y) #endif #include "../SDL_sysvideo.h" typedef struct SDL_PrivateGLESData { int egl_active; /* to stop switching drivers while we have a valid context */ XVisualInfo *egl_visualinfo; EGLDisplay egl_display; EGLContext egl_context; /* Current GLES context */ EGLSurface egl_surface; EGLConfig egl_config; EGLDisplay(*eglGetDisplay) (NativeDisplayType display); EGLBoolean(*eglInitialize) (EGLDisplay dpy, EGLint * major, EGLint * minor); EGLBoolean(*eglTerminate) (EGLDisplay dpy); void *(*eglGetProcAddress) (const GLubyte * procName); EGLBoolean(*eglChooseConfig) (EGLDisplay dpy, const EGLint * attrib_list, EGLConfig * configs, EGLint config_size, EGLint * num_config); EGLContext(*eglCreateContext) (EGLDisplay dpy, EGLConfig config, EGLContext share_list, const EGLint * attrib_list); EGLBoolean(*eglDestroyContext) (EGLDisplay dpy, EGLContext ctx); EGLSurface(*eglCreateWindowSurface) (EGLDisplay dpy, EGLConfig config, NativeWindowType window, const EGLint * attrib_list); EGLBoolean(*eglDestroySurface) (EGLDisplay dpy, EGLSurface surface); EGLBoolean(*eglMakeCurrent) (EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx); EGLBoolean(*eglSwapBuffers) (EGLDisplay dpy, EGLSurface draw); const char *(*eglQueryString) (EGLDisplay dpy, EGLint name); EGLBoolean(*eglGetConfigAttrib) (EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint * value); } SDL_PrivateGLESData; /* OpenGLES functions */ extern SDL_GLContext X11_GLES_CreateContext(_THIS, SDL_Window * window); extern XVisualInfo *X11_GLES_GetVisual(_THIS, Display * display, int screen); extern int X11_GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context); extern int X11_GLES_GetAttribute(_THIS, SDL_GLattr attrib, int *value); extern int X11_GLES_LoadLibrary(_THIS, const char *path); extern void *X11_GLES_GetProcAddress(_THIS, const char *proc); extern void X11_GLES_UnloadLibrary(_THIS); extern int X11_GLES_SetSwapInterval(_THIS, int interval); extern int X11_GLES_GetSwapInterval(_THIS); extern void X11_GLES_SwapWindow(_THIS, SDL_Window * window); extern void X11_GLES_DeleteContext(_THIS, SDL_GLContext context);