From 5c7a5286272fdbf56af643d60646e53026422593 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josip=20Komljenovi=C4=87?= Date: Sat, 19 Apr 2025 10:42:09 +0200 Subject: [PATCH 1/5] Refactor alphablit --- src_c/alphablit.c | 2205 ++++++++++----------------------------------- 1 file changed, 453 insertions(+), 1752 deletions(-) diff --git a/src_c/alphablit.c b/src_c/alphablit.c index 5473d3008f..1d3258b0ce 100644 --- a/src_c/alphablit.c +++ b/src_c/alphablit.c @@ -594,1675 +594,178 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, /* --------------------------------------------------------- */ -static void -blit_blend_rgba_add(SDL_BlitInfo *info) -{ - int n; - int width = info->width; - int height = info->height; - Uint8 *src = info->s_pixels; - int srcpxskip = info->s_pxskip; - int srcskip = info->s_skip; - Uint8 *dst = info->d_pixels; - int dstpxskip = info->d_pxskip; - int dstskip = info->d_skip; - PG_PixelFormat *srcfmt = info->src; - SDL_Palette *srcpal = info->src_palette; - PG_PixelFormat *dstfmt = info->dst; - SDL_Palette *dstpal = info->dst_palette; - int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); - int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); - Uint8 dR, dG, dB, dA, sR, sG, sB, sA; - Uint32 pixel; - Uint32 tmp; - int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; - int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; - - if (!dstppa) { - blit_blend_add(info); - return; - } - - if (srcbpp == 4 && dstbpp == 4 && srcfmt->Rmask == dstfmt->Rmask && - srcfmt->Gmask == dstfmt->Gmask && srcfmt->Bmask == dstfmt->Bmask && - srcfmt->Amask == dstfmt->Amask && - info->src_blend != SDL_BLENDMODE_NONE) { - int incr = srcpxskip > 0 ? 1 : -1; - if (incr < 0) { - src += 3; - dst += 3; - } - while (height--) { - LOOP_UNROLLED4( - { - REPEAT_4({ - tmp = (*dst) + (*src); - (*dst) = (tmp <= 255 ? tmp : 255); - src += incr; - dst += incr; - }); - }, - n, width); - src += srcskip; - dst += dstskip; - } - return; - } - - if (srcbpp == 1) { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_RGBA_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* dstbpp > 1 */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_RGBA_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } - else /* srcbpp > 1 */ - { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_RGBA_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* dstbpp > 1 */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_RGBA_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } -} - -static void -blit_blend_rgba_sub(SDL_BlitInfo *info) -{ - int n; - int width = info->width; - int height = info->height; - Uint8 *src = info->s_pixels; - int srcpxskip = info->s_pxskip; - int srcskip = info->s_skip; - Uint8 *dst = info->d_pixels; - int dstpxskip = info->d_pxskip; - int dstskip = info->d_skip; - PG_PixelFormat *srcfmt = info->src; - SDL_Palette *srcpal = info->src_palette; - PG_PixelFormat *dstfmt = info->dst; - SDL_Palette *dstpal = info->dst_palette; - int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); - int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); - Uint8 dR, dG, dB, dA, sR, sG, sB, sA; - Uint32 pixel; - Sint32 tmp2; - int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; - int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; - - if (!dstppa) { - blit_blend_sub(info); - return; - } - - if (srcbpp == 4 && dstbpp == 4 && srcfmt->Rmask == dstfmt->Rmask && - srcfmt->Gmask == dstfmt->Gmask && srcfmt->Bmask == dstfmt->Bmask && - srcfmt->Amask == dstfmt->Amask && - info->src_blend != SDL_BLENDMODE_NONE) { - int incr = srcpxskip > 0 ? 1 : -1; - if (incr < 0) { - src += 3; - dst += 3; - } - while (height--) { - LOOP_UNROLLED4( - { - REPEAT_4({ - tmp2 = (*dst) - (*src); - (*dst) = (tmp2 >= 0 ? tmp2 : 0); - src += incr; - dst += incr; - }); - }, - n, width); - src += srcskip; - dst += dstskip; - } - return; - } - - if (srcbpp == 1) { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_RGBA_SUB(tmp2, sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* dstbpp > 1 */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_RGBA_SUB(tmp2, sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } - else /* srcbpp > 1 */ - { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_RGBA_SUB(tmp2, sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* dstbpp > 1 */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_RGBA_SUB(tmp2, sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } -} - -static void -blit_blend_rgba_mul(SDL_BlitInfo *info) -{ - int n; - int width = info->width; - int height = info->height; - Uint8 *src = info->s_pixels; - int srcpxskip = info->s_pxskip; - int srcskip = info->s_skip; - Uint8 *dst = info->d_pixels; - int dstpxskip = info->d_pxskip; - int dstskip = info->d_skip; - PG_PixelFormat *srcfmt = info->src; - SDL_Palette *srcpal = info->src_palette; - PG_PixelFormat *dstfmt = info->dst; - SDL_Palette *dstpal = info->dst_palette; - int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); - int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); - Uint8 dR, dG, dB, dA, sR, sG, sB, sA; - Uint32 pixel; - Uint32 tmp; - int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; - int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; - - if (!dstppa) { - blit_blend_mul(info); - return; - } - - if (srcbpp == 4 && dstbpp == 4 && srcfmt->Rmask == dstfmt->Rmask && - srcfmt->Gmask == dstfmt->Gmask && srcfmt->Bmask == dstfmt->Bmask && - srcfmt->Amask == dstfmt->Amask && - info->src_blend != SDL_BLENDMODE_NONE) { - int incr = srcpxskip > 0 ? 1 : -1; - if (incr < 0) { - src += 3; - dst += 3; - } - while (height--) { - LOOP_UNROLLED4( - { - REPEAT_4({ - tmp = ((*dst) && (*src)) - ? (((*dst) * (*src)) + 255) >> 8 - : 0; - (*dst) = (tmp <= 255 ? tmp : 255); - src += incr; - dst += incr; - }); - }, - n, width); - src += srcskip; - dst += dstskip; - } - return; - } - - if (srcbpp == 1) { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_RGBA_MULT(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* dstbpp > 1 */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_RGBA_MULT(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } - else /* srcbpp > 1 */ - { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_RGBA_MULT(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* dstbpp > 1 */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_RGBA_MULT(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } -} - -static void -blit_blend_rgba_min(SDL_BlitInfo *info) -{ - int n; - int width = info->width; - int height = info->height; - Uint8 *src = info->s_pixels; - int srcpxskip = info->s_pxskip; - int srcskip = info->s_skip; - Uint8 *dst = info->d_pixels; - int dstpxskip = info->d_pxskip; - int dstskip = info->d_skip; - PG_PixelFormat *srcfmt = info->src; - SDL_Palette *srcpal = info->src_palette; - PG_PixelFormat *dstfmt = info->dst; - SDL_Palette *dstpal = info->dst_palette; - int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); - int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); - Uint8 dR, dG, dB, dA, sR, sG, sB, sA; - Uint32 pixel; - int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; - int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; - - if (!dstppa) { - blit_blend_min(info); - return; - } - - if (srcbpp == 4 && dstbpp == 4 && srcfmt->Rmask == dstfmt->Rmask && - srcfmt->Gmask == dstfmt->Gmask && srcfmt->Bmask == dstfmt->Bmask && - srcfmt->Amask == dstfmt->Amask && - info->src_blend != SDL_BLENDMODE_NONE) { - int incr = srcpxskip > 0 ? 1 : -1; - if (incr < 0) { - src += 3; - dst += 3; - } - while (height--) { - LOOP_UNROLLED4( - { - REPEAT_4({ - if ((*src) < (*dst)) { - (*dst) = (*src); - } - src += incr; - dst += incr; - }); - }, - n, width); - src += srcskip; - dst += dstskip; - } - return; - } - - if (srcbpp == 1) { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_RGBA_MIN(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* dstbpp > 1 */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_RGBA_MIN(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } - else /* srcbpp > 1 */ - { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_RGBA_MIN(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* dstbpp > 1 */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_RGBA_MIN(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } -} - -static void -blit_blend_rgba_max(SDL_BlitInfo *info) -{ - int n; - int width = info->width; - int height = info->height; - Uint8 *src = info->s_pixels; - int srcpxskip = info->s_pxskip; - int srcskip = info->s_skip; - Uint8 *dst = info->d_pixels; - int dstpxskip = info->d_pxskip; - int dstskip = info->d_skip; - PG_PixelFormat *srcfmt = info->src; - SDL_Palette *srcpal = info->src_palette; - PG_PixelFormat *dstfmt = info->dst; - SDL_Palette *dstpal = info->dst_palette; - int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); - int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); - Uint8 dR, dG, dB, dA, sR, sG, sB, sA; - Uint32 pixel; - int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; - int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; - - if (!dstppa) { - blit_blend_max(info); - return; - } - - if (srcbpp == 4 && dstbpp == 4 && srcfmt->Rmask == dstfmt->Rmask && - srcfmt->Gmask == dstfmt->Gmask && srcfmt->Bmask == dstfmt->Bmask && - srcfmt->Amask == dstfmt->Amask && - info->src_blend != SDL_BLENDMODE_NONE) { - int incr = srcpxskip > 0 ? 1 : -1; - if (incr < 0) { - src += 3; - dst += 3; - } - while (height--) { - LOOP_UNROLLED4( - { - REPEAT_4({ - if ((*src) > (*dst)) { - (*dst) = (*src); - } - src += incr; - dst += incr; - }); - }, - n, width); - src += srcskip; - dst += dstskip; - } - return; - } - - if (srcbpp == 1) { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_RGBA_MAX(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* dstbpp > 1 */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_RGBA_MAX(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } - else /* srcbpp > 1 */ - { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_RGBA_MAX(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* dstbpp > 1 */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_RGBA_MAX(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } -} - -static void -blit_blend_premultiplied(SDL_BlitInfo *info) -{ - int n; - int width = info->width; - int height = info->height; - Uint8 *src = info->s_pixels; - int srcpxskip = info->s_pxskip; - int srcskip = info->s_skip; - Uint8 *dst = info->d_pixels; - int dstpxskip = info->d_pxskip; - int dstskip = info->d_skip; - PG_PixelFormat *srcfmt = info->src; - SDL_Palette *srcpal = info->src_palette; - PG_PixelFormat *dstfmt = info->dst; - SDL_Palette *dstpal = info->dst_palette; - int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); - int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); - Uint8 dR, dG, dB, dA, sR, sG, sB, sA; - Uint32 pixel; - int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; - int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; - - if (srcbpp >= 3 && dstbpp >= 3 && info->src_blend == SDL_BLENDMODE_NONE) { - size_t srcoffsetR, srcoffsetG, srcoffsetB; - size_t dstoffsetR, dstoffsetG, dstoffsetB; - if (srcbpp == 3) { - SET_OFFSETS_24(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); - } - else { - SET_OFFSETS_32(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); - } - if (dstbpp == 3) { - SET_OFFSETS_24(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); - } - else { - SET_OFFSETS_32(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); - } - while (height--) { - LOOP_UNROLLED4( - { - dst[dstoffsetR] = src[srcoffsetR]; - dst[dstoffsetG] = src[srcoffsetG]; - dst[dstoffsetB] = src[srcoffsetB]; - - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - return; - } - - if (srcbpp == 1) { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - ALPHA_BLEND_PREMULTIPLIED(tmp, sR, sG, sB, sA, dR, dG, - dB, dA); - SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else if (dstbpp == 3) { - size_t offsetR, offsetG, offsetB; - SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - ALPHA_BLEND_PREMULTIPLIED(tmp, sR, sG, sB, sA, dR, dG, - dB, dA); - dst[offsetR] = dR; - dst[offsetG] = dG; - dst[offsetB] = dB; - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* dstbpp > 1 */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - ALPHA_BLEND_PREMULTIPLIED(tmp, sR, sG, sB, sA, dR, dG, - dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } - else /* srcbpp > 1 */ - { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - ALPHA_BLEND_PREMULTIPLIED(tmp, sR, sG, sB, sA, dR, dG, - dB, dA); - SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else if (dstbpp == 3) { - size_t offsetR, offsetG, offsetB; - SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - if (sA == 0) { - dst[offsetR] = dR; - dst[offsetG] = dG; - dst[offsetB] = dB; - } - else if (sA == 255) { - dst[offsetR] = sR; - dst[offsetG] = sG; - dst[offsetB] = sB; - } - else { - ALPHA_BLEND_PREMULTIPLIED(tmp, sR, sG, sB, sA, dR, - dG, dB, dA); - dst[offsetR] = dR; - dst[offsetG] = dG; - dst[offsetB] = dB; - } - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* dstbpp > 1 */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - // We can save some blending time by just copying - // pixels with alphas of 255 or 0 - if (sA == 0) { - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - } - else if (sA == 255) { - CREATE_PIXEL(dst, sR, sG, sB, sA, dstbpp, dstfmt); - } - else { - ALPHA_BLEND_PREMULTIPLIED(tmp, sR, sG, sB, sA, dR, - dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - } - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } -} - -/* --------------------------------------------------------- */ - -static void -blit_blend_add(SDL_BlitInfo *info) -{ - int n; - int width = info->width; - int height = info->height; - Uint8 *src = info->s_pixels; - int srcpxskip = info->s_pxskip; - int srcskip = info->s_skip; - Uint8 *dst = info->d_pixels; - int dstpxskip = info->d_pxskip; - int dstskip = info->d_skip; - PG_PixelFormat *srcfmt = info->src; - SDL_Palette *srcpal = info->src_palette; - PG_PixelFormat *dstfmt = info->dst; - SDL_Palette *dstpal = info->dst_palette; - int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); - int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); - Uint8 dR, dG, dB, dA, sR, sG, sB, sA; - Uint32 pixel; - Uint32 tmp; - int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; - int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; - - if (srcbpp >= 3 && dstbpp >= 3 && info->src_blend == SDL_BLENDMODE_NONE) { - size_t srcoffsetR, srcoffsetG, srcoffsetB; - size_t dstoffsetR, dstoffsetG, dstoffsetB; - if (srcbpp == 3) { - SET_OFFSETS_24(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); - } - else { - SET_OFFSETS_32(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); - } - if (dstbpp == 3) { - SET_OFFSETS_24(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); - } - else { - SET_OFFSETS_32(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); - } - while (height--) { - LOOP_UNROLLED4( - { - tmp = dst[dstoffsetR] + src[srcoffsetR]; - dst[dstoffsetR] = (tmp <= 255 ? tmp : 255); - tmp = dst[dstoffsetG] + src[srcoffsetG]; - dst[dstoffsetG] = (tmp <= 255 ? tmp : 255); - tmp = dst[dstoffsetB] + src[srcoffsetB]; - dst[dstoffsetB] = (tmp <= 255 ? tmp : 255); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - return; - } - - if (srcbpp == 1) { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA); - SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else if (dstbpp == 3) { - size_t offsetR, offsetG, offsetB; - SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA); - dst[offsetR] = dR; - dst[offsetG] = dG; - dst[offsetB] = dB; - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* even dstbpp */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } - else /* srcbpp > 1 */ - { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA); - SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else if (dstbpp == 3) { - size_t offsetR, offsetG, offsetB; - SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA); - dst[offsetR] = dR; - dst[offsetG] = dG; - dst[offsetB] = dB; - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* even dstbpp */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } -} - -static void -blit_blend_sub(SDL_BlitInfo *info) -{ - int n; - int width = info->width; - int height = info->height; - Uint8 *src = info->s_pixels; - int srcpxskip = info->s_pxskip; - int srcskip = info->s_skip; - Uint8 *dst = info->d_pixels; - int dstpxskip = info->d_pxskip; - int dstskip = info->d_skip; - PG_PixelFormat *srcfmt = info->src; - SDL_Palette *srcpal = info->src_palette; - PG_PixelFormat *dstfmt = info->dst; - SDL_Palette *dstpal = info->dst_palette; - int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); - int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); - Uint8 dR, dG, dB, dA, sR, sG, sB, sA; - Uint32 pixel; - Sint32 tmp2; - int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; - int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; - - if (srcbpp >= 3 && dstbpp >= 3 && info->src_blend == SDL_BLENDMODE_NONE) { - size_t srcoffsetR, srcoffsetG, srcoffsetB; - size_t dstoffsetR, dstoffsetG, dstoffsetB; - if (srcbpp == 3) { - SET_OFFSETS_24(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); - } - else { - SET_OFFSETS_32(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); - } - if (dstbpp == 3) { - SET_OFFSETS_24(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); - } - else { - SET_OFFSETS_32(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); - } - while (height--) { - LOOP_UNROLLED4( - { - tmp2 = dst[dstoffsetR] - src[srcoffsetR]; - dst[dstoffsetR] = (tmp2 >= 0 ? tmp2 : 0); - tmp2 = dst[dstoffsetG] - src[srcoffsetG]; - dst[dstoffsetG] = (tmp2 >= 0 ? tmp2 : 0); - tmp2 = dst[dstoffsetB] - src[srcoffsetB]; - dst[dstoffsetB] = (tmp2 >= 0 ? tmp2 : 0); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - return; - } - - if (srcbpp == 1) { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_SUB(tmp2, sR, sG, sB, sA, dR, dG, dB, dA); - SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else if (dstbpp == 3) { - size_t offsetR, offsetG, offsetB; - SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_SUB(tmp2, sR, sG, sB, sA, dR, dG, dB, dA); - dst[offsetR] = dR; - dst[offsetG] = dG; - dst[offsetB] = dB; - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* even dstbpp */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_SUB(tmp2, sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } - else /* srcbpp > 1 */ - { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_SUB(tmp2, sR, sG, sB, sA, dR, dG, dB, dA); - SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else if (dstbpp == 3) { - size_t offsetR, offsetG, offsetB; - SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_SUB(tmp2, sR, sG, sB, sA, dR, dG, dB, dA); - dst[offsetR] = dR; - dst[offsetG] = dG; - dst[offsetB] = dB; - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* even dstbpp */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_SUB(tmp2, sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } -} - -static void -blit_blend_mul(SDL_BlitInfo *info) -{ - int n; - int width = info->width; - int height = info->height; - Uint8 *src = info->s_pixels; - int srcpxskip = info->s_pxskip; - int srcskip = info->s_skip; - Uint8 *dst = info->d_pixels; - int dstpxskip = info->d_pxskip; - int dstskip = info->d_skip; - PG_PixelFormat *srcfmt = info->src; - SDL_Palette *srcpal = info->src_palette; - PG_PixelFormat *dstfmt = info->dst; - SDL_Palette *dstpal = info->dst_palette; - int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); - int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); - Uint8 dR, dG, dB, dA, sR, sG, sB, sA; - Uint32 pixel; - Uint32 tmp; - int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; - int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; - - if (srcbpp >= 3 && dstbpp >= 3 && info->src_blend == SDL_BLENDMODE_NONE) { - size_t srcoffsetR, srcoffsetG, srcoffsetB; - size_t dstoffsetR, dstoffsetG, dstoffsetB; - if (srcbpp == 3) { - SET_OFFSETS_24(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); - } - else { - SET_OFFSETS_32(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); - } - if (dstbpp == 3) { - SET_OFFSETS_24(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); - } - else { - SET_OFFSETS_32(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); - } - while (height--) { - LOOP_UNROLLED4( - { - tmp = - ((dst[dstoffsetR] && src[srcoffsetR]) - ? ((dst[dstoffsetR] * src[srcoffsetR]) + 255) >> 8 - : 0); - dst[dstoffsetR] = (tmp <= 255 ? tmp : 255); - tmp = - ((dst[dstoffsetG] && src[srcoffsetG]) - ? ((dst[dstoffsetG] * src[srcoffsetG]) + 255) >> 8 - : 0); - dst[dstoffsetG] = (tmp <= 255 ? tmp : 255); - tmp = - ((dst[dstoffsetB] && src[srcoffsetB]) - ? ((dst[dstoffsetB] * src[srcoffsetB]) + 255) >> 8 - : 0); - dst[dstoffsetB] = (tmp <= 255 ? tmp : 255); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - return; - } - - if (srcbpp == 1) { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA); - SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else if (dstbpp == 3) { - size_t offsetR, offsetG, offsetB; - SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA); - dst[offsetR] = dR; - dst[offsetG] = dG; - dst[offsetB] = dB; - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* even dstbpp */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } - else /* srcbpp > 1 */ - { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA); - SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); - *dst = (Uint8)PG_MapRGB(dstfmt, dstpal, dR, dG, dB); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else if (dstbpp == 3) { - size_t offsetR, offsetG, offsetB; - SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA); - dst[offsetR] = dR; - dst[offsetG] = dG; - dst[offsetB] = dB; - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* even dstbpp */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } -} - -static void -blit_blend_min(SDL_BlitInfo *info) -{ - int n; - int width = info->width; - int height = info->height; - Uint8 *src = info->s_pixels; - int srcpxskip = info->s_pxskip; - int srcskip = info->s_skip; - Uint8 *dst = info->d_pixels; - int dstpxskip = info->d_pxskip; - int dstskip = info->d_skip; - PG_PixelFormat *srcfmt = info->src; - SDL_Palette *srcpal = info->src_palette; - PG_PixelFormat *dstfmt = info->dst; - SDL_Palette *dstpal = info->dst_palette; - int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); - int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); - Uint8 dR, dG, dB, dA, sR, sG, sB, sA; +#define SETUP_BASE() \ + int n; \ + int width = info->width; \ + int height = info->height; \ + Uint8 *src = info->s_pixels; \ + int srcpxskip = info->s_pxskip; \ + int srcskip = info->s_skip; \ + Uint8 *dst = info->d_pixels; \ + int dstpxskip = info->d_pxskip; \ + int dstskip = info->d_skip; \ + PG_PixelFormat *srcfmt = info->src; \ + SDL_Palette *srcpal = info->src_palette; \ + PG_PixelFormat *dstfmt = info->dst; \ + SDL_Palette *dstpal = info->dst_palette; \ + int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); \ + int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); \ + Uint8 dR, dG, dB, dA, sR, sG, sB, sA; \ Uint32 pixel; - int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; + +#define SETUP_BLIT_BLEND(...) \ + SETUP_BASE() \ + __VA_ARGS__; \ + int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; \ int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; - if (srcbpp >= 3 && dstbpp >= 3 && info->src_blend == SDL_BLENDMODE_NONE) { - size_t srcoffsetR, srcoffsetG, srcoffsetB; - size_t dstoffsetR, dstoffsetG, dstoffsetB; - if (srcbpp == 3) { - SET_OFFSETS_24(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); - } - else { - SET_OFFSETS_32(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); - } - if (dstbpp == 3) { - SET_OFFSETS_24(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); - } - else { - SET_OFFSETS_32(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); - } - while (height--) { - LOOP_UNROLLED4( - { - if (src[srcoffsetR] < dst[dstoffsetR]) { - dst[dstoffsetR] = src[srcoffsetR]; - } - if (src[srcoffsetG] < dst[dstoffsetG]) { - dst[dstoffsetG] = src[srcoffsetG]; - } - if (src[srcoffsetB] < dst[dstoffsetB]) { - dst[dstoffsetB] = src[srcoffsetB]; - } - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - return; - } +/* --------------------------------------------------------- */ - if (srcbpp == 1) { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA); - SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else if (dstbpp == 3) { - size_t offsetR, offsetG, offsetB; - SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA); - dst[offsetR] = dR; - dst[offsetG] = dG; - dst[offsetB] = dB; - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* even dstbpp */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - } - else /* srcbpp > 1 */ - { - if (dstbpp == 1) { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA); - *dst = (Uint8)PG_MapRGB(dstfmt, dstpal, dR, dG, dB); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else if (dstbpp == 3) { - size_t offsetR, offsetG, offsetB; - SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA); - dst[offsetR] = dR; - dst[offsetG] = dG; - dst[offsetB] = dB; - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } - else /* even dstbpp */ - { - while (height--) { - LOOP_UNROLLED4( - { - GET_PIXEL(pixel, srcbpp, src); - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, - srcppa); - GET_PIXEL(pixel, dstbpp, dst); - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, - dstppa); - BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); - src += srcpxskip; - dst += dstpxskip; - }, - n, width); - src += srcskip; - dst += dstskip; - } - } +#define BLIT_BLEND_RGBA_OP(operation, tmp_variable, blend_function, code) \ + static void blit_blend_rgba_##operation(SDL_BlitInfo *info) \ + { \ + SETUP_BLIT_BLEND(tmp_variable) \ + if (!dstppa) { \ + blit_blend_##operation(info); \ + return; \ + } \ + if (srcbpp == 4 && dstbpp == 4 && srcfmt->Rmask == dstfmt->Rmask && \ + srcfmt->Gmask == dstfmt->Gmask && \ + srcfmt->Bmask == dstfmt->Bmask && \ + srcfmt->Amask == dstfmt->Amask && \ + info->src_blend != SDL_BLENDMODE_NONE) { \ + int incr = srcpxskip > 0 ? 1 : -1; \ + if (incr < 0) { \ + src += 3; \ + dst += 3; \ + } \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + REPEAT_4({ \ + code src += incr; \ + dst += incr; \ + }); \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + return; \ + } \ + if (srcbpp == 1) { \ + if (dstbpp == 1) { \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ + blend_function; \ + CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, \ + dstfmt); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + } \ + else /* dstbpp > 1 */ \ + { \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ + GET_PIXEL(pixel, dstbpp, dst); \ + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, \ + dstpal, dstppa); \ + blend_function; \ + CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, \ + dstfmt); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + } \ + } \ + else /* srcbpp > 1 */ \ + { \ + if (dstbpp == 1) { \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXEL(pixel, srcbpp, src); \ + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, \ + srcpal, srcppa); \ + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ + blend_function; \ + CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, \ + dstfmt); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + } \ + else /* dstbpp > 1 */ \ + { \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXEL(pixel, srcbpp, src); \ + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, \ + srcpal, srcppa); \ + GET_PIXEL(pixel, dstbpp, dst); \ + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, \ + dstpal, dstppa); \ + blend_function; \ + CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, \ + dstfmt); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + } \ + } \ } -} + +BLIT_BLEND_RGBA_OP(add, Uint32 tmp, + BLEND_RGBA_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA), + tmp = (*dst) + (*src); + (*dst) = (tmp <= 255 ? tmp : 255);); + +BLIT_BLEND_RGBA_OP(sub, Sint32 tmp, + BLEND_RGBA_SUB(tmp, sR, sG, sB, sA, dR, dG, dB, dA), + tmp = (*dst) - (*src); + (*dst) = (tmp >= 0 ? tmp : 0);); + +BLIT_BLEND_RGBA_OP(mul, Uint32 tmp, + BLEND_RGBA_MULT(sR, sG, sB, sA, dR, dG, dB, dA), + tmp = ((*dst) && (*src)) ? (((*dst) * (*src)) + 255) >> 8 + : 0; + (*dst) = (tmp <= 255 ? tmp : 255);); + +BLIT_BLEND_RGBA_OP( + min, , BLEND_RGBA_MIN(sR, sG, sB, sA, dR, dG, dB, dA), + if ((*src) < (*dst)) { (*dst) = (*src); }); + +BLIT_BLEND_RGBA_OP( + max, , BLEND_RGBA_MAX(sR, sG, sB, sA, dR, dG, dB, dA), + if ((*src) > (*dst)) { (*dst) = (*src); }); static void -blit_blend_max(SDL_BlitInfo *info) +blit_blend_premultiplied(SDL_BlitInfo *info) { - int n; - int width = info->width; - int height = info->height; - Uint8 *src = info->s_pixels; - int srcpxskip = info->s_pxskip; - int srcskip = info->s_skip; - Uint8 *dst = info->d_pixels; - int dstpxskip = info->d_pxskip; - int dstskip = info->d_skip; - PG_PixelFormat *srcfmt = info->src; - SDL_Palette *srcpal = info->src_palette; - PG_PixelFormat *dstfmt = info->dst; - SDL_Palette *dstpal = info->dst_palette; - int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); - int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); - Uint8 dR, dG, dB, dA, sR, sG, sB, sA; - Uint32 pixel; - int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; - int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; - + SETUP_BLIT_BLEND() if (srcbpp >= 3 && dstbpp >= 3 && info->src_blend == SDL_BLENDMODE_NONE) { size_t srcoffsetR, srcoffsetG, srcoffsetB; size_t dstoffsetR, dstoffsetG, dstoffsetB; @@ -2281,15 +784,10 @@ blit_blend_max(SDL_BlitInfo *info) while (height--) { LOOP_UNROLLED4( { - if (src[srcoffsetR] > dst[dstoffsetR]) { - dst[dstoffsetR] = src[srcoffsetR]; - } - if (src[srcoffsetG] > dst[dstoffsetG]) { - dst[dstoffsetG] = src[srcoffsetG]; - } - if (src[srcoffsetB] > dst[dstoffsetB]) { - dst[dstoffsetB] = src[srcoffsetB]; - } + dst[dstoffsetR] = src[srcoffsetR]; + dst[dstoffsetG] = src[srcoffsetG]; + dst[dstoffsetB] = src[srcoffsetB]; + src += srcpxskip; dst += dstpxskip; }, @@ -2307,7 +805,8 @@ blit_blend_max(SDL_BlitInfo *info) { GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA); + ALPHA_BLEND_PREMULTIPLIED(tmp, sR, sG, sB, sA, dR, dG, + dB, dA); SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); src += srcpxskip; dst += dstpxskip; @@ -2327,7 +826,8 @@ blit_blend_max(SDL_BlitInfo *info) GET_PIXEL(pixel, dstbpp, dst); GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, dstppa); - BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA); + ALPHA_BLEND_PREMULTIPLIED(tmp, sR, sG, sB, sA, dR, dG, + dB, dA); dst[offsetR] = dR; dst[offsetG] = dG; dst[offsetB] = dB; @@ -2339,7 +839,7 @@ blit_blend_max(SDL_BlitInfo *info) dst += dstskip; } } - else /* even dstbpp */ + else /* dstbpp > 1 */ { while (height--) { LOOP_UNROLLED4( @@ -2348,7 +848,8 @@ blit_blend_max(SDL_BlitInfo *info) GET_PIXEL(pixel, dstbpp, dst); GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, dstppa); - BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA); + ALPHA_BLEND_PREMULTIPLIED(tmp, sR, sG, sB, sA, dR, dG, + dB, dA); CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); src += srcpxskip; dst += dstpxskip; @@ -2369,7 +870,8 @@ blit_blend_max(SDL_BlitInfo *info) GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, srcppa); GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); - BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA); + ALPHA_BLEND_PREMULTIPLIED(tmp, sR, sG, sB, sA, dR, dG, + dB, dA); SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); src += srcpxskip; dst += dstpxskip; @@ -2391,10 +893,23 @@ blit_blend_max(SDL_BlitInfo *info) GET_PIXEL(pixel, dstbpp, dst); GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, dstppa); - BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA); - dst[offsetR] = dR; - dst[offsetG] = dG; - dst[offsetB] = dB; + if (sA == 0) { + dst[offsetR] = dR; + dst[offsetG] = dG; + dst[offsetB] = dB; + } + else if (sA == 255) { + dst[offsetR] = sR; + dst[offsetG] = sG; + dst[offsetB] = sB; + } + else { + ALPHA_BLEND_PREMULTIPLIED(tmp, sR, sG, sB, sA, dR, + dG, dB, dA); + dst[offsetR] = dR; + dst[offsetG] = dG; + dst[offsetB] = dB; + } src += srcpxskip; dst += dstpxskip; }, @@ -2403,7 +918,7 @@ blit_blend_max(SDL_BlitInfo *info) dst += dstskip; } } - else /* even dstbpp */ + else /* dstbpp > 1 */ { while (height--) { LOOP_UNROLLED4( @@ -2414,8 +929,19 @@ blit_blend_max(SDL_BlitInfo *info) GET_PIXEL(pixel, dstbpp, dst); GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, dstppa); - BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA); - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); + // We can save some blending time by just copying + // pixels with alphas of 255 or 0 + if (sA == 0) { + CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); + } + else if (sA == 255) { + CREATE_PIXEL(dst, sR, sG, sB, sA, dstbpp, dstfmt); + } + else { + ALPHA_BLEND_PREMULTIPLIED(tmp, sR, sG, sB, sA, dR, + dG, dB, dA); + CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); + } src += srcpxskip; dst += dstpxskip; }, @@ -2429,32 +955,250 @@ blit_blend_max(SDL_BlitInfo *info) /* --------------------------------------------------------- */ +#define BLIT_BLEND_OP(operation, tmp_variable, blend_function, code) \ + static void blit_blend_##operation(SDL_BlitInfo *info) \ + { \ + int n; \ + int width = info->width; \ + int height = info->height; \ + Uint8 *src = info->s_pixels; \ + int srcpxskip = info->s_pxskip; \ + int srcskip = info->s_skip; \ + Uint8 *dst = info->d_pixels; \ + int dstpxskip = info->d_pxskip; \ + int dstskip = info->d_skip; \ + PG_PixelFormat *srcfmt = info->src; \ + SDL_Palette *srcpal = info->src_palette; \ + PG_PixelFormat *dstfmt = info->dst; \ + SDL_Palette *dstpal = info->dst_palette; \ + int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); \ + int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); \ + Uint8 dR, dG, dB, dA, sR, sG, sB, sA; \ + Uint32 pixel; \ + tmp_variable; \ + int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; \ + int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; \ + if (srcbpp >= 3 && dstbpp >= 3 && \ + info->src_blend == SDL_BLENDMODE_NONE) { \ + size_t srcoffsetR, srcoffsetG, srcoffsetB; \ + size_t dstoffsetR, dstoffsetG, dstoffsetB; \ + if (srcbpp == 3) { \ + SET_OFFSETS_24(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); \ + } \ + else { \ + SET_OFFSETS_32(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); \ + } \ + if (dstbpp == 3) { \ + SET_OFFSETS_24(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); \ + } \ + else { \ + SET_OFFSETS_32(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); \ + } \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + code src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + return; \ + } \ + if (srcbpp == 1) { \ + if (dstbpp == 1) { \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ + blend_function; \ + SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, \ + dA); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + } \ + else if (dstbpp == 3) { \ + size_t offsetR, offsetG, offsetB; \ + SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ + GET_PIXEL(pixel, dstbpp, dst); \ + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, \ + dstpal, dstppa); \ + blend_function; \ + dst[offsetR] = dR; \ + dst[offsetG] = dG; \ + dst[offsetB] = dB; \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + } \ + else /* even dstbpp */ \ + { \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ + GET_PIXEL(pixel, dstbpp, dst); \ + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, \ + dstpal, dstppa); \ + blend_function; \ + CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, \ + dstfmt); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + } \ + } \ + else /* srcbpp > 1 */ \ + { \ + if (dstbpp == 1) { \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXEL(pixel, srcbpp, src); \ + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, \ + srcpal, srcppa); \ + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ + blend_function; \ + SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, \ + dA); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + } \ + else if (dstbpp == 3) { \ + size_t offsetR, offsetG, offsetB; \ + SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXEL(pixel, srcbpp, src); \ + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, \ + srcpal, srcppa); \ + GET_PIXEL(pixel, dstbpp, dst); \ + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, \ + dstpal, dstppa); \ + blend_function; \ + dst[offsetR] = dR; \ + dst[offsetG] = dG; \ + dst[offsetB] = dB; \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + } \ + else /* even dstbpp */ \ + { \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXEL(pixel, srcbpp, src); \ + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, \ + srcpal, srcppa); \ + GET_PIXEL(pixel, dstbpp, dst); \ + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, \ + dstpal, dstppa); \ + blend_function; \ + CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, \ + dstfmt); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + } \ + } \ + } + +BLIT_BLEND_OP(add, Uint32 tmp, BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA), + tmp = dst[dstoffsetR] + src[srcoffsetR]; + dst[dstoffsetR] = (tmp <= 255 ? tmp : 255); + tmp = dst[dstoffsetG] + src[srcoffsetG]; + dst[dstoffsetG] = (tmp <= 255 ? tmp : 255); + tmp = dst[dstoffsetB] + src[srcoffsetB]; + dst[dstoffsetB] = (tmp <= 255 ? tmp : 255);); + +BLIT_BLEND_OP(sub, Sint32 tmp, BLEND_SUB(tmp, sR, sG, sB, sA, dR, dG, dB, dA), + tmp = dst[dstoffsetR] - src[srcoffsetR]; + dst[dstoffsetR] = (tmp >= 0 ? tmp : 0); + tmp = dst[dstoffsetG] - src[srcoffsetG]; + dst[dstoffsetG] = (tmp >= 0 ? tmp : 0); + tmp = dst[dstoffsetB] - src[srcoffsetB]; + dst[dstoffsetB] = (tmp >= 0 ? tmp : 0);); + +BLIT_BLEND_OP(mul, Uint32 tmp, BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA), + tmp = ((dst[dstoffsetR] && src[srcoffsetR]) + ? ((dst[dstoffsetR] * src[srcoffsetR]) + 255) >> 8 + : 0); + dst[dstoffsetR] = (tmp <= 255 ? tmp : 255); + tmp = ((dst[dstoffsetG] && src[srcoffsetG]) + ? ((dst[dstoffsetG] * src[srcoffsetG]) + 255) >> 8 + : 0); + dst[dstoffsetG] = (tmp <= 255 ? tmp : 255); + tmp = ((dst[dstoffsetB] && src[srcoffsetB]) + ? ((dst[dstoffsetB] * src[srcoffsetB]) + 255) >> 8 + : 0); + dst[dstoffsetB] = (tmp <= 255 ? tmp : 255);); + +BLIT_BLEND_OP( + min, , BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA), + if (src[srcoffsetR] < dst[dstoffsetR]) { + dst[dstoffsetR] = src[srcoffsetR]; + } if (src[srcoffsetG] < dst[dstoffsetG]) { + dst[dstoffsetG] = src[srcoffsetG]; + } if (src[srcoffsetB] < dst[dstoffsetB]) { + dst[dstoffsetB] = src[srcoffsetB]; + }); + +BLIT_BLEND_OP( + max, , BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA), + if (src[srcoffsetR] > dst[dstoffsetR]) { + dst[dstoffsetR] = src[srcoffsetR]; + } if (src[srcoffsetG] > dst[dstoffsetG]) { + dst[dstoffsetG] = src[srcoffsetG]; + } if (src[srcoffsetB] > dst[dstoffsetB]) { + dst[dstoffsetB] = src[srcoffsetB]; + }); + +/* --------------------------------------------------------- */ + +#define SETUP_ALPHABLIT() \ + SETUP_BASE() \ + int dRi, dGi, dBi, dAi, sRi, sGi, sBi; \ + int alpha = info->src_blanket_alpha; + static void alphablit_alpha(SDL_BlitInfo *info) { - int n; - int width = info->width; - int height = info->height; - Uint8 *src = info->s_pixels; - int srcpxskip = info->s_pxskip; - int srcskip = info->s_skip; - Uint8 *dst = info->d_pixels; - int dstpxskip = info->d_pxskip; - int dstskip = info->d_skip; - PG_PixelFormat *srcfmt = info->src; - SDL_Palette *srcpal = info->src_palette; - PG_PixelFormat *dstfmt = info->dst; - SDL_Palette *dstpal = info->dst_palette; - int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); - int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); - Uint8 dR, dG, dB, dA, sR, sG, sB, sA; - int dRi, dGi, dBi, dAi, sRi, sGi, sBi, sAi; - Uint32 modulateA = info->src_blanket_alpha; - Uint32 pixel; - - /* - printf ("Alpha blit with %d and %d\n", srcbpp, dstbpp); - */ + SETUP_ALPHABLIT() + int sAi; if (srcbpp == 1) { if (dstbpp == 1) { @@ -2525,7 +1269,7 @@ alphablit_alpha(SDL_BlitInfo *info) GET_PIXEL(pixel, dstbpp, dst); PG_GetRGBA(pixel, dstfmt, dstpal, &dR, &dG, &dB, &dA); /* modulate Alpha */ - sA = (sA * modulateA) / 255; + sA = (sA * alpha) / 255; dRi = dR; dGi = dG; @@ -2547,30 +1291,9 @@ alphablit_alpha(SDL_BlitInfo *info) static void alphablit_colorkey(SDL_BlitInfo *info) { - int n; - int width = info->width; - int height = info->height; - Uint8 *src = info->s_pixels; - int srcpxskip = info->s_pxskip; - int srcskip = info->s_skip; - Uint8 *dst = info->d_pixels; - int dstpxskip = info->d_pxskip; - int dstskip = info->d_skip; - PG_PixelFormat *srcfmt = info->src; - SDL_Palette *srcpal = info->src_palette; - PG_PixelFormat *dstfmt = info->dst; - SDL_Palette *dstpal = info->dst_palette; - int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); - int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); - Uint8 dR, dG, dB, dA, sR, sG, sB, sA; - int dRi, dGi, dBi, dAi, sRi, sGi, sBi, sAi; - int alpha = info->src_blanket_alpha; + SETUP_ALPHABLIT() + int sAi; Uint32 colorkey = info->src_colorkey; - Uint32 pixel; - - /* - printf ("Colorkey blit with %d and %d\n", srcbpp, dstbpp); - */ assert(info->src_has_colorkey); if (srcbpp == 1) { @@ -2697,29 +1420,7 @@ alphablit_colorkey(SDL_BlitInfo *info) static void alphablit_solid(SDL_BlitInfo *info) { - int n; - int width = info->width; - int height = info->height; - Uint8 *src = info->s_pixels; - int srcpxskip = info->s_pxskip; - int srcskip = info->s_skip; - Uint8 *dst = info->d_pixels; - int dstpxskip = info->d_pxskip; - int dstskip = info->d_skip; - PG_PixelFormat *srcfmt = info->src; - SDL_Palette *srcpal = info->src_palette; - PG_PixelFormat *dstfmt = info->dst; - SDL_Palette *dstpal = info->dst_palette; - int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); - int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); - Uint8 dR, dG, dB, dA, sR, sG, sB, sA; - int dRi, dGi, dBi, dAi, sRi, sGi, sBi; - int alpha = info->src_blanket_alpha; - int pixel; - - /* - printf ("Solid blit with %d and %d\n", srcbpp, dstbpp); - */ + SETUP_ALPHABLIT() if (srcbpp == 1) { if (dstbpp == 1) { From ba59f2e4d4a76c2e467a4034661913c4ea0045b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josip=20Komljenovi=C4=87?= Date: Sat, 14 Jun 2025 11:17:29 +0200 Subject: [PATCH 2/5] Refactor alphablit --- src_c/alphablit.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src_c/alphablit.c b/src_c/alphablit.c index 0276b813d3..80832af663 100644 --- a/src_c/alphablit.c +++ b/src_c/alphablit.c @@ -1189,16 +1189,16 @@ BLIT_BLEND_OP( /* --------------------------------------------------------- */ -#define SETUP_ALPHABLIT() \ - SETUP_BASE() \ - int dRi, dGi, dBi, dAi, sRi, sGi, sBi; \ +#define SETUP_ALPHABLIT() \ + SETUP_BASE() \ + Uint32 dRi, dGi, dBi, dAi, sRi, sGi, sBi; \ int alpha = info->src_blanket_alpha; static void alphablit_alpha(SDL_BlitInfo *info) { SETUP_ALPHABLIT() - int sAi; + Uint32 sAi; if (srcbpp == 1) { if (dstbpp == 1) { @@ -1292,7 +1292,7 @@ static void alphablit_colorkey(SDL_BlitInfo *info) { SETUP_ALPHABLIT() - int sAi; + Uint32 sAi; Uint32 colorkey = info->src_colorkey; assert(info->src_has_colorkey); From 58e4ead83084311c0a6044fb4f6444cf379898b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josip=20Komljenovi=C4=87?= Date: Sat, 14 Jun 2025 12:22:55 +0200 Subject: [PATCH 3/5] Refactor alphablit --- src_c/alphablit.c | 725 ++++++++++++++++++++++++---------------------- 1 file changed, 384 insertions(+), 341 deletions(-) diff --git a/src_c/alphablit.c b/src_c/alphablit.c index 80832af663..26211bf461 100644 --- a/src_c/alphablit.c +++ b/src_c/alphablit.c @@ -621,146 +621,165 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, /* --------------------------------------------------------- */ -#define BLIT_BLEND_RGBA_OP(operation, tmp_variable, blend_function, code) \ - static void blit_blend_rgba_##operation(SDL_BlitInfo *info) \ - { \ - SETUP_BLIT_BLEND(tmp_variable) \ - if (!dstppa) { \ - blit_blend_##operation(info); \ - return; \ - } \ - if (srcbpp == 4 && dstbpp == 4 && srcfmt->Rmask == dstfmt->Rmask && \ - srcfmt->Gmask == dstfmt->Gmask && \ - srcfmt->Bmask == dstfmt->Bmask && \ - srcfmt->Amask == dstfmt->Amask && \ - info->src_blend != SDL_BLENDMODE_NONE) { \ - int incr = srcpxskip > 0 ? 1 : -1; \ - if (incr < 0) { \ - src += 3; \ - dst += 3; \ - } \ - while (height--) { \ - LOOP_UNROLLED4( \ - { \ - REPEAT_4({ \ - code src += incr; \ - dst += incr; \ - }); \ - }, \ - n, width); \ - src += srcskip; \ - dst += dstskip; \ - } \ - return; \ - } \ - if (srcbpp == 1) { \ - if (dstbpp == 1) { \ - while (height--) { \ - LOOP_UNROLLED4( \ - { \ - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ - blend_function; \ - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, \ - dstfmt); \ - src += srcpxskip; \ - dst += dstpxskip; \ - }, \ - n, width); \ - src += srcskip; \ - dst += dstskip; \ - } \ - } \ - else /* dstbpp > 1 */ \ - { \ - while (height--) { \ - LOOP_UNROLLED4( \ - { \ - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ - GET_PIXEL(pixel, dstbpp, dst); \ - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, \ - dstpal, dstppa); \ - blend_function; \ - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, \ - dstfmt); \ - src += srcpxskip; \ - dst += dstpxskip; \ - }, \ - n, width); \ - src += srcskip; \ - dst += dstskip; \ - } \ - } \ - } \ - else /* srcbpp > 1 */ \ - { \ - if (dstbpp == 1) { \ - while (height--) { \ - LOOP_UNROLLED4( \ - { \ - GET_PIXEL(pixel, srcbpp, src); \ - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, \ - srcpal, srcppa); \ - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ - blend_function; \ - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, \ - dstfmt); \ - src += srcpxskip; \ - dst += dstpxskip; \ - }, \ - n, width); \ - src += srcskip; \ - dst += dstskip; \ - } \ - } \ - else /* dstbpp > 1 */ \ - { \ - while (height--) { \ - LOOP_UNROLLED4( \ - { \ - GET_PIXEL(pixel, srcbpp, src); \ - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, \ - srcpal, srcppa); \ - GET_PIXEL(pixel, dstbpp, dst); \ - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, \ - dstpal, dstppa); \ - blend_function; \ - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, \ - dstfmt); \ - src += srcpxskip; \ - dst += dstpxskip; \ - }, \ - n, width); \ - src += srcskip; \ - dst += dstskip; \ - } \ - } \ - } \ +#define BLIT_BLEND_RGBA_OP(operation, tmp_variable, blend_function, code) \ + SETUP_BLIT_BLEND(tmp_variable) \ + if (!dstppa) { \ + blit_blend_##operation(info); \ + return; \ + } \ + if (srcbpp == 4 && dstbpp == 4 && srcfmt->Rmask == dstfmt->Rmask && \ + srcfmt->Gmask == dstfmt->Gmask && srcfmt->Bmask == dstfmt->Bmask && \ + srcfmt->Amask == dstfmt->Amask && \ + info->src_blend != SDL_BLENDMODE_NONE) { \ + int incr = srcpxskip > 0 ? 1 : -1; \ + if (incr < 0) { \ + src += 3; \ + dst += 3; \ + } \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + REPEAT_4({ \ + code; \ + src += incr; \ + dst += incr; \ + }); \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + return; \ + } \ + if (srcbpp == 1) { \ + if (dstbpp == 1) { \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ + blend_function; \ + CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + } \ + else /* dstbpp > 1 */ \ + { \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ + GET_PIXEL(pixel, dstbpp, dst); \ + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, \ + dstppa); \ + blend_function; \ + CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + } \ + } \ + else /* srcbpp > 1 */ \ + { \ + if (dstbpp == 1) { \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXEL(pixel, srcbpp, src); \ + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, \ + srcppa); \ + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ + blend_function; \ + CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + } \ + else /* dstbpp > 1 */ \ + { \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXEL(pixel, srcbpp, src); \ + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, \ + srcppa); \ + GET_PIXEL(pixel, dstbpp, dst); \ + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, \ + dstppa); \ + blend_function; \ + CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + } \ } -BLIT_BLEND_RGBA_OP(add, Uint32 tmp, - BLEND_RGBA_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA), - tmp = (*dst) + (*src); - (*dst) = (tmp <= 255 ? tmp : 255);); +static void +blit_blend_rgba_add(SDL_BlitInfo *info) +{ + BLIT_BLEND_RGBA_OP(add, Uint32 tmp, + BLEND_RGBA_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA), { + tmp = (*dst) + (*src); + (*dst) = (tmp <= 255 ? tmp : 255); + }); +} -BLIT_BLEND_RGBA_OP(sub, Sint32 tmp, - BLEND_RGBA_SUB(tmp, sR, sG, sB, sA, dR, dG, dB, dA), - tmp = (*dst) - (*src); - (*dst) = (tmp >= 0 ? tmp : 0);); +static void +blit_blend_rgba_sub(SDL_BlitInfo *info) +{ + BLIT_BLEND_RGBA_OP(sub, Sint32 tmp, + BLEND_RGBA_SUB(tmp, sR, sG, sB, sA, dR, dG, dB, dA), { + tmp = (*dst) - (*src); + (*dst) = (tmp >= 0 ? tmp : 0); + }); +} -BLIT_BLEND_RGBA_OP(mul, Uint32 tmp, - BLEND_RGBA_MULT(sR, sG, sB, sA, dR, dG, dB, dA), - tmp = ((*dst) && (*src)) ? (((*dst) * (*src)) + 255) >> 8 - : 0; - (*dst) = (tmp <= 255 ? tmp : 255);); +static void +blit_blend_rgba_mul(SDL_BlitInfo *info) +{ + BLIT_BLEND_RGBA_OP( + mul, Sint32 tmp, BLEND_RGBA_MULT(sR, sG, sB, sA, dR, dG, dB, dA), { + tmp = ((*dst) && (*src)) ? (((*dst) * (*src)) + 255) >> 8 : 0; + (*dst) = (tmp <= 255 ? tmp : 255); + }); +} -BLIT_BLEND_RGBA_OP( - min, , BLEND_RGBA_MIN(sR, sG, sB, sA, dR, dG, dB, dA), - if ((*src) < (*dst)) { (*dst) = (*src); }); +static void +blit_blend_rgba_min(SDL_BlitInfo *info) +{ + BLIT_BLEND_RGBA_OP(min, , BLEND_RGBA_MIN(sR, sG, sB, sA, dR, dG, dB, dA), { + if ((*src) < (*dst)) { + (*dst) = (*src); + } + }); +} -BLIT_BLEND_RGBA_OP( - max, , BLEND_RGBA_MAX(sR, sG, sB, sA, dR, dG, dB, dA), - if ((*src) > (*dst)) { (*dst) = (*src); }); +static void +blit_blend_rgba_max(SDL_BlitInfo *info) +{ + BLIT_BLEND_RGBA_OP(max, , BLEND_RGBA_MAX(sR, sG, sB, sA, dR, dG, dB, dA), { + if ((*src) > (*dst)) { + (*dst) = (*src); + } + }); +} static void blit_blend_premultiplied(SDL_BlitInfo *info) @@ -956,236 +975,260 @@ blit_blend_premultiplied(SDL_BlitInfo *info) /* --------------------------------------------------------- */ #define BLIT_BLEND_OP(operation, tmp_variable, blend_function, code) \ - static void blit_blend_##operation(SDL_BlitInfo *info) \ - { \ - int n; \ - int width = info->width; \ - int height = info->height; \ - Uint8 *src = info->s_pixels; \ - int srcpxskip = info->s_pxskip; \ - int srcskip = info->s_skip; \ - Uint8 *dst = info->d_pixels; \ - int dstpxskip = info->d_pxskip; \ - int dstskip = info->d_skip; \ - PG_PixelFormat *srcfmt = info->src; \ - SDL_Palette *srcpal = info->src_palette; \ - PG_PixelFormat *dstfmt = info->dst; \ - SDL_Palette *dstpal = info->dst_palette; \ - int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); \ - int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); \ - Uint8 dR, dG, dB, dA, sR, sG, sB, sA; \ - Uint32 pixel; \ - tmp_variable; \ - int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; \ - int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; \ - if (srcbpp >= 3 && dstbpp >= 3 && \ - info->src_blend == SDL_BLENDMODE_NONE) { \ - size_t srcoffsetR, srcoffsetG, srcoffsetB; \ - size_t dstoffsetR, dstoffsetG, dstoffsetB; \ - if (srcbpp == 3) { \ - SET_OFFSETS_24(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); \ - } \ - else { \ - SET_OFFSETS_32(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); \ - } \ - if (dstbpp == 3) { \ - SET_OFFSETS_24(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); \ - } \ - else { \ - SET_OFFSETS_32(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); \ + int n; \ + int width = info->width; \ + int height = info->height; \ + Uint8 *src = info->s_pixels; \ + int srcpxskip = info->s_pxskip; \ + int srcskip = info->s_skip; \ + Uint8 *dst = info->d_pixels; \ + int dstpxskip = info->d_pxskip; \ + int dstskip = info->d_skip; \ + PG_PixelFormat *srcfmt = info->src; \ + SDL_Palette *srcpal = info->src_palette; \ + PG_PixelFormat *dstfmt = info->dst; \ + SDL_Palette *dstpal = info->dst_palette; \ + int srcbpp = PG_FORMAT_BytesPerPixel(srcfmt); \ + int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); \ + Uint8 dR, dG, dB, dA, sR, sG, sB, sA; \ + Uint32 pixel; \ + tmp_variable; \ + int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; \ + int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; \ + if (srcbpp >= 3 && dstbpp >= 3 && \ + info->src_blend == SDL_BLENDMODE_NONE) { \ + size_t srcoffsetR, srcoffsetG, srcoffsetB; \ + size_t dstoffsetR, dstoffsetG, dstoffsetB; \ + if (srcbpp == 3) { \ + SET_OFFSETS_24(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); \ + } \ + else { \ + SET_OFFSETS_32(srcoffsetR, srcoffsetG, srcoffsetB, srcfmt); \ + } \ + if (dstbpp == 3) { \ + SET_OFFSETS_24(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); \ + } \ + else { \ + SET_OFFSETS_32(dstoffsetR, dstoffsetG, dstoffsetB, dstfmt); \ + } \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + code; \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ + } \ + return; \ + } \ + if (srcbpp == 1) { \ + if (dstbpp == 1) { \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ + blend_function; \ + SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ } \ + } \ + else if (dstbpp == 3) { \ + size_t offsetR, offsetG, offsetB; \ + SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); \ while (height--) { \ LOOP_UNROLLED4( \ { \ - code src += srcpxskip; \ + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ + GET_PIXEL(pixel, dstbpp, dst); \ + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, \ + dstppa); \ + blend_function; \ + dst[offsetR] = dR; \ + dst[offsetG] = dG; \ + dst[offsetB] = dB; \ + src += srcpxskip; \ dst += dstpxskip; \ }, \ n, width); \ src += srcskip; \ dst += dstskip; \ } \ - return; \ } \ - if (srcbpp == 1) { \ - if (dstbpp == 1) { \ - while (height--) { \ - LOOP_UNROLLED4( \ - { \ - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ - blend_function; \ - SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, \ - dA); \ - src += srcpxskip; \ - dst += dstpxskip; \ - }, \ - n, width); \ - src += srcskip; \ - dst += dstskip; \ - } \ + else /* even dstbpp */ \ + { \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ + GET_PIXEL(pixel, dstbpp, dst); \ + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, \ + dstppa); \ + blend_function; \ + CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ } \ - else if (dstbpp == 3) { \ - size_t offsetR, offsetG, offsetB; \ - SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); \ - while (height--) { \ - LOOP_UNROLLED4( \ - { \ - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ - GET_PIXEL(pixel, dstbpp, dst); \ - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, \ - dstpal, dstppa); \ - blend_function; \ - dst[offsetR] = dR; \ - dst[offsetG] = dG; \ - dst[offsetB] = dB; \ - src += srcpxskip; \ - dst += dstpxskip; \ - }, \ - n, width); \ - src += srcskip; \ - dst += dstskip; \ - } \ + } \ + } \ + else /* srcbpp > 1 */ \ + { \ + if (dstbpp == 1) { \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXEL(pixel, srcbpp, src); \ + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, \ + srcppa); \ + GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ + blend_function; \ + SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ } \ - else /* even dstbpp */ \ - { \ - while (height--) { \ - LOOP_UNROLLED4( \ - { \ - GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ - GET_PIXEL(pixel, dstbpp, dst); \ - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, \ - dstpal, dstppa); \ - blend_function; \ - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, \ - dstfmt); \ - src += srcpxskip; \ - dst += dstpxskip; \ - }, \ - n, width); \ - src += srcskip; \ - dst += dstskip; \ - } \ + } \ + else if (dstbpp == 3) { \ + size_t offsetR, offsetG, offsetB; \ + SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXEL(pixel, srcbpp, src); \ + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, \ + srcppa); \ + GET_PIXEL(pixel, dstbpp, dst); \ + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, \ + dstppa); \ + blend_function; \ + dst[offsetR] = dR; \ + dst[offsetG] = dG; \ + dst[offsetB] = dB; \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ } \ } \ - else /* srcbpp > 1 */ \ + else /* even dstbpp */ \ { \ - if (dstbpp == 1) { \ - while (height--) { \ - LOOP_UNROLLED4( \ - { \ - GET_PIXEL(pixel, srcbpp, src); \ - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, \ - srcpal, srcppa); \ - GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ - blend_function; \ - SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, \ - dA); \ - src += srcpxskip; \ - dst += dstpxskip; \ - }, \ - n, width); \ - src += srcskip; \ - dst += dstskip; \ - } \ - } \ - else if (dstbpp == 3) { \ - size_t offsetR, offsetG, offsetB; \ - SET_OFFSETS_24(offsetR, offsetG, offsetB, dstfmt); \ - while (height--) { \ - LOOP_UNROLLED4( \ - { \ - GET_PIXEL(pixel, srcbpp, src); \ - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, \ - srcpal, srcppa); \ - GET_PIXEL(pixel, dstbpp, dst); \ - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, \ - dstpal, dstppa); \ - blend_function; \ - dst[offsetR] = dR; \ - dst[offsetG] = dG; \ - dst[offsetB] = dB; \ - src += srcpxskip; \ - dst += dstpxskip; \ - }, \ - n, width); \ - src += srcskip; \ - dst += dstskip; \ - } \ - } \ - else /* even dstbpp */ \ - { \ - while (height--) { \ - LOOP_UNROLLED4( \ - { \ - GET_PIXEL(pixel, srcbpp, src); \ - GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, \ - srcpal, srcppa); \ - GET_PIXEL(pixel, dstbpp, dst); \ - GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, \ - dstpal, dstppa); \ - blend_function; \ - CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, \ - dstfmt); \ - src += srcpxskip; \ - dst += dstpxskip; \ - }, \ - n, width); \ - src += srcskip; \ - dst += dstskip; \ - } \ + while (height--) { \ + LOOP_UNROLLED4( \ + { \ + GET_PIXEL(pixel, srcbpp, src); \ + GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, \ + srcppa); \ + GET_PIXEL(pixel, dstbpp, dst); \ + GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, \ + dstppa); \ + blend_function; \ + CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); \ + src += srcpxskip; \ + dst += dstpxskip; \ + }, \ + n, width); \ + src += srcskip; \ + dst += dstskip; \ } \ } \ } -BLIT_BLEND_OP(add, Uint32 tmp, BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA), - tmp = dst[dstoffsetR] + src[srcoffsetR]; - dst[dstoffsetR] = (tmp <= 255 ? tmp : 255); - tmp = dst[dstoffsetG] + src[srcoffsetG]; - dst[dstoffsetG] = (tmp <= 255 ? tmp : 255); - tmp = dst[dstoffsetB] + src[srcoffsetB]; - dst[dstoffsetB] = (tmp <= 255 ? tmp : 255);); - -BLIT_BLEND_OP(sub, Sint32 tmp, BLEND_SUB(tmp, sR, sG, sB, sA, dR, dG, dB, dA), - tmp = dst[dstoffsetR] - src[srcoffsetR]; - dst[dstoffsetR] = (tmp >= 0 ? tmp : 0); - tmp = dst[dstoffsetG] - src[srcoffsetG]; - dst[dstoffsetG] = (tmp >= 0 ? tmp : 0); - tmp = dst[dstoffsetB] - src[srcoffsetB]; - dst[dstoffsetB] = (tmp >= 0 ? tmp : 0);); - -BLIT_BLEND_OP(mul, Uint32 tmp, BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA), - tmp = ((dst[dstoffsetR] && src[srcoffsetR]) - ? ((dst[dstoffsetR] * src[srcoffsetR]) + 255) >> 8 - : 0); - dst[dstoffsetR] = (tmp <= 255 ? tmp : 255); - tmp = ((dst[dstoffsetG] && src[srcoffsetG]) - ? ((dst[dstoffsetG] * src[srcoffsetG]) + 255) >> 8 - : 0); - dst[dstoffsetG] = (tmp <= 255 ? tmp : 255); - tmp = ((dst[dstoffsetB] && src[srcoffsetB]) - ? ((dst[dstoffsetB] * src[srcoffsetB]) + 255) >> 8 - : 0); - dst[dstoffsetB] = (tmp <= 255 ? tmp : 255);); - -BLIT_BLEND_OP( - min, , BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA), - if (src[srcoffsetR] < dst[dstoffsetR]) { - dst[dstoffsetR] = src[srcoffsetR]; - } if (src[srcoffsetG] < dst[dstoffsetG]) { - dst[dstoffsetG] = src[srcoffsetG]; - } if (src[srcoffsetB] < dst[dstoffsetB]) { - dst[dstoffsetB] = src[srcoffsetB]; +static void +blit_blend_add(SDL_BlitInfo *info) +{ + BLIT_BLEND_OP(add, Uint32 tmp, + BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA), { + tmp = dst[dstoffsetR] + src[srcoffsetR]; + dst[dstoffsetR] = (tmp <= 255 ? tmp : 255); + tmp = dst[dstoffsetG] + src[srcoffsetG]; + dst[dstoffsetG] = (tmp <= 255 ? tmp : 255); + tmp = dst[dstoffsetB] + src[srcoffsetB]; + dst[dstoffsetB] = (tmp <= 255 ? tmp : 255); + }); +} + +static void +blit_blend_sub(SDL_BlitInfo *info) +{ + BLIT_BLEND_OP(sub, Sint32 tmp, + BLEND_SUB(tmp, sR, sG, sB, sA, dR, dG, dB, dA), { + tmp = dst[dstoffsetR] - src[srcoffsetR]; + dst[dstoffsetR] = (tmp >= 0 ? tmp : 0); + tmp = dst[dstoffsetG] - src[srcoffsetG]; + dst[dstoffsetG] = (tmp >= 0 ? tmp : 0); + tmp = dst[dstoffsetB] - src[srcoffsetB]; + dst[dstoffsetB] = (tmp >= 0 ? tmp : 0); + }); +} + +static void +blit_blend_mul(SDL_BlitInfo *info) +{ + BLIT_BLEND_OP( + mul, Sint32 tmp, BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA), { + tmp = ((dst[dstoffsetR] && src[srcoffsetR]) + ? ((dst[dstoffsetR] * src[srcoffsetR]) + 255) >> 8 + : 0); + dst[dstoffsetR] = (tmp <= 255 ? tmp : 255); + tmp = ((dst[dstoffsetG] && src[srcoffsetG]) + ? ((dst[dstoffsetG] * src[srcoffsetG]) + 255) >> 8 + : 0); + dst[dstoffsetG] = (tmp <= 255 ? tmp : 255); + tmp = ((dst[dstoffsetB] && src[srcoffsetB]) + ? ((dst[dstoffsetB] * src[srcoffsetB]) + 255) >> 8 + : 0); + dst[dstoffsetB] = (tmp <= 255 ? tmp : 255); + }); +} + +static void +blit_blend_min(SDL_BlitInfo *info) +{ + BLIT_BLEND_OP(min, , BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA), { + if (src[srcoffsetR] < dst[dstoffsetR]) { + dst[dstoffsetR] = src[srcoffsetR]; + } + if (src[srcoffsetG] < dst[dstoffsetG]) { + dst[dstoffsetG] = src[srcoffsetG]; + } + if (src[srcoffsetB] < dst[dstoffsetB]) { + dst[dstoffsetB] = src[srcoffsetB]; + } }); +} -BLIT_BLEND_OP( - max, , BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA), - if (src[srcoffsetR] > dst[dstoffsetR]) { - dst[dstoffsetR] = src[srcoffsetR]; - } if (src[srcoffsetG] > dst[dstoffsetG]) { - dst[dstoffsetG] = src[srcoffsetG]; - } if (src[srcoffsetB] > dst[dstoffsetB]) { - dst[dstoffsetB] = src[srcoffsetB]; +static void +blit_blend_max(SDL_BlitInfo *info) +{ + BLIT_BLEND_OP(min, , BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA), { + if (src[srcoffsetR] > dst[dstoffsetR]) { + dst[dstoffsetR] = src[srcoffsetR]; + } + if (src[srcoffsetG] > dst[dstoffsetG]) { + dst[dstoffsetG] = src[srcoffsetG]; + } + if (src[srcoffsetB] > dst[dstoffsetB]) { + dst[dstoffsetB] = src[srcoffsetB]; + } }); +} /* --------------------------------------------------------- */ From 9e95ede97b71f263a70e51ec58f17e0c9b19ad74 Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sun, 15 Jun 2025 17:51:04 -0700 Subject: [PATCH 4/5] Simplify alphablit.c macros --- src_c/alphablit.c | 116 +++++++++++++++++++++++----------------------- 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/src_c/alphablit.c b/src_c/alphablit.c index 26211bf461..d1e2b82709 100644 --- a/src_c/alphablit.c +++ b/src_c/alphablit.c @@ -594,7 +594,7 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, /* --------------------------------------------------------- */ -#define SETUP_BASE() \ +#define SETUP_BASE \ int n; \ int width = info->width; \ int height = info->height; \ @@ -613,16 +613,15 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, Uint8 dR, dG, dB, dA, sR, sG, sB, sA; \ Uint32 pixel; -#define SETUP_BLIT_BLEND(...) \ - SETUP_BASE() \ - __VA_ARGS__; \ +#define SETUP_BLIT_BLEND \ + SETUP_BASE \ int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; \ int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; /* --------------------------------------------------------- */ -#define BLIT_BLEND_RGBA_OP(operation, tmp_variable, blend_function, code) \ - SETUP_BLIT_BLEND(tmp_variable) \ +#define BLIT_BLEND_RGBA_OP(operation, blend_function, code) \ + SETUP_BLIT_BLEND \ if (!dstppa) { \ blit_blend_##operation(info); \ return; \ @@ -734,7 +733,8 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, static void blit_blend_rgba_add(SDL_BlitInfo *info) { - BLIT_BLEND_RGBA_OP(add, Uint32 tmp, + Uint32 tmp; + BLIT_BLEND_RGBA_OP(add, BLEND_RGBA_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA), { tmp = (*dst) + (*src); (*dst) = (tmp <= 255 ? tmp : 255); @@ -744,7 +744,8 @@ blit_blend_rgba_add(SDL_BlitInfo *info) static void blit_blend_rgba_sub(SDL_BlitInfo *info) { - BLIT_BLEND_RGBA_OP(sub, Sint32 tmp, + Sint32 tmp; + BLIT_BLEND_RGBA_OP(sub, BLEND_RGBA_SUB(tmp, sR, sG, sB, sA, dR, dG, dB, dA), { tmp = (*dst) - (*src); (*dst) = (tmp >= 0 ? tmp : 0); @@ -754,17 +755,17 @@ blit_blend_rgba_sub(SDL_BlitInfo *info) static void blit_blend_rgba_mul(SDL_BlitInfo *info) { - BLIT_BLEND_RGBA_OP( - mul, Sint32 tmp, BLEND_RGBA_MULT(sR, sG, sB, sA, dR, dG, dB, dA), { - tmp = ((*dst) && (*src)) ? (((*dst) * (*src)) + 255) >> 8 : 0; - (*dst) = (tmp <= 255 ? tmp : 255); - }); + Sint32 tmp; + BLIT_BLEND_RGBA_OP(mul, BLEND_RGBA_MULT(sR, sG, sB, sA, dR, dG, dB, dA), { + tmp = ((*dst) && (*src)) ? (((*dst) * (*src)) + 255) >> 8 : 0; + (*dst) = (tmp <= 255 ? tmp : 255); + }); } static void blit_blend_rgba_min(SDL_BlitInfo *info) { - BLIT_BLEND_RGBA_OP(min, , BLEND_RGBA_MIN(sR, sG, sB, sA, dR, dG, dB, dA), { + BLIT_BLEND_RGBA_OP(min, BLEND_RGBA_MIN(sR, sG, sB, sA, dR, dG, dB, dA), { if ((*src) < (*dst)) { (*dst) = (*src); } @@ -774,7 +775,7 @@ blit_blend_rgba_min(SDL_BlitInfo *info) static void blit_blend_rgba_max(SDL_BlitInfo *info) { - BLIT_BLEND_RGBA_OP(max, , BLEND_RGBA_MAX(sR, sG, sB, sA, dR, dG, dB, dA), { + BLIT_BLEND_RGBA_OP(max, BLEND_RGBA_MAX(sR, sG, sB, sA, dR, dG, dB, dA), { if ((*src) > (*dst)) { (*dst) = (*src); } @@ -784,7 +785,7 @@ blit_blend_rgba_max(SDL_BlitInfo *info) static void blit_blend_premultiplied(SDL_BlitInfo *info) { - SETUP_BLIT_BLEND() + SETUP_BLIT_BLEND if (srcbpp >= 3 && dstbpp >= 3 && info->src_blend == SDL_BLENDMODE_NONE) { size_t srcoffsetR, srcoffsetG, srcoffsetB; size_t dstoffsetR, dstoffsetG, dstoffsetB; @@ -974,7 +975,7 @@ blit_blend_premultiplied(SDL_BlitInfo *info) /* --------------------------------------------------------- */ -#define BLIT_BLEND_OP(operation, tmp_variable, blend_function, code) \ +#define BLIT_BLEND_OP(blend_function, code) \ int n; \ int width = info->width; \ int height = info->height; \ @@ -992,7 +993,6 @@ blit_blend_premultiplied(SDL_BlitInfo *info) int dstbpp = PG_FORMAT_BytesPerPixel(dstfmt); \ Uint8 dR, dG, dB, dA, sR, sG, sB, sA; \ Uint32 pixel; \ - tmp_variable; \ int srcppa = info->src_blend != SDL_BLENDMODE_NONE && srcfmt->Amask; \ int dstppa = info->dst_blend != SDL_BLENDMODE_NONE && dstfmt->Amask; \ if (srcbpp >= 3 && dstbpp >= 3 && \ @@ -1153,55 +1153,55 @@ blit_blend_premultiplied(SDL_BlitInfo *info) static void blit_blend_add(SDL_BlitInfo *info) { - BLIT_BLEND_OP(add, Uint32 tmp, - BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA), { - tmp = dst[dstoffsetR] + src[srcoffsetR]; - dst[dstoffsetR] = (tmp <= 255 ? tmp : 255); - tmp = dst[dstoffsetG] + src[srcoffsetG]; - dst[dstoffsetG] = (tmp <= 255 ? tmp : 255); - tmp = dst[dstoffsetB] + src[srcoffsetB]; - dst[dstoffsetB] = (tmp <= 255 ? tmp : 255); - }); + Uint32 tmp; + BLIT_BLEND_OP(BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA), { + tmp = dst[dstoffsetR] + src[srcoffsetR]; + dst[dstoffsetR] = (tmp <= 255 ? tmp : 255); + tmp = dst[dstoffsetG] + src[srcoffsetG]; + dst[dstoffsetG] = (tmp <= 255 ? tmp : 255); + tmp = dst[dstoffsetB] + src[srcoffsetB]; + dst[dstoffsetB] = (tmp <= 255 ? tmp : 255); + }); } static void blit_blend_sub(SDL_BlitInfo *info) { - BLIT_BLEND_OP(sub, Sint32 tmp, - BLEND_SUB(tmp, sR, sG, sB, sA, dR, dG, dB, dA), { - tmp = dst[dstoffsetR] - src[srcoffsetR]; - dst[dstoffsetR] = (tmp >= 0 ? tmp : 0); - tmp = dst[dstoffsetG] - src[srcoffsetG]; - dst[dstoffsetG] = (tmp >= 0 ? tmp : 0); - tmp = dst[dstoffsetB] - src[srcoffsetB]; - dst[dstoffsetB] = (tmp >= 0 ? tmp : 0); - }); + Sint32 tmp; + BLIT_BLEND_OP(BLEND_SUB(tmp, sR, sG, sB, sA, dR, dG, dB, dA), { + tmp = dst[dstoffsetR] - src[srcoffsetR]; + dst[dstoffsetR] = (tmp >= 0 ? tmp : 0); + tmp = dst[dstoffsetG] - src[srcoffsetG]; + dst[dstoffsetG] = (tmp >= 0 ? tmp : 0); + tmp = dst[dstoffsetB] - src[srcoffsetB]; + dst[dstoffsetB] = (tmp >= 0 ? tmp : 0); + }); } static void blit_blend_mul(SDL_BlitInfo *info) { - BLIT_BLEND_OP( - mul, Sint32 tmp, BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA), { - tmp = ((dst[dstoffsetR] && src[srcoffsetR]) - ? ((dst[dstoffsetR] * src[srcoffsetR]) + 255) >> 8 - : 0); - dst[dstoffsetR] = (tmp <= 255 ? tmp : 255); - tmp = ((dst[dstoffsetG] && src[srcoffsetG]) - ? ((dst[dstoffsetG] * src[srcoffsetG]) + 255) >> 8 - : 0); - dst[dstoffsetG] = (tmp <= 255 ? tmp : 255); - tmp = ((dst[dstoffsetB] && src[srcoffsetB]) - ? ((dst[dstoffsetB] * src[srcoffsetB]) + 255) >> 8 - : 0); - dst[dstoffsetB] = (tmp <= 255 ? tmp : 255); - }); + Sint32 tmp; + BLIT_BLEND_OP(BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA), { + tmp = ((dst[dstoffsetR] && src[srcoffsetR]) + ? ((dst[dstoffsetR] * src[srcoffsetR]) + 255) >> 8 + : 0); + dst[dstoffsetR] = (tmp <= 255 ? tmp : 255); + tmp = ((dst[dstoffsetG] && src[srcoffsetG]) + ? ((dst[dstoffsetG] * src[srcoffsetG]) + 255) >> 8 + : 0); + dst[dstoffsetG] = (tmp <= 255 ? tmp : 255); + tmp = ((dst[dstoffsetB] && src[srcoffsetB]) + ? ((dst[dstoffsetB] * src[srcoffsetB]) + 255) >> 8 + : 0); + dst[dstoffsetB] = (tmp <= 255 ? tmp : 255); + }); } static void blit_blend_min(SDL_BlitInfo *info) { - BLIT_BLEND_OP(min, , BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA), { + BLIT_BLEND_OP(BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA), { if (src[srcoffsetR] < dst[dstoffsetR]) { dst[dstoffsetR] = src[srcoffsetR]; } @@ -1217,7 +1217,7 @@ blit_blend_min(SDL_BlitInfo *info) static void blit_blend_max(SDL_BlitInfo *info) { - BLIT_BLEND_OP(min, , BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA), { + BLIT_BLEND_OP(BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA), { if (src[srcoffsetR] > dst[dstoffsetR]) { dst[dstoffsetR] = src[srcoffsetR]; } @@ -1232,15 +1232,15 @@ blit_blend_max(SDL_BlitInfo *info) /* --------------------------------------------------------- */ -#define SETUP_ALPHABLIT() \ - SETUP_BASE() \ +#define SETUP_ALPHABLIT \ + SETUP_BASE \ Uint32 dRi, dGi, dBi, dAi, sRi, sGi, sBi; \ int alpha = info->src_blanket_alpha; static void alphablit_alpha(SDL_BlitInfo *info) { - SETUP_ALPHABLIT() + SETUP_ALPHABLIT Uint32 sAi; if (srcbpp == 1) { @@ -1334,7 +1334,7 @@ alphablit_alpha(SDL_BlitInfo *info) static void alphablit_colorkey(SDL_BlitInfo *info) { - SETUP_ALPHABLIT() + SETUP_ALPHABLIT Uint32 sAi; Uint32 colorkey = info->src_colorkey; @@ -1463,7 +1463,7 @@ alphablit_colorkey(SDL_BlitInfo *info) static void alphablit_solid(SDL_BlitInfo *info) { - SETUP_ALPHABLIT() + SETUP_ALPHABLIT if (srcbpp == 1) { if (dstbpp == 1) { From 4bbeccf19f78651d04add3cce97f2bf0bd43d57f Mon Sep 17 00:00:00 2001 From: Starbuck5 <46412508+Starbuck5@users.noreply.github.com> Date: Sun, 15 Jun 2025 18:44:44 -0700 Subject: [PATCH 5/5] Rename alphablit.c macro args --- src_c/alphablit.c | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src_c/alphablit.c b/src_c/alphablit.c index d1e2b82709..c8e4ba67c5 100644 --- a/src_c/alphablit.c +++ b/src_c/alphablit.c @@ -620,7 +620,8 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, /* --------------------------------------------------------- */ -#define BLIT_BLEND_RGBA_OP(operation, blend_function, code) \ +#define BLIT_BLEND_RGBA_OP(operation, BLEND_CODE, \ + BLEND_CODE_32BIT_SPECIALIZED) \ SETUP_BLIT_BLEND \ if (!dstppa) { \ blit_blend_##operation(info); \ @@ -639,7 +640,7 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, LOOP_UNROLLED4( \ { \ REPEAT_4({ \ - code; \ + BLEND_CODE_32BIT_SPECIALIZED \ src += incr; \ dst += incr; \ }); \ @@ -657,7 +658,7 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, { \ GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ - blend_function; \ + BLEND_CODE \ CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); \ src += srcpxskip; \ dst += dstpxskip; \ @@ -676,7 +677,7 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, GET_PIXEL(pixel, dstbpp, dst); \ GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, \ dstppa); \ - blend_function; \ + BLEND_CODE \ CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); \ src += srcpxskip; \ dst += dstpxskip; \ @@ -697,7 +698,7 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, \ srcppa); \ GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ - blend_function; \ + BLEND_CODE \ CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); \ src += srcpxskip; \ dst += dstpxskip; \ @@ -718,7 +719,7 @@ SoftBlitPyGame(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, GET_PIXEL(pixel, dstbpp, dst); \ GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, \ dstppa); \ - blend_function; \ + BLEND_CODE \ CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); \ src += srcpxskip; \ dst += dstpxskip; \ @@ -975,7 +976,7 @@ blit_blend_premultiplied(SDL_BlitInfo *info) /* --------------------------------------------------------- */ -#define BLIT_BLEND_OP(blend_function, code) \ +#define BLIT_BLEND_OP(BLEND_CODE, BLEND_CODE_32BIT_SPECIALIZED) \ int n; \ int width = info->width; \ int height = info->height; \ @@ -1014,7 +1015,7 @@ blit_blend_premultiplied(SDL_BlitInfo *info) while (height--) { \ LOOP_UNROLLED4( \ { \ - code; \ + BLEND_CODE_32BIT_SPECIALIZED \ src += srcpxskip; \ dst += dstpxskip; \ }, \ @@ -1031,7 +1032,7 @@ blit_blend_premultiplied(SDL_BlitInfo *info) { \ GET_PIXELVALS_1(sR, sG, sB, sA, src, srcpal); \ GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ - blend_function; \ + BLEND_CODE \ SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); \ src += srcpxskip; \ dst += dstpxskip; \ @@ -1051,7 +1052,7 @@ blit_blend_premultiplied(SDL_BlitInfo *info) GET_PIXEL(pixel, dstbpp, dst); \ GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, \ dstppa); \ - blend_function; \ + BLEND_CODE \ dst[offsetR] = dR; \ dst[offsetG] = dG; \ dst[offsetB] = dB; \ @@ -1072,7 +1073,7 @@ blit_blend_premultiplied(SDL_BlitInfo *info) GET_PIXEL(pixel, dstbpp, dst); \ GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, \ dstppa); \ - blend_function; \ + BLEND_CODE \ CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); \ src += srcpxskip; \ dst += dstpxskip; \ @@ -1093,7 +1094,7 @@ blit_blend_premultiplied(SDL_BlitInfo *info) GET_PIXELVALS(sR, sG, sB, sA, pixel, srcfmt, srcpal, \ srcppa); \ GET_PIXELVALS_1(dR, dG, dB, dA, dst, dstpal); \ - blend_function; \ + BLEND_CODE \ SET_PIXELVAL(dst, dstfmt, dstpal, dR, dG, dB, dA); \ src += srcpxskip; \ dst += dstpxskip; \ @@ -1115,7 +1116,7 @@ blit_blend_premultiplied(SDL_BlitInfo *info) GET_PIXEL(pixel, dstbpp, dst); \ GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, \ dstppa); \ - blend_function; \ + BLEND_CODE \ dst[offsetR] = dR; \ dst[offsetG] = dG; \ dst[offsetB] = dB; \ @@ -1138,7 +1139,7 @@ blit_blend_premultiplied(SDL_BlitInfo *info) GET_PIXEL(pixel, dstbpp, dst); \ GET_PIXELVALS(dR, dG, dB, dA, pixel, dstfmt, dstpal, \ dstppa); \ - blend_function; \ + BLEND_CODE \ CREATE_PIXEL(dst, dR, dG, dB, dA, dstbpp, dstfmt); \ src += srcpxskip; \ dst += dstpxskip; \