Implemented scaling in the D3D renderer
authorSam Lantinga <slouken@libsdl.org>
Wed, 19 Jul 2006 05:45:42 +0000
changeset 1917 3f54b3ec5a07
parent 1916 c773b0c0ac89
child 1918 092bd3a019c5
Implemented scaling in the D3D renderer
src/video/win32/SDL_d3drender.c
test/testsprite2.c
--- a/src/video/win32/SDL_d3drender.c	Wed Jul 19 05:03:21 2006 +0000
+++ b/src/video/win32/SDL_d3drender.c	Wed Jul 19 05:45:42 2006 +0000
@@ -653,6 +653,28 @@
         break;
     }
 
+    switch (scaleMode) {
+    case SDL_TextureScaleMode_None:
+    case SDL_TextureScaleMode_Fast:
+        IDirect3DDevice9_SetSamplerState(data->device, 0, D3DSAMP_MINFILTER,
+                                         D3DTEXF_POINT);
+        IDirect3DDevice9_SetSamplerState(data->device, 0, D3DSAMP_MAGFILTER,
+                                         D3DTEXF_POINT);
+        break;
+    case SDL_TextureScaleMode_Slow:
+        IDirect3DDevice9_SetSamplerState(data->device, 0, D3DSAMP_MINFILTER,
+                                         D3DTEXF_LINEAR);
+        IDirect3DDevice9_SetSamplerState(data->device, 0, D3DSAMP_MAGFILTER,
+                                         D3DTEXF_LINEAR);
+        break;
+    case SDL_TextureScaleMode_Best:
+        IDirect3DDevice9_SetSamplerState(data->device, 0, D3DSAMP_MINFILTER,
+                                         D3DTEXF_GAUSSIANQUAD);
+        IDirect3DDevice9_SetSamplerState(data->device, 0, D3DSAMP_MAGFILTER,
+                                         D3DTEXF_GAUSSIANQUAD);
+        break;
+    }
+
     result =
         IDirect3DDevice9_SetTexture(data->device, 0,
                                     (IDirect3DBaseTexture9 *) texturedata->
--- a/test/testsprite2.c	Wed Jul 19 05:03:21 2006 +0000
+++ b/test/testsprite2.c	Wed Jul 19 05:45:42 2006 +0000
@@ -17,6 +17,7 @@
 static SDL_Rect *velocities;
 static int sprite_w, sprite_h;
 static SDL_TextureBlendMode blendMode = SDL_TextureBlendMode_Mask;
+static SDL_TextureScaleMode scaleMode = SDL_TextureScaleMode_None;
 
 /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
 static void
@@ -87,12 +88,6 @@
     /* Move the sprite, bounce at the wall, and draw */
     n = 0;
     SDL_RenderFill(NULL, BACKGROUND);
-    /*
-       for (i = 0; i < num_sprites; ++i) {
-       position = &positions[i];
-       SDL_RenderFill(position, BACKGROUND);
-       }
-     */
     for (i = 0; i < num_sprites; ++i) {
         position = &positions[i];
         velocity = &velocities[i];
@@ -108,8 +103,7 @@
         }
 
         /* Blit the sprite onto the screen */
-        SDL_RenderCopy(sprite, NULL, position, blendMode,
-                       SDL_TextureScaleMode_None);
+        SDL_RenderCopy(sprite, NULL, position, blendMode, scaleMode);
     }
 
     /* Update the screen! */
@@ -142,6 +136,9 @@
                     if (SDL_strcasecmp(argv[i + 1], "none") == 0) {
                         blendMode = SDL_TextureBlendMode_None;
                         consumed = 2;
+                    } else if (SDL_strcasecmp(argv[i + 1], "mask") == 0) {
+                        blendMode = SDL_TextureBlendMode_Mask;
+                        consumed = 2;
                     } else if (SDL_strcasecmp(argv[i + 1], "blend") == 0) {
                         blendMode = SDL_TextureBlendMode_Blend;
                         consumed = 2;
@@ -153,13 +150,30 @@
                         consumed = 2;
                     }
                 }
+            } else if (SDL_strcasecmp(argv[i], "--scale") == 0) {
+                if (argv[i + 1]) {
+                    if (SDL_strcasecmp(argv[i + 1], "none") == 0) {
+                        scaleMode = SDL_TextureScaleMode_None;
+                        consumed = 2;
+                    } else if (SDL_strcasecmp(argv[i + 1], "fast") == 0) {
+                        scaleMode = SDL_TextureScaleMode_Fast;
+                        consumed = 2;
+                    } else if (SDL_strcasecmp(argv[i + 1], "slow") == 0) {
+                        scaleMode = SDL_TextureScaleMode_Slow;
+                        consumed = 2;
+                    } else if (SDL_strcasecmp(argv[i + 1], "best") == 0) {
+                        scaleMode = SDL_TextureScaleMode_Best;
+                        consumed = 2;
+                    }
+                }
             } else if (SDL_isdigit(*argv[i])) {
                 num_sprites = SDL_atoi(argv[i]);
                 consumed = 1;
             }
         }
         if (consumed < 0) {
-            fprintf(stderr, "Usage: %s %s [--blend none|blend|add|mod]",
+            fprintf(stderr,
+                    "Usage: %s %s [--blend none|mask|blend|add|mod] [--scale none|fast|slow|best]",
                     argv[0], CommonUsage(state));
             quit(1);
         }
@@ -192,6 +206,10 @@
         quit(2);
     }
     srand(time(NULL));
+    if (scaleMode != SDL_TextureScaleMode_None) {
+        sprite_w += sprite_w / 2;
+        sprite_h += sprite_h / 2;
+    }
     for (i = 0; i < num_sprites; ++i) {
         positions[i].x = rand() % (state->window_w - sprite_w);
         positions[i].y = rand() % (state->window_h - sprite_h);