diff --git a/include/SDL3/SDL_blendmode.h b/include/SDL3/SDL_blendmode.h index 159924b4d..9f28ae42c 100644 --- a/include/SDL3/SDL_blendmode.h +++ b/include/SDL3/SDL_blendmode.h @@ -41,8 +41,9 @@ extern "C" { /** * A set of blend modes used in drawing operations. * - * Note that additional values may be obtained from - * SDL_ComposeCustomBlendMode. + * These predefined blend modes are supported everywhere. + * + * Additional values may be obtained from SDL_ComposeCustomBlendMode. * * \since This datatype is available since SDL 3.0.0. * @@ -50,20 +51,25 @@ extern "C" { */ typedef Uint32 SDL_BlendMode; -#define SDL_BLENDMODE_NONE 0x00000000u /**< no blending - dstRGBA = srcRGBA */ -#define SDL_BLENDMODE_BLEND 0x00000001u /**< alpha blending - dstRGB = (srcRGB * srcA) + (dstRGB * (1-srcA)) - dstA = srcA + (dstA * (1-srcA)) */ -#define SDL_BLENDMODE_ADD 0x00000002u /**< additive blending - dstRGB = (srcRGB * srcA) + dstRGB - dstA = dstA */ -#define SDL_BLENDMODE_MOD 0x00000004u /**< color modulate - dstRGB = srcRGB * dstRGB - dstA = dstA */ -#define SDL_BLENDMODE_MUL 0x00000008u /**< color multiply - dstRGB = (srcRGB * dstRGB) + (dstRGB * (1-srcA)) - dstA = dstA */ +#define SDL_BLENDMODE_NONE 0x00000000u /**< no blending + dstRGBA = srcRGBA */ +#define SDL_BLENDMODE_BLEND 0x00000001u /**< alpha blending + dstRGB = (srcRGB * srcA) + (dstRGB * (1-srcA)) + dstA = srcA + (dstA * (1-srcA)) */ +#define SDL_BLENDMODE_BLEND_PREMULTIPLIED 0x00000010u /**< pre-multiplied alpha blending + dstRGBA = srcRGBA + (dstRGBA * (1-srcA)) */ +#define SDL_BLENDMODE_ADD 0x00000002u /**< additive blending + dstRGB = (srcRGB * srcA) + dstRGB + dstA = dstA */ +#define SDL_BLENDMODE_ADD_PREMULTIPLIED 0x00000020u /**< pre-multiplied additive blending + dstRGB = srcRGB + dstRGB + dstA = dstA */ +#define SDL_BLENDMODE_MOD 0x00000004u /**< color modulate + dstRGB = srcRGB * dstRGB + dstA = dstA */ +#define SDL_BLENDMODE_MUL 0x00000008u /**< color multiply + dstRGB = (srcRGB * dstRGB) + (dstRGB * (1-srcA)) + dstA = dstA */ #define SDL_BLENDMODE_INVALID 0x7FFFFFFFu /** @@ -75,10 +81,10 @@ typedef Uint32 SDL_BlendMode; typedef enum SDL_BlendOperation { SDL_BLENDOPERATION_ADD = 0x1, /**< dst + src: supported by all renderers */ - SDL_BLENDOPERATION_SUBTRACT = 0x2, /**< src - dst : supported by D3D9, D3D11, OpenGL, OpenGLES */ - SDL_BLENDOPERATION_REV_SUBTRACT = 0x3, /**< dst - src : supported by D3D9, D3D11, OpenGL, OpenGLES */ - SDL_BLENDOPERATION_MINIMUM = 0x4, /**< min(dst, src) : supported by D3D9, D3D11 */ - SDL_BLENDOPERATION_MAXIMUM = 0x5 /**< max(dst, src) : supported by D3D9, D3D11 */ + SDL_BLENDOPERATION_SUBTRACT = 0x2, /**< src - dst : supported by D3D, OpenGL, OpenGLES, and Vulkan */ + SDL_BLENDOPERATION_REV_SUBTRACT = 0x3, /**< dst - src : supported by D3D, OpenGL, OpenGLES, and Vulkan */ + SDL_BLENDOPERATION_MINIMUM = 0x4, /**< min(dst, src) : supported by D3D, OpenGL, OpenGLES, and Vulkan */ + SDL_BLENDOPERATION_MAXIMUM = 0x5 /**< max(dst, src) : supported by D3D, OpenGL, OpenGLES, and Vulkan */ } SDL_BlendOperation; /** diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c index 2153c239c..64128c79c 100644 --- a/src/render/SDL_render.c +++ b/src/render/SDL_render.c @@ -83,10 +83,18 @@ this should probably be removed at some point in the future. --ryan. */ SDL_COMPOSE_BLENDMODE(SDL_BLENDFACTOR_SRC_ALPHA, SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA, SDL_BLENDOPERATION_ADD, \ SDL_BLENDFACTOR_ONE, SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA, SDL_BLENDOPERATION_ADD) +#define SDL_BLENDMODE_BLEND_PREMULTIPLIED_FULL \ + SDL_COMPOSE_BLENDMODE(SDL_BLENDFACTOR_ONE, SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA, SDL_BLENDOPERATION_ADD, \ + SDL_BLENDFACTOR_ONE, SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA, SDL_BLENDOPERATION_ADD) + #define SDL_BLENDMODE_ADD_FULL \ SDL_COMPOSE_BLENDMODE(SDL_BLENDFACTOR_SRC_ALPHA, SDL_BLENDFACTOR_ONE, SDL_BLENDOPERATION_ADD, \ SDL_BLENDFACTOR_ZERO, SDL_BLENDFACTOR_ONE, SDL_BLENDOPERATION_ADD) +#define SDL_BLENDMODE_ADD_PREMULTIPLIED_FULL \ + SDL_COMPOSE_BLENDMODE(SDL_BLENDFACTOR_ONE, SDL_BLENDFACTOR_ONE, SDL_BLENDOPERATION_ADD, \ + SDL_BLENDFACTOR_ZERO, SDL_BLENDFACTOR_ONE, SDL_BLENDOPERATION_ADD) + #define SDL_BLENDMODE_MOD_FULL \ SDL_COMPOSE_BLENDMODE(SDL_BLENDFACTOR_ZERO, SDL_BLENDFACTOR_SRC_COLOR, SDL_BLENDOPERATION_ADD, \ SDL_BLENDFACTOR_ZERO, SDL_BLENDFACTOR_ONE, SDL_BLENDOPERATION_ADD) @@ -1234,7 +1242,9 @@ static SDL_bool IsSupportedBlendMode(SDL_Renderer *renderer, SDL_BlendMode blend /* These are required to be supported by all renderers */ case SDL_BLENDMODE_NONE: case SDL_BLENDMODE_BLEND: + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: case SDL_BLENDMODE_MOD: case SDL_BLENDMODE_MUL: return SDL_TRUE; @@ -4682,9 +4692,15 @@ static SDL_BlendMode SDL_GetShortBlendMode(SDL_BlendMode blendMode) if (blendMode == SDL_BLENDMODE_BLEND_FULL) { return SDL_BLENDMODE_BLEND; } + if (blendMode == SDL_BLENDMODE_BLEND_PREMULTIPLIED_FULL) { + return SDL_BLENDMODE_BLEND_PREMULTIPLIED; + } if (blendMode == SDL_BLENDMODE_ADD_FULL) { return SDL_BLENDMODE_ADD; } + if (blendMode == SDL_BLENDMODE_ADD_PREMULTIPLIED_FULL) { + return SDL_BLENDMODE_ADD_PREMULTIPLIED; + } if (blendMode == SDL_BLENDMODE_MOD_FULL) { return SDL_BLENDMODE_MOD; } @@ -4702,9 +4718,15 @@ static SDL_BlendMode SDL_GetLongBlendMode(SDL_BlendMode blendMode) if (blendMode == SDL_BLENDMODE_BLEND) { return SDL_BLENDMODE_BLEND_FULL; } + if (blendMode == SDL_BLENDMODE_BLEND_PREMULTIPLIED) { + return SDL_BLENDMODE_BLEND_PREMULTIPLIED_FULL; + } if (blendMode == SDL_BLENDMODE_ADD) { return SDL_BLENDMODE_ADD_FULL; } + if (blendMode == SDL_BLENDMODE_ADD_PREMULTIPLIED) { + return SDL_BLENDMODE_ADD_PREMULTIPLIED_FULL; + } if (blendMode == SDL_BLENDMODE_MOD) { return SDL_BLENDMODE_MOD_FULL; } diff --git a/src/render/ps2/SDL_render_ps2.c b/src/render/ps2/SDL_render_ps2.c index 09bdbe901..bbb9e5739 100644 --- a/src/render/ps2/SDL_render_ps2.c +++ b/src/render/ps2/SDL_render_ps2.c @@ -416,12 +416,26 @@ static void PS2_SetBlendMode(PS2_RenderData *data, int blendMode) data->gsGlobal->PrimAlphaEnable = GS_SETTING_ON; break; } + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + { + /* FIXME: What are the settings for this? */ + gsKit_set_primalpha(data->gsGlobal, GS_SETREG_ALPHA(A_COLOR_SOURCE, A_COLOR_DEST, A_ALPHA_SOURCE, A_COLOR_DEST, 0), 0); + data->gsGlobal->PrimAlphaEnable = GS_SETTING_ON; + break; + } case SDL_BLENDMODE_ADD: { gsKit_set_primalpha(data->gsGlobal, GS_SETREG_ALPHA(A_COLOR_SOURCE, A_COLOR_NULL, A_ALPHA_FIX, A_COLOR_DEST, 0x80), 0); data->gsGlobal->PrimAlphaEnable = GS_SETTING_ON; break; } + case SDL_BLENDMODE_ADD_PREMULTIPLIED: + { + /* FIXME: What are the settings for this? */ + gsKit_set_primalpha(data->gsGlobal, GS_SETREG_ALPHA(A_COLOR_SOURCE, A_COLOR_NULL, A_ALPHA_FIX, A_COLOR_DEST, 0x80), 0); + data->gsGlobal->PrimAlphaEnable = GS_SETTING_ON; + break; + } case SDL_BLENDMODE_MUL: case SDL_BLENDMODE_MOD: { diff --git a/src/render/psp/SDL_render_psp.c b/src/render/psp/SDL_render_psp.c index 6ba77415d..48959d39e 100644 --- a/src/render/psp/SDL_render_psp.c +++ b/src/render/psp/SDL_render_psp.c @@ -990,11 +990,21 @@ static void PSP_SetBlendState(PSP_RenderData *data, PSP_BlendState *state) sceGuBlendFunc(GU_ADD, GU_SRC_ALPHA, GU_ONE_MINUS_SRC_ALPHA, 0, 0); sceGuEnable(GU_BLEND); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + sceGuTexFunc(GU_TFX_MODULATE , GU_TCC_RGBA); + sceGuBlendFunc(GU_ADD, GU_FIX, GU_ONE_MINUS_SRC_ALPHA, 0x00FFFFFF, 0 ); + sceGuEnable(GU_BLEND); + break; case SDL_BLENDMODE_ADD: sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGBA); sceGuBlendFunc(GU_ADD, GU_SRC_ALPHA, GU_FIX, 0, 0x00FFFFFF); sceGuEnable(GU_BLEND); break; + case SDL_BLENDMODE_ADD_PREMULTIPLIED: + sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGBA); + sceGuBlendFunc(GU_ADD, GU_FIX, GU_FIX, 0, 0x00FFFFFF); + sceGuEnable(GU_BLEND); + break; case SDL_BLENDMODE_MOD: sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGBA); sceGuBlendFunc(GU_ADD, GU_FIX, GU_SRC_COLOR, 0, 0); diff --git a/src/render/software/SDL_blendfillrect.c b/src/render/software/SDL_blendfillrect.c index 45c32f96b..df42f4517 100644 --- a/src/render/software/SDL_blendfillrect.c +++ b/src/render/software/SDL_blendfillrect.c @@ -34,7 +34,11 @@ static int SDL_BlendFillRect_RGB555(SDL_Surface *dst, const SDL_Rect *rect, case SDL_BLENDMODE_BLEND: FILLRECT(Uint16, DRAW_SETPIXEL_BLEND_RGB555); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + FILLRECT(Uint16, DRAW_SETPIXEL_BLEND_CLAMPED_RGB555); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: FILLRECT(Uint16, DRAW_SETPIXEL_ADD_RGB555); break; case SDL_BLENDMODE_MOD: @@ -59,7 +63,11 @@ static int SDL_BlendFillRect_RGB565(SDL_Surface *dst, const SDL_Rect *rect, case SDL_BLENDMODE_BLEND: FILLRECT(Uint16, DRAW_SETPIXEL_BLEND_RGB565); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + FILLRECT(Uint16, DRAW_SETPIXEL_BLEND_CLAMPED_RGB565); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: FILLRECT(Uint16, DRAW_SETPIXEL_ADD_RGB565); break; case SDL_BLENDMODE_MOD: @@ -84,7 +92,11 @@ static int SDL_BlendFillRect_XRGB8888(SDL_Surface *dst, const SDL_Rect *rect, case SDL_BLENDMODE_BLEND: FILLRECT(Uint32, DRAW_SETPIXEL_BLEND_XRGB8888); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + FILLRECT(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_XRGB8888); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: FILLRECT(Uint32, DRAW_SETPIXEL_ADD_XRGB8888); break; case SDL_BLENDMODE_MOD: @@ -109,7 +121,11 @@ static int SDL_BlendFillRect_ARGB8888(SDL_Surface *dst, const SDL_Rect *rect, case SDL_BLENDMODE_BLEND: FILLRECT(Uint32, DRAW_SETPIXEL_BLEND_ARGB8888); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + FILLRECT(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_ARGB8888); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: FILLRECT(Uint32, DRAW_SETPIXEL_ADD_ARGB8888); break; case SDL_BLENDMODE_MOD: @@ -137,7 +153,11 @@ static int SDL_BlendFillRect_RGB(SDL_Surface *dst, const SDL_Rect *rect, case SDL_BLENDMODE_BLEND: FILLRECT(Uint16, DRAW_SETPIXEL_BLEND_RGB); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + FILLRECT(Uint16, DRAW_SETPIXEL_BLEND_CLAMPED_RGB); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: FILLRECT(Uint16, DRAW_SETPIXEL_ADD_RGB); break; case SDL_BLENDMODE_MOD: @@ -156,7 +176,11 @@ static int SDL_BlendFillRect_RGB(SDL_Surface *dst, const SDL_Rect *rect, case SDL_BLENDMODE_BLEND: FILLRECT(Uint32, DRAW_SETPIXEL_BLEND_RGB); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + FILLRECT(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_RGB); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: FILLRECT(Uint32, DRAW_SETPIXEL_ADD_RGB); break; case SDL_BLENDMODE_MOD: @@ -187,7 +211,11 @@ static int SDL_BlendFillRect_RGBA(SDL_Surface *dst, const SDL_Rect *rect, case SDL_BLENDMODE_BLEND: FILLRECT(Uint32, DRAW_SETPIXEL_BLEND_RGBA); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + FILLRECT(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_RGBA); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: FILLRECT(Uint32, DRAW_SETPIXEL_ADD_RGBA); break; case SDL_BLENDMODE_MOD: diff --git a/src/render/software/SDL_blendline.c b/src/render/software/SDL_blendline.c index 409828079..8b53d5ca3 100644 --- a/src/render/software/SDL_blendline.c +++ b/src/render/software/SDL_blendline.c @@ -51,7 +51,11 @@ static void SDL_BlendLine_RGB2(SDL_Surface *dst, int x1, int y1, int x2, int y2, case SDL_BLENDMODE_BLEND: HLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB, draw_end); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + HLINE(Uint16, DRAW_SETPIXEL_BLEND_CLAMPED_RGB, draw_end); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: HLINE(Uint16, DRAW_SETPIXEL_ADD_RGB, draw_end); break; case SDL_BLENDMODE_MOD: @@ -69,7 +73,11 @@ static void SDL_BlendLine_RGB2(SDL_Surface *dst, int x1, int y1, int x2, int y2, case SDL_BLENDMODE_BLEND: VLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB, draw_end); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + VLINE(Uint16, DRAW_SETPIXEL_BLEND_CLAMPED_RGB, draw_end); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: VLINE(Uint16, DRAW_SETPIXEL_ADD_RGB, draw_end); break; case SDL_BLENDMODE_MOD: @@ -87,7 +95,11 @@ static void SDL_BlendLine_RGB2(SDL_Surface *dst, int x1, int y1, int x2, int y2, case SDL_BLENDMODE_BLEND: DLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB, draw_end); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + DLINE(Uint16, DRAW_SETPIXEL_BLEND_CLAMPED_RGB, draw_end); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: DLINE(Uint16, DRAW_SETPIXEL_ADD_RGB, draw_end); break; case SDL_BLENDMODE_MOD: @@ -107,7 +119,13 @@ static void SDL_BlendLine_RGB2(SDL_Surface *dst, int x1, int y1, int x2, int y2, DRAW_SETPIXELXY2_BLEND_RGB, DRAW_SETPIXELXY2_BLEND_RGB, draw_end); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY2_BLEND_CLAMPED_RGB, DRAW_SETPIXELXY2_BLEND_CLAMPED_RGB, + draw_end); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: AALINE(x1, y1, x2, y2, DRAW_SETPIXELXY2_ADD_RGB, DRAW_SETPIXELXY2_ADD_RGB, draw_end); @@ -155,7 +173,11 @@ static void SDL_BlendLine_RGB555(SDL_Surface *dst, int x1, int y1, int x2, int y case SDL_BLENDMODE_BLEND: HLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB555, draw_end); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + HLINE(Uint16, DRAW_SETPIXEL_BLEND_CLAMPED_RGB555, draw_end); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: HLINE(Uint16, DRAW_SETPIXEL_ADD_RGB555, draw_end); break; case SDL_BLENDMODE_MOD: @@ -173,7 +195,11 @@ static void SDL_BlendLine_RGB555(SDL_Surface *dst, int x1, int y1, int x2, int y case SDL_BLENDMODE_BLEND: VLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB555, draw_end); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + VLINE(Uint16, DRAW_SETPIXEL_BLEND_CLAMPED_RGB555, draw_end); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: VLINE(Uint16, DRAW_SETPIXEL_ADD_RGB555, draw_end); break; case SDL_BLENDMODE_MOD: @@ -191,7 +217,11 @@ static void SDL_BlendLine_RGB555(SDL_Surface *dst, int x1, int y1, int x2, int y case SDL_BLENDMODE_BLEND: DLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB555, draw_end); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + DLINE(Uint16, DRAW_SETPIXEL_BLEND_CLAMPED_RGB555, draw_end); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: DLINE(Uint16, DRAW_SETPIXEL_ADD_RGB555, draw_end); break; case SDL_BLENDMODE_MOD: @@ -211,7 +241,13 @@ static void SDL_BlendLine_RGB555(SDL_Surface *dst, int x1, int y1, int x2, int y DRAW_SETPIXELXY_BLEND_RGB555, DRAW_SETPIXELXY_BLEND_RGB555, draw_end); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY_BLEND_CLAMPED_RGB555, DRAW_SETPIXELXY_BLEND_CLAMPED_RGB555, + draw_end); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: AALINE(x1, y1, x2, y2, DRAW_SETPIXELXY_ADD_RGB555, DRAW_SETPIXELXY_ADD_RGB555, draw_end); @@ -259,7 +295,11 @@ static void SDL_BlendLine_RGB565(SDL_Surface *dst, int x1, int y1, int x2, int y case SDL_BLENDMODE_BLEND: HLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB565, draw_end); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + HLINE(Uint16, DRAW_SETPIXEL_BLEND_CLAMPED_RGB565, draw_end); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: HLINE(Uint16, DRAW_SETPIXEL_ADD_RGB565, draw_end); break; case SDL_BLENDMODE_MOD: @@ -277,7 +317,11 @@ static void SDL_BlendLine_RGB565(SDL_Surface *dst, int x1, int y1, int x2, int y case SDL_BLENDMODE_BLEND: VLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB565, draw_end); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + VLINE(Uint16, DRAW_SETPIXEL_BLEND_CLAMPED_RGB565, draw_end); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: VLINE(Uint16, DRAW_SETPIXEL_ADD_RGB565, draw_end); break; case SDL_BLENDMODE_MOD: @@ -295,7 +339,11 @@ static void SDL_BlendLine_RGB565(SDL_Surface *dst, int x1, int y1, int x2, int y case SDL_BLENDMODE_BLEND: DLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB565, draw_end); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + DLINE(Uint16, DRAW_SETPIXEL_BLEND_CLAMPED_RGB565, draw_end); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: DLINE(Uint16, DRAW_SETPIXEL_ADD_RGB565, draw_end); break; case SDL_BLENDMODE_MOD: @@ -315,7 +363,13 @@ static void SDL_BlendLine_RGB565(SDL_Surface *dst, int x1, int y1, int x2, int y DRAW_SETPIXELXY_BLEND_RGB565, DRAW_SETPIXELXY_BLEND_RGB565, draw_end); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY_BLEND_CLAMPED_RGB565, DRAW_SETPIXELXY_BLEND_CLAMPED_RGB565, + draw_end); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: AALINE(x1, y1, x2, y2, DRAW_SETPIXELXY_ADD_RGB565, DRAW_SETPIXELXY_ADD_RGB565, draw_end); @@ -364,7 +418,11 @@ static void SDL_BlendLine_RGB4(SDL_Surface *dst, int x1, int y1, int x2, int y2, case SDL_BLENDMODE_BLEND: HLINE(Uint32, DRAW_SETPIXEL_BLEND_RGB, draw_end); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + HLINE(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_RGB, draw_end); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: HLINE(Uint32, DRAW_SETPIXEL_ADD_RGB, draw_end); break; case SDL_BLENDMODE_MOD: @@ -382,7 +440,11 @@ static void SDL_BlendLine_RGB4(SDL_Surface *dst, int x1, int y1, int x2, int y2, case SDL_BLENDMODE_BLEND: VLINE(Uint32, DRAW_SETPIXEL_BLEND_RGB, draw_end); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + VLINE(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_RGB, draw_end); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: VLINE(Uint32, DRAW_SETPIXEL_ADD_RGB, draw_end); break; case SDL_BLENDMODE_MOD: @@ -400,7 +462,11 @@ static void SDL_BlendLine_RGB4(SDL_Surface *dst, int x1, int y1, int x2, int y2, case SDL_BLENDMODE_BLEND: DLINE(Uint32, DRAW_SETPIXEL_BLEND_RGB, draw_end); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + DLINE(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_RGB, draw_end); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: DLINE(Uint32, DRAW_SETPIXEL_ADD_RGB, draw_end); break; case SDL_BLENDMODE_MOD: @@ -420,7 +486,13 @@ static void SDL_BlendLine_RGB4(SDL_Surface *dst, int x1, int y1, int x2, int y2, DRAW_SETPIXELXY4_BLEND_RGB, DRAW_SETPIXELXY4_BLEND_RGB, draw_end); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY4_BLEND_CLAMPED_RGB, DRAW_SETPIXELXY4_BLEND_CLAMPED_RGB, + draw_end); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: AALINE(x1, y1, x2, y2, DRAW_SETPIXELXY4_ADD_RGB, DRAW_SETPIXELXY4_ADD_RGB, draw_end); @@ -469,7 +541,11 @@ static void SDL_BlendLine_RGBA4(SDL_Surface *dst, int x1, int y1, int x2, int y2 case SDL_BLENDMODE_BLEND: HLINE(Uint32, DRAW_SETPIXEL_BLEND_RGBA, draw_end); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + HLINE(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_RGBA, draw_end); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: HLINE(Uint32, DRAW_SETPIXEL_ADD_RGBA, draw_end); break; case SDL_BLENDMODE_MOD: @@ -487,7 +563,11 @@ static void SDL_BlendLine_RGBA4(SDL_Surface *dst, int x1, int y1, int x2, int y2 case SDL_BLENDMODE_BLEND: VLINE(Uint32, DRAW_SETPIXEL_BLEND_RGBA, draw_end); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + VLINE(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_RGBA, draw_end); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: VLINE(Uint32, DRAW_SETPIXEL_ADD_RGBA, draw_end); break; case SDL_BLENDMODE_MOD: @@ -505,7 +585,11 @@ static void SDL_BlendLine_RGBA4(SDL_Surface *dst, int x1, int y1, int x2, int y2 case SDL_BLENDMODE_BLEND: DLINE(Uint32, DRAW_SETPIXEL_BLEND_RGBA, draw_end); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + DLINE(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_RGBA, draw_end); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: DLINE(Uint32, DRAW_SETPIXEL_ADD_RGBA, draw_end); break; case SDL_BLENDMODE_MOD: @@ -525,7 +609,13 @@ static void SDL_BlendLine_RGBA4(SDL_Surface *dst, int x1, int y1, int x2, int y2 DRAW_SETPIXELXY4_BLEND_RGBA, DRAW_SETPIXELXY4_BLEND_RGBA, draw_end); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY4_BLEND_CLAMPED_RGBA, DRAW_SETPIXELXY4_BLEND_CLAMPED_RGBA, + draw_end); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: AALINE(x1, y1, x2, y2, DRAW_SETPIXELXY4_ADD_RGBA, DRAW_SETPIXELXY4_ADD_RGBA, draw_end); @@ -573,7 +663,11 @@ static void SDL_BlendLine_XRGB8888(SDL_Surface *dst, int x1, int y1, int x2, int case SDL_BLENDMODE_BLEND: HLINE(Uint32, DRAW_SETPIXEL_BLEND_XRGB8888, draw_end); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + HLINE(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_XRGB8888, draw_end); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: HLINE(Uint32, DRAW_SETPIXEL_ADD_XRGB8888, draw_end); break; case SDL_BLENDMODE_MOD: @@ -591,7 +685,11 @@ static void SDL_BlendLine_XRGB8888(SDL_Surface *dst, int x1, int y1, int x2, int case SDL_BLENDMODE_BLEND: VLINE(Uint32, DRAW_SETPIXEL_BLEND_XRGB8888, draw_end); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + VLINE(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_XRGB8888, draw_end); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: VLINE(Uint32, DRAW_SETPIXEL_ADD_XRGB8888, draw_end); break; case SDL_BLENDMODE_MOD: @@ -609,7 +707,11 @@ static void SDL_BlendLine_XRGB8888(SDL_Surface *dst, int x1, int y1, int x2, int case SDL_BLENDMODE_BLEND: DLINE(Uint32, DRAW_SETPIXEL_BLEND_XRGB8888, draw_end); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + DLINE(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_XRGB8888, draw_end); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: DLINE(Uint32, DRAW_SETPIXEL_ADD_XRGB8888, draw_end); break; case SDL_BLENDMODE_MOD: @@ -629,7 +731,13 @@ static void SDL_BlendLine_XRGB8888(SDL_Surface *dst, int x1, int y1, int x2, int DRAW_SETPIXELXY_BLEND_XRGB8888, DRAW_SETPIXELXY_BLEND_XRGB8888, draw_end); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY_BLEND_CLAMPED_XRGB8888, DRAW_SETPIXELXY_BLEND_CLAMPED_XRGB8888, + draw_end); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: AALINE(x1, y1, x2, y2, DRAW_SETPIXELXY_ADD_XRGB8888, DRAW_SETPIXELXY_ADD_XRGB8888, draw_end); @@ -677,7 +785,11 @@ static void SDL_BlendLine_ARGB8888(SDL_Surface *dst, int x1, int y1, int x2, int case SDL_BLENDMODE_BLEND: HLINE(Uint32, DRAW_SETPIXEL_BLEND_ARGB8888, draw_end); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + HLINE(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_ARGB8888, draw_end); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: HLINE(Uint32, DRAW_SETPIXEL_ADD_ARGB8888, draw_end); break; case SDL_BLENDMODE_MOD: @@ -695,7 +807,11 @@ static void SDL_BlendLine_ARGB8888(SDL_Surface *dst, int x1, int y1, int x2, int case SDL_BLENDMODE_BLEND: VLINE(Uint32, DRAW_SETPIXEL_BLEND_ARGB8888, draw_end); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + VLINE(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_ARGB8888, draw_end); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: VLINE(Uint32, DRAW_SETPIXEL_ADD_ARGB8888, draw_end); break; case SDL_BLENDMODE_MOD: @@ -713,7 +829,11 @@ static void SDL_BlendLine_ARGB8888(SDL_Surface *dst, int x1, int y1, int x2, int case SDL_BLENDMODE_BLEND: DLINE(Uint32, DRAW_SETPIXEL_BLEND_ARGB8888, draw_end); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + DLINE(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_ARGB8888, draw_end); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: DLINE(Uint32, DRAW_SETPIXEL_ADD_ARGB8888, draw_end); break; case SDL_BLENDMODE_MOD: @@ -733,7 +853,13 @@ static void SDL_BlendLine_ARGB8888(SDL_Surface *dst, int x1, int y1, int x2, int DRAW_SETPIXELXY_BLEND_ARGB8888, DRAW_SETPIXELXY_BLEND_ARGB8888, draw_end); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY_BLEND_CLAMPED_ARGB8888, DRAW_SETPIXELXY_BLEND_CLAMPED_ARGB8888, + draw_end); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: AALINE(x1, y1, x2, y2, DRAW_SETPIXELXY_ADD_ARGB8888, DRAW_SETPIXELXY_ADD_ARGB8888, draw_end); diff --git a/src/render/software/SDL_blendpoint.c b/src/render/software/SDL_blendpoint.c index db325ab94..4ccdabe17 100644 --- a/src/render/software/SDL_blendpoint.c +++ b/src/render/software/SDL_blendpoint.c @@ -34,7 +34,11 @@ static int SDL_BlendPoint_RGB555(SDL_Surface *dst, int x, int y, SDL_BlendMode b case SDL_BLENDMODE_BLEND: DRAW_SETPIXELXY_BLEND_RGB555(x, y); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + DRAW_SETPIXELXY_BLEND_CLAMPED_RGB555(x, y); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: DRAW_SETPIXELXY_ADD_RGB555(x, y); break; case SDL_BLENDMODE_MOD: @@ -59,7 +63,11 @@ static int SDL_BlendPoint_RGB565(SDL_Surface *dst, int x, int y, SDL_BlendMode b case SDL_BLENDMODE_BLEND: DRAW_SETPIXELXY_BLEND_RGB565(x, y); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + DRAW_SETPIXELXY_BLEND_CLAMPED_RGB565(x, y); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: DRAW_SETPIXELXY_ADD_RGB565(x, y); break; case SDL_BLENDMODE_MOD: @@ -84,7 +92,11 @@ static int SDL_BlendPoint_XRGB8888(SDL_Surface *dst, int x, int y, SDL_BlendMode case SDL_BLENDMODE_BLEND: DRAW_SETPIXELXY_BLEND_XRGB8888(x, y); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + DRAW_SETPIXELXY_BLEND_CLAMPED_XRGB8888(x, y); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: DRAW_SETPIXELXY_ADD_XRGB8888(x, y); break; case SDL_BLENDMODE_MOD: @@ -109,7 +121,11 @@ static int SDL_BlendPoint_ARGB8888(SDL_Surface *dst, int x, int y, SDL_BlendMode case SDL_BLENDMODE_BLEND: DRAW_SETPIXELXY_BLEND_ARGB8888(x, y); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + DRAW_SETPIXELXY_BLEND_CLAMPED_ARGB8888(x, y); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: DRAW_SETPIXELXY_ADD_ARGB8888(x, y); break; case SDL_BLENDMODE_MOD: @@ -137,7 +153,11 @@ static int SDL_BlendPoint_RGB(SDL_Surface *dst, int x, int y, SDL_BlendMode blen case SDL_BLENDMODE_BLEND: DRAW_SETPIXELXY2_BLEND_RGB(x, y); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + DRAW_SETPIXELXY2_BLEND_CLAMPED_RGB(x, y); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: DRAW_SETPIXELXY2_ADD_RGB(x, y); break; case SDL_BLENDMODE_MOD: @@ -156,7 +176,11 @@ static int SDL_BlendPoint_RGB(SDL_Surface *dst, int x, int y, SDL_BlendMode blen case SDL_BLENDMODE_BLEND: DRAW_SETPIXELXY4_BLEND_RGB(x, y); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + DRAW_SETPIXELXY4_BLEND_CLAMPED_RGB(x, y); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: DRAW_SETPIXELXY4_ADD_RGB(x, y); break; case SDL_BLENDMODE_MOD: @@ -187,7 +211,11 @@ static int SDL_BlendPoint_RGBA(SDL_Surface *dst, int x, int y, SDL_BlendMode ble case SDL_BLENDMODE_BLEND: DRAW_SETPIXELXY4_BLEND_RGBA(x, y); break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + DRAW_SETPIXELXY4_BLEND_CLAMPED_RGBA(x, y); + break; case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_ADD_PREMULTIPLIED: DRAW_SETPIXELXY4_ADD_RGBA(x, y); break; case SDL_BLENDMODE_MOD: diff --git a/src/render/software/SDL_draw.h b/src/render/software/SDL_draw.h index 56df78d36..08c8aba81 100644 --- a/src/render/software/SDL_draw.h +++ b/src/render/software/SDL_draw.h @@ -60,6 +60,25 @@ setpixel; \ } while (0) +#define DRAW_SETPIXEL_BLEND_CLAMPED(getpixel, setpixel) \ + do { \ + unsigned sr, sg, sb, sa = 0xFF; \ + getpixel; \ + sr = DRAW_MUL(inva, sr) + r; \ + if (sr > 0xff) \ + sr = 0xff; \ + sg = DRAW_MUL(inva, sg) + g; \ + if (sg > 0xff) \ + sg = 0xff; \ + sb = DRAW_MUL(inva, sb) + b; \ + if (sb > 0xff) \ + sb = 0xff; \ + sa = DRAW_MUL(inva, sa) + a; \ + if (sa > 0xff) \ + sa = 0xff; \ + setpixel; \ + } while (0) + #define DRAW_SETPIXEL_ADD(getpixel, setpixel) \ do { \ unsigned sr, sg, sb, sa; \ @@ -122,6 +141,10 @@ DRAW_SETPIXEL_BLEND(RGB_FROM_RGB555(*pixel, sr, sg, sb), \ RGB555_FROM_RGB(*pixel, sr, sg, sb)) +#define DRAW_SETPIXEL_BLEND_CLAMPED_RGB555 \ + DRAW_SETPIXEL_BLEND_CLAMPED(RGB_FROM_RGB555(*pixel, sr, sg, sb), \ + RGB555_FROM_RGB(*pixel, sr, sg, sb)) + #define DRAW_SETPIXEL_ADD_RGB555 \ DRAW_SETPIXEL_ADD(RGB_FROM_RGB555(*pixel, sr, sg, sb), \ RGB555_FROM_RGB(*pixel, sr, sg, sb)) @@ -140,6 +163,9 @@ #define DRAW_SETPIXELXY_BLEND_RGB555(x, y) \ DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_BLEND_RGB555) +#define DRAW_SETPIXELXY_BLEND_CLAMPED_RGB555(x, y) \ + DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_BLEND_CLAMPED_RGB555) + #define DRAW_SETPIXELXY_ADD_RGB555(x, y) \ DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_ADD_RGB555) @@ -160,6 +186,10 @@ DRAW_SETPIXEL_BLEND(RGB_FROM_RGB565(*pixel, sr, sg, sb), \ RGB565_FROM_RGB(*pixel, sr, sg, sb)) +#define DRAW_SETPIXEL_BLEND_CLAMPED_RGB565 \ + DRAW_SETPIXEL_BLEND_CLAMPED(RGB_FROM_RGB565(*pixel, sr, sg, sb), \ + RGB565_FROM_RGB(*pixel, sr, sg, sb)) + #define DRAW_SETPIXEL_ADD_RGB565 \ DRAW_SETPIXEL_ADD(RGB_FROM_RGB565(*pixel, sr, sg, sb), \ RGB565_FROM_RGB(*pixel, sr, sg, sb)) @@ -178,6 +208,9 @@ #define DRAW_SETPIXELXY_BLEND_RGB565(x, y) \ DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_BLEND_RGB565) +#define DRAW_SETPIXELXY_BLEND_CLAMPED_RGB565(x, y) \ + DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_BLEND_CLAMPED_RGB565) + #define DRAW_SETPIXELXY_ADD_RGB565(x, y) \ DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_ADD_RGB565) @@ -198,6 +231,10 @@ DRAW_SETPIXEL_BLEND(RGB_FROM_XRGB8888(*pixel, sr, sg, sb), \ XRGB8888_FROM_RGB(*pixel, sr, sg, sb)) +#define DRAW_SETPIXEL_BLEND_CLAMPED_XRGB8888 \ + DRAW_SETPIXEL_BLEND_CLAMPED(RGB_FROM_XRGB8888(*pixel, sr, sg, sb), \ + XRGB8888_FROM_RGB(*pixel, sr, sg, sb)) + #define DRAW_SETPIXEL_ADD_XRGB8888 \ DRAW_SETPIXEL_ADD(RGB_FROM_XRGB8888(*pixel, sr, sg, sb), \ XRGB8888_FROM_RGB(*pixel, sr, sg, sb)) @@ -216,6 +253,9 @@ #define DRAW_SETPIXELXY_BLEND_XRGB8888(x, y) \ DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_BLEND_XRGB8888) +#define DRAW_SETPIXELXY_BLEND_CLAMPED_XRGB8888(x, y) \ + DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_BLEND_CLAMPED_XRGB8888) + #define DRAW_SETPIXELXY_ADD_XRGB8888(x, y) \ DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_ADD_XRGB8888) @@ -236,6 +276,10 @@ DRAW_SETPIXEL_BLEND(RGBA_FROM_ARGB8888(*pixel, sr, sg, sb, sa), \ ARGB8888_FROM_RGBA(*pixel, sr, sg, sb, sa)) +#define DRAW_SETPIXEL_BLEND_CLAMPED_ARGB8888 \ + DRAW_SETPIXEL_BLEND_CLAMPED(RGBA_FROM_ARGB8888(*pixel, sr, sg, sb, sa), \ + ARGB8888_FROM_RGBA(*pixel, sr, sg, sb, sa)) + #define DRAW_SETPIXEL_ADD_ARGB8888 \ DRAW_SETPIXEL_ADD(RGBA_FROM_ARGB8888(*pixel, sr, sg, sb, sa), \ ARGB8888_FROM_RGBA(*pixel, sr, sg, sb, sa)) @@ -254,6 +298,9 @@ #define DRAW_SETPIXELXY_BLEND_ARGB8888(x, y) \ DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_BLEND_ARGB8888) +#define DRAW_SETPIXELXY_BLEND_CLAMPED_ARGB8888(x, y) \ + DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_BLEND_CLAMPED_ARGB8888) + #define DRAW_SETPIXELXY_ADD_ARGB8888(x, y) \ DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_ADD_ARGB8888) @@ -274,6 +321,10 @@ DRAW_SETPIXEL_BLEND(RGB_FROM_PIXEL(*pixel, fmt, sr, sg, sb), \ PIXEL_FROM_RGB(*pixel, fmt, sr, sg, sb)) +#define DRAW_SETPIXEL_BLEND_CLAMPED_RGB \ + DRAW_SETPIXEL_BLEND_CLAMPED(RGB_FROM_PIXEL(*pixel, fmt, sr, sg, sb), \ + PIXEL_FROM_RGB(*pixel, fmt, sr, sg, sb)) + #define DRAW_SETPIXEL_ADD_RGB \ DRAW_SETPIXEL_ADD(RGB_FROM_PIXEL(*pixel, fmt, sr, sg, sb), \ PIXEL_FROM_RGB(*pixel, fmt, sr, sg, sb)) @@ -295,9 +346,15 @@ #define DRAW_SETPIXELXY2_BLEND_RGB(x, y) \ DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_BLEND_RGB) +#define DRAW_SETPIXELXY2_BLEND_CLAMPED_RGB(x, y) \ + DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_BLEND_CLAMPED_RGB) + #define DRAW_SETPIXELXY4_BLEND_RGB(x, y) \ DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_BLEND_RGB) +#define DRAW_SETPIXELXY4_BLEND_CLAMPED_RGB(x, y) \ + DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_BLEND_CLAMPED_RGB) + #define DRAW_SETPIXELXY2_ADD_RGB(x, y) \ DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_ADD_RGB) @@ -327,6 +384,10 @@ DRAW_SETPIXEL_BLEND(RGBA_FROM_PIXEL(*pixel, fmt, sr, sg, sb, sa), \ PIXEL_FROM_RGBA(*pixel, fmt, sr, sg, sb, sa)) +#define DRAW_SETPIXEL_BLEND_CLAMPED_RGBA \ + DRAW_SETPIXEL_BLEND_CLAMPED(RGBA_FROM_PIXEL(*pixel, fmt, sr, sg, sb, sa), \ + PIXEL_FROM_RGBA(*pixel, fmt, sr, sg, sb, sa)) + #define DRAW_SETPIXEL_ADD_RGBA \ DRAW_SETPIXEL_ADD(RGBA_FROM_PIXEL(*pixel, fmt, sr, sg, sb, sa), \ PIXEL_FROM_RGBA(*pixel, fmt, sr, sg, sb, sa)) @@ -345,6 +406,9 @@ #define DRAW_SETPIXELXY4_BLEND_RGBA(x, y) \ DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_BLEND_RGBA) +#define DRAW_SETPIXELXY4_BLEND_CLAMPED_RGBA(x, y) \ + DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_BLEND_CLAMPED_RGBA) + #define DRAW_SETPIXELXY4_ADD_RGBA(x, y) \ DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_ADD_RGBA) diff --git a/src/video/SDL_RLEaccel.c b/src/video/SDL_RLEaccel.c index 545f85b4b..6907a281c 100644 --- a/src/video/SDL_RLEaccel.c +++ b/src/video/SDL_RLEaccel.c @@ -1400,7 +1400,7 @@ int SDL_RLESurface(SDL_Surface *surface) /* Pass on combinations not supported */ if ((flags & SDL_COPY_MODULATE_COLOR) || ((flags & SDL_COPY_MODULATE_ALPHA) && SDL_ISPIXELFORMAT_ALPHA(surface->format)) || - (flags & (SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL)) || + (flags & (SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) || (flags & SDL_COPY_NEAREST)) { return -1; } diff --git a/src/video/SDL_blit.c b/src/video/SDL_blit.c index 9ab76a154..ce543e2ee 100644 --- a/src/video/SDL_blit.c +++ b/src/video/SDL_blit.c @@ -125,7 +125,7 @@ static SDL_bool SDL_UseAltivecPrefetch(void) static SDL_BlitFunc SDL_ChooseBlitFunc(SDL_PixelFormat src_format, SDL_PixelFormat dst_format, int flags, SDL_BlitFuncEntry *entries) { - int i, flagcheck = (flags & (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_COLORKEY | SDL_COPY_NEAREST)); + int i, flagcheck = (flags & (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_COLORKEY | SDL_COPY_NEAREST)); static unsigned int features = 0x7fffffff; /* Get the available CPU features */ diff --git a/src/video/SDL_blit.h b/src/video/SDL_blit.h index 0197ca392..18ceb39d1 100644 --- a/src/video/SDL_blit.h +++ b/src/video/SDL_blit.h @@ -28,18 +28,20 @@ extern const Uint8 *SDL_expand_byte[9]; extern const Uint16 SDL_expand_byte_10[]; /* SDL blit copy flags */ -#define SDL_COPY_MODULATE_COLOR 0x00000001 -#define SDL_COPY_MODULATE_ALPHA 0x00000002 -#define SDL_COPY_BLEND 0x00000010 -#define SDL_COPY_ADD 0x00000020 -#define SDL_COPY_MOD 0x00000040 -#define SDL_COPY_MUL 0x00000080 -#define SDL_COPY_COLORKEY 0x00000100 -#define SDL_COPY_NEAREST 0x00000200 -#define SDL_COPY_RLE_DESIRED 0x00001000 -#define SDL_COPY_RLE_COLORKEY 0x00002000 -#define SDL_COPY_RLE_ALPHAKEY 0x00004000 -#define SDL_COPY_RLE_MASK (SDL_COPY_RLE_DESIRED | SDL_COPY_RLE_COLORKEY | SDL_COPY_RLE_ALPHAKEY) +#define SDL_COPY_MODULATE_COLOR 0x00000001 +#define SDL_COPY_MODULATE_ALPHA 0x00000002 +#define SDL_COPY_BLEND 0x00000010 +#define SDL_COPY_BLEND_PREMULTIPLIED 0x00000020 +#define SDL_COPY_ADD 0x00000040 +#define SDL_COPY_ADD_PREMULTIPLIED 0x00000080 +#define SDL_COPY_MOD 0x00000100 +#define SDL_COPY_MUL 0x00000200 +#define SDL_COPY_COLORKEY 0x00000400 +#define SDL_COPY_NEAREST 0x00000800 +#define SDL_COPY_RLE_DESIRED 0x00001000 +#define SDL_COPY_RLE_COLORKEY 0x00002000 +#define SDL_COPY_RLE_ALPHAKEY 0x00004000 +#define SDL_COPY_RLE_MASK (SDL_COPY_RLE_DESIRED | SDL_COPY_RLE_COLORKEY | SDL_COPY_RLE_ALPHAKEY) /* SDL blit CPU flags */ #define SDL_CPU_ANY 0x00000000 diff --git a/src/video/SDL_blit_auto.c b/src/video/SDL_blit_auto.c index e3c50e0ef..9b45dda5b 100644 --- a/src/video/SDL_blit_auto.c +++ b/src/video/SDL_blit_auto.c @@ -75,13 +75,19 @@ static void SDL_Blit_XRGB8888_XRGB8888_Blend(SDL_BlitInfo *info) srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; dstpixel = *dst; dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: dstR = srcR; dstG = srcG; dstB = srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + dstR = srcR; + dstG = srcG; + dstB = srcB; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -136,13 +142,19 @@ static void SDL_Blit_XRGB8888_XRGB8888_Blend_Scale(SDL_BlitInfo *info) srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; dstpixel = *dst; dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: dstR = srcR; dstG = srcG; dstB = srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + dstR = srcR; + dstG = srcG; + dstB = srcB; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -270,14 +282,13 @@ static void SDL_Blit_XRGB8888_XRGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, modulateB, srcB); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -286,7 +297,19 @@ static void SDL_Blit_XRGB8888_XRGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -297,15 +320,19 @@ static void SDL_Blit_XRGB8888_XRGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstR << 16) | (dstG << 8) | dstB; @@ -358,14 +385,13 @@ static void SDL_Blit_XRGB8888_XRGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, modulateB, srcB); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -374,7 +400,19 @@ static void SDL_Blit_XRGB8888_XRGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -385,15 +423,19 @@ static void SDL_Blit_XRGB8888_XRGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstR << 16) | (dstG << 8) | dstB; @@ -457,13 +499,19 @@ static void SDL_Blit_XRGB8888_XBGR8888_Blend(SDL_BlitInfo *info) srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; dstpixel = *dst; dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: dstR = srcR; dstG = srcG; dstB = srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + dstR = srcR; + dstG = srcG; + dstB = srcB; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -518,13 +566,19 @@ static void SDL_Blit_XRGB8888_XBGR8888_Blend_Scale(SDL_BlitInfo *info) srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; dstpixel = *dst; dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: dstR = srcR; dstG = srcG; dstB = srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + dstR = srcR; + dstG = srcG; + dstB = srcB; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -652,14 +706,13 @@ static void SDL_Blit_XRGB8888_XBGR8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, modulateB, srcB); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -668,7 +721,19 @@ static void SDL_Blit_XRGB8888_XBGR8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -679,15 +744,19 @@ static void SDL_Blit_XRGB8888_XBGR8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstB << 16) | (dstG << 8) | dstR; @@ -740,14 +809,13 @@ static void SDL_Blit_XRGB8888_XBGR8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, modulateB, srcB); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -756,7 +824,19 @@ static void SDL_Blit_XRGB8888_XBGR8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -767,15 +847,19 @@ static void SDL_Blit_XRGB8888_XBGR8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstB << 16) | (dstG << 8) | dstR; @@ -838,14 +922,21 @@ static void SDL_Blit_XRGB8888_ARGB8888_Blend(SDL_BlitInfo *info) srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; dstpixel = *dst; dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: dstR = srcR; dstG = srcG; dstB = srcB; dstA = 0xFF; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + dstR = srcR; + dstG = srcG; + dstB = srcB; + dstA = 0xFF; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -900,14 +991,21 @@ static void SDL_Blit_XRGB8888_ARGB8888_Blend_Scale(SDL_BlitInfo *info) srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; dstpixel = *dst; dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: dstR = srcR; dstG = srcG; dstB = srcB; dstA = 0xFF; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + dstR = srcR; + dstG = srcG; + dstB = srcB; + dstA = 0xFF; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -1039,14 +1137,13 @@ static void SDL_Blit_XRGB8888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, modulateB, srcB); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -1057,7 +1154,22 @@ static void SDL_Blit_XRGB8888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstA, dstA); dstA += srcA; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -1068,15 +1180,19 @@ static void SDL_Blit_XRGB8888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstA << 24) | (dstR << 16) | (dstG << 8) | dstB; @@ -1129,14 +1245,13 @@ static void SDL_Blit_XRGB8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, modulateB, srcB); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -1147,7 +1262,22 @@ static void SDL_Blit_XRGB8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstA, dstA); dstA += srcA; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -1158,15 +1288,19 @@ static void SDL_Blit_XRGB8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstA << 24) | (dstR << 16) | (dstG << 8) | dstB; @@ -1179,6 +1313,449 @@ static void SDL_Blit_XRGB8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) } } +static void SDL_Blit_XRGB8888_ABGR8888_Scale(SDL_BlitInfo *info) +{ + Uint32 pixel; + const Uint32 A = 0xFF; + Uint32 R, G, B; + Uint64 srcy, srcx; + Uint64 posy, posx; + Uint64 incy, incx; + + incy = ((Uint64)info->src_h << 16) / info->dst_h; + incx = ((Uint64)info->src_w << 16) / info->dst_w; + posy = incy / 2; + + while (info->dst_h--) { + Uint32 *src = 0; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + posx = incx / 2; + + srcy = posy >> 16; + while (n--) { + srcx = posx >> 16; + src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); + pixel = *src; + R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel; + pixel = (A << 24) | (B << 16) | (G << 8) | R; + *dst = pixel; + posx += incx; + ++dst; + } + posy += incy; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_XRGB8888_ABGR8888_Blend(SDL_BlitInfo *info) +{ + const int flags = info->flags; + Uint32 srcpixel; + Uint32 srcR, srcG, srcB; + Uint32 dstpixel; + Uint32 dstR, dstG, dstB, dstA; + + while (info->dst_h--) { + Uint32 *src = (Uint32 *)info->src; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + while (n--) { + srcpixel = *src; + srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; + dstpixel = *dst; + dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { + case SDL_COPY_BLEND: + dstR = srcR; + dstG = srcG; + dstB = srcB; + dstA = 0xFF; + break; + case SDL_COPY_BLEND_PREMULTIPLIED: + dstR = srcR; + dstG = srcG; + dstB = srcB; + dstA = 0xFF; + break; + case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: + dstR = srcR + dstR; if (dstR > 255) dstR = 255; + dstG = srcG + dstG; if (dstG > 255) dstG = 255; + dstB = srcB + dstB; if (dstB > 255) dstB = 255; + break; + case SDL_COPY_MOD: + MULT_DIV_255(srcR, dstR, dstR); + MULT_DIV_255(srcG, dstG, dstG); + MULT_DIV_255(srcB, dstB, dstB); + break; + case SDL_COPY_MUL: + MULT_DIV_255(srcR, dstR, dstR); + MULT_DIV_255(srcG, dstG, dstG); + MULT_DIV_255(srcB, dstB, dstB); + break; + } + dstpixel = (dstA << 24) | (dstB << 16) | (dstG << 8) | dstR; + *dst = dstpixel; + ++src; + ++dst; + } + info->src += info->src_pitch; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_XRGB8888_ABGR8888_Blend_Scale(SDL_BlitInfo *info) +{ + const int flags = info->flags; + Uint32 srcpixel; + Uint32 srcR, srcG, srcB; + Uint32 dstpixel; + Uint32 dstR, dstG, dstB, dstA; + Uint64 srcy, srcx; + Uint64 posy, posx; + Uint64 incy, incx; + + incy = ((Uint64)info->src_h << 16) / info->dst_h; + incx = ((Uint64)info->src_w << 16) / info->dst_w; + posy = incy / 2; + + while (info->dst_h--) { + Uint32 *src = 0; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + posx = incx / 2; + + srcy = posy >> 16; + while (n--) { + srcx = posx >> 16; + src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); + srcpixel = *src; + srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; + dstpixel = *dst; + dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { + case SDL_COPY_BLEND: + dstR = srcR; + dstG = srcG; + dstB = srcB; + dstA = 0xFF; + break; + case SDL_COPY_BLEND_PREMULTIPLIED: + dstR = srcR; + dstG = srcG; + dstB = srcB; + dstA = 0xFF; + break; + case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: + dstR = srcR + dstR; if (dstR > 255) dstR = 255; + dstG = srcG + dstG; if (dstG > 255) dstG = 255; + dstB = srcB + dstB; if (dstB > 255) dstB = 255; + break; + case SDL_COPY_MOD: + MULT_DIV_255(srcR, dstR, dstR); + MULT_DIV_255(srcG, dstG, dstG); + MULT_DIV_255(srcB, dstB, dstB); + break; + case SDL_COPY_MUL: + MULT_DIV_255(srcR, dstR, dstR); + MULT_DIV_255(srcG, dstG, dstG); + MULT_DIV_255(srcB, dstB, dstB); + break; + } + dstpixel = (dstA << 24) | (dstB << 16) | (dstG << 8) | dstR; + *dst = dstpixel; + posx += incx; + ++dst; + } + posy += incy; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_XRGB8888_ABGR8888_Modulate(SDL_BlitInfo *info) +{ + const int flags = info->flags; + const Uint32 modulateR = info->r; + const Uint32 modulateG = info->g; + const Uint32 modulateB = info->b; + const Uint32 modulateA = info->a; + Uint32 pixel; + const Uint32 A = (flags & SDL_COPY_MODULATE_ALPHA) ? modulateA : 0xFF; + Uint32 R, G, B; + + while (info->dst_h--) { + Uint32 *src = (Uint32 *)info->src; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + while (n--) { + pixel = *src; + R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel; + if (flags & SDL_COPY_MODULATE_COLOR) { + MULT_DIV_255(R, modulateR, R); + MULT_DIV_255(G, modulateG, G); + MULT_DIV_255(B, modulateB, B); + } + pixel = (A << 24) | (B << 16) | (G << 8) | R; + *dst = pixel; + ++src; + ++dst; + } + info->src += info->src_pitch; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_XRGB8888_ABGR8888_Modulate_Scale(SDL_BlitInfo *info) +{ + const int flags = info->flags; + const Uint32 modulateR = info->r; + const Uint32 modulateG = info->g; + const Uint32 modulateB = info->b; + const Uint32 modulateA = info->a; + Uint32 pixel; + const Uint32 A = (flags & SDL_COPY_MODULATE_ALPHA) ? modulateA : 0xFF; + Uint32 R, G, B; + Uint64 srcy, srcx; + Uint64 posy, posx; + Uint64 incy, incx; + + incy = ((Uint64)info->src_h << 16) / info->dst_h; + incx = ((Uint64)info->src_w << 16) / info->dst_w; + posy = incy / 2; + + while (info->dst_h--) { + Uint32 *src = 0; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + posx = incx / 2; + + srcy = posy >> 16; + while (n--) { + srcx = posx >> 16; + src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); + pixel = *src; + R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel; + if (flags & SDL_COPY_MODULATE_COLOR) { + MULT_DIV_255(R, modulateR, R); + MULT_DIV_255(G, modulateG, G); + MULT_DIV_255(B, modulateB, B); + } + pixel = (A << 24) | (B << 16) | (G << 8) | R; + *dst = pixel; + posx += incx; + ++dst; + } + posy += incy; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_XRGB8888_ABGR8888_Modulate_Blend(SDL_BlitInfo *info) +{ + const int flags = info->flags; + const Uint32 modulateR = info->r; + const Uint32 modulateG = info->g; + const Uint32 modulateB = info->b; + const Uint32 modulateA = info->a; + Uint32 srcpixel; + const Uint32 srcA = (flags & SDL_COPY_MODULATE_ALPHA) ? modulateA : 0xFF; + Uint32 srcR, srcG, srcB; + Uint32 dstpixel; + Uint32 dstR, dstG, dstB, dstA; + + while (info->dst_h--) { + Uint32 *src = (Uint32 *)info->src; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + while (n--) { + srcpixel = *src; + srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; + dstpixel = *dst; + dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); + if (flags & SDL_COPY_MODULATE_COLOR) { + MULT_DIV_255(srcR, modulateR, srcR); + MULT_DIV_255(srcG, modulateG, srcG); + MULT_DIV_255(srcB, modulateB, srcB); + } + if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { + if (srcA < 255) { + MULT_DIV_255(srcR, srcA, srcR); + MULT_DIV_255(srcG, srcA, srcG); + MULT_DIV_255(srcB, srcA, srcB); + } + } + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { + case SDL_COPY_BLEND: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; + case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: + dstR = srcR + dstR; if (dstR > 255) dstR = 255; + dstG = srcG + dstG; if (dstG > 255) dstG = 255; + dstB = srcB + dstB; if (dstB > 255) dstB = 255; + break; + case SDL_COPY_MOD: + MULT_DIV_255(srcR, dstR, dstR); + MULT_DIV_255(srcG, dstG, dstG); + MULT_DIV_255(srcB, dstB, dstB); + break; + case SDL_COPY_MUL: + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } + break; + } + dstpixel = (dstA << 24) | (dstB << 16) | (dstG << 8) | dstR; + *dst = dstpixel; + ++src; + ++dst; + } + info->src += info->src_pitch; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_XRGB8888_ABGR8888_Modulate_Blend_Scale(SDL_BlitInfo *info) +{ + const int flags = info->flags; + const Uint32 modulateR = info->r; + const Uint32 modulateG = info->g; + const Uint32 modulateB = info->b; + const Uint32 modulateA = info->a; + Uint32 srcpixel; + const Uint32 srcA = (flags & SDL_COPY_MODULATE_ALPHA) ? modulateA : 0xFF; + Uint32 srcR, srcG, srcB; + Uint32 dstpixel; + Uint32 dstR, dstG, dstB, dstA; + Uint64 srcy, srcx; + Uint64 posy, posx; + Uint64 incy, incx; + + incy = ((Uint64)info->src_h << 16) / info->dst_h; + incx = ((Uint64)info->src_w << 16) / info->dst_w; + posy = incy / 2; + + while (info->dst_h--) { + Uint32 *src = 0; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + posx = incx / 2; + + srcy = posy >> 16; + while (n--) { + srcx = posx >> 16; + src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); + srcpixel = *src; + srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; + dstpixel = *dst; + dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); + if (flags & SDL_COPY_MODULATE_COLOR) { + MULT_DIV_255(srcR, modulateR, srcR); + MULT_DIV_255(srcG, modulateG, srcG); + MULT_DIV_255(srcB, modulateB, srcB); + } + if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { + if (srcA < 255) { + MULT_DIV_255(srcR, srcA, srcR); + MULT_DIV_255(srcG, srcA, srcG); + MULT_DIV_255(srcB, srcA, srcB); + } + } + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { + case SDL_COPY_BLEND: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; + case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: + dstR = srcR + dstR; if (dstR > 255) dstR = 255; + dstG = srcG + dstG; if (dstG > 255) dstG = 255; + dstB = srcB + dstB; if (dstB > 255) dstB = 255; + break; + case SDL_COPY_MOD: + MULT_DIV_255(srcR, dstR, dstR); + MULT_DIV_255(srcG, dstG, dstG); + MULT_DIV_255(srcB, dstB, dstB); + break; + case SDL_COPY_MUL: + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } + break; + } + dstpixel = (dstA << 24) | (dstB << 16) | (dstG << 8) | dstR; + *dst = dstpixel; + posx += incx; + ++dst; + } + posy += incy; + info->dst += info->dst_pitch; + } +} + static void SDL_Blit_XBGR8888_XRGB8888_Scale(SDL_BlitInfo *info) { Uint32 pixel; @@ -1230,13 +1807,19 @@ static void SDL_Blit_XBGR8888_XRGB8888_Blend(SDL_BlitInfo *info) srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; dstpixel = *dst; dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: dstR = srcR; dstG = srcG; dstB = srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + dstR = srcR; + dstG = srcG; + dstB = srcB; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -1291,13 +1874,19 @@ static void SDL_Blit_XBGR8888_XRGB8888_Blend_Scale(SDL_BlitInfo *info) srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; dstpixel = *dst; dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: dstR = srcR; dstG = srcG; dstB = srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + dstR = srcR; + dstG = srcG; + dstB = srcB; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -1425,14 +2014,13 @@ static void SDL_Blit_XBGR8888_XRGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, modulateB, srcB); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -1441,7 +2029,19 @@ static void SDL_Blit_XBGR8888_XRGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -1452,15 +2052,19 @@ static void SDL_Blit_XBGR8888_XRGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstR << 16) | (dstG << 8) | dstB; @@ -1513,14 +2117,13 @@ static void SDL_Blit_XBGR8888_XRGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, modulateB, srcB); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -1529,7 +2132,19 @@ static void SDL_Blit_XBGR8888_XRGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -1540,15 +2155,19 @@ static void SDL_Blit_XBGR8888_XRGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstR << 16) | (dstG << 8) | dstB; @@ -1607,13 +2226,19 @@ static void SDL_Blit_XBGR8888_XBGR8888_Blend(SDL_BlitInfo *info) srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; dstpixel = *dst; dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: dstR = srcR; dstG = srcG; dstB = srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + dstR = srcR; + dstG = srcG; + dstB = srcB; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -1668,13 +2293,19 @@ static void SDL_Blit_XBGR8888_XBGR8888_Blend_Scale(SDL_BlitInfo *info) srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; dstpixel = *dst; dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: dstR = srcR; dstG = srcG; dstB = srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + dstR = srcR; + dstG = srcG; + dstB = srcB; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -1802,14 +2433,13 @@ static void SDL_Blit_XBGR8888_XBGR8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, modulateB, srcB); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -1818,7 +2448,19 @@ static void SDL_Blit_XBGR8888_XBGR8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -1829,15 +2471,19 @@ static void SDL_Blit_XBGR8888_XBGR8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstB << 16) | (dstG << 8) | dstR; @@ -1890,14 +2536,13 @@ static void SDL_Blit_XBGR8888_XBGR8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, modulateB, srcB); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -1906,7 +2551,19 @@ static void SDL_Blit_XBGR8888_XBGR8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -1917,15 +2574,19 @@ static void SDL_Blit_XBGR8888_XBGR8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstB << 16) | (dstG << 8) | dstR; @@ -1990,14 +2651,21 @@ static void SDL_Blit_XBGR8888_ARGB8888_Blend(SDL_BlitInfo *info) srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; dstpixel = *dst; dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: dstR = srcR; dstG = srcG; dstB = srcB; dstA = 0xFF; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + dstR = srcR; + dstG = srcG; + dstB = srcB; + dstA = 0xFF; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -2052,14 +2720,21 @@ static void SDL_Blit_XBGR8888_ARGB8888_Blend_Scale(SDL_BlitInfo *info) srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; dstpixel = *dst; dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: dstR = srcR; dstG = srcG; dstB = srcB; dstA = 0xFF; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + dstR = srcR; + dstG = srcG; + dstB = srcB; + dstA = 0xFF; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -2191,14 +2866,13 @@ static void SDL_Blit_XBGR8888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, modulateB, srcB); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -2209,7 +2883,22 @@ static void SDL_Blit_XBGR8888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstA, dstA); dstA += srcA; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -2220,15 +2909,19 @@ static void SDL_Blit_XBGR8888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstA << 24) | (dstR << 16) | (dstG << 8) | dstB; @@ -2281,14 +2974,13 @@ static void SDL_Blit_XBGR8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, modulateB, srcB); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -2299,7 +2991,22 @@ static void SDL_Blit_XBGR8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstA, dstA); dstA += srcA; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -2310,15 +3017,19 @@ static void SDL_Blit_XBGR8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstA << 24) | (dstR << 16) | (dstG << 8) | dstB; @@ -2331,6 +3042,447 @@ static void SDL_Blit_XBGR8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) } } +static void SDL_Blit_XBGR8888_ABGR8888_Scale(SDL_BlitInfo *info) +{ + Uint32 pixel; + const Uint32 A = 0xFF; + Uint64 srcy, srcx; + Uint64 posy, posx; + Uint64 incy, incx; + + incy = ((Uint64)info->src_h << 16) / info->dst_h; + incx = ((Uint64)info->src_w << 16) / info->dst_w; + posy = incy / 2; + + while (info->dst_h--) { + Uint32 *src = 0; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + posx = incx / 2; + + srcy = posy >> 16; + while (n--) { + srcx = posx >> 16; + src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); + pixel = *src; + pixel |= (A << 24); + *dst = pixel; + posx += incx; + ++dst; + } + posy += incy; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_XBGR8888_ABGR8888_Blend(SDL_BlitInfo *info) +{ + const int flags = info->flags; + Uint32 srcpixel; + Uint32 srcR, srcG, srcB; + Uint32 dstpixel; + Uint32 dstR, dstG, dstB, dstA; + + while (info->dst_h--) { + Uint32 *src = (Uint32 *)info->src; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + while (n--) { + srcpixel = *src; + srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; + dstpixel = *dst; + dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { + case SDL_COPY_BLEND: + dstR = srcR; + dstG = srcG; + dstB = srcB; + dstA = 0xFF; + break; + case SDL_COPY_BLEND_PREMULTIPLIED: + dstR = srcR; + dstG = srcG; + dstB = srcB; + dstA = 0xFF; + break; + case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: + dstR = srcR + dstR; if (dstR > 255) dstR = 255; + dstG = srcG + dstG; if (dstG > 255) dstG = 255; + dstB = srcB + dstB; if (dstB > 255) dstB = 255; + break; + case SDL_COPY_MOD: + MULT_DIV_255(srcR, dstR, dstR); + MULT_DIV_255(srcG, dstG, dstG); + MULT_DIV_255(srcB, dstB, dstB); + break; + case SDL_COPY_MUL: + MULT_DIV_255(srcR, dstR, dstR); + MULT_DIV_255(srcG, dstG, dstG); + MULT_DIV_255(srcB, dstB, dstB); + break; + } + dstpixel = (dstA << 24) | (dstB << 16) | (dstG << 8) | dstR; + *dst = dstpixel; + ++src; + ++dst; + } + info->src += info->src_pitch; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_XBGR8888_ABGR8888_Blend_Scale(SDL_BlitInfo *info) +{ + const int flags = info->flags; + Uint32 srcpixel; + Uint32 srcR, srcG, srcB; + Uint32 dstpixel; + Uint32 dstR, dstG, dstB, dstA; + Uint64 srcy, srcx; + Uint64 posy, posx; + Uint64 incy, incx; + + incy = ((Uint64)info->src_h << 16) / info->dst_h; + incx = ((Uint64)info->src_w << 16) / info->dst_w; + posy = incy / 2; + + while (info->dst_h--) { + Uint32 *src = 0; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + posx = incx / 2; + + srcy = posy >> 16; + while (n--) { + srcx = posx >> 16; + src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); + srcpixel = *src; + srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; + dstpixel = *dst; + dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { + case SDL_COPY_BLEND: + dstR = srcR; + dstG = srcG; + dstB = srcB; + dstA = 0xFF; + break; + case SDL_COPY_BLEND_PREMULTIPLIED: + dstR = srcR; + dstG = srcG; + dstB = srcB; + dstA = 0xFF; + break; + case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: + dstR = srcR + dstR; if (dstR > 255) dstR = 255; + dstG = srcG + dstG; if (dstG > 255) dstG = 255; + dstB = srcB + dstB; if (dstB > 255) dstB = 255; + break; + case SDL_COPY_MOD: + MULT_DIV_255(srcR, dstR, dstR); + MULT_DIV_255(srcG, dstG, dstG); + MULT_DIV_255(srcB, dstB, dstB); + break; + case SDL_COPY_MUL: + MULT_DIV_255(srcR, dstR, dstR); + MULT_DIV_255(srcG, dstG, dstG); + MULT_DIV_255(srcB, dstB, dstB); + break; + } + dstpixel = (dstA << 24) | (dstB << 16) | (dstG << 8) | dstR; + *dst = dstpixel; + posx += incx; + ++dst; + } + posy += incy; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_XBGR8888_ABGR8888_Modulate(SDL_BlitInfo *info) +{ + const int flags = info->flags; + const Uint32 modulateR = info->r; + const Uint32 modulateG = info->g; + const Uint32 modulateB = info->b; + const Uint32 modulateA = info->a; + Uint32 pixel; + const Uint32 A = (flags & SDL_COPY_MODULATE_ALPHA) ? modulateA : 0xFF; + Uint32 R, G, B; + + while (info->dst_h--) { + Uint32 *src = (Uint32 *)info->src; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + while (n--) { + pixel = *src; + B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel; + if (flags & SDL_COPY_MODULATE_COLOR) { + MULT_DIV_255(R, modulateR, R); + MULT_DIV_255(G, modulateG, G); + MULT_DIV_255(B, modulateB, B); + } + pixel = (A << 24) | (B << 16) | (G << 8) | R; + *dst = pixel; + ++src; + ++dst; + } + info->src += info->src_pitch; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_XBGR8888_ABGR8888_Modulate_Scale(SDL_BlitInfo *info) +{ + const int flags = info->flags; + const Uint32 modulateR = info->r; + const Uint32 modulateG = info->g; + const Uint32 modulateB = info->b; + const Uint32 modulateA = info->a; + Uint32 pixel; + const Uint32 A = (flags & SDL_COPY_MODULATE_ALPHA) ? modulateA : 0xFF; + Uint32 R, G, B; + Uint64 srcy, srcx; + Uint64 posy, posx; + Uint64 incy, incx; + + incy = ((Uint64)info->src_h << 16) / info->dst_h; + incx = ((Uint64)info->src_w << 16) / info->dst_w; + posy = incy / 2; + + while (info->dst_h--) { + Uint32 *src = 0; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + posx = incx / 2; + + srcy = posy >> 16; + while (n--) { + srcx = posx >> 16; + src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); + pixel = *src; + B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel; + if (flags & SDL_COPY_MODULATE_COLOR) { + MULT_DIV_255(R, modulateR, R); + MULT_DIV_255(G, modulateG, G); + MULT_DIV_255(B, modulateB, B); + } + pixel = (A << 24) | (B << 16) | (G << 8) | R; + *dst = pixel; + posx += incx; + ++dst; + } + posy += incy; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_XBGR8888_ABGR8888_Modulate_Blend(SDL_BlitInfo *info) +{ + const int flags = info->flags; + const Uint32 modulateR = info->r; + const Uint32 modulateG = info->g; + const Uint32 modulateB = info->b; + const Uint32 modulateA = info->a; + Uint32 srcpixel; + const Uint32 srcA = (flags & SDL_COPY_MODULATE_ALPHA) ? modulateA : 0xFF; + Uint32 srcR, srcG, srcB; + Uint32 dstpixel; + Uint32 dstR, dstG, dstB, dstA; + + while (info->dst_h--) { + Uint32 *src = (Uint32 *)info->src; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + while (n--) { + srcpixel = *src; + srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; + dstpixel = *dst; + dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); + if (flags & SDL_COPY_MODULATE_COLOR) { + MULT_DIV_255(srcR, modulateR, srcR); + MULT_DIV_255(srcG, modulateG, srcG); + MULT_DIV_255(srcB, modulateB, srcB); + } + if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { + if (srcA < 255) { + MULT_DIV_255(srcR, srcA, srcR); + MULT_DIV_255(srcG, srcA, srcG); + MULT_DIV_255(srcB, srcA, srcB); + } + } + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { + case SDL_COPY_BLEND: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; + case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: + dstR = srcR + dstR; if (dstR > 255) dstR = 255; + dstG = srcG + dstG; if (dstG > 255) dstG = 255; + dstB = srcB + dstB; if (dstB > 255) dstB = 255; + break; + case SDL_COPY_MOD: + MULT_DIV_255(srcR, dstR, dstR); + MULT_DIV_255(srcG, dstG, dstG); + MULT_DIV_255(srcB, dstB, dstB); + break; + case SDL_COPY_MUL: + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } + break; + } + dstpixel = (dstA << 24) | (dstB << 16) | (dstG << 8) | dstR; + *dst = dstpixel; + ++src; + ++dst; + } + info->src += info->src_pitch; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_XBGR8888_ABGR8888_Modulate_Blend_Scale(SDL_BlitInfo *info) +{ + const int flags = info->flags; + const Uint32 modulateR = info->r; + const Uint32 modulateG = info->g; + const Uint32 modulateB = info->b; + const Uint32 modulateA = info->a; + Uint32 srcpixel; + const Uint32 srcA = (flags & SDL_COPY_MODULATE_ALPHA) ? modulateA : 0xFF; + Uint32 srcR, srcG, srcB; + Uint32 dstpixel; + Uint32 dstR, dstG, dstB, dstA; + Uint64 srcy, srcx; + Uint64 posy, posx; + Uint64 incy, incx; + + incy = ((Uint64)info->src_h << 16) / info->dst_h; + incx = ((Uint64)info->src_w << 16) / info->dst_w; + posy = incy / 2; + + while (info->dst_h--) { + Uint32 *src = 0; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + posx = incx / 2; + + srcy = posy >> 16; + while (n--) { + srcx = posx >> 16; + src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); + srcpixel = *src; + srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; + dstpixel = *dst; + dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); + if (flags & SDL_COPY_MODULATE_COLOR) { + MULT_DIV_255(srcR, modulateR, srcR); + MULT_DIV_255(srcG, modulateG, srcG); + MULT_DIV_255(srcB, modulateB, srcB); + } + if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { + if (srcA < 255) { + MULT_DIV_255(srcR, srcA, srcR); + MULT_DIV_255(srcG, srcA, srcG); + MULT_DIV_255(srcB, srcA, srcB); + } + } + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { + case SDL_COPY_BLEND: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; + case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: + dstR = srcR + dstR; if (dstR > 255) dstR = 255; + dstG = srcG + dstG; if (dstG > 255) dstG = 255; + dstB = srcB + dstB; if (dstB > 255) dstB = 255; + break; + case SDL_COPY_MOD: + MULT_DIV_255(srcR, dstR, dstR); + MULT_DIV_255(srcG, dstG, dstG); + MULT_DIV_255(srcB, dstB, dstB); + break; + case SDL_COPY_MUL: + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } + break; + } + dstpixel = (dstA << 24) | (dstB << 16) | (dstG << 8) | dstR; + *dst = dstpixel; + posx += incx; + ++dst; + } + posy += incy; + info->dst += info->dst_pitch; + } +} + static void SDL_Blit_ARGB8888_XRGB8888_Scale(SDL_BlitInfo *info) { Uint32 pixel; @@ -2381,14 +3533,13 @@ static void SDL_Blit_ARGB8888_XRGB8888_Blend(SDL_BlitInfo *info) dstpixel = *dst; dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -2397,7 +3548,19 @@ static void SDL_Blit_ARGB8888_XRGB8888_Blend(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -2408,15 +3571,19 @@ static void SDL_Blit_ARGB8888_XRGB8888_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstR << 16) | (dstG << 8) | dstB; @@ -2459,14 +3626,13 @@ static void SDL_Blit_ARGB8888_XRGB8888_Blend_Scale(SDL_BlitInfo *info) dstpixel = *dst; dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -2475,7 +3641,19 @@ static void SDL_Blit_ARGB8888_XRGB8888_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -2486,15 +3664,19 @@ static void SDL_Blit_ARGB8888_XRGB8888_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstR << 16) | (dstG << 8) | dstB; @@ -2611,14 +3793,13 @@ static void SDL_Blit_ARGB8888_XRGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcA, modulateA, srcA); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -2627,7 +3808,19 @@ static void SDL_Blit_ARGB8888_XRGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -2638,15 +3831,19 @@ static void SDL_Blit_ARGB8888_XRGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstR << 16) | (dstG << 8) | dstB; @@ -2701,14 +3898,13 @@ static void SDL_Blit_ARGB8888_XRGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcA, modulateA, srcA); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -2717,7 +3913,19 @@ static void SDL_Blit_ARGB8888_XRGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -2728,15 +3936,19 @@ static void SDL_Blit_ARGB8888_XRGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstR << 16) | (dstG << 8) | dstB; @@ -2801,14 +4013,13 @@ static void SDL_Blit_ARGB8888_XBGR8888_Blend(SDL_BlitInfo *info) dstpixel = *dst; dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -2817,7 +4028,19 @@ static void SDL_Blit_ARGB8888_XBGR8888_Blend(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -2828,15 +4051,19 @@ static void SDL_Blit_ARGB8888_XBGR8888_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstB << 16) | (dstG << 8) | dstR; @@ -2879,14 +4106,13 @@ static void SDL_Blit_ARGB8888_XBGR8888_Blend_Scale(SDL_BlitInfo *info) dstpixel = *dst; dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -2895,7 +4121,19 @@ static void SDL_Blit_ARGB8888_XBGR8888_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -2906,15 +4144,19 @@ static void SDL_Blit_ARGB8888_XBGR8888_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstB << 16) | (dstG << 8) | dstR; @@ -3031,14 +4273,13 @@ static void SDL_Blit_ARGB8888_XBGR8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcA, modulateA, srcA); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -3047,7 +4288,19 @@ static void SDL_Blit_ARGB8888_XBGR8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -3058,15 +4311,19 @@ static void SDL_Blit_ARGB8888_XBGR8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstB << 16) | (dstG << 8) | dstR; @@ -3121,14 +4378,13 @@ static void SDL_Blit_ARGB8888_XBGR8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcA, modulateA, srcA); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -3137,7 +4393,19 @@ static void SDL_Blit_ARGB8888_XBGR8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -3148,15 +4416,19 @@ static void SDL_Blit_ARGB8888_XBGR8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstB << 16) | (dstG << 8) | dstR; @@ -3216,14 +4488,13 @@ static void SDL_Blit_ARGB8888_ARGB8888_Blend(SDL_BlitInfo *info) dstpixel = *dst; dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -3234,7 +4505,22 @@ static void SDL_Blit_ARGB8888_ARGB8888_Blend(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstA, dstA); dstA += srcA; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -3245,15 +4531,19 @@ static void SDL_Blit_ARGB8888_ARGB8888_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstA << 24) | (dstR << 16) | (dstG << 8) | dstB; @@ -3296,14 +4586,13 @@ static void SDL_Blit_ARGB8888_ARGB8888_Blend_Scale(SDL_BlitInfo *info) dstpixel = *dst; dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -3314,7 +4603,22 @@ static void SDL_Blit_ARGB8888_ARGB8888_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstA, dstA); dstA += srcA; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -3325,15 +4629,19 @@ static void SDL_Blit_ARGB8888_ARGB8888_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstA << 24) | (dstR << 16) | (dstG << 8) | dstB; @@ -3458,14 +4766,13 @@ static void SDL_Blit_ARGB8888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcA, modulateA, srcA); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -3476,7 +4783,22 @@ static void SDL_Blit_ARGB8888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstA, dstA); dstA += srcA; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -3487,15 +4809,19 @@ static void SDL_Blit_ARGB8888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstA << 24) | (dstR << 16) | (dstG << 8) | dstB; @@ -3550,14 +4876,13 @@ static void SDL_Blit_ARGB8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcA, modulateA, srcA); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -3568,7 +4893,22 @@ static void SDL_Blit_ARGB8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstA, dstA); dstA += srcA; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -3579,15 +4919,19 @@ static void SDL_Blit_ARGB8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstA << 24) | (dstR << 16) | (dstG << 8) | dstB; @@ -3600,6 +4944,514 @@ static void SDL_Blit_ARGB8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) } } +static void SDL_Blit_ARGB8888_ABGR8888_Scale(SDL_BlitInfo *info) +{ + Uint32 pixel; + Uint32 R, G, B, A; + Uint64 srcy, srcx; + Uint64 posy, posx; + Uint64 incy, incx; + + incy = ((Uint64)info->src_h << 16) / info->dst_h; + incx = ((Uint64)info->src_w << 16) / info->dst_w; + posy = incy / 2; + + while (info->dst_h--) { + Uint32 *src = 0; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + posx = incx / 2; + + srcy = posy >> 16; + while (n--) { + srcx = posx >> 16; + src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); + pixel = *src; + R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel; A = (Uint8)(pixel >> 24); + pixel = (A << 24) | (B << 16) | (G << 8) | R; + *dst = pixel; + posx += incx; + ++dst; + } + posy += incy; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_ARGB8888_ABGR8888_Blend(SDL_BlitInfo *info) +{ + const int flags = info->flags; + Uint32 srcpixel; + Uint32 srcR, srcG, srcB, srcA; + Uint32 dstpixel; + Uint32 dstR, dstG, dstB, dstA; + + while (info->dst_h--) { + Uint32 *src = (Uint32 *)info->src; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + while (n--) { + srcpixel = *src; + srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); + dstpixel = *dst; + dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); + if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { + if (srcA < 255) { + MULT_DIV_255(srcR, srcA, srcR); + MULT_DIV_255(srcG, srcA, srcG); + MULT_DIV_255(srcB, srcA, srcB); + } + } + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { + case SDL_COPY_BLEND: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; + case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: + dstR = srcR + dstR; if (dstR > 255) dstR = 255; + dstG = srcG + dstG; if (dstG > 255) dstG = 255; + dstB = srcB + dstB; if (dstB > 255) dstB = 255; + break; + case SDL_COPY_MOD: + MULT_DIV_255(srcR, dstR, dstR); + MULT_DIV_255(srcG, dstG, dstG); + MULT_DIV_255(srcB, dstB, dstB); + break; + case SDL_COPY_MUL: + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } + break; + } + dstpixel = (dstA << 24) | (dstB << 16) | (dstG << 8) | dstR; + *dst = dstpixel; + ++src; + ++dst; + } + info->src += info->src_pitch; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_ARGB8888_ABGR8888_Blend_Scale(SDL_BlitInfo *info) +{ + const int flags = info->flags; + Uint32 srcpixel; + Uint32 srcR, srcG, srcB, srcA; + Uint32 dstpixel; + Uint32 dstR, dstG, dstB, dstA; + Uint64 srcy, srcx; + Uint64 posy, posx; + Uint64 incy, incx; + + incy = ((Uint64)info->src_h << 16) / info->dst_h; + incx = ((Uint64)info->src_w << 16) / info->dst_w; + posy = incy / 2; + + while (info->dst_h--) { + Uint32 *src = 0; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + posx = incx / 2; + + srcy = posy >> 16; + while (n--) { + srcx = posx >> 16; + src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); + srcpixel = *src; + srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); + dstpixel = *dst; + dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); + if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { + if (srcA < 255) { + MULT_DIV_255(srcR, srcA, srcR); + MULT_DIV_255(srcG, srcA, srcG); + MULT_DIV_255(srcB, srcA, srcB); + } + } + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { + case SDL_COPY_BLEND: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; + case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: + dstR = srcR + dstR; if (dstR > 255) dstR = 255; + dstG = srcG + dstG; if (dstG > 255) dstG = 255; + dstB = srcB + dstB; if (dstB > 255) dstB = 255; + break; + case SDL_COPY_MOD: + MULT_DIV_255(srcR, dstR, dstR); + MULT_DIV_255(srcG, dstG, dstG); + MULT_DIV_255(srcB, dstB, dstB); + break; + case SDL_COPY_MUL: + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } + break; + } + dstpixel = (dstA << 24) | (dstB << 16) | (dstG << 8) | dstR; + *dst = dstpixel; + posx += incx; + ++dst; + } + posy += incy; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_ARGB8888_ABGR8888_Modulate(SDL_BlitInfo *info) +{ + const int flags = info->flags; + const Uint32 modulateR = info->r; + const Uint32 modulateG = info->g; + const Uint32 modulateB = info->b; + const Uint32 modulateA = info->a; + Uint32 pixel; + Uint32 R, G, B, A; + + while (info->dst_h--) { + Uint32 *src = (Uint32 *)info->src; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + while (n--) { + pixel = *src; + R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel; A = (Uint8)(pixel >> 24); + if (flags & SDL_COPY_MODULATE_COLOR) { + MULT_DIV_255(R, modulateR, R); + MULT_DIV_255(G, modulateG, G); + MULT_DIV_255(B, modulateB, B); + } + if (flags & SDL_COPY_MODULATE_ALPHA) { + MULT_DIV_255(A, modulateA, A); + } + pixel = (A << 24) | (B << 16) | (G << 8) | R; + *dst = pixel; + ++src; + ++dst; + } + info->src += info->src_pitch; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_ARGB8888_ABGR8888_Modulate_Scale(SDL_BlitInfo *info) +{ + const int flags = info->flags; + const Uint32 modulateR = info->r; + const Uint32 modulateG = info->g; + const Uint32 modulateB = info->b; + const Uint32 modulateA = info->a; + Uint32 pixel; + Uint32 R, G, B, A; + Uint64 srcy, srcx; + Uint64 posy, posx; + Uint64 incy, incx; + + incy = ((Uint64)info->src_h << 16) / info->dst_h; + incx = ((Uint64)info->src_w << 16) / info->dst_w; + posy = incy / 2; + + while (info->dst_h--) { + Uint32 *src = 0; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + posx = incx / 2; + + srcy = posy >> 16; + while (n--) { + srcx = posx >> 16; + src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); + pixel = *src; + R = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); B = (Uint8)pixel; A = (Uint8)(pixel >> 24); + if (flags & SDL_COPY_MODULATE_COLOR) { + MULT_DIV_255(R, modulateR, R); + MULT_DIV_255(G, modulateG, G); + MULT_DIV_255(B, modulateB, B); + } + if (flags & SDL_COPY_MODULATE_ALPHA) { + MULT_DIV_255(A, modulateA, A); + } + pixel = (A << 24) | (B << 16) | (G << 8) | R; + *dst = pixel; + posx += incx; + ++dst; + } + posy += incy; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_ARGB8888_ABGR8888_Modulate_Blend(SDL_BlitInfo *info) +{ + const int flags = info->flags; + const Uint32 modulateR = info->r; + const Uint32 modulateG = info->g; + const Uint32 modulateB = info->b; + const Uint32 modulateA = info->a; + Uint32 srcpixel; + Uint32 srcR, srcG, srcB, srcA; + Uint32 dstpixel; + Uint32 dstR, dstG, dstB, dstA; + + while (info->dst_h--) { + Uint32 *src = (Uint32 *)info->src; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + while (n--) { + srcpixel = *src; + srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); + dstpixel = *dst; + dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); + if (flags & SDL_COPY_MODULATE_COLOR) { + MULT_DIV_255(srcR, modulateR, srcR); + MULT_DIV_255(srcG, modulateG, srcG); + MULT_DIV_255(srcB, modulateB, srcB); + } + if (flags & SDL_COPY_MODULATE_ALPHA) { + MULT_DIV_255(srcA, modulateA, srcA); + } + if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { + if (srcA < 255) { + MULT_DIV_255(srcR, srcA, srcR); + MULT_DIV_255(srcG, srcA, srcG); + MULT_DIV_255(srcB, srcA, srcB); + } + } + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { + case SDL_COPY_BLEND: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; + case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: + dstR = srcR + dstR; if (dstR > 255) dstR = 255; + dstG = srcG + dstG; if (dstG > 255) dstG = 255; + dstB = srcB + dstB; if (dstB > 255) dstB = 255; + break; + case SDL_COPY_MOD: + MULT_DIV_255(srcR, dstR, dstR); + MULT_DIV_255(srcG, dstG, dstG); + MULT_DIV_255(srcB, dstB, dstB); + break; + case SDL_COPY_MUL: + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } + break; + } + dstpixel = (dstA << 24) | (dstB << 16) | (dstG << 8) | dstR; + *dst = dstpixel; + ++src; + ++dst; + } + info->src += info->src_pitch; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_ARGB8888_ABGR8888_Modulate_Blend_Scale(SDL_BlitInfo *info) +{ + const int flags = info->flags; + const Uint32 modulateR = info->r; + const Uint32 modulateG = info->g; + const Uint32 modulateB = info->b; + const Uint32 modulateA = info->a; + Uint32 srcpixel; + Uint32 srcR, srcG, srcB, srcA; + Uint32 dstpixel; + Uint32 dstR, dstG, dstB, dstA; + Uint64 srcy, srcx; + Uint64 posy, posx; + Uint64 incy, incx; + + incy = ((Uint64)info->src_h << 16) / info->dst_h; + incx = ((Uint64)info->src_w << 16) / info->dst_w; + posy = incy / 2; + + while (info->dst_h--) { + Uint32 *src = 0; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + posx = incx / 2; + + srcy = posy >> 16; + while (n--) { + srcx = posx >> 16; + src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); + srcpixel = *src; + srcR = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcB = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); + dstpixel = *dst; + dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); + if (flags & SDL_COPY_MODULATE_COLOR) { + MULT_DIV_255(srcR, modulateR, srcR); + MULT_DIV_255(srcG, modulateG, srcG); + MULT_DIV_255(srcB, modulateB, srcB); + } + if (flags & SDL_COPY_MODULATE_ALPHA) { + MULT_DIV_255(srcA, modulateA, srcA); + } + if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { + if (srcA < 255) { + MULT_DIV_255(srcR, srcA, srcR); + MULT_DIV_255(srcG, srcA, srcG); + MULT_DIV_255(srcB, srcA, srcB); + } + } + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { + case SDL_COPY_BLEND: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; + case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: + dstR = srcR + dstR; if (dstR > 255) dstR = 255; + dstG = srcG + dstG; if (dstG > 255) dstG = 255; + dstB = srcB + dstB; if (dstB > 255) dstB = 255; + break; + case SDL_COPY_MOD: + MULT_DIV_255(srcR, dstR, dstR); + MULT_DIV_255(srcG, dstG, dstG); + MULT_DIV_255(srcB, dstB, dstB); + break; + case SDL_COPY_MUL: + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } + break; + } + dstpixel = (dstA << 24) | (dstB << 16) | (dstG << 8) | dstR; + *dst = dstpixel; + posx += incx; + ++dst; + } + posy += incy; + info->dst += info->dst_pitch; + } +} + static void SDL_Blit_RGBA8888_XRGB8888_Scale(SDL_BlitInfo *info) { Uint32 pixel; @@ -3650,14 +5502,13 @@ static void SDL_Blit_RGBA8888_XRGB8888_Blend(SDL_BlitInfo *info) dstpixel = *dst; dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -3666,7 +5517,19 @@ static void SDL_Blit_RGBA8888_XRGB8888_Blend(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -3677,15 +5540,19 @@ static void SDL_Blit_RGBA8888_XRGB8888_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstR << 16) | (dstG << 8) | dstB; @@ -3728,14 +5595,13 @@ static void SDL_Blit_RGBA8888_XRGB8888_Blend_Scale(SDL_BlitInfo *info) dstpixel = *dst; dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -3744,7 +5610,19 @@ static void SDL_Blit_RGBA8888_XRGB8888_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -3755,15 +5633,19 @@ static void SDL_Blit_RGBA8888_XRGB8888_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstR << 16) | (dstG << 8) | dstB; @@ -3880,14 +5762,13 @@ static void SDL_Blit_RGBA8888_XRGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcA, modulateA, srcA); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -3896,7 +5777,19 @@ static void SDL_Blit_RGBA8888_XRGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -3907,15 +5800,19 @@ static void SDL_Blit_RGBA8888_XRGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstR << 16) | (dstG << 8) | dstB; @@ -3970,14 +5867,13 @@ static void SDL_Blit_RGBA8888_XRGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcA, modulateA, srcA); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -3986,7 +5882,19 @@ static void SDL_Blit_RGBA8888_XRGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -3997,15 +5905,19 @@ static void SDL_Blit_RGBA8888_XRGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstR << 16) | (dstG << 8) | dstB; @@ -4070,14 +5982,13 @@ static void SDL_Blit_RGBA8888_XBGR8888_Blend(SDL_BlitInfo *info) dstpixel = *dst; dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -4086,7 +5997,19 @@ static void SDL_Blit_RGBA8888_XBGR8888_Blend(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -4097,15 +6020,19 @@ static void SDL_Blit_RGBA8888_XBGR8888_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstB << 16) | (dstG << 8) | dstR; @@ -4148,14 +6075,13 @@ static void SDL_Blit_RGBA8888_XBGR8888_Blend_Scale(SDL_BlitInfo *info) dstpixel = *dst; dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -4164,7 +6090,19 @@ static void SDL_Blit_RGBA8888_XBGR8888_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -4175,15 +6113,19 @@ static void SDL_Blit_RGBA8888_XBGR8888_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstB << 16) | (dstG << 8) | dstR; @@ -4300,14 +6242,13 @@ static void SDL_Blit_RGBA8888_XBGR8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcA, modulateA, srcA); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -4316,7 +6257,19 @@ static void SDL_Blit_RGBA8888_XBGR8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -4327,15 +6280,19 @@ static void SDL_Blit_RGBA8888_XBGR8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstB << 16) | (dstG << 8) | dstR; @@ -4390,14 +6347,13 @@ static void SDL_Blit_RGBA8888_XBGR8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcA, modulateA, srcA); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -4406,7 +6362,19 @@ static void SDL_Blit_RGBA8888_XBGR8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -4417,15 +6385,19 @@ static void SDL_Blit_RGBA8888_XBGR8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstB << 16) | (dstG << 8) | dstR; @@ -4488,14 +6460,13 @@ static void SDL_Blit_RGBA8888_ARGB8888_Blend(SDL_BlitInfo *info) dstpixel = *dst; dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -4506,7 +6477,22 @@ static void SDL_Blit_RGBA8888_ARGB8888_Blend(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstA, dstA); dstA += srcA; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -4517,15 +6503,19 @@ static void SDL_Blit_RGBA8888_ARGB8888_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstA << 24) | (dstR << 16) | (dstG << 8) | dstB; @@ -4568,14 +6558,13 @@ static void SDL_Blit_RGBA8888_ARGB8888_Blend_Scale(SDL_BlitInfo *info) dstpixel = *dst; dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -4586,7 +6575,22 @@ static void SDL_Blit_RGBA8888_ARGB8888_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstA, dstA); dstA += srcA; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -4597,15 +6601,19 @@ static void SDL_Blit_RGBA8888_ARGB8888_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstA << 24) | (dstR << 16) | (dstG << 8) | dstB; @@ -4730,14 +6738,13 @@ static void SDL_Blit_RGBA8888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcA, modulateA, srcA); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -4748,7 +6755,22 @@ static void SDL_Blit_RGBA8888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstA, dstA); dstA += srcA; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -4759,15 +6781,19 @@ static void SDL_Blit_RGBA8888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstA << 24) | (dstR << 16) | (dstG << 8) | dstB; @@ -4822,14 +6848,13 @@ static void SDL_Blit_RGBA8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcA, modulateA, srcA); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -4840,7 +6865,22 @@ static void SDL_Blit_RGBA8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstA, dstA); dstA += srcA; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -4851,15 +6891,19 @@ static void SDL_Blit_RGBA8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstA << 24) | (dstR << 16) | (dstG << 8) | dstB; @@ -4872,6 +6916,514 @@ static void SDL_Blit_RGBA8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) } } +static void SDL_Blit_RGBA8888_ABGR8888_Scale(SDL_BlitInfo *info) +{ + Uint32 pixel; + Uint32 R, G, B, A; + Uint64 srcy, srcx; + Uint64 posy, posx; + Uint64 incy, incx; + + incy = ((Uint64)info->src_h << 16) / info->dst_h; + incx = ((Uint64)info->src_w << 16) / info->dst_w; + posy = incy / 2; + + while (info->dst_h--) { + Uint32 *src = 0; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + posx = incx / 2; + + srcy = posy >> 16; + while (n--) { + srcx = posx >> 16; + src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); + pixel = *src; + R = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); B = (Uint8)(pixel >> 8); A = (Uint8)pixel; + pixel = (A << 24) | (B << 16) | (G << 8) | R; + *dst = pixel; + posx += incx; + ++dst; + } + posy += incy; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_RGBA8888_ABGR8888_Blend(SDL_BlitInfo *info) +{ + const int flags = info->flags; + Uint32 srcpixel; + Uint32 srcR, srcG, srcB, srcA; + Uint32 dstpixel; + Uint32 dstR, dstG, dstB, dstA; + + while (info->dst_h--) { + Uint32 *src = (Uint32 *)info->src; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + while (n--) { + srcpixel = *src; + srcR = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcB = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; + dstpixel = *dst; + dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); + if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { + if (srcA < 255) { + MULT_DIV_255(srcR, srcA, srcR); + MULT_DIV_255(srcG, srcA, srcG); + MULT_DIV_255(srcB, srcA, srcB); + } + } + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { + case SDL_COPY_BLEND: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; + case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: + dstR = srcR + dstR; if (dstR > 255) dstR = 255; + dstG = srcG + dstG; if (dstG > 255) dstG = 255; + dstB = srcB + dstB; if (dstB > 255) dstB = 255; + break; + case SDL_COPY_MOD: + MULT_DIV_255(srcR, dstR, dstR); + MULT_DIV_255(srcG, dstG, dstG); + MULT_DIV_255(srcB, dstB, dstB); + break; + case SDL_COPY_MUL: + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } + break; + } + dstpixel = (dstA << 24) | (dstB << 16) | (dstG << 8) | dstR; + *dst = dstpixel; + ++src; + ++dst; + } + info->src += info->src_pitch; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_RGBA8888_ABGR8888_Blend_Scale(SDL_BlitInfo *info) +{ + const int flags = info->flags; + Uint32 srcpixel; + Uint32 srcR, srcG, srcB, srcA; + Uint32 dstpixel; + Uint32 dstR, dstG, dstB, dstA; + Uint64 srcy, srcx; + Uint64 posy, posx; + Uint64 incy, incx; + + incy = ((Uint64)info->src_h << 16) / info->dst_h; + incx = ((Uint64)info->src_w << 16) / info->dst_w; + posy = incy / 2; + + while (info->dst_h--) { + Uint32 *src = 0; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + posx = incx / 2; + + srcy = posy >> 16; + while (n--) { + srcx = posx >> 16; + src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); + srcpixel = *src; + srcR = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcB = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; + dstpixel = *dst; + dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); + if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { + if (srcA < 255) { + MULT_DIV_255(srcR, srcA, srcR); + MULT_DIV_255(srcG, srcA, srcG); + MULT_DIV_255(srcB, srcA, srcB); + } + } + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { + case SDL_COPY_BLEND: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; + case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: + dstR = srcR + dstR; if (dstR > 255) dstR = 255; + dstG = srcG + dstG; if (dstG > 255) dstG = 255; + dstB = srcB + dstB; if (dstB > 255) dstB = 255; + break; + case SDL_COPY_MOD: + MULT_DIV_255(srcR, dstR, dstR); + MULT_DIV_255(srcG, dstG, dstG); + MULT_DIV_255(srcB, dstB, dstB); + break; + case SDL_COPY_MUL: + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } + break; + } + dstpixel = (dstA << 24) | (dstB << 16) | (dstG << 8) | dstR; + *dst = dstpixel; + posx += incx; + ++dst; + } + posy += incy; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_RGBA8888_ABGR8888_Modulate(SDL_BlitInfo *info) +{ + const int flags = info->flags; + const Uint32 modulateR = info->r; + const Uint32 modulateG = info->g; + const Uint32 modulateB = info->b; + const Uint32 modulateA = info->a; + Uint32 pixel; + Uint32 R, G, B, A; + + while (info->dst_h--) { + Uint32 *src = (Uint32 *)info->src; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + while (n--) { + pixel = *src; + R = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); B = (Uint8)(pixel >> 8); A = (Uint8)pixel; + if (flags & SDL_COPY_MODULATE_COLOR) { + MULT_DIV_255(R, modulateR, R); + MULT_DIV_255(G, modulateG, G); + MULT_DIV_255(B, modulateB, B); + } + if (flags & SDL_COPY_MODULATE_ALPHA) { + MULT_DIV_255(A, modulateA, A); + } + pixel = (A << 24) | (B << 16) | (G << 8) | R; + *dst = pixel; + ++src; + ++dst; + } + info->src += info->src_pitch; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_RGBA8888_ABGR8888_Modulate_Scale(SDL_BlitInfo *info) +{ + const int flags = info->flags; + const Uint32 modulateR = info->r; + const Uint32 modulateG = info->g; + const Uint32 modulateB = info->b; + const Uint32 modulateA = info->a; + Uint32 pixel; + Uint32 R, G, B, A; + Uint64 srcy, srcx; + Uint64 posy, posx; + Uint64 incy, incx; + + incy = ((Uint64)info->src_h << 16) / info->dst_h; + incx = ((Uint64)info->src_w << 16) / info->dst_w; + posy = incy / 2; + + while (info->dst_h--) { + Uint32 *src = 0; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + posx = incx / 2; + + srcy = posy >> 16; + while (n--) { + srcx = posx >> 16; + src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); + pixel = *src; + R = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); B = (Uint8)(pixel >> 8); A = (Uint8)pixel; + if (flags & SDL_COPY_MODULATE_COLOR) { + MULT_DIV_255(R, modulateR, R); + MULT_DIV_255(G, modulateG, G); + MULT_DIV_255(B, modulateB, B); + } + if (flags & SDL_COPY_MODULATE_ALPHA) { + MULT_DIV_255(A, modulateA, A); + } + pixel = (A << 24) | (B << 16) | (G << 8) | R; + *dst = pixel; + posx += incx; + ++dst; + } + posy += incy; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_RGBA8888_ABGR8888_Modulate_Blend(SDL_BlitInfo *info) +{ + const int flags = info->flags; + const Uint32 modulateR = info->r; + const Uint32 modulateG = info->g; + const Uint32 modulateB = info->b; + const Uint32 modulateA = info->a; + Uint32 srcpixel; + Uint32 srcR, srcG, srcB, srcA; + Uint32 dstpixel; + Uint32 dstR, dstG, dstB, dstA; + + while (info->dst_h--) { + Uint32 *src = (Uint32 *)info->src; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + while (n--) { + srcpixel = *src; + srcR = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcB = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; + dstpixel = *dst; + dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); + if (flags & SDL_COPY_MODULATE_COLOR) { + MULT_DIV_255(srcR, modulateR, srcR); + MULT_DIV_255(srcG, modulateG, srcG); + MULT_DIV_255(srcB, modulateB, srcB); + } + if (flags & SDL_COPY_MODULATE_ALPHA) { + MULT_DIV_255(srcA, modulateA, srcA); + } + if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { + if (srcA < 255) { + MULT_DIV_255(srcR, srcA, srcR); + MULT_DIV_255(srcG, srcA, srcG); + MULT_DIV_255(srcB, srcA, srcB); + } + } + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { + case SDL_COPY_BLEND: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; + case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: + dstR = srcR + dstR; if (dstR > 255) dstR = 255; + dstG = srcG + dstG; if (dstG > 255) dstG = 255; + dstB = srcB + dstB; if (dstB > 255) dstB = 255; + break; + case SDL_COPY_MOD: + MULT_DIV_255(srcR, dstR, dstR); + MULT_DIV_255(srcG, dstG, dstG); + MULT_DIV_255(srcB, dstB, dstB); + break; + case SDL_COPY_MUL: + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } + break; + } + dstpixel = (dstA << 24) | (dstB << 16) | (dstG << 8) | dstR; + *dst = dstpixel; + ++src; + ++dst; + } + info->src += info->src_pitch; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_RGBA8888_ABGR8888_Modulate_Blend_Scale(SDL_BlitInfo *info) +{ + const int flags = info->flags; + const Uint32 modulateR = info->r; + const Uint32 modulateG = info->g; + const Uint32 modulateB = info->b; + const Uint32 modulateA = info->a; + Uint32 srcpixel; + Uint32 srcR, srcG, srcB, srcA; + Uint32 dstpixel; + Uint32 dstR, dstG, dstB, dstA; + Uint64 srcy, srcx; + Uint64 posy, posx; + Uint64 incy, incx; + + incy = ((Uint64)info->src_h << 16) / info->dst_h; + incx = ((Uint64)info->src_w << 16) / info->dst_w; + posy = incy / 2; + + while (info->dst_h--) { + Uint32 *src = 0; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + posx = incx / 2; + + srcy = posy >> 16; + while (n--) { + srcx = posx >> 16; + src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); + srcpixel = *src; + srcR = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcB = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; + dstpixel = *dst; + dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); + if (flags & SDL_COPY_MODULATE_COLOR) { + MULT_DIV_255(srcR, modulateR, srcR); + MULT_DIV_255(srcG, modulateG, srcG); + MULT_DIV_255(srcB, modulateB, srcB); + } + if (flags & SDL_COPY_MODULATE_ALPHA) { + MULT_DIV_255(srcA, modulateA, srcA); + } + if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { + if (srcA < 255) { + MULT_DIV_255(srcR, srcA, srcR); + MULT_DIV_255(srcG, srcA, srcG); + MULT_DIV_255(srcB, srcA, srcB); + } + } + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { + case SDL_COPY_BLEND: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; + case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: + dstR = srcR + dstR; if (dstR > 255) dstR = 255; + dstG = srcG + dstG; if (dstG > 255) dstG = 255; + dstB = srcB + dstB; if (dstB > 255) dstB = 255; + break; + case SDL_COPY_MOD: + MULT_DIV_255(srcR, dstR, dstR); + MULT_DIV_255(srcG, dstG, dstG); + MULT_DIV_255(srcB, dstB, dstB); + break; + case SDL_COPY_MUL: + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } + break; + } + dstpixel = (dstA << 24) | (dstB << 16) | (dstG << 8) | dstR; + *dst = dstpixel; + posx += incx; + ++dst; + } + posy += incy; + info->dst += info->dst_pitch; + } +} + static void SDL_Blit_ABGR8888_XRGB8888_Scale(SDL_BlitInfo *info) { Uint32 pixel; @@ -4924,14 +7476,13 @@ static void SDL_Blit_ABGR8888_XRGB8888_Blend(SDL_BlitInfo *info) dstpixel = *dst; dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -4940,7 +7491,19 @@ static void SDL_Blit_ABGR8888_XRGB8888_Blend(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -4951,15 +7514,19 @@ static void SDL_Blit_ABGR8888_XRGB8888_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstR << 16) | (dstG << 8) | dstB; @@ -5002,14 +7569,13 @@ static void SDL_Blit_ABGR8888_XRGB8888_Blend_Scale(SDL_BlitInfo *info) dstpixel = *dst; dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -5018,7 +7584,19 @@ static void SDL_Blit_ABGR8888_XRGB8888_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -5029,15 +7607,19 @@ static void SDL_Blit_ABGR8888_XRGB8888_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstR << 16) | (dstG << 8) | dstB; @@ -5154,14 +7736,13 @@ static void SDL_Blit_ABGR8888_XRGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcA, modulateA, srcA); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -5170,7 +7751,19 @@ static void SDL_Blit_ABGR8888_XRGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -5181,15 +7774,19 @@ static void SDL_Blit_ABGR8888_XRGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstR << 16) | (dstG << 8) | dstB; @@ -5244,14 +7841,13 @@ static void SDL_Blit_ABGR8888_XRGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcA, modulateA, srcA); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -5260,7 +7856,19 @@ static void SDL_Blit_ABGR8888_XRGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -5271,15 +7879,19 @@ static void SDL_Blit_ABGR8888_XRGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstR << 16) | (dstG << 8) | dstB; @@ -5342,14 +7954,13 @@ static void SDL_Blit_ABGR8888_XBGR8888_Blend(SDL_BlitInfo *info) dstpixel = *dst; dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -5358,7 +7969,19 @@ static void SDL_Blit_ABGR8888_XBGR8888_Blend(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -5369,15 +7992,19 @@ static void SDL_Blit_ABGR8888_XBGR8888_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstB << 16) | (dstG << 8) | dstR; @@ -5420,14 +8047,13 @@ static void SDL_Blit_ABGR8888_XBGR8888_Blend_Scale(SDL_BlitInfo *info) dstpixel = *dst; dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -5436,7 +8062,19 @@ static void SDL_Blit_ABGR8888_XBGR8888_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -5447,15 +8085,19 @@ static void SDL_Blit_ABGR8888_XBGR8888_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstB << 16) | (dstG << 8) | dstR; @@ -5572,14 +8214,13 @@ static void SDL_Blit_ABGR8888_XBGR8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcA, modulateA, srcA); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -5588,7 +8229,19 @@ static void SDL_Blit_ABGR8888_XBGR8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -5599,15 +8252,19 @@ static void SDL_Blit_ABGR8888_XBGR8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstB << 16) | (dstG << 8) | dstR; @@ -5662,14 +8319,13 @@ static void SDL_Blit_ABGR8888_XBGR8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcA, modulateA, srcA); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -5678,7 +8334,19 @@ static void SDL_Blit_ABGR8888_XBGR8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -5689,15 +8357,19 @@ static void SDL_Blit_ABGR8888_XBGR8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstB << 16) | (dstG << 8) | dstR; @@ -5762,14 +8434,13 @@ static void SDL_Blit_ABGR8888_ARGB8888_Blend(SDL_BlitInfo *info) dstpixel = *dst; dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -5780,7 +8451,22 @@ static void SDL_Blit_ABGR8888_ARGB8888_Blend(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstA, dstA); dstA += srcA; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -5791,15 +8477,19 @@ static void SDL_Blit_ABGR8888_ARGB8888_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstA << 24) | (dstR << 16) | (dstG << 8) | dstB; @@ -5842,14 +8532,13 @@ static void SDL_Blit_ABGR8888_ARGB8888_Blend_Scale(SDL_BlitInfo *info) dstpixel = *dst; dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -5860,7 +8549,22 @@ static void SDL_Blit_ABGR8888_ARGB8888_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstA, dstA); dstA += srcA; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -5871,15 +8575,19 @@ static void SDL_Blit_ABGR8888_ARGB8888_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstA << 24) | (dstR << 16) | (dstG << 8) | dstB; @@ -6004,14 +8712,13 @@ static void SDL_Blit_ABGR8888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcA, modulateA, srcA); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -6022,7 +8729,22 @@ static void SDL_Blit_ABGR8888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstA, dstA); dstA += srcA; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -6033,15 +8755,19 @@ static void SDL_Blit_ABGR8888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstA << 24) | (dstR << 16) | (dstG << 8) | dstB; @@ -6096,14 +8822,13 @@ static void SDL_Blit_ABGR8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcA, modulateA, srcA); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -6114,7 +8839,22 @@ static void SDL_Blit_ABGR8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstA, dstA); dstA += srcA; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -6125,15 +8865,19 @@ static void SDL_Blit_ABGR8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstA << 24) | (dstR << 16) | (dstG << 8) | dstB; @@ -6146,6 +8890,509 @@ static void SDL_Blit_ABGR8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) } } +static void SDL_Blit_ABGR8888_ABGR8888_Scale(SDL_BlitInfo *info) +{ + Uint64 srcy, srcx; + Uint64 posy, posx; + Uint64 incy, incx; + + incy = ((Uint64)info->src_h << 16) / info->dst_h; + incx = ((Uint64)info->src_w << 16) / info->dst_w; + posy = incy / 2; + + while (info->dst_h--) { + Uint32 *src = 0; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + posx = incx / 2; + + srcy = posy >> 16; + while (n--) { + srcx = posx >> 16; + src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); + *dst = *src; + posx += incx; + ++dst; + } + posy += incy; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_ABGR8888_ABGR8888_Blend(SDL_BlitInfo *info) +{ + const int flags = info->flags; + Uint32 srcpixel; + Uint32 srcR, srcG, srcB, srcA; + Uint32 dstpixel; + Uint32 dstR, dstG, dstB, dstA; + + while (info->dst_h--) { + Uint32 *src = (Uint32 *)info->src; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + while (n--) { + srcpixel = *src; + srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); + dstpixel = *dst; + dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); + if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { + if (srcA < 255) { + MULT_DIV_255(srcR, srcA, srcR); + MULT_DIV_255(srcG, srcA, srcG); + MULT_DIV_255(srcB, srcA, srcB); + } + } + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { + case SDL_COPY_BLEND: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; + case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: + dstR = srcR + dstR; if (dstR > 255) dstR = 255; + dstG = srcG + dstG; if (dstG > 255) dstG = 255; + dstB = srcB + dstB; if (dstB > 255) dstB = 255; + break; + case SDL_COPY_MOD: + MULT_DIV_255(srcR, dstR, dstR); + MULT_DIV_255(srcG, dstG, dstG); + MULT_DIV_255(srcB, dstB, dstB); + break; + case SDL_COPY_MUL: + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } + break; + } + dstpixel = (dstA << 24) | (dstB << 16) | (dstG << 8) | dstR; + *dst = dstpixel; + ++src; + ++dst; + } + info->src += info->src_pitch; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_ABGR8888_ABGR8888_Blend_Scale(SDL_BlitInfo *info) +{ + const int flags = info->flags; + Uint32 srcpixel; + Uint32 srcR, srcG, srcB, srcA; + Uint32 dstpixel; + Uint32 dstR, dstG, dstB, dstA; + Uint64 srcy, srcx; + Uint64 posy, posx; + Uint64 incy, incx; + + incy = ((Uint64)info->src_h << 16) / info->dst_h; + incx = ((Uint64)info->src_w << 16) / info->dst_w; + posy = incy / 2; + + while (info->dst_h--) { + Uint32 *src = 0; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + posx = incx / 2; + + srcy = posy >> 16; + while (n--) { + srcx = posx >> 16; + src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); + srcpixel = *src; + srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); + dstpixel = *dst; + dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); + if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { + if (srcA < 255) { + MULT_DIV_255(srcR, srcA, srcR); + MULT_DIV_255(srcG, srcA, srcG); + MULT_DIV_255(srcB, srcA, srcB); + } + } + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { + case SDL_COPY_BLEND: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; + case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: + dstR = srcR + dstR; if (dstR > 255) dstR = 255; + dstG = srcG + dstG; if (dstG > 255) dstG = 255; + dstB = srcB + dstB; if (dstB > 255) dstB = 255; + break; + case SDL_COPY_MOD: + MULT_DIV_255(srcR, dstR, dstR); + MULT_DIV_255(srcG, dstG, dstG); + MULT_DIV_255(srcB, dstB, dstB); + break; + case SDL_COPY_MUL: + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } + break; + } + dstpixel = (dstA << 24) | (dstB << 16) | (dstG << 8) | dstR; + *dst = dstpixel; + posx += incx; + ++dst; + } + posy += incy; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_ABGR8888_ABGR8888_Modulate(SDL_BlitInfo *info) +{ + const int flags = info->flags; + const Uint32 modulateR = info->r; + const Uint32 modulateG = info->g; + const Uint32 modulateB = info->b; + const Uint32 modulateA = info->a; + Uint32 pixel; + Uint32 R, G, B, A; + + while (info->dst_h--) { + Uint32 *src = (Uint32 *)info->src; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + while (n--) { + pixel = *src; + B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel; A = (Uint8)(pixel >> 24); + if (flags & SDL_COPY_MODULATE_COLOR) { + MULT_DIV_255(R, modulateR, R); + MULT_DIV_255(G, modulateG, G); + MULT_DIV_255(B, modulateB, B); + } + if (flags & SDL_COPY_MODULATE_ALPHA) { + MULT_DIV_255(A, modulateA, A); + } + pixel = (A << 24) | (B << 16) | (G << 8) | R; + *dst = pixel; + ++src; + ++dst; + } + info->src += info->src_pitch; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_ABGR8888_ABGR8888_Modulate_Scale(SDL_BlitInfo *info) +{ + const int flags = info->flags; + const Uint32 modulateR = info->r; + const Uint32 modulateG = info->g; + const Uint32 modulateB = info->b; + const Uint32 modulateA = info->a; + Uint32 pixel; + Uint32 R, G, B, A; + Uint64 srcy, srcx; + Uint64 posy, posx; + Uint64 incy, incx; + + incy = ((Uint64)info->src_h << 16) / info->dst_h; + incx = ((Uint64)info->src_w << 16) / info->dst_w; + posy = incy / 2; + + while (info->dst_h--) { + Uint32 *src = 0; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + posx = incx / 2; + + srcy = posy >> 16; + while (n--) { + srcx = posx >> 16; + src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); + pixel = *src; + B = (Uint8)(pixel >> 16); G = (Uint8)(pixel >> 8); R = (Uint8)pixel; A = (Uint8)(pixel >> 24); + if (flags & SDL_COPY_MODULATE_COLOR) { + MULT_DIV_255(R, modulateR, R); + MULT_DIV_255(G, modulateG, G); + MULT_DIV_255(B, modulateB, B); + } + if (flags & SDL_COPY_MODULATE_ALPHA) { + MULT_DIV_255(A, modulateA, A); + } + pixel = (A << 24) | (B << 16) | (G << 8) | R; + *dst = pixel; + posx += incx; + ++dst; + } + posy += incy; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_ABGR8888_ABGR8888_Modulate_Blend(SDL_BlitInfo *info) +{ + const int flags = info->flags; + const Uint32 modulateR = info->r; + const Uint32 modulateG = info->g; + const Uint32 modulateB = info->b; + const Uint32 modulateA = info->a; + Uint32 srcpixel; + Uint32 srcR, srcG, srcB, srcA; + Uint32 dstpixel; + Uint32 dstR, dstG, dstB, dstA; + + while (info->dst_h--) { + Uint32 *src = (Uint32 *)info->src; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + while (n--) { + srcpixel = *src; + srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); + dstpixel = *dst; + dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); + if (flags & SDL_COPY_MODULATE_COLOR) { + MULT_DIV_255(srcR, modulateR, srcR); + MULT_DIV_255(srcG, modulateG, srcG); + MULT_DIV_255(srcB, modulateB, srcB); + } + if (flags & SDL_COPY_MODULATE_ALPHA) { + MULT_DIV_255(srcA, modulateA, srcA); + } + if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { + if (srcA < 255) { + MULT_DIV_255(srcR, srcA, srcR); + MULT_DIV_255(srcG, srcA, srcG); + MULT_DIV_255(srcB, srcA, srcB); + } + } + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { + case SDL_COPY_BLEND: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; + case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: + dstR = srcR + dstR; if (dstR > 255) dstR = 255; + dstG = srcG + dstG; if (dstG > 255) dstG = 255; + dstB = srcB + dstB; if (dstB > 255) dstB = 255; + break; + case SDL_COPY_MOD: + MULT_DIV_255(srcR, dstR, dstR); + MULT_DIV_255(srcG, dstG, dstG); + MULT_DIV_255(srcB, dstB, dstB); + break; + case SDL_COPY_MUL: + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } + break; + } + dstpixel = (dstA << 24) | (dstB << 16) | (dstG << 8) | dstR; + *dst = dstpixel; + ++src; + ++dst; + } + info->src += info->src_pitch; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_ABGR8888_ABGR8888_Modulate_Blend_Scale(SDL_BlitInfo *info) +{ + const int flags = info->flags; + const Uint32 modulateR = info->r; + const Uint32 modulateG = info->g; + const Uint32 modulateB = info->b; + const Uint32 modulateA = info->a; + Uint32 srcpixel; + Uint32 srcR, srcG, srcB, srcA; + Uint32 dstpixel; + Uint32 dstR, dstG, dstB, dstA; + Uint64 srcy, srcx; + Uint64 posy, posx; + Uint64 incy, incx; + + incy = ((Uint64)info->src_h << 16) / info->dst_h; + incx = ((Uint64)info->src_w << 16) / info->dst_w; + posy = incy / 2; + + while (info->dst_h--) { + Uint32 *src = 0; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + posx = incx / 2; + + srcy = posy >> 16; + while (n--) { + srcx = posx >> 16; + src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); + srcpixel = *src; + srcB = (Uint8)(srcpixel >> 16); srcG = (Uint8)(srcpixel >> 8); srcR = (Uint8)srcpixel; srcA = (Uint8)(srcpixel >> 24); + dstpixel = *dst; + dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); + if (flags & SDL_COPY_MODULATE_COLOR) { + MULT_DIV_255(srcR, modulateR, srcR); + MULT_DIV_255(srcG, modulateG, srcG); + MULT_DIV_255(srcB, modulateB, srcB); + } + if (flags & SDL_COPY_MODULATE_ALPHA) { + MULT_DIV_255(srcA, modulateA, srcA); + } + if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { + if (srcA < 255) { + MULT_DIV_255(srcR, srcA, srcR); + MULT_DIV_255(srcG, srcA, srcG); + MULT_DIV_255(srcB, srcA, srcB); + } + } + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { + case SDL_COPY_BLEND: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; + case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: + dstR = srcR + dstR; if (dstR > 255) dstR = 255; + dstG = srcG + dstG; if (dstG > 255) dstG = 255; + dstB = srcB + dstB; if (dstB > 255) dstB = 255; + break; + case SDL_COPY_MOD: + MULT_DIV_255(srcR, dstR, dstR); + MULT_DIV_255(srcG, dstG, dstG); + MULT_DIV_255(srcB, dstB, dstB); + break; + case SDL_COPY_MUL: + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } + break; + } + dstpixel = (dstA << 24) | (dstB << 16) | (dstG << 8) | dstR; + *dst = dstpixel; + posx += incx; + ++dst; + } + posy += incy; + info->dst += info->dst_pitch; + } +} + static void SDL_Blit_BGRA8888_XRGB8888_Scale(SDL_BlitInfo *info) { Uint32 pixel; @@ -6198,14 +9445,13 @@ static void SDL_Blit_BGRA8888_XRGB8888_Blend(SDL_BlitInfo *info) dstpixel = *dst; dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -6214,7 +9460,19 @@ static void SDL_Blit_BGRA8888_XRGB8888_Blend(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -6225,15 +9483,19 @@ static void SDL_Blit_BGRA8888_XRGB8888_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstR << 16) | (dstG << 8) | dstB; @@ -6276,14 +9538,13 @@ static void SDL_Blit_BGRA8888_XRGB8888_Blend_Scale(SDL_BlitInfo *info) dstpixel = *dst; dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -6292,7 +9553,19 @@ static void SDL_Blit_BGRA8888_XRGB8888_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -6303,15 +9576,19 @@ static void SDL_Blit_BGRA8888_XRGB8888_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstR << 16) | (dstG << 8) | dstB; @@ -6428,14 +9705,13 @@ static void SDL_Blit_BGRA8888_XRGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcA, modulateA, srcA); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -6444,7 +9720,19 @@ static void SDL_Blit_BGRA8888_XRGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -6455,15 +9743,19 @@ static void SDL_Blit_BGRA8888_XRGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstR << 16) | (dstG << 8) | dstB; @@ -6518,14 +9810,13 @@ static void SDL_Blit_BGRA8888_XRGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcA, modulateA, srcA); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -6534,7 +9825,19 @@ static void SDL_Blit_BGRA8888_XRGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -6545,15 +9848,19 @@ static void SDL_Blit_BGRA8888_XRGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstR << 16) | (dstG << 8) | dstB; @@ -6616,14 +9923,13 @@ static void SDL_Blit_BGRA8888_XBGR8888_Blend(SDL_BlitInfo *info) dstpixel = *dst; dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -6632,7 +9938,19 @@ static void SDL_Blit_BGRA8888_XBGR8888_Blend(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -6643,15 +9961,19 @@ static void SDL_Blit_BGRA8888_XBGR8888_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstB << 16) | (dstG << 8) | dstR; @@ -6694,14 +10016,13 @@ static void SDL_Blit_BGRA8888_XBGR8888_Blend_Scale(SDL_BlitInfo *info) dstpixel = *dst; dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -6710,7 +10031,19 @@ static void SDL_Blit_BGRA8888_XBGR8888_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -6721,15 +10054,19 @@ static void SDL_Blit_BGRA8888_XBGR8888_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstB << 16) | (dstG << 8) | dstR; @@ -6846,14 +10183,13 @@ static void SDL_Blit_BGRA8888_XBGR8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcA, modulateA, srcA); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -6862,7 +10198,19 @@ static void SDL_Blit_BGRA8888_XBGR8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -6873,15 +10221,19 @@ static void SDL_Blit_BGRA8888_XBGR8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstB << 16) | (dstG << 8) | dstR; @@ -6936,14 +10288,13 @@ static void SDL_Blit_BGRA8888_XBGR8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcA, modulateA, srcA); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -6952,7 +10303,19 @@ static void SDL_Blit_BGRA8888_XBGR8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstB, dstB); dstB += srcB; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -6963,15 +10326,19 @@ static void SDL_Blit_BGRA8888_XBGR8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstB << 16) | (dstG << 8) | dstR; @@ -7036,14 +10403,13 @@ static void SDL_Blit_BGRA8888_ARGB8888_Blend(SDL_BlitInfo *info) dstpixel = *dst; dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -7054,7 +10420,22 @@ static void SDL_Blit_BGRA8888_ARGB8888_Blend(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstA, dstA); dstA += srcA; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -7065,15 +10446,19 @@ static void SDL_Blit_BGRA8888_ARGB8888_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstA << 24) | (dstR << 16) | (dstG << 8) | dstB; @@ -7116,14 +10501,13 @@ static void SDL_Blit_BGRA8888_ARGB8888_Blend_Scale(SDL_BlitInfo *info) dstpixel = *dst; dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -7134,7 +10518,22 @@ static void SDL_Blit_BGRA8888_ARGB8888_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstA, dstA); dstA += srcA; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -7145,15 +10544,19 @@ static void SDL_Blit_BGRA8888_ARGB8888_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstA << 24) | (dstR << 16) | (dstG << 8) | dstB; @@ -7278,14 +10681,13 @@ static void SDL_Blit_BGRA8888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcA, modulateA, srcA); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -7296,7 +10698,22 @@ static void SDL_Blit_BGRA8888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstA, dstA); dstA += srcA; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -7307,15 +10724,19 @@ static void SDL_Blit_BGRA8888_ARGB8888_Modulate_Blend(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstA << 24) | (dstR << 16) | (dstG << 8) | dstB; @@ -7370,14 +10791,13 @@ static void SDL_Blit_BGRA8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcA, modulateA, srcA); } if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { MULT_DIV_255(srcR, srcA, srcR); MULT_DIV_255(srcG, srcA, srcG); MULT_DIV_255(srcB, srcA, srcB); } } - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: MULT_DIV_255((255 - srcA), dstR, dstR); dstR += srcR; @@ -7388,7 +10808,22 @@ static void SDL_Blit_BGRA8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255((255 - srcA), dstA, dstA); dstA += srcA; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) dstR = 255; dstG = srcG + dstG; if (dstG > 255) dstG = 255; dstB = srcB + dstB; if (dstB > 255) dstB = 255; @@ -7399,15 +10834,19 @@ static void SDL_Blit_BGRA8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) MULT_DIV_255(srcB, dstB, dstB); break; case SDL_COPY_MUL: - MULT_DIV_255(dstR, (255 - srcA), dstR); - dstR += (srcR * dstR); - if (dstR > 255) dstR = 255; - MULT_DIV_255(dstB, (255 - srcA), dstB); - dstB += (srcB * dstB); - if (dstB > 255) dstB = 255; - MULT_DIV_255(dstG, (255 - srcA), dstG); - dstG += (srcG * dstG); - if (dstG > 255) dstG = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } break; } dstpixel = (dstA << 24) | (dstR << 16) | (dstG << 8) | dstB; @@ -7420,133 +10859,681 @@ static void SDL_Blit_BGRA8888_ARGB8888_Modulate_Blend_Scale(SDL_BlitInfo *info) } } +static void SDL_Blit_BGRA8888_ABGR8888_Scale(SDL_BlitInfo *info) +{ + Uint32 pixel; + Uint64 srcy, srcx; + Uint64 posy, posx; + Uint64 incy, incx; + + incy = ((Uint64)info->src_h << 16) / info->dst_h; + incx = ((Uint64)info->src_w << 16) / info->dst_w; + posy = incy / 2; + + while (info->dst_h--) { + Uint32 *src = 0; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + posx = incx / 2; + + srcy = posy >> 16; + while (n--) { + srcx = posx >> 16; + src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); + pixel = *src; + pixel = (pixel >> 8) | (pixel << 24); + *dst = pixel; + posx += incx; + ++dst; + } + posy += incy; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_BGRA8888_ABGR8888_Blend(SDL_BlitInfo *info) +{ + const int flags = info->flags; + Uint32 srcpixel; + Uint32 srcR, srcG, srcB, srcA; + Uint32 dstpixel; + Uint32 dstR, dstG, dstB, dstA; + + while (info->dst_h--) { + Uint32 *src = (Uint32 *)info->src; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + while (n--) { + srcpixel = *src; + srcB = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcR = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; + dstpixel = *dst; + dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); + if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { + if (srcA < 255) { + MULT_DIV_255(srcR, srcA, srcR); + MULT_DIV_255(srcG, srcA, srcG); + MULT_DIV_255(srcB, srcA, srcB); + } + } + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { + case SDL_COPY_BLEND: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; + case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: + dstR = srcR + dstR; if (dstR > 255) dstR = 255; + dstG = srcG + dstG; if (dstG > 255) dstG = 255; + dstB = srcB + dstB; if (dstB > 255) dstB = 255; + break; + case SDL_COPY_MOD: + MULT_DIV_255(srcR, dstR, dstR); + MULT_DIV_255(srcG, dstG, dstG); + MULT_DIV_255(srcB, dstB, dstB); + break; + case SDL_COPY_MUL: + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } + break; + } + dstpixel = (dstA << 24) | (dstB << 16) | (dstG << 8) | dstR; + *dst = dstpixel; + ++src; + ++dst; + } + info->src += info->src_pitch; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_BGRA8888_ABGR8888_Blend_Scale(SDL_BlitInfo *info) +{ + const int flags = info->flags; + Uint32 srcpixel; + Uint32 srcR, srcG, srcB, srcA; + Uint32 dstpixel; + Uint32 dstR, dstG, dstB, dstA; + Uint64 srcy, srcx; + Uint64 posy, posx; + Uint64 incy, incx; + + incy = ((Uint64)info->src_h << 16) / info->dst_h; + incx = ((Uint64)info->src_w << 16) / info->dst_w; + posy = incy / 2; + + while (info->dst_h--) { + Uint32 *src = 0; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + posx = incx / 2; + + srcy = posy >> 16; + while (n--) { + srcx = posx >> 16; + src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); + srcpixel = *src; + srcB = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcR = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; + dstpixel = *dst; + dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); + if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { + if (srcA < 255) { + MULT_DIV_255(srcR, srcA, srcR); + MULT_DIV_255(srcG, srcA, srcG); + MULT_DIV_255(srcB, srcA, srcB); + } + } + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { + case SDL_COPY_BLEND: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; + case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: + dstR = srcR + dstR; if (dstR > 255) dstR = 255; + dstG = srcG + dstG; if (dstG > 255) dstG = 255; + dstB = srcB + dstB; if (dstB > 255) dstB = 255; + break; + case SDL_COPY_MOD: + MULT_DIV_255(srcR, dstR, dstR); + MULT_DIV_255(srcG, dstG, dstG); + MULT_DIV_255(srcB, dstB, dstB); + break; + case SDL_COPY_MUL: + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } + break; + } + dstpixel = (dstA << 24) | (dstB << 16) | (dstG << 8) | dstR; + *dst = dstpixel; + posx += incx; + ++dst; + } + posy += incy; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_BGRA8888_ABGR8888_Modulate(SDL_BlitInfo *info) +{ + const int flags = info->flags; + const Uint32 modulateR = info->r; + const Uint32 modulateG = info->g; + const Uint32 modulateB = info->b; + const Uint32 modulateA = info->a; + Uint32 pixel; + Uint32 R, G, B, A; + + while (info->dst_h--) { + Uint32 *src = (Uint32 *)info->src; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + while (n--) { + pixel = *src; + B = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); R = (Uint8)(pixel >> 8); A = (Uint8)pixel; + if (flags & SDL_COPY_MODULATE_COLOR) { + MULT_DIV_255(R, modulateR, R); + MULT_DIV_255(G, modulateG, G); + MULT_DIV_255(B, modulateB, B); + } + if (flags & SDL_COPY_MODULATE_ALPHA) { + MULT_DIV_255(A, modulateA, A); + } + pixel = (A << 24) | (B << 16) | (G << 8) | R; + *dst = pixel; + ++src; + ++dst; + } + info->src += info->src_pitch; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_BGRA8888_ABGR8888_Modulate_Scale(SDL_BlitInfo *info) +{ + const int flags = info->flags; + const Uint32 modulateR = info->r; + const Uint32 modulateG = info->g; + const Uint32 modulateB = info->b; + const Uint32 modulateA = info->a; + Uint32 pixel; + Uint32 R, G, B, A; + Uint64 srcy, srcx; + Uint64 posy, posx; + Uint64 incy, incx; + + incy = ((Uint64)info->src_h << 16) / info->dst_h; + incx = ((Uint64)info->src_w << 16) / info->dst_w; + posy = incy / 2; + + while (info->dst_h--) { + Uint32 *src = 0; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + posx = incx / 2; + + srcy = posy >> 16; + while (n--) { + srcx = posx >> 16; + src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); + pixel = *src; + B = (Uint8)(pixel >> 24); G = (Uint8)(pixel >> 16); R = (Uint8)(pixel >> 8); A = (Uint8)pixel; + if (flags & SDL_COPY_MODULATE_COLOR) { + MULT_DIV_255(R, modulateR, R); + MULT_DIV_255(G, modulateG, G); + MULT_DIV_255(B, modulateB, B); + } + if (flags & SDL_COPY_MODULATE_ALPHA) { + MULT_DIV_255(A, modulateA, A); + } + pixel = (A << 24) | (B << 16) | (G << 8) | R; + *dst = pixel; + posx += incx; + ++dst; + } + posy += incy; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_BGRA8888_ABGR8888_Modulate_Blend(SDL_BlitInfo *info) +{ + const int flags = info->flags; + const Uint32 modulateR = info->r; + const Uint32 modulateG = info->g; + const Uint32 modulateB = info->b; + const Uint32 modulateA = info->a; + Uint32 srcpixel; + Uint32 srcR, srcG, srcB, srcA; + Uint32 dstpixel; + Uint32 dstR, dstG, dstB, dstA; + + while (info->dst_h--) { + Uint32 *src = (Uint32 *)info->src; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + while (n--) { + srcpixel = *src; + srcB = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcR = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; + dstpixel = *dst; + dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); + if (flags & SDL_COPY_MODULATE_COLOR) { + MULT_DIV_255(srcR, modulateR, srcR); + MULT_DIV_255(srcG, modulateG, srcG); + MULT_DIV_255(srcB, modulateB, srcB); + } + if (flags & SDL_COPY_MODULATE_ALPHA) { + MULT_DIV_255(srcA, modulateA, srcA); + } + if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { + if (srcA < 255) { + MULT_DIV_255(srcR, srcA, srcR); + MULT_DIV_255(srcG, srcA, srcG); + MULT_DIV_255(srcB, srcA, srcB); + } + } + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { + case SDL_COPY_BLEND: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; + case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: + dstR = srcR + dstR; if (dstR > 255) dstR = 255; + dstG = srcG + dstG; if (dstG > 255) dstG = 255; + dstB = srcB + dstB; if (dstB > 255) dstB = 255; + break; + case SDL_COPY_MOD: + MULT_DIV_255(srcR, dstR, dstR); + MULT_DIV_255(srcG, dstG, dstG); + MULT_DIV_255(srcB, dstB, dstB); + break; + case SDL_COPY_MUL: + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } + break; + } + dstpixel = (dstA << 24) | (dstB << 16) | (dstG << 8) | dstR; + *dst = dstpixel; + ++src; + ++dst; + } + info->src += info->src_pitch; + info->dst += info->dst_pitch; + } +} + +static void SDL_Blit_BGRA8888_ABGR8888_Modulate_Blend_Scale(SDL_BlitInfo *info) +{ + const int flags = info->flags; + const Uint32 modulateR = info->r; + const Uint32 modulateG = info->g; + const Uint32 modulateB = info->b; + const Uint32 modulateA = info->a; + Uint32 srcpixel; + Uint32 srcR, srcG, srcB, srcA; + Uint32 dstpixel; + Uint32 dstR, dstG, dstB, dstA; + Uint64 srcy, srcx; + Uint64 posy, posx; + Uint64 incy, incx; + + incy = ((Uint64)info->src_h << 16) / info->dst_h; + incx = ((Uint64)info->src_w << 16) / info->dst_w; + posy = incy / 2; + + while (info->dst_h--) { + Uint32 *src = 0; + Uint32 *dst = (Uint32 *)info->dst; + int n = info->dst_w; + posx = incx / 2; + + srcy = posy >> 16; + while (n--) { + srcx = posx >> 16; + src = (Uint32 *)(info->src + (srcy * info->src_pitch) + (srcx * 4)); + srcpixel = *src; + srcB = (Uint8)(srcpixel >> 24); srcG = (Uint8)(srcpixel >> 16); srcR = (Uint8)(srcpixel >> 8); srcA = (Uint8)srcpixel; + dstpixel = *dst; + dstB = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstR = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); + if (flags & SDL_COPY_MODULATE_COLOR) { + MULT_DIV_255(srcR, modulateR, srcR); + MULT_DIV_255(srcG, modulateG, srcG); + MULT_DIV_255(srcB, modulateB, srcB); + } + if (flags & SDL_COPY_MODULATE_ALPHA) { + MULT_DIV_255(srcA, modulateA, srcA); + } + if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { + if (srcA < 255) { + MULT_DIV_255(srcR, srcA, srcR); + MULT_DIV_255(srcG, srcA, srcG); + MULT_DIV_255(srcB, srcA, srcB); + } + } + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { + case SDL_COPY_BLEND: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + break; + case SDL_COPY_BLEND_PREMULTIPLIED: + MULT_DIV_255((255 - srcA), dstR, dstR); + dstR += srcR; + if (dstR > 255) dstR = 255; + MULT_DIV_255((255 - srcA), dstG, dstG); + dstG += srcG; + if (dstG > 255) dstG = 255; + MULT_DIV_255((255 - srcA), dstB, dstB); + dstB += srcB; + if (dstB > 255) dstB = 255; + MULT_DIV_255((255 - srcA), dstA, dstA); + dstA += srcA; + if (dstA > 255) dstA = 255; + break; + case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: + dstR = srcR + dstR; if (dstR > 255) dstR = 255; + dstG = srcG + dstG; if (dstG > 255) dstG = 255; + dstB = srcB + dstB; if (dstB > 255) dstB = 255; + break; + case SDL_COPY_MOD: + MULT_DIV_255(srcR, dstR, dstR); + MULT_DIV_255(srcG, dstG, dstG); + MULT_DIV_255(srcB, dstB, dstB); + break; + case SDL_COPY_MUL: + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(srcR, dstR, tmp1); + MULT_DIV_255(dstR, (255 - srcA), tmp2); + dstR = tmp1 + tmp2; if (dstR > 255) dstR = 255; + MULT_DIV_255(srcG, dstG, tmp1); + MULT_DIV_255(dstG, (255 - srcA), tmp2); + dstG = tmp1 + tmp2; if (dstG > 255) dstG = 255; + MULT_DIV_255(srcB, dstB, tmp1); + MULT_DIV_255(dstB, (255 - srcA), tmp2); + dstB = tmp1 + tmp2; if (dstB > 255) dstB = 255; + } + break; + } + dstpixel = (dstA << 24) | (dstB << 16) | (dstG << 8) | dstR; + *dst = dstpixel; + posx += incx; + ++dst; + } + posy += incy; + info->dst += info->dst_pitch; + } +} + SDL_BlitFuncEntry SDL_GeneratedBlitFuncTable[] = { { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XRGB8888_XRGB8888_Scale }, - { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_XRGB8888_XRGB8888_Blend }, - { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XRGB8888_XRGB8888_Blend_Scale }, + { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_XRGB8888_XRGB8888_Blend }, + { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XRGB8888_XRGB8888_Blend_Scale }, { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_XRGB8888_XRGB8888_Modulate }, { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XRGB8888_XRGB8888_Modulate_Scale }, - { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_XRGB8888_XRGB8888_Modulate_Blend }, - { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XRGB8888_XRGB8888_Modulate_Blend_Scale }, + { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_XRGB8888_XRGB8888_Modulate_Blend }, + { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XRGB8888_XRGB8888_Modulate_Blend_Scale }, { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XRGB8888_XBGR8888_Scale }, - { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_XRGB8888_XBGR8888_Blend }, - { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XRGB8888_XBGR8888_Blend_Scale }, + { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_XRGB8888_XBGR8888_Blend }, + { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XRGB8888_XBGR8888_Blend_Scale }, { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_XRGB8888_XBGR8888_Modulate }, { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XRGB8888_XBGR8888_Modulate_Scale }, - { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_XRGB8888_XBGR8888_Modulate_Blend }, - { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XRGB8888_XBGR8888_Modulate_Blend_Scale }, + { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_XRGB8888_XBGR8888_Modulate_Blend }, + { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XRGB8888_XBGR8888_Modulate_Blend_Scale }, { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XRGB8888_ARGB8888_Scale }, - { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_XRGB8888_ARGB8888_Blend }, - { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XRGB8888_ARGB8888_Blend_Scale }, + { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_XRGB8888_ARGB8888_Blend }, + { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XRGB8888_ARGB8888_Blend_Scale }, { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_XRGB8888_ARGB8888_Modulate }, { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XRGB8888_ARGB8888_Modulate_Scale }, - { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_XRGB8888_ARGB8888_Modulate_Blend }, - { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XRGB8888_ARGB8888_Modulate_Blend_Scale }, + { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_XRGB8888_ARGB8888_Modulate_Blend }, + { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XRGB8888_ARGB8888_Modulate_Blend_Scale }, + { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XRGB8888_ABGR8888_Scale }, + { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_XRGB8888_ABGR8888_Blend }, + { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XRGB8888_ABGR8888_Blend_Scale }, + { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_XRGB8888_ABGR8888_Modulate }, + { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XRGB8888_ABGR8888_Modulate_Scale }, + { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_XRGB8888_ABGR8888_Modulate_Blend }, + { SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XRGB8888_ABGR8888_Modulate_Blend_Scale }, { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XBGR8888_XRGB8888_Scale }, - { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_XBGR8888_XRGB8888_Blend }, - { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XBGR8888_XRGB8888_Blend_Scale }, + { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_XBGR8888_XRGB8888_Blend }, + { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XBGR8888_XRGB8888_Blend_Scale }, { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_XBGR8888_XRGB8888_Modulate }, { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XBGR8888_XRGB8888_Modulate_Scale }, - { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_XBGR8888_XRGB8888_Modulate_Blend }, - { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XBGR8888_XRGB8888_Modulate_Blend_Scale }, + { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_XBGR8888_XRGB8888_Modulate_Blend }, + { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XBGR8888_XRGB8888_Modulate_Blend_Scale }, { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XBGR8888_XBGR8888_Scale }, - { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_XBGR8888_XBGR8888_Blend }, - { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XBGR8888_XBGR8888_Blend_Scale }, + { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_XBGR8888_XBGR8888_Blend }, + { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XBGR8888_XBGR8888_Blend_Scale }, { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_XBGR8888_XBGR8888_Modulate }, { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XBGR8888_XBGR8888_Modulate_Scale }, - { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_XBGR8888_XBGR8888_Modulate_Blend }, - { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XBGR8888_XBGR8888_Modulate_Blend_Scale }, + { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_XBGR8888_XBGR8888_Modulate_Blend }, + { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XBGR8888_XBGR8888_Modulate_Blend_Scale }, { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XBGR8888_ARGB8888_Scale }, - { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_XBGR8888_ARGB8888_Blend }, - { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XBGR8888_ARGB8888_Blend_Scale }, + { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_XBGR8888_ARGB8888_Blend }, + { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XBGR8888_ARGB8888_Blend_Scale }, { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_XBGR8888_ARGB8888_Modulate }, { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XBGR8888_ARGB8888_Modulate_Scale }, - { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_XBGR8888_ARGB8888_Modulate_Blend }, - { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XBGR8888_ARGB8888_Modulate_Blend_Scale }, + { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_XBGR8888_ARGB8888_Modulate_Blend }, + { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XBGR8888_ARGB8888_Modulate_Blend_Scale }, + { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XBGR8888_ABGR8888_Scale }, + { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_XBGR8888_ABGR8888_Blend }, + { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XBGR8888_ABGR8888_Blend_Scale }, + { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_XBGR8888_ABGR8888_Modulate }, + { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XBGR8888_ABGR8888_Modulate_Scale }, + { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_XBGR8888_ABGR8888_Modulate_Blend }, + { SDL_PIXELFORMAT_XBGR8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_XBGR8888_ABGR8888_Modulate_Blend_Scale }, { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_XRGB8888_Scale }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_ARGB8888_XRGB8888_Blend }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_XRGB8888_Blend_Scale }, + { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_ARGB8888_XRGB8888_Blend }, + { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_XRGB8888_Blend_Scale }, { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_ARGB8888_XRGB8888_Modulate }, { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_XRGB8888_Modulate_Scale }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_ARGB8888_XRGB8888_Modulate_Blend }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_XRGB8888_Modulate_Blend_Scale }, + { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_ARGB8888_XRGB8888_Modulate_Blend }, + { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_XRGB8888_Modulate_Blend_Scale }, { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_XBGR8888_Scale }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_ARGB8888_XBGR8888_Blend }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_XBGR8888_Blend_Scale }, + { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_ARGB8888_XBGR8888_Blend }, + { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_XBGR8888_Blend_Scale }, { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_ARGB8888_XBGR8888_Modulate }, { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_XBGR8888_Modulate_Scale }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_ARGB8888_XBGR8888_Modulate_Blend }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_XBGR8888_Modulate_Blend_Scale }, + { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_ARGB8888_XBGR8888_Modulate_Blend }, + { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_XBGR8888_Modulate_Blend_Scale }, { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_ARGB8888_Scale }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_ARGB8888_ARGB8888_Blend }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_ARGB8888_Blend_Scale }, + { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_ARGB8888_ARGB8888_Blend }, + { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_ARGB8888_Blend_Scale }, { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_ARGB8888_ARGB8888_Modulate }, { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_ARGB8888_Modulate_Scale }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_ARGB8888_ARGB8888_Modulate_Blend }, - { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_ARGB8888_Modulate_Blend_Scale }, + { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_ARGB8888_ARGB8888_Modulate_Blend }, + { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_ARGB8888_Modulate_Blend_Scale }, + { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_ABGR8888_Scale }, + { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_ARGB8888_ABGR8888_Blend }, + { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_ABGR8888_Blend_Scale }, + { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_ARGB8888_ABGR8888_Modulate }, + { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_ABGR8888_Modulate_Scale }, + { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_ARGB8888_ABGR8888_Modulate_Blend }, + { SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ARGB8888_ABGR8888_Modulate_Blend_Scale }, { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_XRGB8888_Scale }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_RGBA8888_XRGB8888_Blend }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_XRGB8888_Blend_Scale }, + { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_RGBA8888_XRGB8888_Blend }, + { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_XRGB8888_Blend_Scale }, { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_RGBA8888_XRGB8888_Modulate }, { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_XRGB8888_Modulate_Scale }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_RGBA8888_XRGB8888_Modulate_Blend }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_XRGB8888_Modulate_Blend_Scale }, + { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_RGBA8888_XRGB8888_Modulate_Blend }, + { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_XRGB8888_Modulate_Blend_Scale }, { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_XBGR8888_Scale }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_RGBA8888_XBGR8888_Blend }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_XBGR8888_Blend_Scale }, + { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_RGBA8888_XBGR8888_Blend }, + { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_XBGR8888_Blend_Scale }, { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_RGBA8888_XBGR8888_Modulate }, { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_XBGR8888_Modulate_Scale }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_RGBA8888_XBGR8888_Modulate_Blend }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_XBGR8888_Modulate_Blend_Scale }, + { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_RGBA8888_XBGR8888_Modulate_Blend }, + { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_XBGR8888_Modulate_Blend_Scale }, { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_ARGB8888_Scale }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_RGBA8888_ARGB8888_Blend }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_ARGB8888_Blend_Scale }, + { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_RGBA8888_ARGB8888_Blend }, + { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_ARGB8888_Blend_Scale }, { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_RGBA8888_ARGB8888_Modulate }, { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_ARGB8888_Modulate_Scale }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_RGBA8888_ARGB8888_Modulate_Blend }, - { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_ARGB8888_Modulate_Blend_Scale }, + { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_RGBA8888_ARGB8888_Modulate_Blend }, + { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_ARGB8888_Modulate_Blend_Scale }, + { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_ABGR8888_Scale }, + { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_RGBA8888_ABGR8888_Blend }, + { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_ABGR8888_Blend_Scale }, + { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_RGBA8888_ABGR8888_Modulate }, + { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_ABGR8888_Modulate_Scale }, + { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_RGBA8888_ABGR8888_Modulate_Blend }, + { SDL_PIXELFORMAT_RGBA8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_RGBA8888_ABGR8888_Modulate_Blend_Scale }, { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_XRGB8888_Scale }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_ABGR8888_XRGB8888_Blend }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_XRGB8888_Blend_Scale }, + { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_ABGR8888_XRGB8888_Blend }, + { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_XRGB8888_Blend_Scale }, { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_ABGR8888_XRGB8888_Modulate }, { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_XRGB8888_Modulate_Scale }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_ABGR8888_XRGB8888_Modulate_Blend }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_XRGB8888_Modulate_Blend_Scale }, + { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_ABGR8888_XRGB8888_Modulate_Blend }, + { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_XRGB8888_Modulate_Blend_Scale }, { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_XBGR8888_Scale }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_ABGR8888_XBGR8888_Blend }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_XBGR8888_Blend_Scale }, + { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_ABGR8888_XBGR8888_Blend }, + { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_XBGR8888_Blend_Scale }, { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_ABGR8888_XBGR8888_Modulate }, { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_XBGR8888_Modulate_Scale }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_ABGR8888_XBGR8888_Modulate_Blend }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_XBGR8888_Modulate_Blend_Scale }, + { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_ABGR8888_XBGR8888_Modulate_Blend }, + { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_XBGR8888_Modulate_Blend_Scale }, { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_ARGB8888_Scale }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_ABGR8888_ARGB8888_Blend }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_ARGB8888_Blend_Scale }, + { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_ABGR8888_ARGB8888_Blend }, + { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_ARGB8888_Blend_Scale }, { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_ABGR8888_ARGB8888_Modulate }, { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_ARGB8888_Modulate_Scale }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_ABGR8888_ARGB8888_Modulate_Blend }, - { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_ARGB8888_Modulate_Blend_Scale }, + { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_ABGR8888_ARGB8888_Modulate_Blend }, + { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_ARGB8888_Modulate_Blend_Scale }, + { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_ABGR8888_Scale }, + { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_ABGR8888_ABGR8888_Blend }, + { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_ABGR8888_Blend_Scale }, + { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_ABGR8888_ABGR8888_Modulate }, + { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_ABGR8888_Modulate_Scale }, + { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_ABGR8888_ABGR8888_Modulate_Blend }, + { SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_ABGR8888_ABGR8888_Modulate_Blend_Scale }, { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_XRGB8888_Scale }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_BGRA8888_XRGB8888_Blend }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_XRGB8888_Blend_Scale }, + { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_BGRA8888_XRGB8888_Blend }, + { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_XRGB8888_Blend_Scale }, { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_BGRA8888_XRGB8888_Modulate }, { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_XRGB8888_Modulate_Scale }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_BGRA8888_XRGB8888_Modulate_Blend }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_XRGB8888_Modulate_Blend_Scale }, + { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_BGRA8888_XRGB8888_Modulate_Blend }, + { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_XRGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_XRGB8888_Modulate_Blend_Scale }, { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_XBGR8888_Scale }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_BGRA8888_XBGR8888_Blend }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_XBGR8888_Blend_Scale }, + { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_BGRA8888_XBGR8888_Blend }, + { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_XBGR8888_Blend_Scale }, { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_BGRA8888_XBGR8888_Modulate }, { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_XBGR8888_Modulate_Scale }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_BGRA8888_XBGR8888_Modulate_Blend }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_XBGR8888_Modulate_Blend_Scale }, + { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_BGRA8888_XBGR8888_Modulate_Blend }, + { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_XBGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_XBGR8888_Modulate_Blend_Scale }, { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_ARGB8888_Scale }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_BGRA8888_ARGB8888_Blend }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_ARGB8888_Blend_Scale }, + { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_BGRA8888_ARGB8888_Blend }, + { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_ARGB8888_Blend_Scale }, { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_BGRA8888_ARGB8888_Modulate }, { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_ARGB8888_Modulate_Scale }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_BGRA8888_ARGB8888_Modulate_Blend }, - { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_ARGB8888_Modulate_Blend_Scale }, + { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_BGRA8888_ARGB8888_Modulate_Blend }, + { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ARGB8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_ARGB8888_Modulate_Blend_Scale }, + { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_ABGR8888_Scale }, + { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_BGRA8888_ABGR8888_Blend }, + { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_ABGR8888_Blend_Scale }, + { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA), SDL_CPU_ANY, SDL_Blit_BGRA8888_ABGR8888_Modulate }, + { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_ABGR8888_Modulate_Scale }, + { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL), SDL_CPU_ANY, SDL_Blit_BGRA8888_ABGR8888_Modulate_Blend }, + { SDL_PIXELFORMAT_BGRA8888, SDL_PIXELFORMAT_ABGR8888, (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_NEAREST), SDL_CPU_ANY, SDL_Blit_BGRA8888_ABGR8888_Modulate_Blend_Scale }, { 0, 0, 0, 0, NULL } }; diff --git a/src/video/SDL_blit_slow.c b/src/video/SDL_blit_slow.c index 7bdb090dc..db675d542 100644 --- a/src/video/SDL_blit_slow.c +++ b/src/video/SDL_blit_slow.c @@ -134,7 +134,7 @@ void SDL_Blit_Slow(SDL_BlitInfo *info) continue; } } - if ((flags & (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL))) { + if ((flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL))) { switch (dst_access) { case SlowBlitPixelAccess_RGB: DISEMBLE_RGB(dst, dstbpp, dst_fmt, dstpixel, dstR, dstG, dstB); @@ -181,14 +181,13 @@ void SDL_Blit_Slow(SDL_BlitInfo *info) srcA = (srcA * modulateA) / 255; } if (flags & (SDL_COPY_BLEND | SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 255) { srcR = (srcR * srcA) / 255; srcG = (srcG * srcA) / 255; srcB = (srcB * srcA) / 255; } } - switch (flags & (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case 0: dstR = srcR; dstG = srcG; @@ -201,7 +200,26 @@ void SDL_Blit_Slow(SDL_BlitInfo *info) dstB = srcB + ((255 - srcA) * dstB) / 255; dstA = srcA + ((255 - srcA) * dstA) / 255; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + dstR = srcR + ((255 - srcA) * dstR) / 255; + if (dstR > 255) { + dstR = 255; + } + dstG = srcG + ((255 - srcA) * dstG) / 255; + if (dstG > 255) { + dstG = 255; + } + dstB = srcB + ((255 - srcA) * dstB) / 255; + if (dstB > 255) { + dstB = 255; + } + dstA = srcA + ((255 - srcA) * dstA) / 255; + if (dstA > 255) { + dstA = 255; + } + break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: dstR = srcR + dstR; if (dstR > 255) { dstR = 255; @@ -869,7 +887,6 @@ void SDL_Blit_Slow_Float(SDL_BlitInfo *info) srcA = (srcA * modulateA) / 255; } if (flags & (SDL_COPY_BLEND | SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (srcA < 1.0f) { srcR = (srcR * srcA); srcG = (srcG * srcA); diff --git a/src/video/SDL_surface.c b/src/video/SDL_surface.c index 1d8a0326e..3cc685c08 100644 --- a/src/video/SDL_surface.c +++ b/src/video/SDL_surface.c @@ -708,16 +708,22 @@ int SDL_SetSurfaceBlendMode(SDL_Surface *surface, SDL_BlendMode blendMode) status = 0; flags = surface->internal->map.info.flags; - surface->internal->map.info.flags &= ~(SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL); + surface->internal->map.info.flags &= ~(SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL); switch (blendMode) { case SDL_BLENDMODE_NONE: break; case SDL_BLENDMODE_BLEND: surface->internal->map.info.flags |= SDL_COPY_BLEND; break; + case SDL_BLENDMODE_BLEND_PREMULTIPLIED: + surface->internal->map.info.flags |= SDL_COPY_BLEND_PREMULTIPLIED; + break; case SDL_BLENDMODE_ADD: surface->internal->map.info.flags |= SDL_COPY_ADD; break; + case SDL_BLENDMODE_ADD_PREMULTIPLIED: + surface->internal->map.info.flags |= SDL_COPY_ADD_PREMULTIPLIED; + break; case SDL_BLENDMODE_MOD: surface->internal->map.info.flags |= SDL_COPY_MOD; break; @@ -746,13 +752,19 @@ int SDL_GetSurfaceBlendMode(SDL_Surface *surface, SDL_BlendMode *blendMode) return 0; } - switch (surface->internal->map.info.flags & (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL)) { + switch (surface->internal->map.info.flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: *blendMode = SDL_BLENDMODE_BLEND; break; + case SDL_COPY_BLEND_PREMULTIPLIED: + *blendMode = SDL_BLENDMODE_BLEND_PREMULTIPLIED; + break; case SDL_COPY_ADD: *blendMode = SDL_BLENDMODE_ADD; break; + case SDL_COPY_ADD_PREMULTIPLIED: + *blendMode = SDL_BLENDMODE_ADD_PREMULTIPLIED; + break; case SDL_COPY_MOD: *blendMode = SDL_BLENDMODE_MOD; break; @@ -1088,7 +1100,7 @@ int SDL_BlitSurfaceUncheckedScaled(SDL_Surface *src, const SDL_Rect *srcrect, SDL_ScaleMode scaleMode) { static const Uint32 complex_copy_flags = (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA | - SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL | + SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL | SDL_COPY_COLORKEY); if (scaleMode != SDL_SCALEMODE_NEAREST && scaleMode != SDL_SCALEMODE_LINEAR && scaleMode != SDL_SCALEMODE_BEST) { diff --git a/src/video/sdlgenblit.pl b/src/video/sdlgenblit.pl index 001ec2fed..a1c795ea8 100755 --- a/src/video/sdlgenblit.pl +++ b/src/video/sdlgenblit.pl @@ -38,6 +38,7 @@ my @dst_formats = ( "XRGB8888", "XBGR8888", "ARGB8888", + "ABGR8888", ); my %format_size = ( @@ -327,7 +328,6 @@ __EOF__ if (!$A_is_const_FF) { print FILE <<__EOF__; if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { - /* This goes away if we ever use premultiplied alpha */ if (${s}A < 255) { MULT_DIV_255(${s}R, ${s}A, ${s}R); MULT_DIV_255(${s}G, ${s}A, ${s}G); @@ -337,7 +337,7 @@ __EOF__ __EOF__ } print FILE <<__EOF__; - switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { + switch (flags & (SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL)) { case SDL_COPY_BLEND: __EOF__ if ($A_is_const_FF) { @@ -369,9 +369,47 @@ __EOF__ } } + print FILE <<__EOF__; + break; + case SDL_COPY_BLEND_PREMULTIPLIED: +__EOF__ + if ($A_is_const_FF) { + print FILE <<__EOF__; + ${d}R = ${s}R; + ${d}G = ${s}G; + ${d}B = ${s}B; +__EOF__ + } else { + print FILE <<__EOF__; + MULT_DIV_255((255 - ${s}A), ${d}R, ${d}R); + ${d}R += ${s}R; + if (${d}R > 255) ${d}R = 255; + MULT_DIV_255((255 - ${s}A), ${d}G, ${d}G); + ${d}G += ${s}G; + if (${d}G > 255) ${d}G = 255; + MULT_DIV_255((255 - ${s}A), ${d}B, ${d}B); + ${d}B += ${s}B; + if (${d}B > 255) ${d}B = 255; +__EOF__ + } + if ( $dst_has_alpha ) { + if ($A_is_const_FF) { + print FILE <<__EOF__; + ${d}A = 0xFF; +__EOF__ + } else { + print FILE <<__EOF__; + MULT_DIV_255((255 - ${s}A), ${d}A, ${d}A); + ${d}A += ${s}A; + if (${d}A > 255) ${d}A = 255; +__EOF__ + } + } + print FILE <<__EOF__; break; case SDL_COPY_ADD: + case SDL_COPY_ADD_PREMULTIPLIED: ${d}R = ${s}R + ${d}R; if (${d}R > 255) ${d}R = 255; ${d}G = ${s}G + ${d}G; if (${d}G > 255) ${d}G = 255; ${d}B = ${s}B + ${d}B; if (${d}B > 255) ${d}B = 255; @@ -391,15 +429,19 @@ __EOF__ __EOF__ } else { print FILE <<__EOF__; - MULT_DIV_255(${d}R, (255 - ${s}A), ${d}R); - ${d}R += (${s}R * ${d}R); - if (${d}R > 255) ${d}R = 255; - MULT_DIV_255(${d}B, (255 - ${s}A), ${d}B); - ${d}B += (${s}B * ${d}B); - if (${d}B > 255) ${d}B = 255; - MULT_DIV_255(${d}G, (255 - ${s}A), ${d}G); - ${d}G += (${s}G * ${d}G); - if (${d}G > 255) ${d}G = 255; + { + Uint32 tmp1, tmp2; + + MULT_DIV_255(${s}R, ${d}R, tmp1); + MULT_DIV_255(${d}R, (255 - ${s}A), tmp2); + ${d}R = tmp1 + tmp2; if (${d}R > 255) ${d}R = 255; + MULT_DIV_255(${s}G, ${d}G, tmp1); + MULT_DIV_255(${d}G, (255 - ${s}A), tmp2); + ${d}G = tmp1 + tmp2; if (${d}G > 255) ${d}G = 255; + MULT_DIV_255(${s}B, ${d}B, tmp1); + MULT_DIV_255(${d}B, (255 - ${s}A), tmp2); + ${d}B = tmp1 + tmp2; if (${d}B > 255) ${d}B = 255; + } __EOF__ } @@ -624,7 +666,7 @@ __EOF__ } } if ( $blend ) { - $flag = "SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL"; + $flag = "SDL_COPY_BLEND | SDL_COPY_BLEND_PREMULTIPLIED | SDL_COPY_ADD | SDL_COPY_ADD_PREMULTIPLIED | SDL_COPY_MOD | SDL_COPY_MUL"; if ( $flags eq "" ) { $flags = $flag; } else { diff --git a/test/testautomation_images.c b/test/testautomation_images.c index 0ff7d21ed..478c319a3 100644 --- a/test/testautomation_images.c +++ b/test/testautomation_images.c @@ -1652,573 +1652,6 @@ SDL_Surface *SDLTest_ImageBlitAlpha(void) /* GIMP RGB C-Source image dump (alpha.c) */ -static const SDLTest_SurfaceImage_t SDLTest_imageBlitBlendAdd = { - 80, - 60, - 3, - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0dd\0dd\0\310\310\0\310\310\0\310\310\0\310" - "\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310" - "\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0" - "\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310" - "\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310" - "\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0" - "\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310" - "\310\0dd\0dd\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0dd\0dd\0dd\0dd\0\310\310\0\310\310\0\310\310\0\310\310\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310" - "\0\310\310\0\310\310\0\310\310\0dd\0dd\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0dd\0dd\0dd\0dd\0\310\310\0\310\310\0\310\310\0\310\310" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\310\310\0\310\310\0\310\310\0\310\310\0dd\0dd\0dd" - "\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0dd\0dd\0\310\310\0\310\310\0" - "\310\310\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310\0\310" - "\310\0\310\310\0\310\310\0dd\0dd\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0dd\0" - "dd\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310\0" - "dd\0dd\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0dd\0dd\0\310\310\0\310\310\0\310\310" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\310\310\0\310\310\0\310\310\0dd\0dd\0dd\0dd\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0dd" - "\0\310\310\0\310\310\0\310\310\0\310\310\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310" - "\310\0\310\310\0\310\310\0\310\310\0dd\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0\310\310\0\310\310" - "\0\310\310\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310" - "\310\0\310\310\0\310\310\0\310\310\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0\310\310\0\310\310\0\310" - "\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\310\310\0\310\310\0\310\310\0dd\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0\310\310\0\310" - "\310\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\310\310\0\310\310\0\310\310\0dd\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310" - "\0\310\310\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310\0\310\310" - "\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\310\310\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\310\310\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0dd\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310" - "\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\310\310\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\310\310\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0dd\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\310\310\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\310\310\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0dd\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310" - "\310\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310" - "\310\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310" - "\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310" - "\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310\0\310" - "\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310\0\310" - "\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310\0\377\377\0\377\377\0\310\310" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\310\310\0\377\377\0\377\377\0\310\310\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310\0\310\310" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310\0\310\310" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\310\310\0\310\310\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310" - "\0\310\310\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0dd\0\310\310\0\310\310\0\310\310\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310" - "\310\0\310\310\0\310\310\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0\310\310\0\310\310\0dd\0\310\310\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310\0" - "dd\0\310\310\0\310\310\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0\310\310\0\310\310\0\310\310\0\310\310" - "\0\377\377\0\377\377\0\377\377\0\310\310\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\310\310\0\377\377\0\377\377\0\377\377\0\310\310\0\310\310\0\310" - "\310\0\310\310\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0dd\0\310\310\0\377\377\0\310\310\0\310\310" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\310\310\0\310\310\0\377\377\0\310\310\0dd" - "\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0dd\0dd\0dd\0\310\310\0\377\377\0\377\377\0\310\310\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\310\310\0\377\377\0\377\377\0\310\310\0dd\0dd\0dd\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd" - "\0\0\0\0\0\0\0dd\0\377\377\0\310\310\0\310\310\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" - "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" - "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" - "\377\0\377\377\0\377\377\0\377\377\0\310\310\0\310\310\0\377\377\0dd\0\0" - "\0\0\0\0\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0\0\0\0\0\0\0dd\0dd\0\0\0\0\0" - "\0\0dd\0dd\0\0\0\0\0\0\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0" - "dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0" - "dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0\0\0\0\0\0\0dd\0dd\0\0\0\0\0\0\0" - "dd\0dd\0\0\0\0\0\0\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0\0\0\0" - "\0\0\0dd\0dd\0\0\0\0\0\0\0dd\0dd\0\0\0\0\0\0\0\310\310\0\310\310\0\0\0\0" - "\0\0\0\310\310\0\310\310\0\0\0\0\0\0\0\310\310\0\310\310\0\0\0\0\0\0\0\310" - "\310\0\310\310\0\0\0\0\0\0\0\310\310\0\310\310\0\0\0\0\0\0\0\310\310\0\310" - "\310\0\0\0\0\0\0\0\310\310\0\310\310\0\0\0\0\0\0\0\310\310\0\310\310\0\0" - "\0\0\0\0\0\310\310\0\310\310\0\0\0\0\0\0\0\310\310\0\310\310\0\0\0\0\0\0" - "\0dd\0dd\0\0\0\0\0\0\0dd\0dd\0\0\0\0\0\0\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0dd\0dd\0dd\0\0\0\0dd\0dd\0dd\0\0\0\0dd\0\310\310\0\310" - "\310\0dd\0dd\0\310\310\0\310\310\0dd\0dd\0\310\310\0\310\310\0dd\0dd\0\310" - "\310\0\310\310\0dd\0dd\0\310\310\0\310\310\0dd\0dd\0\310\310\0\310\310\0" - "dd\0dd\0\310\310\0\310\310\0dd\0dd\0\310\310\0\310\310\0dd\0dd\0\310\310" - "\0\310\310\0dd\0dd\0\310\310\0\310\310\0dd\0dd\0\310\310\0\310\310\0dd\0" - "\0\0\0dd\0dd\0dd\0\0\0\0dd\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0dd\0dd\0\310\310\0\310\310\0\310\310\0\310" - "\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310" - "\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0" - "\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310" - "\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310" - "\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0" - "\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310" - "\310\0dd\0dd\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", -}; - -/** - * Returns the BlitBlendAdd test image as SDL_Surface. - */ -SDL_Surface *SDLTest_ImageBlitBlendAdd(void) -{ - SDL_Surface *surface = SDL_CreateSurfaceFrom( - SDLTest_imageBlitBlendAdd.width, - SDLTest_imageBlitBlendAdd.height, - SDL_PIXELFORMAT_RGB24, - (void *)SDLTest_imageBlitBlendAdd.pixel_data, - SDLTest_imageBlitBlendAdd.width * SDLTest_imageBlitBlendAdd.bytes_per_pixel); - return surface; -} - static const SDLTest_SurfaceImage_t SDLTest_imageBlitBlend = { 80, 60, @@ -2809,6 +2242,1558 @@ SDL_Surface *SDLTest_ImageBlitBlend(void) return surface; } +static const SDLTest_SurfaceImage_t SDLTest_imageBlitBlendPremultiplied = { + 80, 60, 3, + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", +}; + +/** + * \brief Returns the BlitBlendPremultiplied test image as SDL_Surface. + */ +SDL_Surface *SDLTest_ImageBlitBlendPremultiplied() +{ + SDL_Surface *surface = SDL_CreateSurfaceFrom( + SDLTest_imageBlitBlendPremultiplied.width, + SDLTest_imageBlitBlendPremultiplied.height, + SDL_PIXELFORMAT_RGB24, + (void *)SDLTest_imageBlitBlendPremultiplied.pixel_data, + SDLTest_imageBlitBlendPremultiplied.width * SDLTest_imageBlitBlendPremultiplied.bytes_per_pixel); + return surface; +} + +static const SDLTest_SurfaceImage_t SDLTest_imageBlitBlendAdd = { + 80, + 60, + 3, + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0dd\0dd\0\310\310\0\310\310\0\310\310\0\310" + "\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310" + "\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0" + "\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310" + "\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310" + "\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0" + "\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310" + "\310\0dd\0dd\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0dd\0dd\0dd\0dd\0\310\310\0\310\310\0\310\310\0\310\310\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310" + "\0\310\310\0\310\310\0\310\310\0dd\0dd\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0dd\0dd\0dd\0dd\0\310\310\0\310\310\0\310\310\0\310\310" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\310\310\0\310\310\0\310\310\0\310\310\0dd\0dd\0dd" + "\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0dd\0dd\0\310\310\0\310\310\0" + "\310\310\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310\0\310" + "\310\0\310\310\0\310\310\0dd\0dd\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0dd\0" + "dd\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310\0" + "dd\0dd\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0dd\0dd\0\310\310\0\310\310\0\310\310" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\310\310\0\310\310\0\310\310\0dd\0dd\0dd\0dd\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0dd" + "\0\310\310\0\310\310\0\310\310\0\310\310\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310" + "\310\0\310\310\0\310\310\0\310\310\0dd\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0\310\310\0\310\310" + "\0\310\310\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310" + "\310\0\310\310\0\310\310\0\310\310\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0\310\310\0\310\310\0\310" + "\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\310\310\0\310\310\0\310\310\0dd\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0\310\310\0\310" + "\310\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\310\310\0\310\310\0\310\310\0dd\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310" + "\0\310\310\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310\0\310\310" + "\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\310\310\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\310\310\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0dd\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310" + "\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\310\310\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\310\310\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0dd\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\310\310\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\310\310\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0dd\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310" + "\310\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310" + "\310\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310" + "\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310" + "\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310\0\310" + "\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310\0\310" + "\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310\0\377\377\0\377\377\0\310\310" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\310\310\0\377\377\0\377\377\0\310\310\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310\0\310\310" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310\0\310\310" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\310\310\0\310\310\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310" + "\0\310\310\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0dd\0\310\310\0\310\310\0\310\310\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310" + "\310\0\310\310\0\310\310\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0\310\310\0\310\310\0dd\0\310\310\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310\0" + "dd\0\310\310\0\310\310\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0\310\310\0\310\310\0\310\310\0\310\310" + "\0\377\377\0\377\377\0\377\377\0\310\310\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\310\310\0\377\377\0\377\377\0\377\377\0\310\310\0\310\310\0\310" + "\310\0\310\310\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0dd\0\310\310\0\377\377\0\310\310\0\310\310" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\310\310\0\310\310\0\377\377\0\310\310\0dd" + "\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0dd\0dd\0dd\0\310\310\0\377\377\0\377\377\0\310\310\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\310\310\0\377\377\0\377\377\0\310\310\0dd\0dd\0dd\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd" + "\0\0\0\0\0\0\0dd\0\377\377\0\310\310\0\310\310\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\310\310\0\310\310\0\377\377\0dd\0\0" + "\0\0\0\0\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0\0\0\0\0\0\0dd\0dd\0\0\0\0\0" + "\0\0dd\0dd\0\0\0\0\0\0\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0" + "dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0" + "dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0\0\0\0\0\0\0dd\0dd\0\0\0\0\0\0\0" + "dd\0dd\0\0\0\0\0\0\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0\0\0\0" + "\0\0\0dd\0dd\0\0\0\0\0\0\0dd\0dd\0\0\0\0\0\0\0\310\310\0\310\310\0\0\0\0" + "\0\0\0\310\310\0\310\310\0\0\0\0\0\0\0\310\310\0\310\310\0\0\0\0\0\0\0\310" + "\310\0\310\310\0\0\0\0\0\0\0\310\310\0\310\310\0\0\0\0\0\0\0\310\310\0\310" + "\310\0\0\0\0\0\0\0\310\310\0\310\310\0\0\0\0\0\0\0\310\310\0\310\310\0\0" + "\0\0\0\0\0\310\310\0\310\310\0\0\0\0\0\0\0\310\310\0\310\310\0\0\0\0\0\0" + "\0dd\0dd\0\0\0\0\0\0\0dd\0dd\0\0\0\0\0\0\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0dd\0dd\0dd\0\0\0\0dd\0dd\0dd\0\0\0\0dd\0\310\310\0\310" + "\310\0dd\0dd\0\310\310\0\310\310\0dd\0dd\0\310\310\0\310\310\0dd\0dd\0\310" + "\310\0\310\310\0dd\0dd\0\310\310\0\310\310\0dd\0dd\0\310\310\0\310\310\0" + "dd\0dd\0\310\310\0\310\310\0dd\0dd\0\310\310\0\310\310\0dd\0dd\0\310\310" + "\0\310\310\0dd\0dd\0\310\310\0\310\310\0dd\0dd\0\310\310\0\310\310\0dd\0" + "\0\0\0dd\0dd\0dd\0\0\0\0dd\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0dd\0dd\0\310\310\0\310\310\0\310\310\0\310" + "\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310" + "\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0" + "\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310" + "\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310" + "\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0" + "\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310" + "\310\0dd\0dd\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", +}; + +/** + * Returns the BlitBlendAdd test image as SDL_Surface. + */ +SDL_Surface *SDLTest_ImageBlitBlendAdd(void) +{ + SDL_Surface *surface = SDL_CreateSurfaceFrom( + SDLTest_imageBlitBlendAdd.width, + SDLTest_imageBlitBlendAdd.height, + SDL_PIXELFORMAT_RGB24, + (void *)SDLTest_imageBlitBlendAdd.pixel_data, + SDLTest_imageBlitBlendAdd.width * SDLTest_imageBlitBlendAdd.bytes_per_pixel); + return surface; +} + +static const SDLTest_SurfaceImage_t SDLTest_imageBlitBlendAddPremultiplied = { + 80, + 60, + 3, + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0dd\0dd\0\310\310\0\310\310\0\310\310\0\310" + "\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310" + "\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0" + "\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310" + "\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310" + "\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0" + "\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310" + "\310\0dd\0dd\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0dd\0dd\0dd\0dd\0\310\310\0\310\310\0\310\310\0\310\310\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310" + "\0\310\310\0\310\310\0\310\310\0dd\0dd\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0dd\0dd\0dd\0dd\0\310\310\0\310\310\0\310\310\0\310\310" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\310\310\0\310\310\0\310\310\0\310\310\0dd\0dd\0dd" + "\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0dd\0dd\0\310\310\0\310\310\0" + "\310\310\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310\0\310" + "\310\0\310\310\0\310\310\0dd\0dd\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0dd\0" + "dd\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310\0" + "dd\0dd\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0dd\0dd\0\310\310\0\310\310\0\310\310" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\310\310\0\310\310\0\310\310\0dd\0dd\0dd\0dd\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0dd" + "\0\310\310\0\310\310\0\310\310\0\310\310\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310" + "\310\0\310\310\0\310\310\0\310\310\0dd\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0\310\310\0\310\310" + "\0\310\310\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310" + "\310\0\310\310\0\310\310\0\310\310\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0\310\310\0\310\310\0\310" + "\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\310\310\0\310\310\0\310\310\0dd\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0\310\310\0\310" + "\310\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\310\310\0\310\310\0\310\310\0dd\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310" + "\0\310\310\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310\0\310\310" + "\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\310\310\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\310\310\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0dd\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310" + "\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\310\310\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\310\310\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0dd\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\310\310\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\310\310\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0dd\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310" + "\310\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310" + "\310\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310" + "\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310" + "\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310\0\310" + "\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310\0\310" + "\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310\0\377\377\0\377\377\0\310\310" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\310\310\0\377\377\0\377\377\0\310\310\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310\310\0\310\310" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310\0\310\310" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\310\310\0\310\310\0\310\310\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310" + "\0\310\310\0\310\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0dd\0\310\310\0\310\310\0\310\310\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310" + "\310\0\310\310\0\310\310\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0\310\310\0\310\310\0dd\0\310\310\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\310\310\0" + "dd\0\310\310\0\310\310\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0\310\310\0\310\310\0\310\310\0\310\310" + "\0\377\377\0\377\377\0\377\377\0\310\310\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\310\310\0\377\377\0\377\377\0\377\377\0\310\310\0\310\310\0\310" + "\310\0\310\310\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0dd\0\310\310\0\377\377\0\310\310\0\310\310" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\310\310\0\310\310\0\377\377\0\310\310\0dd" + "\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0dd\0dd\0dd\0\310\310\0\377\377\0\377\377\0\310\310\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\310\310\0\377\377\0\377\377\0\310\310\0dd\0dd\0dd\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd" + "\0\0\0\0\0\0\0dd\0\377\377\0\310\310\0\310\310\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377" + "\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0" + "\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377\377\0\377" + "\377\0\377\377\0\377\377\0\377\377\0\310\310\0\310\310\0\377\377\0dd\0\0" + "\0\0\0\0\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0\0\0\0\0\0\0dd\0dd\0\0\0\0\0" + "\0\0dd\0dd\0\0\0\0\0\0\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0" + "dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0" + "dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0dd\0\0\0\0\0\0\0dd\0dd\0\0\0\0\0\0\0" + "dd\0dd\0\0\0\0\0\0\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0\0\0\0" + "\0\0\0dd\0dd\0\0\0\0\0\0\0dd\0dd\0\0\0\0\0\0\0\310\310\0\310\310\0\0\0\0" + "\0\0\0\310\310\0\310\310\0\0\0\0\0\0\0\310\310\0\310\310\0\0\0\0\0\0\0\310" + "\310\0\310\310\0\0\0\0\0\0\0\310\310\0\310\310\0\0\0\0\0\0\0\310\310\0\310" + "\310\0\0\0\0\0\0\0\310\310\0\310\310\0\0\0\0\0\0\0\310\310\0\310\310\0\0" + "\0\0\0\0\0\310\310\0\310\310\0\0\0\0\0\0\0\310\310\0\310\310\0\0\0\0\0\0" + "\0dd\0dd\0\0\0\0\0\0\0dd\0dd\0\0\0\0\0\0\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0dd\0dd\0dd\0\0\0\0dd\0dd\0dd\0\0\0\0dd\0\310\310\0\310" + "\310\0dd\0dd\0\310\310\0\310\310\0dd\0dd\0\310\310\0\310\310\0dd\0dd\0\310" + "\310\0\310\310\0dd\0dd\0\310\310\0\310\310\0dd\0dd\0\310\310\0\310\310\0" + "dd\0dd\0\310\310\0\310\310\0dd\0dd\0\310\310\0\310\310\0dd\0dd\0\310\310" + "\0\310\310\0dd\0dd\0\310\310\0\310\310\0dd\0dd\0\310\310\0\310\310\0dd\0" + "\0\0\0dd\0dd\0dd\0\0\0\0dd\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0dd\0dd\0dd\0dd\0\310\310\0\310\310\0\310\310\0\310" + "\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310" + "\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0" + "\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310" + "\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310" + "\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0" + "\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310\310\0\310" + "\310\0dd\0dd\0dd\0dd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", +}; + +/** + * Returns the BlitBlendAdd test image as SDL_Surface. + */ +SDL_Surface *SDLTest_ImageBlitBlendAddPremultiplied(void) +{ + SDL_Surface *surface = SDL_CreateSurfaceFrom( + SDLTest_imageBlitBlendAddPremultiplied.width, + SDLTest_imageBlitBlendAddPremultiplied.height, + SDL_PIXELFORMAT_RGB24, + (void *)SDLTest_imageBlitBlendAddPremultiplied.pixel_data, + SDLTest_imageBlitBlendAddPremultiplied.width * SDLTest_imageBlitBlendAddPremultiplied.bytes_per_pixel); + return surface; +} + static const SDLTest_SurfaceImage_t SDLTest_imageBlitBlendMod = { 80, 60, diff --git a/test/testautomation_images.h b/test/testautomation_images.h index f8541deda..d96698afc 100644 --- a/test/testautomation_images.h +++ b/test/testautomation_images.h @@ -26,8 +26,10 @@ typedef struct SDLTest_SurfaceImage_s { SDL_Surface *SDLTest_ImageBlit(void); SDL_Surface *SDLTest_ImageBlitColor(void); SDL_Surface *SDLTest_ImageBlitAlpha(void); -SDL_Surface *SDLTest_ImageBlitBlendAdd(void); SDL_Surface *SDLTest_ImageBlitBlend(void); +SDL_Surface *SDLTest_ImageBlitBlendPremultiplied(void); +SDL_Surface *SDLTest_ImageBlitBlendAdd(void); +SDL_Surface *SDLTest_ImageBlitBlendAddPremultiplied(void); SDL_Surface *SDLTest_ImageBlitBlendMod(void); SDL_Surface *SDLTest_ImageBlitBlendNone(void); SDL_Surface *SDLTest_ImageBlitBlendAll(void); diff --git a/test/testautomation_render.c b/test/testautomation_render.c index 4afff21c5..abc51bb91 100644 --- a/test/testautomation_render.c +++ b/test/testautomation_render.c @@ -702,6 +702,17 @@ static int render_testBlitBlend(void *arg) SDL_DestroySurface(referenceSurface); referenceSurface = NULL; + /* Test Blend Premultiplied. */ + testBlitBlendMode(tface, SDL_BLENDMODE_BLEND_PREMULTIPLIED); + referenceSurface = SDLTest_ImageBlitBlendPremultiplied(); + + /* Compare, then Present */ + compare(referenceSurface, ALLOWABLE_ERROR_BLENDED); + SDL_RenderPresent(renderer); + + SDL_DestroySurface(referenceSurface); + referenceSurface = NULL; + /* Test Add. */ testBlitBlendMode(tface, SDL_BLENDMODE_ADD); referenceSurface = SDLTest_ImageBlitBlendAdd(); @@ -713,6 +724,17 @@ static int render_testBlitBlend(void *arg) SDL_DestroySurface(referenceSurface); referenceSurface = NULL; + /* Test Add Premultiplied. */ + testBlitBlendMode(tface, SDL_BLENDMODE_ADD_PREMULTIPLIED); + referenceSurface = SDLTest_ImageBlitBlendAddPremultiplied(); + + /* Compare, then Present */ + compare(referenceSurface, ALLOWABLE_ERROR_BLENDED); + SDL_RenderPresent(renderer); + + SDL_DestroySurface(referenceSurface); + referenceSurface = NULL; + /* Test Mod. */ testBlitBlendMode(tface, SDL_BLENDMODE_MOD); referenceSurface = SDLTest_ImageBlitBlendMod(); @@ -1154,6 +1176,15 @@ hasBlendModes(void) if (!isSupported(ret)) { fail = 1; } + ret = SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND_PREMULTIPLIED ); + if (!isSupported(ret)) + fail = 1; + ret = SDL_GetRenderDrawBlendMode(renderer, &mode ); + if (!isSupported(ret)) + fail = 1; + ret = (mode != SDL_BLENDMODE_BLEND_PREMULTIPLIED); + if (!isSupported(ret)) + fail = 1; ret = SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_ADD); if (!isSupported(ret)) { fail = 1; @@ -1166,6 +1197,18 @@ hasBlendModes(void) if (!isSupported(ret)) { fail = 1; } + ret = SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_ADD_PREMULTIPLIED); + if (!isSupported(ret)) { + fail = 1; + } + ret = SDL_GetRenderDrawBlendMode(renderer, &mode); + if (!isSupported(ret)) { + fail = 1; + } + ret = (mode != SDL_BLENDMODE_ADD_PREMULTIPLIED); + if (!isSupported(ret)) { + fail = 1; + } ret = SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_MOD); if (!isSupported(ret)) { fail = 1; diff --git a/test/testautomation_surface.c b/test/testautomation_surface.c index 0d9a81afc..39fd16764 100644 --- a/test/testautomation_surface.c +++ b/test/testautomation_surface.c @@ -523,6 +523,28 @@ static int surface_testBlitBlendBlend(void *arg) return TEST_COMPLETED; } +/** + * @brief Tests some more blitting routines. + */ +static int surface_testBlitBlendPremultiplied(void *arg) +{ + int ret; + SDL_Surface *compareSurface; + + /* Blend premultiplied blitting */ + testBlitBlendMode(SDL_BLENDMODE_BLEND_PREMULTIPLIED); + + /* Verify result by comparing surfaces */ + compareSurface = SDLTest_ImageBlitBlendPremultiplied(); + ret = SDLTest_CompareSurfaces( testSurface, compareSurface, 0 ); + SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret); + + /* Clean up. */ + SDL_DestroySurface(compareSurface); + + return TEST_COMPLETED; +} + /** * Tests some more blitting routines. */ @@ -545,6 +567,28 @@ static int surface_testBlitBlendAdd(void *arg) return TEST_COMPLETED; } +/** + * Tests some more blitting routines. + */ +static int surface_testBlitBlendAddPremultiplied(void *arg) +{ + int ret; + SDL_Surface *compareSurface; + + /* Add blitting */ + testBlitBlendMode(SDL_BLENDMODE_ADD_PREMULTIPLIED); + + /* Verify result by comparing surfaces */ + compareSurface = SDLTest_ImageBlitBlendAddPremultiplied(); + ret = SDLTest_CompareSurfaces(testSurface, compareSurface, 0); + SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret); + + /* Clean up. */ + SDL_DestroySurface(compareSurface); + + return TEST_COMPLETED; +} + /** * Tests some more blitting routines. */ @@ -958,10 +1002,20 @@ static const SDLTest_TestCaseReference surfaceTest10 = { /* TODO: rewrite test case, define new test data and re-enable; current implementation fails */ static const SDLTest_TestCaseReference surfaceTest11 = { + (SDLTest_TestCaseFp)surface_testBlitBlendPremultiplied, "surface_testBlitBlendPremultiplied", "Tests blitting routines with premultiplied blending mode.", TEST_DISABLED +}; + +/* TODO: rewrite test case, define new test data and re-enable; current implementation fails */ +static const SDLTest_TestCaseReference surfaceTest12 = { (SDLTest_TestCaseFp)surface_testBlitBlendAdd, "surface_testBlitBlendAdd", "Tests blitting routines with add blending mode.", TEST_DISABLED }; -static const SDLTest_TestCaseReference surfaceTest12 = { +/* TODO: rewrite test case, define new test data and re-enable; current implementation fails */ +static const SDLTest_TestCaseReference surfaceTest13 = { + (SDLTest_TestCaseFp)surface_testBlitBlendAddPremultiplied, "surface_testBlitBlendAddPremultiplied", "Tests blitting routines with premultiplied add blending mode.", TEST_DISABLED +}; + +static const SDLTest_TestCaseReference surfaceTest14 = { (SDLTest_TestCaseFp)surface_testBlitBlendMod, "surface_testBlitBlendMod", "Tests blitting routines with mod blending mode.", TEST_ENABLED }; @@ -981,8 +1035,8 @@ static const SDLTest_TestCaseReference surfaceTestPalette = { static const SDLTest_TestCaseReference *surfaceTests[] = { &surfaceTest1, &surfaceTest2, &surfaceTest3, &surfaceTest4, &surfaceTest5, &surfaceTest6, &surfaceTest7, &surfaceTest8, &surfaceTest9, &surfaceTest10, - &surfaceTest11, &surfaceTest12, &surfaceTestOverflow, &surfaceTestFlip, - &surfaceTestPalette, NULL + &surfaceTest11, &surfaceTest12, &surfaceTest13, &surfaceTest14, + &surfaceTestOverflow, &surfaceTestFlip, &surfaceTestPalette, NULL }; /* Surface test suite (global) */ diff --git a/test/testdraw.c b/test/testdraw.c index 242b49ec8..d558bac26 100644 --- a/test/testdraw.c +++ b/test/testdraw.c @@ -243,9 +243,15 @@ int main(int argc, char *argv[]) } else if (SDL_strcasecmp(argv[i + 1], "blend") == 0) { blendMode = SDL_BLENDMODE_BLEND; consumed = 2; + } else if (SDL_strcasecmp(argv[i + 1], "blend_premultiplied") == 0) { + blendMode = SDL_BLENDMODE_BLEND_PREMULTIPLIED; + consumed = 2; } else if (SDL_strcasecmp(argv[i + 1], "add") == 0) { blendMode = SDL_BLENDMODE_ADD; consumed = 2; + } else if (SDL_strcasecmp(argv[i + 1], "add_premultiplied") == 0) { + blendMode = SDL_BLENDMODE_ADD_PREMULTIPLIED; + consumed = 2; } else if (SDL_strcasecmp(argv[i + 1], "mod") == 0) { blendMode = SDL_BLENDMODE_MOD; consumed = 2; @@ -267,7 +273,7 @@ int main(int argc, char *argv[]) } if (consumed < 0) { static const char *options[] = { - "[--blend none|blend|add|mod|mul]", + "[--blend none|blend|blend_premultiplied|add|add_premultiplied|mod|mul]", "[--cyclecolor]", "[--cyclealpha]", "[num_objects]", diff --git a/test/testintersections.c b/test/testintersections.c index 2ff5f09d1..6223aafa6 100644 --- a/test/testintersections.c +++ b/test/testintersections.c @@ -312,9 +312,15 @@ int main(int argc, char *argv[]) } else if (SDL_strcasecmp(argv[i + 1], "blend") == 0) { blendMode = SDL_BLENDMODE_BLEND; consumed = 2; + } else if (SDL_strcasecmp(argv[i + 1], "blend_premultiplied") == 0) { + blendMode = SDL_BLENDMODE_BLEND_PREMULTIPLIED; + consumed = 2; } else if (SDL_strcasecmp(argv[i + 1], "add") == 0) { blendMode = SDL_BLENDMODE_ADD; consumed = 2; + } else if (SDL_strcasecmp(argv[i + 1], "add_premultiplied") == 0) { + blendMode = SDL_BLENDMODE_ADD_PREMULTIPLIED; + consumed = 2; } else if (SDL_strcasecmp(argv[i + 1], "mod") == 0) { blendMode = SDL_BLENDMODE_MOD; consumed = 2; @@ -338,7 +344,7 @@ int main(int argc, char *argv[]) } } if (consumed < 0) { - static const char *options[] = { "[--blend none|blend|add|mod|mul]", "[--cyclecolor]", "[--cyclealpha]", "[count]", NULL }; + static const char *options[] = { "[--blend none|blend|blend_premultiplied|add|add_premultiplied|mod|mul]", "[--cyclecolor]", "[--cyclealpha]", "[count]", NULL }; SDLTest_CommonLogUsage(state, argv[0], options); return 1; } diff --git a/test/testsprite.c b/test/testsprite.c index 8fb3531d6..98f6a3276 100644 --- a/test/testsprite.c +++ b/test/testsprite.c @@ -451,9 +451,15 @@ int SDL_AppInit(void **appstate, int argc, char *argv[]) } else if (SDL_strcasecmp(argv[i + 1], "blend") == 0) { blendMode = SDL_BLENDMODE_BLEND; consumed = 2; + } else if (SDL_strcasecmp(argv[i + 1], "blend_premultiplied") == 0) { + blendMode = SDL_BLENDMODE_BLEND_PREMULTIPLIED; + consumed = 2; } else if (SDL_strcasecmp(argv[i + 1], "add") == 0) { blendMode = SDL_BLENDMODE_ADD; consumed = 2; + } else if (SDL_strcasecmp(argv[i + 1], "add_premultiplied") == 0) { + blendMode = SDL_BLENDMODE_ADD_PREMULTIPLIED; + consumed = 2; } else if (SDL_strcasecmp(argv[i + 1], "mod") == 0) { blendMode = SDL_BLENDMODE_MOD; consumed = 2; @@ -506,7 +512,7 @@ int SDL_AppInit(void **appstate, int argc, char *argv[]) } if (consumed < 0) { static const char *options[] = { - "[--blend none|blend|add|mod|mul|sub]", + "[--blend none|blend|blend_premultiplied|add|add_premultiplied|mod|mul|sub]", "[--cyclecolor]", "[--cyclealpha]", "[--suspend-when-occluded]",