Updated blend semantics so blending uses the following formula:

dstRGB = (srcRGB * srcA) + (dstRGB * (1-srcA))
    dstA = srcA + (dstA * (1-srcA))
This allows proper compositing semantics without requiring premultiplied alpha.

Needs full unit test coverage and bug fixes!
This commit is contained in:
Sam Lantinga 2013-07-23 08:06:49 -07:00
parent a99edf3519
commit 32188834b5
17 changed files with 362 additions and 1001 deletions

View file

@ -39,10 +39,17 @@ extern "C" {
*/ */
typedef enum typedef enum
{ {
SDL_BLENDMODE_NONE = 0x00000000, /**< No blending */ SDL_BLENDMODE_NONE = 0x00000000, /**< no blending
SDL_BLENDMODE_BLEND = 0x00000001, /**< dst = (src * A) + (dst * (1-A)) */ dstRGBA = srcRGBA */
SDL_BLENDMODE_ADD = 0x00000002, /**< dst = (src * A) + dst */ SDL_BLENDMODE_BLEND = 0x00000001, /**< alpha blending
SDL_BLENDMODE_MOD = 0x00000004 /**< dst = src * dst */ dstRGB = (srcRGB * srcA) + (dstRGB * (1-srcA))
dstA = srcA + (dstA * (1-srcA)) */
SDL_BLENDMODE_ADD = 0x00000002, /**< additive blending
dstRGB = (srcRGB * srcA) + dstRGB
dstA = dstA */
SDL_BLENDMODE_MOD = 0x00000004 /**< color modulate
dstRGB = srcRGB * dstRGB
dstA = dstA */
} SDL_BlendMode; } SDL_BlendMode;
/* Ends C function definitions when using C++ */ /* Ends C function definitions when using C++ */

View file

@ -399,44 +399,42 @@ extern DECLSPEC int SDLCALL SDL_FillRects
* *
* The blit function should not be called on a locked surface. * The blit function should not be called on a locked surface.
* *
* The blit semantics for surfaces with and without alpha and colorkey * The blit semantics for surfaces with and without blending and colorkey
* are defined as follows: * are defined as follows:
* \verbatim * \verbatim
RGBA->RGB: RGBA->RGB:
SDL_SRCALPHA set: Source surface blend mode set to SDL_BLENDMODE_BLEND:
alpha-blend (using alpha-channel). alpha-blend (using the source alpha-channel and per-surface alpha)
SDL_SRCCOLORKEY ignored. SDL_SRCCOLORKEY ignored.
SDL_SRCALPHA not set: Source surface blend mode set to SDL_BLENDMODE_NONE:
copy RGB. copy RGB.
if SDL_SRCCOLORKEY set, only copy the pixels matching the if SDL_SRCCOLORKEY set, only copy the pixels matching the
RGB values of the source color key, ignoring alpha in the RGB values of the source color key, ignoring alpha in the
comparison. comparison.
RGB->RGBA: RGB->RGBA:
SDL_SRCALPHA set: Source surface blend mode set to SDL_BLENDMODE_BLEND:
alpha-blend (using the source per-surface alpha value); alpha-blend (using the source per-surface alpha)
set destination alpha to opaque. Source surface blend mode set to SDL_BLENDMODE_NONE:
SDL_SRCALPHA not set:
copy RGB, set destination alpha to source per-surface alpha value. copy RGB, set destination alpha to source per-surface alpha value.
both: both:
if SDL_SRCCOLORKEY set, only copy the pixels matching the if SDL_SRCCOLORKEY set, only copy the pixels matching the
source color key. source color key.
RGBA->RGBA: RGBA->RGBA:
SDL_SRCALPHA set: Source surface blend mode set to SDL_BLENDMODE_BLEND:
alpha-blend (using the source alpha channel) the RGB values; alpha-blend (using the source alpha-channel and per-surface alpha)
leave destination alpha untouched. [Note: is this correct?]
SDL_SRCCOLORKEY ignored. SDL_SRCCOLORKEY ignored.
SDL_SRCALPHA not set: Source surface blend mode set to SDL_BLENDMODE_NONE:
copy all of RGBA to the destination. copy all of RGBA to the destination.
if SDL_SRCCOLORKEY set, only copy the pixels matching the if SDL_SRCCOLORKEY set, only copy the pixels matching the
RGB values of the source color key, ignoring alpha in the RGB values of the source color key, ignoring alpha in the
comparison. comparison.
RGB->RGB: RGB->RGB:
SDL_SRCALPHA set: Source surface blend mode set to SDL_BLENDMODE_BLEND:
alpha-blend (using the source per-surface alpha value). alpha-blend (using the source per-surface alpha)
SDL_SRCALPHA not set: Source surface blend mode set to SDL_BLENDMODE_NONE:
copy RGB. copy RGB.
both: both:
if SDL_SRCCOLORKEY set, only copy the pixels matching the if SDL_SRCCOLORKEY set, only copy the pixels matching the

View file

@ -227,6 +227,7 @@ typedef struct
D3DPRESENT_PARAMETERS pparams; D3DPRESENT_PARAMETERS pparams;
SDL_bool updateSize; SDL_bool updateSize;
SDL_bool beginScene; SDL_bool beginScene;
SDL_bool enableSeparateAlphaBlend;
D3DTEXTUREFILTERTYPE scaleMode; D3DTEXTUREFILTERTYPE scaleMode;
IDirect3DSurface9 *defaultRenderTarget; IDirect3DSurface9 *defaultRenderTarget;
IDirect3DSurface9 *currentRenderTarget; IDirect3DSurface9 *currentRenderTarget;
@ -615,6 +616,10 @@ D3D_CreateRenderer(SDL_Window * window, Uint32 flags)
renderer->info.flags |= SDL_RENDERER_TARGETTEXTURE; renderer->info.flags |= SDL_RENDERER_TARGETTEXTURE;
} }
if (caps.PrimitiveMiscCaps & D3DPMISCCAPS_SEPARATEALPHABLEND) {
data->enableSeparateAlphaBlend = SDL_TRUE;
}
/* Set up parameters for rendering */ /* Set up parameters for rendering */
IDirect3DDevice9_SetVertexShader(data->device, NULL); IDirect3DDevice9_SetVertexShader(data->device, NULL);
IDirect3DDevice9_SetFVF(data->device, IDirect3DDevice9_SetFVF(data->device,
@ -637,6 +642,10 @@ D3D_CreateRenderer(SDL_Window * window, Uint32 flags)
D3DTA_TEXTURE); D3DTA_TEXTURE);
IDirect3DDevice9_SetTextureStageState(data->device, 0, D3DTSS_ALPHAARG2, IDirect3DDevice9_SetTextureStageState(data->device, 0, D3DTSS_ALPHAARG2,
D3DTA_DIFFUSE); D3DTA_DIFFUSE);
/* Enable separate alpha blend function, if possible */
if (data->enableSeparateAlphaBlend) {
IDirect3DDevice9_SetRenderState(data->device, D3DRS_SEPARATEALPHABLENDENABLE, TRUE);
}
/* Disable second texture stage, since we're done */ /* Disable second texture stage, since we're done */
IDirect3DDevice9_SetTextureStageState(data->device, 1, D3DTSS_COLOROP, IDirect3DDevice9_SetTextureStageState(data->device, 1, D3DTSS_COLOROP,
D3DTOP_DISABLE); D3DTOP_DISABLE);
@ -979,6 +988,12 @@ D3D_SetBlendMode(D3D_RenderData * data, int blendMode)
D3DBLEND_SRCALPHA); D3DBLEND_SRCALPHA);
IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLEND, IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLEND,
D3DBLEND_INVSRCALPHA); D3DBLEND_INVSRCALPHA);
if (data->enableSeparateAlphaBlend) {
IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLENDALPHA,
D3DBLEND_ONE);
IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLENDALPHA,
D3DBLEND_INVSRCALPHA);
}
break; break;
case SDL_BLENDMODE_ADD: case SDL_BLENDMODE_ADD:
IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE, IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE,
@ -987,6 +1002,12 @@ D3D_SetBlendMode(D3D_RenderData * data, int blendMode)
D3DBLEND_SRCALPHA); D3DBLEND_SRCALPHA);
IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLEND, IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLEND,
D3DBLEND_ONE); D3DBLEND_ONE);
if (data->enableSeparateAlphaBlend) {
IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLENDALPHA,
D3DBLEND_ZERO);
IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLENDALPHA,
D3DBLEND_ONE);
}
break; break;
case SDL_BLENDMODE_MOD: case SDL_BLENDMODE_MOD:
IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE, IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE,
@ -995,6 +1016,12 @@ D3D_SetBlendMode(D3D_RenderData * data, int blendMode)
D3DBLEND_ZERO); D3DBLEND_ZERO);
IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLEND, IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLEND,
D3DBLEND_SRCCOLOR); D3DBLEND_SRCCOLOR);
if (data->enableSeparateAlphaBlend) {
IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLENDALPHA,
D3DBLEND_ZERO);
IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLENDALPHA,
D3DBLEND_ONE);
}
break; break;
} }
} }

