Implemented blend modes in the D3D renderer
authorSam Lantinga <slouken@libsdl.org>
Wed, 19 Jul 2006 05:03:21 +0000
changeset 1916 c773b0c0ac89
parent 1915 a228436a2404
child 1917 3f54b3ec5a07
Implemented blend modes in the D3D renderer
src/stdlib/SDL_string.c
src/video/win32/SDL_d3drender.c
test/common.c
test/testgl2.c
test/testsprite2.c
--- a/src/stdlib/SDL_string.c	Wed Jul 19 04:24:41 2006 +0000
+++ b/src/stdlib/SDL_string.c	Wed Jul 19 05:03:21 2006 +0000
@@ -750,6 +750,8 @@
         ++str1;
         ++str2;
     }
+    a = SDL_tolower(*str1);
+    b = SDL_tolower(*str2);
     return (int) ((unsigned char) a - (unsigned char) b);
 }
 #endif
@@ -769,6 +771,8 @@
         ++str2;
         --maxlen;
     }
+    a = SDL_tolower(*str1);
+    b = SDL_tolower(*str2);
     return (int) ((unsigned char) a - (unsigned char) b);
 }
 #endif
--- a/src/video/win32/SDL_d3drender.c	Wed Jul 19 04:24:41 2006 +0000
+++ b/src/video/win32/SDL_d3drender.c	Wed Jul 19 05:03:21 2006 +0000
@@ -359,12 +359,6 @@
     IDirect3DDevice9_SetRenderState(data->device, D3DRS_CULLMODE,
                                     D3DCULL_NONE);
     IDirect3DDevice9_SetRenderState(data->device, D3DRS_LIGHTING, FALSE);
-    IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE,
-                                    TRUE);
-    IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLEND,
-                                    D3DBLEND_SRCALPHA);
-    IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLEND,
-                                    D3DBLEND_INVSRCALPHA);
 
     return renderer;
 }
@@ -627,6 +621,38 @@
     vertices[3].u = minu;
     vertices[3].v = maxv;
 
+    switch (blendMode) {
+    case SDL_TextureBlendMode_None:
+        IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE,
+                                        FALSE);
+        break;
+    case SDL_TextureBlendMode_Mask:
+    case SDL_TextureBlendMode_Blend:
+        IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE,
+                                        TRUE);
+        IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLEND,
+                                        D3DBLEND_SRCALPHA);
+        IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLEND,
+                                        D3DBLEND_INVSRCALPHA);
+        break;
+    case SDL_TextureBlendMode_Add:
+        IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE,
+                                        TRUE);
+        IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLEND,
+                                        D3DBLEND_SRCALPHA);
+        IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLEND,
+                                        D3DBLEND_ONE);
+        break;
+    case SDL_TextureBlendMode_Mod:
+        IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE,
+                                        TRUE);
+        IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLEND,
+                                        D3DBLEND_ZERO);
+        IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLEND,
+                                        D3DBLEND_SRCCOLOR);
+        break;
+    }
+
     result =
         IDirect3DDevice9_SetTexture(data->device, 0,
                                     (IDirect3DBaseTexture9 *) texturedata->
--- a/test/common.c	Wed Jul 19 04:24:41 2006 +0000
+++ b/test/common.c	Wed Jul 19 05:03:21 2006 +0000
@@ -105,7 +105,7 @@
     }
     if (SDL_strcasecmp(argv[index], "--windows") == 0) {
         ++index;
-        if (!argv[index] || !isdigit(*argv[index])) {
+        if (!argv[index] || !SDL_isdigit(*argv[index])) {
             return -1;
         }
         if (!(state->window_flags & SDL_WINDOW_FULLSCREEN)) {
--- a/test/testgl2.c	Wed Jul 19 04:24:41 2006 +0000
+++ b/test/testgl2.c	Wed Jul 19 05:03:21 2006 +0000
@@ -193,7 +193,7 @@
             }
         }
         if (consumed < 0) {
-            fprintf(stderr, "Usage: %s [--fsaa] [--accel] %s", argv[0],
+            fprintf(stderr, "Usage: %s %s [--fsaa] [--accel]", argv[0],
                     CommonUsage(state));
             quit(1);
         }
--- a/test/testsprite2.c	Wed Jul 19 04:24:41 2006 +0000
+++ b/test/testsprite2.c	Wed Jul 19 05:03:21 2006 +0000
@@ -8,7 +8,7 @@
 
 #define NUM_SPRITES	100
 #define MAX_SPEED 	1
-#define BACKGROUND  0x00FFFFFF
+#define BACKGROUND  0x00A0A0A0
 
 static CommonState *state;
 static int num_sprites;
@@ -16,6 +16,7 @@
 static SDL_Rect *positions;
 static SDL_Rect *velocities;
 static int sprite_w, sprite_h;
+static SDL_TextureBlendMode blendMode = SDL_TextureBlendMode_Mask;
 
 /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
 static void
@@ -107,7 +108,7 @@
         }
 
         /* Blit the sprite onto the screen */
-        SDL_RenderCopy(sprite, NULL, position, SDL_TextureBlendMode_Mask,
+        SDL_RenderCopy(sprite, NULL, position, blendMode,
                        SDL_TextureScaleMode_None);
     }
 
@@ -135,11 +136,31 @@
 
         consumed = CommonArg(state, i);
         if (consumed == 0) {
-            num_sprites = SDL_atoi(argv[i]);
-            consumed = 1;
+            consumed = -1;
+            if (SDL_strcasecmp(argv[i], "--blend") == 0) {
+                if (argv[i + 1]) {
+                    if (SDL_strcasecmp(argv[i + 1], "none") == 0) {
+                        blendMode = SDL_TextureBlendMode_None;
+                        consumed = 2;
+                    } else if (SDL_strcasecmp(argv[i + 1], "blend") == 0) {
+                        blendMode = SDL_TextureBlendMode_Blend;
+                        consumed = 2;
+                    } else if (SDL_strcasecmp(argv[i + 1], "add") == 0) {
+                        blendMode = SDL_TextureBlendMode_Add;
+                        consumed = 2;
+                    } else if (SDL_strcasecmp(argv[i + 1], "mod") == 0) {
+                        blendMode = SDL_TextureBlendMode_Mod;
+                        consumed = 2;
+                    }
+                }
+            } else if (SDL_isdigit(*argv[i])) {
+                num_sprites = SDL_atoi(argv[i]);
+                consumed = 1;
+            }
         }
         if (consumed < 0) {
-            fprintf(stderr, "Usage: %s %s", argv[0], CommonUsage(state));
+            fprintf(stderr, "Usage: %s %s [--blend none|blend|add|mod]",
+                    argv[0], CommonUsage(state));
             quit(1);
         }
         i += consumed;