diff src/video/x11/SDL_x11render.c @ 4629:44fd1f0b895a

Fixed a huge bug with texture scaling.
author Sunny Sachanandani <sunnysachanandani@gmail.com>
date Mon, 02 Aug 2010 11:13:40 +0530
parents b70b99ab75b8
children 02895e9c796b
line wrap: on
line diff
--- a/src/video/x11/SDL_x11render.c	Wed Jul 28 15:35:18 2010 +0530
+++ b/src/video/x11/SDL_x11render.c	Mon Aug 02 11:13:40 2010 +0530
@@ -1021,8 +1021,9 @@
             return -1;
         }
         texture->blendMode = SDL_BLENDMODE_NONE;
+        texture->scaleMode = SDL_TEXTURESCALEMODE_NONE;
         data->blend_op = PictOpSrc;
-        data->filter = "fast";
+        data->filter = NULL;
     }
 #endif
     return 0;
@@ -1159,6 +1160,11 @@
 
     switch (texture->scaleMode) {
     case SDL_TEXTURESCALEMODE_NONE:
+#ifdef SDL_VIDEO_DRIVER_X11_XRENDER
+        if (renderdata->use_xrender) {
+            data->filter = NULL;
+        }
+#endif
         return 0;
     case SDL_TEXTURESCALEMODE_FAST:
         /* We can sort of fake it for streaming textures */
@@ -1186,8 +1192,8 @@
         SDL_Unsupported();
 #ifdef SDL_VIDEO_DRIVER_X11_XRENDER
         if (renderdata->use_xrender) {
-            texture->scaleMode = SDL_TEXTURESCALEMODE_FAST;
-            data->filter = FilterFast;
+            texture->scaleMode = SDL_TEXTURESCALEMODE_NONE;
+            data->filter = NULL;
         }
         else
 #endif
@@ -1900,7 +1906,7 @@
         }
         else
         {
-            mask = texturedata->picture;
+            mask = src;
             mrect = srcrect;
         }
 
@@ -1919,8 +1925,8 @@
                             mrect->x, mrect->y, dstrect->x, dstrect->y,
                             dstrect->w, dstrect->h);
         } else {
-            double xscale = ((double) dstrect->w) / srcrect->w;
-            double yscale = ((double) dstrect->h) / srcrect->h;
+            double xscale = ((double) srcrect->w) / dstrect->w;
+            double yscale = ((double) srcrect->h) / dstrect->h;
             XTransform xform = {{
                     {XDoubleToFixed(xscale), XDoubleToFixed(0), XDoubleToFixed(0)},
                     {XDoubleToFixed(0), XDoubleToFixed(yscale), XDoubleToFixed(0)},
@@ -1937,8 +1943,10 @@
                                      CPComponentAlpha, &attr);
             }
 
-            XRenderSetPictureFilter(data->display, src,
-                                    texturedata->filter, 0, 0);
+            if (texture->scaleMode != SDL_TEXTURESCALEMODE_NONE) {
+                XRenderSetPictureFilter(data->display, src,
+                                        texturedata->filter, 0, 0);
+            }
 
             XRenderComposite(data->display, texturedata->blend_op,
                              src, mask, data->drawable_pict,
@@ -1951,6 +1959,7 @@
                     {XDoubleToFixed(0), XDoubleToFixed(0), XDoubleToFixed(1)}}};
             XRenderSetPictureTransform(data->display, src, &identity);
         }
+
         if (renderer->blendMode == SDL_BLENDMODE_MOD) {
             attr.component_alpha = False;
             XRenderChangePicture(data->display, data->stencil_pict,