From 4366cd6214eea98c48826f4fde928eac40338557 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Wed, 19 Jul 2006 05:03:21 +0000 Subject: [PATCH] Implemented blend modes in the D3D renderer --- src/stdlib/SDL_string.c | 4 ++++ src/video/win32/SDL_d3drender.c | 38 +++++++++++++++++++++++++++------ test/common.c | 2 +- test/testgl2.c | 2 +- test/testsprite2.c | 31 ++++++++++++++++++++++----- 5 files changed, 64 insertions(+), 13 deletions(-) diff --git a/src/stdlib/SDL_string.c b/src/stdlib/SDL_string.c index c3f73409e..95e7aafe1 100644 --- a/src/stdlib/SDL_string.c +++ b/src/stdlib/SDL_string.c @@ -750,6 +750,8 @@ SDL_strcasecmp(const char *str1, const char *str2) ++str1; ++str2; } + a = SDL_tolower(*str1); + b = SDL_tolower(*str2); return (int) ((unsigned char) a - (unsigned char) b); } #endif @@ -769,6 +771,8 @@ SDL_strncasecmp(const char *str1, const char *str2, size_t maxlen) ++str2; --maxlen; } + a = SDL_tolower(*str1); + b = SDL_tolower(*str2); return (int) ((unsigned char) a - (unsigned char) b); } #endif diff --git a/src/video/win32/SDL_d3drender.c b/src/video/win32/SDL_d3drender.c index c30efa4f6..0479bbe7c 100644 --- a/src/video/win32/SDL_d3drender.c +++ b/src/video/win32/SDL_d3drender.c @@ -359,12 +359,6 @@ D3D_CreateRenderer(SDL_Window * window, Uint32 flags) 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 @@ D3D_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, 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-> diff --git a/test/common.c b/test/common.c index ce75556e5..1fb15e57d 100644 --- a/test/common.c +++ b/test/common.c @@ -105,7 +105,7 @@ CommonArg(CommonState * state, int index) } 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)) { diff --git a/test/testgl2.c b/test/testgl2.c index b0f53851d..62f55e889 100644 --- a/test/testgl2.c +++ b/test/testgl2.c @@ -193,7 +193,7 @@ main(int argc, char *argv[]) } } 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); } diff --git a/test/testsprite2.c b/test/testsprite2.c index e9d23d97f..3804dbf2b 100644 --- a/test/testsprite2.c +++ b/test/testsprite2.c @@ -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_TextureID *sprites; 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 @@ MoveSprites(SDL_WindowID window, SDL_TextureID sprite) } /* 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 @@ main(int argc, char *argv[]) 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;