diff -r c65a4cfdd8b2 include/SDL_blendmode.h --- a/include/SDL_blendmode.h Wed Jun 18 10:04:21 2014 -0300 +++ b/include/SDL_blendmode.h Wed Jun 18 22:43:25 2014 +0200 @@ -47,9 +47,12 @@ SDL_BLENDMODE_ADD = 0x00000002, /**< additive blending dstRGB = (srcRGB * srcA) + dstRGB dstA = dstA */ - SDL_BLENDMODE_MOD = 0x00000004 /**< color modulate + SDL_BLENDMODE_MOD = 0x00000004, /**< color modulate dstRGB = srcRGB * dstRGB dstA = dstA */ + SDL_BLENDMODE_BLEND_DSTA = 0x00000008 /**< alpha blending + dstRGB = (srcRGB * srcA) + (dstRGB * (1-srcA)) + dstA = dstA */ } SDL_BlendMode; /* Ends C function definitions when using C++ */ diff -r c65a4cfdd8b2 src/render/direct3d/SDL_render_d3d.c --- a/src/render/direct3d/SDL_render_d3d.c Wed Jun 18 10:04:21 2014 -0300 +++ b/src/render/direct3d/SDL_render_d3d.c Wed Jun 18 22:43:25 2014 +0200 @@ -1348,6 +1348,20 @@ D3DBLEND_ONE); } break; + case SDL_BLENDMODE_BLEND_DSTA: + IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE, + TRUE); + IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLEND, + D3DBLEND_SRCALPHA); + IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLEND, + D3DBLEND_INVSRCALPHA); + if (data->enableSeparateAlphaBlend) { + IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLENDALPHA, + D3DBLEND_ZERO); + IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLENDALPHA, + D3DBLEND_ONE); + } + break; } } diff -r c65a4cfdd8b2 src/render/direct3d11/SDL_render_d3d11.c --- a/src/render/direct3d11/SDL_render_d3d11.c Wed Jun 18 10:04:21 2014 -0300 +++ b/src/render/direct3d11/SDL_render_d3d11.c Wed Jun 18 22:43:25 2014 +0200 @@ -113,6 +113,7 @@ ID3D11BlendState *blendModeBlend; ID3D11BlendState *blendModeAdd; ID3D11BlendState *blendModeMod; + ID3D11BlendState *blendModeBlendDstA; ID3D11SamplerState *nearestPixelSampler; ID3D11SamplerState *linearSampler; D3D_FEATURE_LEVEL featureLevel; @@ -1294,6 +1295,19 @@ goto done; } + result = D3D11_CreateBlendMode( + renderer, + TRUE, + D3D11_BLEND_SRC_ALPHA, /* srcBlend */ + D3D11_BLEND_INV_SRC_ALPHA, /* destBlend */ + D3D11_BLEND_ZERO, /* srcBlendAlpha */ + D3D11_BLEND_ONE , /* destBlendAlpha */ + &data->blendModeBlendDstA); + if (FAILED(result)) { + /* D3D11_CreateBlendMode will set the SDL error, if it fails */ + goto done; + } + /* Setup render state that doesn't change */ ID3D11DeviceContext_IASetInputLayout(data->d3dContext, data->inputLayout); ID3D11DeviceContext_VSSetShader(data->d3dContext, data->vertexShader, NULL, 0); @@ -2406,6 +2420,9 @@ case SDL_BLENDMODE_MOD: blendState = rendererData->blendModeMod; break; + case SDL_BLENDMODE_BLEND_DSTA: + blendState = rendererData->blendModeBlendDstA; + break; case SDL_BLENDMODE_NONE: blendState = NULL; break; diff -r c65a4cfdd8b2 src/render/opengl/SDL_render_gl.c --- a/src/render/opengl/SDL_render_gl.c Wed Jun 18 10:04:21 2014 -0300 +++ b/src/render/opengl/SDL_render_gl.c Wed Jun 18 22:43:25 2014 +0200 @@ -1036,6 +1036,11 @@ data->glEnable(GL_BLEND); data->glBlendFuncSeparate(GL_ZERO, GL_SRC_COLOR, GL_ZERO, GL_ONE); break; + case SDL_BLENDMODE_BLEND_DSTA: + data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + data->glEnable(GL_BLEND); + data->glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE); + break; } data->current.blendMode = blendMode; } diff -r c65a4cfdd8b2 src/render/opengles/SDL_render_gles.c --- a/src/render/opengles/SDL_render_gles.c Wed Jun 18 10:04:21 2014 -0300 +++ b/src/render/opengles/SDL_render_gles.c Wed Jun 18 22:43:25 2014 +0200 @@ -750,6 +750,15 @@ data->glBlendFunc(GL_ZERO, GL_SRC_COLOR); } break; + case SDL_BLENDMODE_BLEND_DSTA: + data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + data->glEnable(GL_BLEND); + if (data->GL_OES_blend_func_separate_supported) { + data->glBlendFuncSeparateOES(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE); + } else { + data->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } + break; } data->current.blendMode = blendMode; } diff -r c65a4cfdd8b2 src/render/opengles2/SDL_render_gles2.c --- a/src/render/opengles2/SDL_render_gles2.c Wed Jun 18 10:04:21 2014 -0300 +++ b/src/render/opengles2/SDL_render_gles2.c Wed Jun 18 22:43:25 2014 +0200 @@ -1227,6 +1227,10 @@ data->glEnable(GL_BLEND); data->glBlendFuncSeparate(GL_ZERO, GL_SRC_COLOR, GL_ZERO, GL_ONE); break; + case SDL_BLENDMODE_BLEND_DSTA: + data->glEnable(GL_BLEND); + data->glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE); + break; } data->current.blendMode = blendMode; }