From 604932ea8497ebe25f553efc311aa41962d521a5 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Thu, 18 Jun 2015 00:44:57 -0400 Subject: [PATCH 01/15] Moving some whitespace around to test something on the Mercurial server. --- docs/README-dynapi.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/README-dynapi.md b/docs/README-dynapi.md index 665efd74e3744..bfaecb34496e5 100644 --- a/docs/README-dynapi.md +++ b/docs/README-dynapi.md @@ -1,6 +1,7 @@ Dynamic API ================================================================================ -Originally posted by Ryan at https://plus.google.com/103391075724026391227/posts/TB8UfnDYu4U +Originally posted by Ryan at: + https://plus.google.com/103391075724026391227/posts/TB8UfnDYu4U Background: From dd8c64779b0074b31da0e092759eb3d3c73fecbe Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Thu, 18 Jun 2015 12:20:46 -0300 Subject: [PATCH 02/15] Updated WhatsNew.txt's 2.0.4 list to include a more detailed set of changes for iOS, and added a couple missing items to the OS X and Windows sections. --- WhatsNew.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/WhatsNew.txt b/WhatsNew.txt index 1c17704f03553..fa5eaede63bc8 100644 --- a/WhatsNew.txt +++ b/WhatsNew.txt @@ -39,11 +39,15 @@ Windows: * SDL_SysWMinfo now contains the window HDC * Added support for Unicode command line options * Prevent beeping when Alt-key combos are pressed +* SDL_SetTextInputRect re-positions the OS-rendered IME Mac OS X: * Implemented drag-and-drop support * Improved joystick hot-plug detection +* The SDL_WINDOWEVENT_EXPOSED window event is triggered in the appropriate situations * Fixed relative mouse mode when the application loses/regains focus +* Fixed bugs related to transitioning to and from Spaces-aware fullscreen-desktop mode +* Fixed the refresh rate of display modes * SDL_SysWMInfo is now ARC-compatible Linux: @@ -55,6 +59,14 @@ Linux: iOS: * Added support for iOS 8 +* Added support for the hint SDL_HINT_ACCELEROMETER_AS_JOYSTICK +* Added sRGB OpenGL ES context support on iOS 7+ +* Added native resolution support for the iPhone 6 Plus +* The SDL_WINDOW_ALLOW_HIGHDPI window flag now enables high-dpi support, and SDL_GL_GetDrawableSize or SDL_GetRendererOutputSize gets the window resolution in pixels +* SDL_GetWindowSize and display mode sizes are in the "DPI-independent points" coordinate space rather than pixels (matches OS X behavior) +* SDL_SysWMinfo now contains the OpenGL ES framebuffer and color renderbuffer objects used by the window's active GLES view +* Fixed various rotation and orientation issues +* Fixed memory leaks Android: * Added a hint SDL_HINT_ANDROID_SEPARATE_MOUSE_AND_TOUCH to prevent mouse events from being registered as touch events From 3a84f7b5204afbe9d3ce2dec91969f88730c29e9 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Thu, 18 Jun 2015 22:34:39 -0400 Subject: [PATCH 03/15] CMake fixes for MingW (thanks, Ozkan!). - ignore DXSDK_DIR for mingw environment - use dxerr8 instead of dxerr for mingw. Partially fixes Bugzilla #3016. --- CMakeLists.txt | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4d8b95be47a9a..f1cf7aa982147 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -900,10 +900,12 @@ elseif(WINDOWS) # Check for DirectX if(DIRECTX) - if("$ENV{DXSDK_DIR}" STREQUAL "") - message_error("DIRECTX requires the \$DXSDK_DIR environment variable to be set") + if(NOT CMAKE_COMPILER_IS_MINGW) + if("$ENV{DXSDK_DIR}" STREQUAL "") + message_error("DIRECTX requires the \$DXSDK_DIR environment variable to be set") + endif() + set(CMAKE_REQUIRED_FLAGS "/I\"$ENV{DXSDK_DIR}\\Include\"") endif() - set(CMAKE_REQUIRED_FLAGS "/I\"$ENV{DXSDK_DIR}\\Include\"") check_include_file(d3d9.h HAVE_D3D_H) check_include_file(d3d11_1.h HAVE_D3D11_H) check_include_file(ddraw.h HAVE_DDRAW_H) @@ -914,9 +916,11 @@ elseif(WINDOWS) check_include_file(dxgi.h HAVE_DXGI_H) if(HAVE_D3D_H OR HAVE_D3D11_H OR HAVE_DDRAW_H OR HAVE_DSOUND_H OR HAVE_DINPUT_H OR HAVE_XAUDIO2_H) set(HAVE_DIRECTX TRUE) + if(NOT CMAKE_COMPILER_IS_MINGW) # TODO: change $ENV{DXSDL_DIR} to get the path from the include checks - link_directories($ENV{DXSDK_DIR}\\lib\\${PROCESSOR_ARCH}) - include_directories($ENV{DXSDK_DIR}\\Include) + link_directories($ENV{DXSDK_DIR}\\lib\\${PROCESSOR_ARCH}) + include_directories($ENV{DXSDK_DIR}\\Include) + endif() endif() set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS}) endif() @@ -1020,7 +1024,12 @@ elseif(WINDOWS) set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES}) if(HAVE_DINPUT_H) set(SDL_JOYSTICK_DINPUT 1) - list(APPEND EXTRA_LIBS dinput8 dxguid dxerr) + list(APPEND EXTRA_LIBS dinput8 dxguid) + if(CMAKE_COMPILER_IS_MINGW) + list(APPEND EXTRA_LIBS dxerr8) + else() + list(APPEND EXTRA_LIBS dxerr) + endif() endif() if(HAVE_XINPUT_H) set(SDL_JOYSTICK_XINPUT 1) From 21935b03130cab356c561ff17a00750f9ee363e5 Mon Sep 17 00:00:00 2001 From: Philipp Wiesemann Date: Fri, 19 Jun 2015 21:17:00 +0200 Subject: [PATCH 04/15] Added more entries and brackets to WhatsNew.txt for 2.0.4. --- WhatsNew.txt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/WhatsNew.txt b/WhatsNew.txt index fa5eaede63bc8..4f9b30c5f4e40 100644 --- a/WhatsNew.txt +++ b/WhatsNew.txt @@ -27,7 +27,10 @@ General: * Added a Vivante video driver that is used on various SoC platforms * Added an event SDL_RENDER_DEVICE_RESET that is sent from the D3D renderers when the D3D device is lost, and from Android's event loop when the GLES context had to be recreated * Added a hint SDL_HINT_NO_SIGNAL_HANDLERS to disable SDL's built in signal handling +* Added a hint SDL_HINT_THREAD_STACK_SIZE to set the stack size of SDL's threads +* Added SDL_sqrtf(), SDL_tan(), and SDL_tanf() to the stdlib routines * Improved support for WAV and BMP files with unusual chunks in them +* Renamed SDL_assert_data to SDL_AssertData and SDL_assert_state to SDL_AssertState Windows: * Added support for Windows Phone 8.1 @@ -39,7 +42,7 @@ Windows: * SDL_SysWMinfo now contains the window HDC * Added support for Unicode command line options * Prevent beeping when Alt-key combos are pressed -* SDL_SetTextInputRect re-positions the OS-rendered IME +* SDL_SetTextInputRect() re-positions the OS-rendered IME Mac OS X: * Implemented drag-and-drop support @@ -62,8 +65,8 @@ iOS: * Added support for the hint SDL_HINT_ACCELEROMETER_AS_JOYSTICK * Added sRGB OpenGL ES context support on iOS 7+ * Added native resolution support for the iPhone 6 Plus -* The SDL_WINDOW_ALLOW_HIGHDPI window flag now enables high-dpi support, and SDL_GL_GetDrawableSize or SDL_GetRendererOutputSize gets the window resolution in pixels -* SDL_GetWindowSize and display mode sizes are in the "DPI-independent points" coordinate space rather than pixels (matches OS X behavior) +* The SDL_WINDOW_ALLOW_HIGHDPI window flag now enables high-dpi support, and SDL_GL_GetDrawableSize() or SDL_GetRendererOutputSize() gets the window resolution in pixels +* SDL_GetWindowSize() and display mode sizes are in the "DPI-independent points" coordinate space rather than pixels (matches OS X behavior) * SDL_SysWMinfo now contains the OpenGL ES framebuffer and color renderbuffer objects used by the window's active GLES view * Fixed various rotation and orientation issues * Fixed memory leaks From 82ae4f6fc5121b23982279fcbfb5e4df319a245c Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 19 Jun 2015 22:12:47 -0700 Subject: [PATCH 05/15] [mq]: 3027_rleperf.diff --- src/render/software/SDL_render_sw.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/render/software/SDL_render_sw.c b/src/render/software/SDL_render_sw.c index d2252a22f61ec..918f32b433372 100644 --- a/src/render/software/SDL_render_sw.c +++ b/src/render/software/SDL_render_sw.c @@ -253,6 +253,12 @@ static int SW_SetTextureColorMod(SDL_Renderer * renderer, SDL_Texture * texture) { SDL_Surface *surface = (SDL_Surface *) texture->driverdata; + /* If the color mod is ever enabled (non-white), permanently disable RLE (which doesn't support + * color mod) to avoid potentially frequent RLE encoding/decoding. + */ + if ((texture->r & texture->g & texture->b) != 255) { + SDL_SetSurfaceRLE(surface, 0); + } return SDL_SetSurfaceColorMod(surface, texture->r, texture->g, texture->b); } @@ -261,6 +267,12 @@ static int SW_SetTextureAlphaMod(SDL_Renderer * renderer, SDL_Texture * texture) { SDL_Surface *surface = (SDL_Surface *) texture->driverdata; + /* If the texture ever has multiple alpha values (surface alpha plus alpha channel), permanently + * disable RLE (which doesn't support this) to avoid potentially frequent RLE encoding/decoding. + */ + if (texture->a != 255 && surface->format->Amask) { + SDL_SetSurfaceRLE(surface, 0); + } return SDL_SetSurfaceAlphaMod(surface, texture->a); } @@ -268,6 +280,12 @@ static int SW_SetTextureBlendMode(SDL_Renderer * renderer, SDL_Texture * texture) { SDL_Surface *surface = (SDL_Surface *) texture->driverdata; + /* If add or mod blending are ever enabled, permanently disable RLE (which doesn't support + * them) to avoid potentially frequent RLE encoding/decoding. + */ + if ((texture->blendMode == SDL_BLENDMODE_ADD || texture->blendMode == SDL_BLENDMODE_MOD)) { + SDL_SetSurfaceRLE(surface, 0); + } return SDL_SetSurfaceBlendMode(surface, texture->blendMode); } @@ -553,6 +571,10 @@ SW_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, if ( srcrect->w == final_rect.w && srcrect->h == final_rect.h ) { return SDL_BlitSurface(src, srcrect, surface, &final_rect); } else { + /* If scaling is ever done, permanently disable RLE (which doesn't support scaling) + * to avoid potentially frequent RLE encoding/decoding. + */ + SDL_SetSurfaceRLE(surface, 0); return SDL_BlitScaled(src, srcrect, surface, &final_rect); } } From e589cdba2fa7e0fecc61d9480c267c42980c3f98 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 19 Jun 2015 23:12:13 -0700 Subject: [PATCH 06/15] Fixed bug 3023 - setting a white and then non-white texture color mod breaks the texture with software renderer Adam M. Okay, here is the problem, I think. During the first blit, RLEAlphaSurface is called to do RLE conversion of the RGBA source into a format allowing it "to be quickly alpha-blittable onto dest". Since the destination is the screen, it has no alpha channel. RLEAlphaSurface calls copy_opaque(dst, src + runstart, len, sf, df) (where copy_opaque is copy_32), which has this code: SDL_RLEaccel.c:984: RGBA_FROM_8888(*src, sfmt, r, g, b, a); PIXEL_FROM_RGBA(*d, dfmt, r, g, b, a); On the first line, it reads the source pixel 0xFFFFFFFF. The second line drops the alpha value (because dfmt for the screen has no alpha channel) and writes 0x00FFFFFF. Later, when the RLE conversion is being undone, uncopy_32 is called, which has the following code: SDL_RLEaccel.c:1001: Uint32 pixel = *s++; RGB_FROM_PIXEL(pixel, sfmt, r, g, b); a = pixel >> 24; PIXEL_FROM_RGBA(*dst, dfmt, r, g, b, a); However, the the alpha channel has already been dropped by copy_opaque (= copy_32), so pixel = 0x00FFFFFF and 'a' becomes 0. Thus, all opaque pixels lose their alpha channel when being unRLE'd. (I don't know what happens to pixels with alpha from 1-254, but they should be checked too.) So, that seems to be the problem, but I'm not sure what the solution should be. Since opaque pixels have alpha == 255, I'm thinking to create another uncopy function for opaque pixels that simply uses 255 for alpha. However, there may be other problems here. For translucent pixels, uncopy_32 assumes the alpha channel is stored in the upper 8 bits, but copy_32 doesn't store it there. Instead, it stores it in whatever location is appropriate for the destination surface. Isn't one of their behaviors incorrect, given the other? I'm not sure which to change, however. For translucent pixels, it seems that the blit function uses do_blend, which is the BLIT_TRANSL_888 macro, which also assumes alpha is in top 8 bits. It has the comment "we have made sure the alpha is stored in the top 8 bits...", but it seems that's not true (copy_32 doesn't make sure the alpha goes there). Perhaps the correct fix is to make copy_32 put the alpha there, but then that seems to require that RLE conversion be limited to destination surfaces that don't use the upper 8 bits. However, looking further, it seems that has already been done: if (masksum != 0x00ffffff) return -1; /* requires unused high byte */ --- src/video/SDL_RLEaccel.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/video/SDL_RLEaccel.c b/src/video/SDL_RLEaccel.c index d0ae09ad24a87..b9f1426dc70ca 100644 --- a/src/video/SDL_RLEaccel.c +++ b/src/video/SDL_RLEaccel.c @@ -373,6 +373,18 @@ } \ } while(0) +/* + * Set a pixel value using the given format, except that the alpha value is + * placed in the top byte. This is the format used for RLE with alpha. + */ +#define RLEPIXEL_FROM_RGBA(Pixel, fmt, r, g, b, a) \ +{ \ + Pixel = ((r>>fmt->Rloss)<Rshift)| \ + ((g>>fmt->Gloss)<Gshift)| \ + ((b>>fmt->Bloss)<Bshift)| \ + (a<<24); \ +} + /* * This takes care of the case when the surface is clipped on the left and/or * right. Top clipping has already been taken care of. @@ -982,7 +994,7 @@ copy_32(void *dst, Uint32 * src, int n, for (i = 0; i < n; i++) { unsigned r, g, b, a; RGBA_FROM_8888(*src, sfmt, r, g, b, a); - PIXEL_FROM_RGBA(*d, dfmt, r, g, b, a); + RLEPIXEL_FROM_RGBA(*d, dfmt, r, g, b, a); d++; src++; } From b7ede6cc47ffdb5e0bb253181595472ea520f985 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 19 Jun 2015 23:20:43 -0700 Subject: [PATCH 07/15] Fixed bug 1550 - SDL_RenderCopy/CopyEx in software should optionally render 8bit alpha Adam M. There are three problems in the code that I see. 1. SW_RenderCopyEx enables a color key on surface_scaled even if the source surface didn't have a color key. 2. SW_RenderCopyEx doesn't copy blend mode, color mod, or alpha mod from src to surface_scaled. 3. When SDL_BlitScaled(src, srcrect, surface_scaled, &tmp_rect) is called, it blends the src pixels into surface_scaled instead of overwriting them (if src has blending, etc. enabled). I've attached a patch that 1) fixes the three problems that I mentioned, 2) adds the requested performance improvement of using the regular blit function if no rotation or flipping is needed, 3) avoids cloning the source surface if no stretching is required, and simplifies the rotation code slightly. --- src/render/SDL_render.c | 4 + src/render/software/SDL_render_sw.c | 158 ++++++++++++++++++---------- src/render/software/SDL_rotate.c | 36 +++---- 3 files changed, 121 insertions(+), 77 deletions(-) diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c index 1ddb62355ef4f..088fe7ce89a81 100644 --- a/src/render/SDL_render.c +++ b/src/render/SDL_render.c @@ -1734,6 +1734,10 @@ SDL_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture, SDL_FRect frect; SDL_FPoint fcenter; + if (flip == SDL_FLIP_NONE && angle == 0) { /* fast path when we don't need rotation or flipping */ + return SDL_RenderCopy(renderer, texture, srcrect, dstrect); + } + CHECK_RENDERER_MAGIC(renderer, -1); CHECK_TEXTURE_MAGIC(texture, -1); diff --git a/src/render/software/SDL_render_sw.c b/src/render/software/SDL_render_sw.c index 918f32b433372..119b20015932a 100644 --- a/src/render/software/SDL_render_sw.c +++ b/src/render/software/SDL_render_sw.c @@ -600,7 +600,6 @@ SW_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture, SDL_Surface *src = (SDL_Surface *) texture->driverdata; SDL_Rect final_rect, tmp_rect; SDL_Surface *surface_rotated, *surface_scaled; - Uint32 colorkey; int retval, dstwidth, dstheight, abscenterx, abscentery; double cangle, sangle, px, py, p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y; @@ -618,66 +617,113 @@ SW_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture, final_rect.w = (int)dstrect->w; final_rect.h = (int)dstrect->h; - surface_scaled = SDL_CreateRGBSurface(SDL_SWSURFACE, final_rect.w, final_rect.h, src->format->BitsPerPixel, - src->format->Rmask, src->format->Gmask, - src->format->Bmask, src->format->Amask ); - if (surface_scaled) { - SDL_GetColorKey(src, &colorkey); - SDL_SetColorKey(surface_scaled, SDL_TRUE, colorkey); - tmp_rect = final_rect; - tmp_rect.x = 0; - tmp_rect.y = 0; - - retval = SDL_BlitScaled(src, srcrect, surface_scaled, &tmp_rect); - if (!retval) { - SDLgfx_rotozoomSurfaceSizeTrig(tmp_rect.w, tmp_rect.h, -angle, &dstwidth, &dstheight, &cangle, &sangle); - surface_rotated = SDLgfx_rotateSurface(surface_scaled, -angle, dstwidth/2, dstheight/2, GetScaleQuality(), flip & SDL_FLIP_HORIZONTAL, flip & SDL_FLIP_VERTICAL, dstwidth, dstheight, cangle, sangle); - if(surface_rotated) { - /* Find out where the new origin is by rotating the four final_rect points around the center and then taking the extremes */ - abscenterx = final_rect.x + (int)center->x; - abscentery = final_rect.y + (int)center->y; - /* Compensate the angle inversion to match the behaviour of the other backends */ - sangle = -sangle; - - /* Top Left */ - px = final_rect.x - abscenterx; - py = final_rect.y - abscentery; - p1x = px * cangle - py * sangle + abscenterx; - p1y = px * sangle + py * cangle + abscentery; - - /* Top Right */ - px = final_rect.x + final_rect.w - abscenterx; - py = final_rect.y - abscentery; - p2x = px * cangle - py * sangle + abscenterx; - p2y = px * sangle + py * cangle + abscentery; - - /* Bottom Left */ - px = final_rect.x - abscenterx; - py = final_rect.y + final_rect.h - abscentery; - p3x = px * cangle - py * sangle + abscenterx; - p3y = px * sangle + py * cangle + abscentery; - - /* Bottom Right */ - px = final_rect.x + final_rect.w - abscenterx; - py = final_rect.y + final_rect.h - abscentery; - p4x = px * cangle - py * sangle + abscenterx; - p4y = px * sangle + py * cangle + abscentery; - - tmp_rect.x = (int)MIN(MIN(p1x, p2x), MIN(p3x, p4x)); - tmp_rect.y = (int)MIN(MIN(p1y, p2y), MIN(p3y, p4y)); - tmp_rect.w = dstwidth; - tmp_rect.h = dstheight; - - retval = SDL_BlitSurface(surface_rotated, NULL, surface, &tmp_rect); + /* SDLgfx_rotateSurface doesn't accept a source rectangle, so crop and scale if we need to */ + tmp_rect = final_rect; + tmp_rect.x = 0; + tmp_rect.y = 0; + if (srcrect->w == final_rect.w && srcrect->h == final_rect.h && srcrect->x == 0 && srcrect->y == 0) { + surface_scaled = src; /* but if we don't need to, just use the original */ + retval = 0; + } else { + SDL_Surface *blit_src = src; + Uint32 colorkey; + SDL_BlendMode blendMode; + Uint8 alphaMod, r, g, b; + SDL_bool cloneSource = SDL_FALSE; + + surface_scaled = SDL_CreateRGBSurface(SDL_SWSURFACE, final_rect.w, final_rect.h, src->format->BitsPerPixel, + src->format->Rmask, src->format->Gmask, + src->format->Bmask, src->format->Amask ); + if (!surface_scaled) { + return -1; + } + + /* copy the color key, alpha mod, blend mode, and color mod so the scaled surface behaves like the source */ + if (SDL_GetColorKey(src, &colorkey) == 0) { + SDL_SetColorKey(surface_scaled, SDL_TRUE, colorkey); + cloneSource = SDL_TRUE; + } + SDL_GetSurfaceAlphaMod(src, &alphaMod); /* these will be copied to surface_scaled below if necessary */ + SDL_GetSurfaceBlendMode(src, &blendMode); + SDL_GetSurfaceColorMod(src, &r, &g, &b); + + /* now we need to blit the src into surface_scaled. since we want to copy the colors from the source to + * surface_scaled rather than blend them, etc. we'll need to disable the blend mode, alpha mod, etc. + * but we don't want to modify src (in case it's being used on other threads), so we'll need to clone it + * before changing the blend options + */ + cloneSource |= blendMode != SDL_BLENDMODE_NONE || (alphaMod & r & g & b) != 255; + if (cloneSource) { + blit_src = SDL_ConvertSurface(src, src->format, src->flags); /* clone src */ + if (!blit_src) { SDL_FreeSurface(surface_scaled); - SDL_FreeSurface(surface_rotated); - return retval; + return -1; } + SDL_SetSurfaceAlphaMod(blit_src, 255); /* disable all blending options in blit_src */ + SDL_SetSurfaceBlendMode(blit_src, SDL_BLENDMODE_NONE); + SDL_SetColorKey(blit_src, 0, 0); + SDL_SetSurfaceColorMod(blit_src, 255, 255, 255); + SDL_SetSurfaceRLE(blit_src, 0); /* don't RLE encode a surface we'll only use once */ + + SDL_SetSurfaceAlphaMod(surface_scaled, alphaMod); /* copy blending options to surface_scaled */ + SDL_SetSurfaceBlendMode(surface_scaled, blendMode); + SDL_SetSurfaceColorMod(surface_scaled, r, g, b); + } + + retval = SDL_BlitScaled(blit_src, srcrect, surface_scaled, &tmp_rect); + if (blit_src != src) { + SDL_FreeSurface(blit_src); } - return retval; } - return -1; + if (!retval) { + SDLgfx_rotozoomSurfaceSizeTrig(tmp_rect.w, tmp_rect.h, -angle, &dstwidth, &dstheight, &cangle, &sangle); + surface_rotated = SDLgfx_rotateSurface(surface_scaled, -angle, dstwidth/2, dstheight/2, GetScaleQuality(), flip & SDL_FLIP_HORIZONTAL, flip & SDL_FLIP_VERTICAL, dstwidth, dstheight, cangle, sangle); + if(surface_rotated) { + /* Find out where the new origin is by rotating the four final_rect points around the center and then taking the extremes */ + abscenterx = final_rect.x + (int)center->x; + abscentery = final_rect.y + (int)center->y; + /* Compensate the angle inversion to match the behaviour of the other backends */ + sangle = -sangle; + + /* Top Left */ + px = final_rect.x - abscenterx; + py = final_rect.y - abscentery; + p1x = px * cangle - py * sangle + abscenterx; + p1y = px * sangle + py * cangle + abscentery; + + /* Top Right */ + px = final_rect.x + final_rect.w - abscenterx; + py = final_rect.y - abscentery; + p2x = px * cangle - py * sangle + abscenterx; + p2y = px * sangle + py * cangle + abscentery; + + /* Bottom Left */ + px = final_rect.x - abscenterx; + py = final_rect.y + final_rect.h - abscentery; + p3x = px * cangle - py * sangle + abscenterx; + p3y = px * sangle + py * cangle + abscentery; + + /* Bottom Right */ + px = final_rect.x + final_rect.w - abscenterx; + py = final_rect.y + final_rect.h - abscentery; + p4x = px * cangle - py * sangle + abscenterx; + p4y = px * sangle + py * cangle + abscentery; + + tmp_rect.x = (int)MIN(MIN(p1x, p2x), MIN(p3x, p4x)); + tmp_rect.y = (int)MIN(MIN(p1y, p2y), MIN(p3y, p4y)); + tmp_rect.w = dstwidth; + tmp_rect.h = dstheight; + + retval = SDL_BlitSurface(surface_rotated, NULL, surface, &tmp_rect); + SDL_FreeSurface(surface_rotated); + } + } + + if (surface_scaled != src) { + SDL_FreeSurface(surface_scaled); + } + return retval; } static int diff --git a/src/render/software/SDL_rotate.c b/src/render/software/SDL_rotate.c index 0edf784cd7cce..3a8bc21db46aa 100644 --- a/src/render/software/SDL_rotate.c +++ b/src/render/software/SDL_rotate.c @@ -188,10 +188,8 @@ _transformSurfaceRGBA(SDL_Surface * src, SDL_Surface * dst, int cx, int cy, int dy = (sdy >> 16); if (flipx) dx = sw - dx; if (flipy) dy = sh - dy; - if ((dx > -1) && (dy > -1) && (dx < (src->w-1)) && (dy < (src->h-1))) { - sp = (tColorRGBA *)src->pixels; - sp += ((src->pitch/4) * dy); - sp += dx; + if ((unsigned)dx < (unsigned)sw && (unsigned)dy < (unsigned)sh) { + sp = (tColorRGBA *) ((Uint8 *) src->pixels + src->pitch * dy) + dx; c00 = *sp; sp += 1; c01 = *sp; @@ -237,14 +235,12 @@ _transformSurfaceRGBA(SDL_Surface * src, SDL_Surface * dst, int cx, int cy, int sdx = (ax + (isin * dy)) + xd; sdy = (ay - (icos * dy)) + yd; for (x = 0; x < dst->w; x++) { - dx = (short) (sdx >> 16); - dy = (short) (sdy >> 16); - if (flipx) dx = (src->w-1)-dx; - if (flipy) dy = (src->h-1)-dy; - if ((dx >= 0) && (dy >= 0) && (dx < src->w) && (dy < src->h)) { - sp = (tColorRGBA *) ((Uint8 *) src->pixels + src->pitch * dy); - sp += dx; - *pc = *sp; + dx = (sdx >> 16); + dy = (sdy >> 16); + if ((unsigned)dx < (unsigned)src->w && (unsigned)dy < (unsigned)src->h) { + if(flipx) dx = sw - dx; + if(flipy) dy = sh - dy; + *pc = *((tColorRGBA *)((Uint8 *)src->pixels + src->pitch * dy) + dx); } sdx += icos; sdy += isin; @@ -277,7 +273,7 @@ static void transformSurfaceY(SDL_Surface * src, SDL_Surface * dst, int cx, int cy, int isin, int icos, int flipx, int flipy) { int x, y, dx, dy, xd, yd, sdx, sdy, ax, ay; - tColorY *pc, *sp; + tColorY *pc; int gap; /* @@ -301,14 +297,12 @@ transformSurfaceY(SDL_Surface * src, SDL_Surface * dst, int cx, int cy, int isin sdx = (ax + (isin * dy)) + xd; sdy = (ay - (icos * dy)) + yd; for (x = 0; x < dst->w; x++) { - dx = (short) (sdx >> 16); - dy = (short) (sdy >> 16); - if (flipx) dx = (src->w-1)-dx; - if (flipy) dy = (src->h-1)-dy; - if ((dx >= 0) && (dy >= 0) && (dx < src->w) && (dy < src->h)) { - sp = (tColorY *) (src->pixels); - sp += (src->pitch * dy + dx); - *pc = *sp; + dx = (sdx >> 16); + dy = (sdy >> 16); + if ((unsigned)dx < (unsigned)src->w && (unsigned)dy < (unsigned)src->h) { + if (flipx) dx = (src->w-1)-dx; + if (flipy) dy = (src->h-1)-dy; + *pc = *((tColorY *)src->pixels + src->pitch * dy + dx); } sdx += icos; sdy += isin; From d763a9f64dd653eb7cb52ad3dd80c56cef882ba2 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 19 Jun 2015 23:22:53 -0700 Subject: [PATCH 08/15] Fixed bug 2538 - SDL_SetTextureAlphaMod does not work with SDL_FlipMode or rotation in the software renderer Adam M. When setting a texture alpha mod other than 255 and also specifying a flip mode in the software renderer, the rendering fails. When the texture has an alpha channel, it becomes invisible when flipped. When the texture does not have an alpha channel, it is flipped but the colors are wrong: the alpha mod makes the texture darker rather than more translucent. 0) Initialize a software renderer. 1) Load 16-bit 565 or 32-bit texture. 2) Set texture blend mode to BLEND. 3) Set texture alpha mod to 150. 4) Draw the texture flipped horizontally and/or vertically. --- src/render/software/SDL_rotate.c | 35 ++++++++++++++++---------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/src/render/software/SDL_rotate.c b/src/render/software/SDL_rotate.c index 3a8bc21db46aa..89a3aac2b7e1a 100644 --- a/src/render/software/SDL_rotate.c +++ b/src/render/software/SDL_rotate.c @@ -342,7 +342,7 @@ SDLgfx_rotateSurface(SDL_Surface * src, double angle, int centerx, int centery, SDL_Surface *rz_src; SDL_Surface *rz_dst; int is32bit; - int i, src_converted; + int i; Uint8 r,g,b; Uint32 colorkey = 0; int colorKeyAvailable = 0; @@ -369,27 +369,15 @@ SDLgfx_rotateSurface(SDL_Surface * src, double angle, int centerx, int centery, * Use source surface 'as is' */ rz_src = src; - src_converted = 0; } else { - /* - * New source surface is 32bit with a defined RGBA ordering - */ - rz_src = - SDL_CreateRGBSurface(SDL_SWSURFACE, src->w, src->h, 32, + Uint32 format = SDL_MasksToPixelFormatEnum(32, #if SDL_BYTEORDER == SDL_LIL_ENDIAN 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 #else 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff #endif - ); - if(colorKeyAvailable) - SDL_SetColorKey(src, 0, 0); - - SDL_BlitSurface(src, NULL, rz_src, NULL); - - if(colorKeyAvailable) - SDL_SetColorKey(src, SDL_TRUE /* SDL_SRCCOLORKEY */, colorkey); - src_converted = 1; + ); + rz_src = SDL_ConvertSurfaceFormat(src, format, src->flags); is32bit = 1; } @@ -474,6 +462,19 @@ SDLgfx_rotateSurface(SDL_Surface * src, double angle, int centerx, int centery, flipx, flipy); SDL_SetColorKey(rz_dst, /* SDL_SRCCOLORKEY */ SDL_TRUE | SDL_RLEACCEL, _colorkey(rz_src)); } + + /* copy alpha mod, color mod, and blend mode */ + { + SDL_BlendMode blendMode; + Uint8 alphaMod, r, g, b; + SDL_GetSurfaceAlphaMod(src, &alphaMod); + SDL_GetSurfaceBlendMode(src, &blendMode); + SDL_GetSurfaceColorMod(src, &r, &g, &b); + SDL_SetSurfaceAlphaMod(rz_dst, alphaMod); + SDL_SetSurfaceBlendMode(rz_dst, blendMode); + SDL_SetSurfaceColorMod(rz_dst, r, g, b); + } + /* * Unlock source surface */ @@ -484,7 +485,7 @@ SDLgfx_rotateSurface(SDL_Surface * src, double angle, int centerx, int centery, /* * Cleanup temp surface */ - if (src_converted) { + if (rz_src != src) { SDL_FreeSurface(rz_src); } From f6b788f095f50406a40cbec3100c3ee4ae70c445 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 19 Jun 2015 23:27:35 -0700 Subject: [PATCH 09/15] Simplified Mercurial ignore rules for Xcode build products --- .hgignore | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/.hgignore b/.hgignore index 489f09a64da0c..0cea8d699a54d 100644 --- a/.hgignore +++ b/.hgignore @@ -9,8 +9,6 @@ sdl-config SDL2.spec build Build -*xcuserdata* -*xcworkspacedata* # for Xcode *.orig @@ -20,20 +18,12 @@ Build *~ *.o *.mode1* -*.model* -*.perspective* *.perspective* *.pbxuser (^|/)build($|/) .DS_Store -Xcode/SDL/SDL.xcodeproj/xcuserdata -Xcode/SDL/SDL.xcodeproj/project.xcworkspace -Xcode/SDLTest/SDLTest.xcodeproj/xcuserdata -Xcode/SDLTest/SDLTest.xcodeproj/project.xcworkspace -Xcode-iOS/SDL/SDL.xcodeproj/xcuserdata -Xcode-iOS/SDL/SDL.xcodeproj/project.xcworkspace -Xcode-iOS/Demos/Demos.xcodeproj/xcuserdata -Xcode-iOS/Demos/Demos.xcodeproj/project.xcworkspace +*xcuserdata +*xcworkspace* # for Visual C++ Debug From 3426c99acfcd69ca7628e67360f6a8a7444442fb Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 19 Jun 2015 23:32:37 -0700 Subject: [PATCH 10/15] Cleaned up Xcode rules a little more --- .hgignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.hgignore b/.hgignore index 0cea8d699a54d..467cb78bf6478 100644 --- a/.hgignore +++ b/.hgignore @@ -22,8 +22,8 @@ Build *.pbxuser (^|/)build($|/) .DS_Store -*xcuserdata -*xcworkspace* +xcuserdata +*.xcworkspace # for Visual C++ Debug From f71fa2f4028db82bf512f0fc4bff0557748728e0 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 19 Jun 2015 23:40:23 -0700 Subject: [PATCH 11/15] Android has clock_gettime() - thanks Michael Labbe! --- include/SDL_config_android.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/SDL_config_android.h b/include/SDL_config_android.h index 1d2b1ae1fe555..8d5f1e5f2cf7b 100644 --- a/include/SDL_config_android.h +++ b/include/SDL_config_android.h @@ -104,6 +104,7 @@ #define HAVE_SETJMP 1 #define HAVE_NANOSLEEP 1 #define HAVE_SYSCONF 1 +#define HAVE_CLOCK_GETTIME 1 #define SIZEOF_VOIDP 4 From 903df4afbda3e9492aae4e2e626b7f87874e9894 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 19 Jun 2015 23:49:00 -0700 Subject: [PATCH 12/15] Use CLOCK_MONOTONIC_RAW, if available, which is not subject to adjustment by NTP --- src/timer/unix/SDL_systimer.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/timer/unix/SDL_systimer.c b/src/timer/unix/SDL_systimer.c index bea7deb5f3781..98917214dbd77 100644 --- a/src/timer/unix/SDL_systimer.c +++ b/src/timer/unix/SDL_systimer.c @@ -48,6 +48,15 @@ #include #endif +/* Use CLOCK_MONOTONIC_RAW, if available, which is not subject to adjustment by NTP */ +#if HAVE_CLOCK_GETTIME +#ifdef CLOCK_MONOTONIC_RAW +#define SDL_MONOTONIC_CLOCK CLOCK_MONOTONIC_RAW +#else +#define SDL_MONOTONIC_CLOCK CLOCK_MONOTONIC +#endif +#endif + /* The first ticks value of the application */ #if HAVE_CLOCK_GETTIME static struct timespec start_ts; @@ -69,7 +78,7 @@ SDL_TicksInit(void) /* Set first ticks value */ #if HAVE_CLOCK_GETTIME - if (clock_gettime(CLOCK_MONOTONIC, &start_ts) == 0) { + if (clock_gettime(SDL_MONOTONIC_CLOCK, &start_ts) == 0) { has_monotonic_time = SDL_TRUE; } else #elif defined(__APPLE__) @@ -101,7 +110,7 @@ SDL_GetTicks(void) if (has_monotonic_time) { #if HAVE_CLOCK_GETTIME struct timespec now; - clock_gettime(CLOCK_MONOTONIC, &now); + clock_gettime(SDL_MONOTONIC_CLOCK, &now); ticks = (now.tv_sec - start_ts.tv_sec) * 1000 + (now.tv_nsec - start_ts.tv_nsec) / 1000000; #elif defined(__APPLE__) @@ -132,7 +141,7 @@ SDL_GetPerformanceCounter(void) #if HAVE_CLOCK_GETTIME struct timespec now; - clock_gettime(CLOCK_MONOTONIC, &now); + clock_gettime(SDL_MONOTONIC_CLOCK, &now); ticks = now.tv_sec; ticks *= 1000000000; ticks += now.tv_nsec; From fb5732dc5c0b5bbda351a88c1dbe79a1fe30c56f Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 19 Jun 2015 23:53:33 -0700 Subject: [PATCH 13/15] GCC is warning about global functions with the same name as variables in the code, when using -Wshadow. This is a little ridiculous because we have no idea what functions a given platform will provide, so we'll disable -Wshadow for now. --- configure | 38 -------------------------------------- configure.in | 23 ----------------------- 2 files changed, 61 deletions(-) diff --git a/configure b/configure index 6a863330e8cdd..50c4551bb8e4a 100755 --- a/configure +++ b/configure @@ -18701,43 +18701,6 @@ $as_echo "$need_gcc_Wno_multichar" >&6; } fi } -CheckWarnShadow() -{ - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GCC -Wshadow option" >&5 -$as_echo_n "checking for GCC -Wshadow option... " >&6; } - have_gcc_Wshadow=no - - save_CFLAGS="$CFLAGS" - CFLAGS="$save_CFLAGS -Wshadow" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - - int x = 0; - -int -main () -{ - - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - - have_gcc_Wshadow=yes - -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_gcc_Wshadow" >&5 -$as_echo "$have_gcc_Wshadow" >&6; } - CFLAGS="$save_CFLAGS" - - if test x$have_gcc_Wshadow = xyes; then - EXTRA_CFLAGS="$EXTRA_CFLAGS -Wshadow" - fi -} - CheckWayland() { # Check whether --enable-video-wayland was given. @@ -23652,7 +23615,6 @@ $as_echo "#define SDL_TIMER_UNIX 1" >>confdefs.h esac CheckWarnAll -CheckWarnShadow # Verify that we have all the platform specific files we need diff --git a/configure.in b/configure.in index 75b2d21ab0b54..1339ea829b405 100644 --- a/configure.in +++ b/configure.in @@ -1159,28 +1159,6 @@ CheckWarnAll() fi } -dnl See if GCC's -Wshadow is supported. -CheckWarnShadow() -{ - AC_MSG_CHECKING(for GCC -Wshadow option) - have_gcc_Wshadow=no - - save_CFLAGS="$CFLAGS" - CFLAGS="$save_CFLAGS -Wshadow" - AC_TRY_COMPILE([ - int x = 0; - ],[ - ],[ - have_gcc_Wshadow=yes - ]) - AC_MSG_RESULT($have_gcc_Wshadow) - CFLAGS="$save_CFLAGS" - - if test x$have_gcc_Wshadow = xyes; then - EXTRA_CFLAGS="$EXTRA_CFLAGS -Wshadow" - fi -} - dnl Check for Wayland CheckWayland() { @@ -3415,7 +3393,6 @@ esac dnl Do this on all platforms, after everything else. CheckWarnAll -CheckWarnShadow # Verify that we have all the platform specific files we need From 36af63f0c002407bc540ca98ee806132edd59d97 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sat, 20 Jun 2015 00:25:28 -0700 Subject: [PATCH 14/15] Added the docs directory to the release archive --- Makefile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.in b/Makefile.in index 62b9269ee136f..0b18e67fbffb4 100644 --- a/Makefile.in +++ b/Makefile.in @@ -39,7 +39,7 @@ SDLMAIN_OBJECTS = @SDLMAIN_OBJECTS@ SDLTEST_TARGET = libSDL2_test.a SDLTEST_OBJECTS = @SDLTEST_OBJECTS@ -SRC_DIST = *.txt acinclude Android.mk autogen.sh android-project build-scripts cmake configure configure.in debian include Makefile.* sdl2-config.in sdl2.m4 sdl2.pc.in SDL2.spec.in src test VisualC.html VisualC Xcode Xcode-iOS +SRC_DIST = *.txt acinclude Android.mk autogen.sh android-project build-scripts cmake configure configure.in debian docs include Makefile.* sdl2-config.in sdl2.m4 sdl2.pc.in SDL2.spec.in src test VisualC.html VisualC Xcode Xcode-iOS GEN_DIST = SDL2.spec ifneq ($V,1) From 4393a711108e534eeb30759e09ff53df28c22c95 Mon Sep 17 00:00:00 2001 From: Philipp Wiesemann Date: Sat, 20 Jun 2015 11:15:37 +0200 Subject: [PATCH 15/15] Added missing file and folder to the release archive. --- Makefile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.in b/Makefile.in index 0b18e67fbffb4..ef633521a98c7 100644 --- a/Makefile.in +++ b/Makefile.in @@ -39,7 +39,7 @@ SDLMAIN_OBJECTS = @SDLMAIN_OBJECTS@ SDLTEST_TARGET = libSDL2_test.a SDLTEST_OBJECTS = @SDLTEST_OBJECTS@ -SRC_DIST = *.txt acinclude Android.mk autogen.sh android-project build-scripts cmake configure configure.in debian docs include Makefile.* sdl2-config.in sdl2.m4 sdl2.pc.in SDL2.spec.in src test VisualC.html VisualC Xcode Xcode-iOS +SRC_DIST = *.txt acinclude Android.mk autogen.sh android-project build-scripts cmake cmake_uninstall.cmake.in configure configure.in debian docs include Makefile.* sdl2-config.in sdl2.m4 sdl2.pc.in SDL2.spec.in src test VisualC.html VisualC VisualC-WinRT Xcode Xcode-iOS GEN_DIST = SDL2.spec ifneq ($V,1)