View file

@ -15,6 +15,7 @@ SDL_PROC_UNUSED(void, glBitmap,
(GLsizei, GLsizei, GLfloat, GLfloat, GLfloat, GLfloat, (GLsizei, GLsizei, GLfloat, GLfloat, GLfloat, GLfloat,
const GLubyte *)) const GLubyte *))
SDL_PROC(void, glBlendFunc, (GLenum, GLenum)) SDL_PROC(void, glBlendFunc, (GLenum, GLenum))
SDL_PROC(void, glBlendFuncSeparate, (GLenum, GLenum, GLenum, GLenum))
SDL_PROC_UNUSED(void, glCallList, (GLuint)) SDL_PROC_UNUSED(void, glCallList, (GLuint))
SDL_PROC_UNUSED(void, glCallLists, (GLsizei, GLenum, const GLvoid *)) SDL_PROC_UNUSED(void, glCallLists, (GLsizei, GLenum, const GLvoid *))
SDL_PROC(void, glClear, (GLbitfield)) SDL_PROC(void, glClear, (GLbitfield))

View file

@ -924,17 +924,17 @@ GL_SetBlendMode(GL_RenderData * data, int blendMode)
case SDL_BLENDMODE_BLEND: case SDL_BLENDMODE_BLEND:
data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
data->glEnable(GL_BLEND); data->glEnable(GL_BLEND);
data->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); data->glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
break; break;
case SDL_BLENDMODE_ADD: case SDL_BLENDMODE_ADD:
data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
data->glEnable(GL_BLEND); data->glEnable(GL_BLEND);
data->glBlendFunc(GL_SRC_ALPHA, GL_ONE); data->glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE, GL_ZERO, GL_ONE);
break; break;
case SDL_BLENDMODE_MOD: case SDL_BLENDMODE_MOD:
data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
data->glEnable(GL_BLEND); data->glEnable(GL_BLEND);
data->glBlendFunc(GL_ZERO, GL_SRC_COLOR); data->glBlendFuncSeparate(GL_ZERO, GL_SRC_COLOR, GL_ZERO, GL_ONE);
break; break;
} }
data->current.blendMode = blendMode; data->current.blendMode = blendMode;

