# HG changeset patch # User Sam Lantinga # Date 1153287942 0 # Node ID 3f54b3ec5a07fd7b2657545857f84a724a3ad27b # Parent c773b0c0ac8923d1c207b0e6fab8e968269842b1 Implemented scaling in the D3D renderer diff -r c773b0c0ac89 -r 3f54b3ec5a07 src/video/win32/SDL_d3drender.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-> diff -r c773b0c0ac89 -r 3f54b3ec5a07 test/testsprite2.c --- 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);