# HG changeset patch # User Sam Lantinga # Date 1153285401 0 # Node ID c773b0c0ac8923d1c207b0e6fab8e968269842b1 # Parent a228436a2404ffdf9d9e3905c90ba2fb465bbe44 Implemented blend modes in the D3D renderer diff -r a228436a2404 -r c773b0c0ac89 src/stdlib/SDL_string.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 diff -r a228436a2404 -r c773b0c0ac89 src/video/win32/SDL_d3drender.c --- 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-> diff -r a228436a2404 -r c773b0c0ac89 test/common.c --- 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)) { diff -r a228436a2404 -r c773b0c0ac89 test/testgl2.c --- 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); } diff -r a228436a2404 -r c773b0c0ac89 test/testsprite2.c --- 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;