View file

@ -1,5 +1,6 @@
SDL_PROC(void, glBindTexture, (GLenum, GLuint)) SDL_PROC(void, glBindTexture, (GLenum, GLuint))
SDL_PROC(void, glBlendFunc, (GLenum, GLenum)) SDL_PROC(void, glBlendFunc, (GLenum, GLenum))
SDL_PROC(void, glBlendFuncSeparateOES, (GLenum, GLenum, GLenum, GLenum))
SDL_PROC(void, glClear, (GLbitfield)) SDL_PROC(void, glClear, (GLbitfield))
SDL_PROC(void, glClearColor, (GLclampf, GLclampf, GLclampf, GLclampf)) SDL_PROC(void, glClearColor, (GLclampf, GLclampf, GLclampf, GLclampf))
SDL_PROC(void, glColor4f, (GLfloat, GLfloat, GLfloat, GLfloat)) SDL_PROC(void, glColor4f, (GLfloat, GLfloat, GLfloat, GLfloat))

View file

@ -121,6 +121,7 @@ typedef struct
SDL_bool useDrawTexture; SDL_bool useDrawTexture;
SDL_bool GL_OES_draw_texture_supported; SDL_bool GL_OES_draw_texture_supported;
SDL_bool GL_OES_blend_func_separate_supported;
} GLES_RenderData; } GLES_RenderData;
typedef struct typedef struct
@ -376,6 +377,10 @@ GLES_CreateRenderer(SDL_Window * window, Uint32 flags)
} }
data->framebuffers = NULL; data->framebuffers = NULL;
if (SDL_GL_ExtensionSupported("GL_OES_blend_func_separate")) {
data->GL_OES_blend_func_separate_supported = SDL_TRUE;
}
/* Set up parameters for rendering */ /* Set up parameters for rendering */
GLES_ResetState(renderer); GLES_ResetState(renderer);
@ -680,17 +685,29 @@ GLES_SetBlendMode(GLES_RenderData * data, int blendMode)
case SDL_BLENDMODE_BLEND: case SDL_BLENDMODE_BLEND:
data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
data->glEnable(GL_BLEND); data->glEnable(GL_BLEND);
data->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); if (data->GL_OES_blend_func_separate_supported) {
data->glBlendFuncSeparateOES(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
} else {
data->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
break; break;
case SDL_BLENDMODE_ADD: case SDL_BLENDMODE_ADD:
data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
data->glEnable(GL_BLEND); data->glEnable(GL_BLEND);
data->glBlendFunc(GL_SRC_ALPHA, GL_ONE); if (data->GL_OES_blend_func_separate_supported) {
data->glBlendFuncSeparateOES(GL_SRC_ALPHA, GL_ONE, GL_ZERO, GL_ONE);
} else {
data->glBlendFunc(GL_SRC_ALPHA, GL_ONE);
}
break; break;
case SDL_BLENDMODE_MOD: case SDL_BLENDMODE_MOD:
data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
data->glEnable(GL_BLEND); data->glEnable(GL_BLEND);
data->glBlendFunc(GL_ZERO, GL_SRC_COLOR); if (data->GL_OES_blend_func_separate_supported) {
data->glBlendFuncSeparateOES(GL_ZERO, GL_SRC_COLOR, GL_ZERO, GL_ONE);
} else {
data->glBlendFunc(GL_ZERO, GL_SRC_COLOR);
}
break; break;
} }
data->current.blendMode = blendMode; data->current.blendMode = blendMode;

View file

@ -2,7 +2,7 @@ SDL_PROC(void, glActiveTexture, (GLenum))
SDL_PROC(void, glAttachShader, (GLuint, GLuint)) SDL_PROC(void, glAttachShader, (GLuint, GLuint))
SDL_PROC(void, glBindAttribLocation, (GLuint, GLuint, const char *)) SDL_PROC(void, glBindAttribLocation, (GLuint, GLuint, const char *))
SDL_PROC(void, glBindTexture, (GLenum, GLuint)) SDL_PROC(void, glBindTexture, (GLenum, GLuint))
SDL_PROC(void, glBlendFunc, (GLenum, GLenum)) SDL_PROC(void, glBlendFuncSeparate, (GLenum, GLenum, GLenum, GLenum))
SDL_PROC(void, glClear, (GLbitfield)) SDL_PROC(void, glClear, (GLbitfield))
SDL_PROC(void, glClearColor, (GLclampf, GLclampf, GLclampf, GLclampf)) SDL_PROC(void, glClearColor, (GLclampf, GLclampf, GLclampf, GLclampf))
SDL_PROC(void, glCompileShader, (GLuint)) SDL_PROC(void, glCompileShader, (GLuint))

View file

@ -994,15 +994,15 @@ GLES2_SetBlendMode(GLES2_DriverContext *rdata, int blendMode)
break; break;
case SDL_BLENDMODE_BLEND: case SDL_BLENDMODE_BLEND:
rdata->glEnable(GL_BLEND); rdata->glEnable(GL_BLEND);
rdata->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); rdata->glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
break; break;
case SDL_BLENDMODE_ADD: case SDL_BLENDMODE_ADD:
rdata->glEnable(GL_BLEND); rdata->glEnable(GL_BLEND);
rdata->glBlendFunc(GL_SRC_ALPHA, GL_ONE); rdata->glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE, GL_ZERO, GL_ONE);
break; break;
case SDL_BLENDMODE_MOD: case SDL_BLENDMODE_MOD:
rdata->glEnable(GL_BLEND); rdata->glEnable(GL_BLEND);
rdata->glBlendFunc(GL_ZERO, GL_SRC_COLOR); rdata->glBlendFuncSeparate(GL_ZERO, GL_SRC_COLOR, GL_ZERO, GL_ONE);
break; break;
} }
rdata->current.blendMode = blendMode; rdata->current.blendMode = blendMode;

View file

@ -440,12 +440,22 @@ do { \
} \ } \
} }
/* Blend the RGB values of two Pixels based on a source alpha value */ /* Blend the RGB values of two pixels with an alpha value */
#define ALPHA_BLEND(sR, sG, sB, A, dR, dG, dB) \ #define ALPHA_BLEND_RGB(sR, sG, sB, A, dR, dG, dB) \
do { \ do { \
dR = ((((int)(sR-dR)*(int)A)/255)+dR); \ dR = ((((unsigned)(sR-dR)*(unsigned)A)/255)+dR); \
dG = ((((int)(sG-dG)*(int)A)/255)+dG); \ dG = ((((unsigned)(sG-dG)*(unsigned)A)/255)+dG); \
dB = ((((int)(sB-dB)*(int)A)/255)+dB); \ dB = ((((unsigned)(sB-dB)*(unsigned)A)/255)+dB); \
} while(0)
/* Blend the RGBA values of two pixels */
#define ALPHA_BLEND_RGBA(sR, sG, sB, sA, dR, dG, dB, dA) \
do { \
dR = ((((unsigned)(sR-dR)*(unsigned)sA)/255)+dR); \
dG = ((((unsigned)(sG-dG)*(unsigned)sA)/255)+dG); \
dB = ((((unsigned)(sB-dB)*(unsigned)sA)/255)+dB); \
dA = ((unsigned)sA+(unsigned)dA-((unsigned)sA*dA)/255); \
} while(0) } while(0)

View file

@ -363,7 +363,10 @@ BlitBtoNAlpha(SDL_BlitInfo * info)
SDL_PixelFormat *dstfmt = info->dst_fmt; SDL_PixelFormat *dstfmt = info->dst_fmt;
int dstbpp; int dstbpp;
int c; int c;
const int A = info->a; Uint32 pixel;
unsigned sR, sG, sB;
unsigned dR, dG, dB, dA;
const unsigned A = info->a;
/* Set up some basic variables */ /* Set up some basic variables */
dstbpp = dstfmt->BytesPerPixel; dstbpp = dstfmt->BytesPerPixel;
@ -377,15 +380,12 @@ BlitBtoNAlpha(SDL_BlitInfo * info)
} }
bit = (byte & 0x80) >> 7; bit = (byte & 0x80) >> 7;
if (1) { if (1) {
Uint32 pixel;
unsigned sR, sG, sB;
unsigned dR, dG, dB;
sR = srcpal[bit].r; sR = srcpal[bit].r;
sG = srcpal[bit].g; sG = srcpal[bit].g;
sB = srcpal[bit].b; sB = srcpal[bit].b;
DISEMBLE_RGB(dst, dstbpp, dstfmt, pixel, dR, dG, dB); DISEMBLE_RGBA(dst, dstbpp, dstfmt, pixel, dR, dG, dB, dA);
ALPHA_BLEND(sR, sG, sB, A, dR, dG, dB); ALPHA_BLEND_RGBA(sR, sG, sB, A, dR, dG, dB, dA);
ASSEMBLE_RGB(dst, dstbpp, dstfmt, dR, dG, dB); ASSEMBLE_RGBA(dst, dstbpp, dstfmt, dR, dG, dB, dA);
} }
byte <<= 1; byte <<= 1;
dst += dstbpp; dst += dstbpp;
@ -409,7 +409,10 @@ BlitBtoNAlphaKey(SDL_BlitInfo * info)
const SDL_Color *srcpal = srcfmt->palette->colors; const SDL_Color *srcpal = srcfmt->palette->colors;
int dstbpp; int dstbpp;
int c; int c;
const int A = info->a; Uint32 pixel;
unsigned sR, sG, sB;
unsigned dR, dG, dB, dA;
const unsigned A = info->a;
Uint32 ckey = info->colorkey; Uint32 ckey = info->colorkey;
/* Set up some basic variables */ /* Set up some basic variables */
@ -424,15 +427,12 @@ BlitBtoNAlphaKey(SDL_BlitInfo * info)
} }
bit = (byte & 0x80) >> 7; bit = (byte & 0x80) >> 7;
if (bit != ckey) { if (bit != ckey) {
int sR, sG, sB;
int dR, dG, dB;
Uint32 pixel;
sR = srcpal[bit].r; sR = srcpal[bit].r;
sG = srcpal[bit].g; sG = srcpal[bit].g;
sB = srcpal[bit].b; sB = srcpal[bit].b;
DISEMBLE_RGB(dst, dstbpp, dstfmt, pixel, dR, dG, dB); DISEMBLE_RGBA(dst, dstbpp, dstfmt, pixel, dR, dG, dB, dA);
ALPHA_BLEND(sR, sG, sB, A, dR, dG, dB); ALPHA_BLEND_RGBA(sR, sG, sB, A, dR, dG, dB, dA);
ASSEMBLE_RGB(dst, dstbpp, dstfmt, dR, dG, dB); ASSEMBLE_RGBA(dst, dstbpp, dstfmt, dR, dG, dB, dA);
} }
byte <<= 1; byte <<= 1;
dst += dstbpp; dst += dstbpp;

View file

@ -437,30 +437,29 @@ Blit1toNAlpha(SDL_BlitInfo * info)
SDL_PixelFormat *dstfmt = info->dst_fmt; SDL_PixelFormat *dstfmt = info->dst_fmt;
const SDL_Color *srcpal = info->src_fmt->palette->colors; const SDL_Color *srcpal = info->src_fmt->palette->colors;
int dstbpp; int dstbpp;
const int A = info->a; Uint32 pixel;
unsigned sR, sG, sB;
unsigned dR, dG, dB, dA;
const unsigned A = info->a;
/* Set up some basic variables */ /* Set up some basic variables */
dstbpp = dstfmt->BytesPerPixel; dstbpp = dstfmt->BytesPerPixel;
while (height--) { while (height--) {
int sR, sG, sB; /* *INDENT-OFF* */
int dR, dG, dB; DUFFS_LOOP4(
/* *INDENT-OFF* */ {
DUFFS_LOOP4( sR = srcpal[*src].r;
{ sG = srcpal[*src].g;
Uint32 pixel; sB = srcpal[*src].b;
sR = srcpal[*src].r; DISEMBLE_RGBA(dst, dstbpp, dstfmt, pixel, dR, dG, dB, dA);
sG = srcpal[*src].g; ALPHA_BLEND_RGBA(sR, sG, sB, A, dR, dG, dB, dA);
sB = srcpal[*src].b; ASSEMBLE_RGBA(dst, dstbpp, dstfmt, dR, dG, dB, dA);
DISEMBLE_RGB(dst, dstbpp, dstfmt, src++;
pixel, dR, dG, dB); dst += dstbpp;
ALPHA_BLEND(sR, sG, sB, A, dR, dG, dB); },
ASSEMBLE_RGB(dst, dstbpp, dstfmt, dR, dG, dB); width);
src++; /* *INDENT-ON* */
dst += dstbpp;
},
width);
/* *INDENT-ON* */
src += srcskip; src += srcskip;
dst += dstskip; dst += dstskip;
} }
@ -479,26 +478,25 @@ Blit1toNAlphaKey(SDL_BlitInfo * info)
const SDL_Color *srcpal = info->src_fmt->palette->colors; const SDL_Color *srcpal = info->src_fmt->palette->colors;
Uint32 ckey = info->colorkey; Uint32 ckey = info->colorkey;
int dstbpp; int dstbpp;
const int A = info->a; Uint32 pixel;
unsigned sR, sG, sB;
unsigned dR, dG, dB, dA;
const unsigned A = info->a;
/* Set up some basic variables */ /* Set up some basic variables */
dstbpp = dstfmt->BytesPerPixel; dstbpp = dstfmt->BytesPerPixel;
while (height--) { while (height--) {
int sR, sG, sB;
int dR, dG, dB;
/* *INDENT-OFF* */ /* *INDENT-OFF* */
DUFFS_LOOP( DUFFS_LOOP(
{ {
if ( *src != ckey ) { if ( *src != ckey ) {
Uint32 pixel;
sR = srcpal[*src].r; sR = srcpal[*src].r;
sG = srcpal[*src].g; sG = srcpal[*src].g;
sB = srcpal[*src].b; sB = srcpal[*src].b;
DISEMBLE_RGB(dst, dstbpp, dstfmt, DISEMBLE_RGBA(dst, dstbpp, dstfmt, pixel, dR, dG, dB, dA);
pixel, dR, dG, dB); ALPHA_BLEND_RGBA(sR, sG, sB, A, dR, dG, dB, dA);
ALPHA_BLEND(sR, sG, sB, A, dR, dG, dB); ASSEMBLE_RGBA(dst, dstbpp, dstfmt, dR, dG, dB, dA);
ASSEMBLE_RGB(dst, dstbpp, dstfmt, dR, dG, dB);
} }
src++; src++;
dst += dstbpp; dst += dstbpp;

File diff suppressed because it is too large Load diff

View file

@ -95,6 +95,7 @@ static void SDL_Blit_RGB888_RGB888_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -168,6 +169,7 @@ static void SDL_Blit_RGB888_RGB888_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -323,6 +325,7 @@ static void SDL_Blit_RGB888_RGB888_Modulate_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -408,6 +411,7 @@ static void SDL_Blit_RGB888_RGB888_Modulate_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -503,6 +507,7 @@ static void SDL_Blit_RGB888_BGR888_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -576,6 +581,7 @@ static void SDL_Blit_RGB888_BGR888_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -731,6 +737,7 @@ static void SDL_Blit_RGB888_BGR888_Modulate_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -816,6 +823,7 @@ static void SDL_Blit_RGB888_BGR888_Modulate_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -911,6 +919,7 @@ static void SDL_Blit_RGB888_ARGB8888_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -984,6 +993,7 @@ static void SDL_Blit_RGB888_ARGB8888_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -1139,6 +1149,7 @@ static void SDL_Blit_RGB888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -1224,6 +1235,7 @@ static void SDL_Blit_RGB888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -1319,6 +1331,7 @@ static void SDL_Blit_BGR888_RGB888_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -1392,6 +1405,7 @@ static void SDL_Blit_BGR888_RGB888_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -1547,6 +1561,7 @@ static void SDL_Blit_BGR888_RGB888_Modulate_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -1632,6 +1647,7 @@ static void SDL_Blit_BGR888_RGB888_Modulate_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -1722,6 +1738,7 @@ static void SDL_Blit_BGR888_BGR888_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -1795,6 +1812,7 @@ static void SDL_Blit_BGR888_BGR888_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -1950,6 +1968,7 @@ static void SDL_Blit_BGR888_BGR888_Modulate_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -2035,6 +2054,7 @@ static void SDL_Blit_BGR888_BGR888_Modulate_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -2130,6 +2150,7 @@ static void SDL_Blit_BGR888_ARGB8888_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -2203,6 +2224,7 @@ static void SDL_Blit_BGR888_ARGB8888_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -2358,6 +2380,7 @@ static void SDL_Blit_BGR888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -2443,6 +2466,7 @@ static void SDL_Blit_BGR888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -2538,6 +2562,7 @@ static void SDL_Blit_ARGB8888_RGB888_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -2611,6 +2636,7 @@ static void SDL_Blit_ARGB8888_RGB888_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -2766,6 +2792,7 @@ static void SDL_Blit_ARGB8888_RGB888_Modulate_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -2851,6 +2878,7 @@ static void SDL_Blit_ARGB8888_RGB888_Modulate_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -2946,6 +2974,7 @@ static void SDL_Blit_ARGB8888_BGR888_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -3019,6 +3048,7 @@ static void SDL_Blit_ARGB8888_BGR888_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -3174,6 +3204,7 @@ static void SDL_Blit_ARGB8888_BGR888_Modulate_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -3259,6 +3290,7 @@ static void SDL_Blit_ARGB8888_BGR888_Modulate_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -3349,6 +3381,7 @@ static void SDL_Blit_ARGB8888_ARGB8888_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -3422,6 +3455,7 @@ static void SDL_Blit_ARGB8888_ARGB8888_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -3577,6 +3611,7 @@ static void SDL_Blit_ARGB8888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -3662,6 +3697,7 @@ static void SDL_Blit_ARGB8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -3757,6 +3793,7 @@ static void SDL_Blit_RGBA8888_RGB888_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -3830,6 +3867,7 @@ static void SDL_Blit_RGBA8888_RGB888_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -3985,6 +4023,7 @@ static void SDL_Blit_RGBA8888_RGB888_Modulate_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -4070,6 +4109,7 @@ static void SDL_Blit_RGBA8888_RGB888_Modulate_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -4165,6 +4205,7 @@ static void SDL_Blit_RGBA8888_BGR888_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -4238,6 +4279,7 @@ static void SDL_Blit_RGBA8888_BGR888_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -4393,6 +4435,7 @@ static void SDL_Blit_RGBA8888_BGR888_Modulate_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -4478,6 +4521,7 @@ static void SDL_Blit_RGBA8888_BGR888_Modulate_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -4573,6 +4617,7 @@ static void SDL_Blit_RGBA8888_ARGB8888_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -4646,6 +4691,7 @@ static void SDL_Blit_RGBA8888_ARGB8888_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -4801,6 +4847,7 @@ static void SDL_Blit_RGBA8888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -4886,6 +4933,7 @@ static void SDL_Blit_RGBA8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -4981,6 +5029,7 @@ static void SDL_Blit_ABGR8888_RGB888_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -5054,6 +5103,7 @@ static void SDL_Blit_ABGR8888_RGB888_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -5209,6 +5259,7 @@ static void SDL_Blit_ABGR8888_RGB888_Modulate_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -5294,6 +5345,7 @@ static void SDL_Blit_ABGR8888_RGB888_Modulate_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -5389,6 +5441,7 @@ static void SDL_Blit_ABGR8888_BGR888_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -5462,6 +5515,7 @@ static void SDL_Blit_ABGR8888_BGR888_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -5617,6 +5671,7 @@ static void SDL_Blit_ABGR8888_BGR888_Modulate_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -5702,6 +5757,7 @@ static void SDL_Blit_ABGR8888_BGR888_Modulate_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -5797,6 +5853,7 @@ static void SDL_Blit_ABGR8888_ARGB8888_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -5870,6 +5927,7 @@ static void SDL_Blit_ABGR8888_ARGB8888_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -6025,6 +6083,7 @@ static void SDL_Blit_ABGR8888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -6110,6 +6169,7 @@ static void SDL_Blit_ABGR8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -6205,6 +6265,7 @@ static void SDL_Blit_BGRA8888_RGB888_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -6278,6 +6339,7 @@ static void SDL_Blit_BGRA8888_RGB888_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -6433,6 +6495,7 @@ static void SDL_Blit_BGRA8888_RGB888_Modulate_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -6518,6 +6581,7 @@ static void SDL_Blit_BGRA8888_RGB888_Modulate_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -6613,6 +6677,7 @@ static void SDL_Blit_BGRA8888_BGR888_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -6686,6 +6751,7 @@ static void SDL_Blit_BGRA8888_BGR888_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -6841,6 +6907,7 @@ static void SDL_Blit_BGRA8888_BGR888_Modulate_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -6926,6 +6993,7 @@ static void SDL_Blit_BGRA8888_BGR888_Modulate_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -7021,6 +7089,7 @@ static void SDL_Blit_BGRA8888_ARGB8888_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -7094,6 +7163,7 @@ static void SDL_Blit_BGRA8888_ARGB8888_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -7249,6 +7319,7 @@ static void SDL_Blit_BGRA8888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;
@ -7334,6 +7405,7 @@ static void SDL_Blit_BGRA8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info)
dstR = srcR + ((255 - srcA) * dstR) / 255; dstR = srcR + ((255 - srcA) * dstR) / 255;
dstG = srcG + ((255 - srcA) * dstG) / 255; dstG = srcG + ((255 - srcA) * dstG) / 255;
dstB = srcB + ((255 - srcA) * dstB) / 255; dstB = srcB + ((255 - srcA) * dstB) / 255;
dstA = srcA + ((255 - srcA) * dstA) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstR = srcR + dstR; if (dstR > 255) dstR = 255;

View file

@ -82,7 +82,7 @@ sub open_file {
/* DO NOT EDIT! This file is generated by sdlgenblit.pl */ /* DO NOT EDIT! This file is generated by sdlgenblit.pl */
/* /*
Simple DirectMedia Layer Simple DirectMedia Layer
Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org> Copyright (C) 1997-2013 Sam Lantinga <slouken\@libsdl.org>
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@ -241,6 +241,7 @@ __EOF__
${d}R = ${s}R + ((255 - ${s}A) * ${d}R) / 255; ${d}R = ${s}R + ((255 - ${s}A) * ${d}R) / 255;
${d}G = ${s}G + ((255 - ${s}A) * ${d}G) / 255; ${d}G = ${s}G + ((255 - ${s}A) * ${d}G) / 255;
${d}B = ${s}B + ((255 - ${s}A) * ${d}B) / 255; ${d}B = ${s}B + ((255 - ${s}A) * ${d}B) / 255;
${d}A = ${s}A + ((255 - ${s}A) * ${d}A) / 255;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
${d}R = ${s}R + ${d}R; if (${d}R > 255) ${d}R = 255; ${d}R = ${s}R + ${d}R; if (${d}R > 255) ${d}R = 255;

View file

@ -87,6 +87,88 @@ LoadTexture(SDL_Renderer *renderer, char *file, SDL_bool transparent)
return texture; return texture;
} }
void
DrawComposite(DrawState *s)
{
SDL_Rect viewport, R;
SDL_Texture *target, *A, *B;
static SDL_bool blend_tested = SDL_FALSE;
if (!blend_tested) {
SDL_Texture *A, *B;
Uint32 P;
A = SDL_CreateTexture(s->renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, 1, 1);
SDL_SetTextureBlendMode(A, SDL_BLENDMODE_BLEND);
B = SDL_CreateTexture(s->renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, 1, 1);
SDL_SetTextureBlendMode(B, SDL_BLENDMODE_BLEND);
SDL_SetRenderTarget(s->renderer, A);
SDL_SetRenderDrawColor(s->renderer, 0x00, 0x00, 0x00, 0x80);
SDL_RenderFillRect(s->renderer, NULL);
SDL_SetRenderTarget(s->renderer, B);
SDL_SetRenderDrawColor(s->renderer, 0x00, 0x00, 0x00, 0x00);
SDL_RenderFillRect(s->renderer, NULL);
SDL_RenderCopy(s->renderer, A, NULL, NULL);
SDL_RenderReadPixels(s->renderer, NULL, SDL_PIXELFORMAT_ARGB8888, &P, sizeof(P));
printf("Blended pixel: 0x%8.8X\n", P);
SDL_DestroyTexture(A);
SDL_DestroyTexture(B);
blend_tested = SDL_TRUE;
}
SDL_RenderGetViewport(s->renderer, &viewport);
target = SDL_CreateTexture(s->renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, viewport.w, viewport.h);
SDL_SetTextureBlendMode(target, SDL_BLENDMODE_BLEND);
SDL_SetRenderTarget(s->renderer, target);
/* Draw the background.
This is solid black so when the sprite is copied to it, any per-pixel alpha will be blended through.
*/
SDL_SetRenderDrawColor(s->renderer, 0x00, 0x00, 0x00, 0x00);
SDL_RenderFillRect(s->renderer, NULL);
/* Scale and draw the sprite */
s->sprite_rect.w += s->scale_direction;
s->sprite_rect.h += s->scale_direction;
if (s->scale_direction > 0) {
if (s->sprite_rect.w >= viewport.w || s->sprite_rect.h >= viewport.h) {
s->scale_direction = -1;
}
} else {
if (s->sprite_rect.w <= 1 || s->sprite_rect.h <= 1) {
s->scale_direction = 1;
}
}
s->sprite_rect.x = (viewport.w - s->sprite_rect.w) / 2;
s->sprite_rect.y = (viewport.h - s->sprite_rect.h) / 2;
SDL_RenderCopy(s->renderer, s->sprite, NULL, &s->sprite_rect);
SDL_SetRenderTarget(s->renderer, NULL);
SDL_RenderCopy(s->renderer, s->background, NULL, NULL);
SDL_SetRenderDrawBlendMode(s->renderer, SDL_BLENDMODE_BLEND);
SDL_SetRenderDrawColor(s->renderer, 0xff, 0x00, 0x00, 0x80);
R.x = 0;
R.y = 0;
R.w = 100;
R.h = 100;
SDL_RenderFillRect(s->renderer, &R);
SDL_SetRenderDrawBlendMode(s->renderer, SDL_BLENDMODE_NONE);
SDL_RenderCopy(s->renderer, target, NULL, NULL);
SDL_DestroyTexture(target);
/* Update the screen! */
SDL_RenderPresent(s->renderer);
}
void void
Draw(DrawState *s) Draw(DrawState *s)
{ {
@ -134,6 +216,7 @@ main(int argc, char *argv[])
SDL_Event event; SDL_Event event;
int frames; int frames;
Uint32 then, now; Uint32 then, now;
SDL_bool test_composite = SDL_FALSE;
/* Initialize test framework */ /* Initialize test framework */
state = SDLTest_CommonCreateState(argv, SDL_INIT_VIDEO); state = SDLTest_CommonCreateState(argv, SDL_INIT_VIDEO);
@ -145,8 +228,17 @@ main(int argc, char *argv[])
consumed = SDLTest_CommonArg(state, i); consumed = SDLTest_CommonArg(state, i);
if (consumed == 0) { if (consumed == 0) {
fprintf(stderr, "Usage: %s %s\n", argv[0], SDLTest_CommonUsage(state)); consumed = -1;
return 1; if (SDL_strcasecmp(argv[i], "--composite") == 0) {
test_composite = SDL_TRUE;
consumed = 1;
}
}
if (consumed < 0) {
fprintf(stderr,
"Usage: %s %s [--composite]\n",
argv[0], SDLTest_CommonUsage(state));
quit(1);
} }
i += consumed; i += consumed;
} }
@ -160,7 +252,11 @@ main(int argc, char *argv[])
drawstate->window = state->windows[i]; drawstate->window = state->windows[i];
drawstate->renderer = state->renderers[i]; drawstate->renderer = state->renderers[i];
drawstate->sprite = LoadTexture(drawstate->renderer, "icon.bmp", SDL_TRUE); if (test_composite) {
drawstate->sprite = LoadTexture(drawstate->renderer, "icon-alpha.bmp", SDL_TRUE);
} else {
drawstate->sprite = LoadTexture(drawstate->renderer, "icon.bmp", SDL_TRUE);
}
drawstate->background = LoadTexture(drawstate->renderer, "sample.bmp", SDL_FALSE); drawstate->background = LoadTexture(drawstate->renderer, "sample.bmp", SDL_FALSE);
if (!drawstate->sprite || !drawstate->background) { if (!drawstate->sprite || !drawstate->background) {
quit(2); quit(2);
@ -181,7 +277,11 @@ main(int argc, char *argv[])
SDLTest_CommonEvent(state, &event, &done); SDLTest_CommonEvent(state, &event, &done);
} }
for (i = 0; i < state->num_windows; ++i) { for (i = 0; i < state->num_windows; ++i) {
Draw(&drawstates[i]); if (test_composite) {
DrawComposite(&drawstates[i]);
} else {
Draw(&drawstates[i]);
}
} }
} }

View file

@ -56,7 +56,7 @@ quit(int rc)
} }
int int
LoadSprite(char *file) LoadSprite(const char *file)
{ {
int i; int i;
SDL_Surface *temp; SDL_Surface *temp;
@ -243,6 +243,7 @@ main(int argc, char *argv[])
SDL_Event event; SDL_Event event;
Uint32 then, now, frames; Uint32 then, now, frames;
Uint64 seed; Uint64 seed;
const char *icon = "icon.bmp";
/* Initialize parameters */ /* Initialize parameters */
num_sprites = NUM_SPRITES; num_sprites = NUM_SPRITES;
@ -292,11 +293,14 @@ main(int argc, char *argv[])
} else if (SDL_isdigit(*argv[i])) { } else if (SDL_isdigit(*argv[i])) {
num_sprites = SDL_atoi(argv[i]); num_sprites = SDL_atoi(argv[i]);
consumed = 1; consumed = 1;
} else if (argv[i][0] != '-') {
icon = argv[i];
consumed = 1;
} }
} }
if (consumed < 0) { if (consumed < 0) {
fprintf(stderr, fprintf(stderr,
"Usage: %s %s [--blend none|blend|add|mod] [--cyclecolor] [--cyclealpha] [--iterations N]\n", "Usage: %s %s [--blend none|blend|add|mod] [--cyclecolor] [--cyclealpha] [--iterations N] [num_sprites] [icon.bmp]\n",
argv[0], SDLTest_CommonUsage(state)); argv[0], SDLTest_CommonUsage(state));
quit(1); quit(1);
} }
@ -318,7 +322,7 @@ main(int argc, char *argv[])
SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF); SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
SDL_RenderClear(renderer); SDL_RenderClear(renderer);
} }
if (LoadSprite("icon.bmp") < 0) { if (LoadSprite(icon) < 0) {
quit(2); quit(2);
} }