| /* DO NOT EDIT! This file is generated by sdlgenblit.pl */ |
| /* |
| Simple DirectMedia Layer |
| Copyright (C) 1997-2023 Sam Lantinga <slouken@libsdl.org> |
| |
| This software is provided 'as-is', without any express or implied |
| warranty. In no event will the authors be held liable for any damages |
| arising from the use of this software. |
| |
| Permission is granted to anyone to use this software for any purpose, |
| including commercial applications, and to alter it and redistribute it |
| freely, subject to the following restrictions: |
| |
| 1. The origin of this software must not be misrepresented; you must not |
| claim that you wrote the original software. If you use this software |
| in a product, an acknowledgment in the product documentation would be |
| appreciated but is not required. |
| 2. Altered source versions must be plainly marked as such, and must not be |
| misrepresented as being the original software. |
| 3. This notice may not be removed or altered from any source distribution. |
| */ |
| #include "../SDL_internal.h" |
| |
| #if SDL_HAVE_BLIT_AUTO |
| |
| /* *INDENT-OFF* */ /* clang-format off */ |
| |
| #include "SDL_video.h" |
| #include "SDL_blit.h" |
| #include "SDL_blit_auto.h" |
| |
| static void SDL_Blit_RGB888_RGB888_Scale(SDL_BlitInfo *info) |
| { |
| int srcy, srcx; |
| Uint32 posy, posx; |
| int incy, incx; |
| |
| incy = (info->src_h << 16) / info->dst_h; |
| incx = (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_RGB888_RGB888_Blend(SDL_BlitInfo *info) |
| { |
| const int flags = info->flags; |
| Uint32 srcpixel; |
| Uint32 srcR, srcG, srcB; |
| Uint32 dstpixel; |
| Uint32 dstR, dstG, dstB; |
| |
| 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; |
| 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)) { |
| case SDL_COPY_BLEND: |
| dstR = srcR; |
| dstG = srcG; |
| dstB = srcB; |
| break; |
| case SDL_COPY_ADD: |
| 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: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| case SDL_COPY_MUL: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| } |
| dstpixel = (dstR << 16) | (dstG << 8) | dstB; |
| *dst = dstpixel; |
| ++src; |
| ++dst; |
| } |
| info->src += info->src_pitch; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_RGB888_RGB888_Blend_Scale(SDL_BlitInfo *info) |
| { |
| const int flags = info->flags; |
| Uint32 srcpixel; |
| Uint32 srcR, srcG, srcB; |
| Uint32 dstpixel; |
| Uint32 dstR, dstG, dstB; |
| int srcy, srcx; |
| Uint32 posy, posx; |
| int incy, incx; |
| |
| incy = (info->src_h << 16) / info->dst_h; |
| incx = (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; |
| 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)) { |
| case SDL_COPY_BLEND: |
| dstR = srcR; |
| dstG = srcG; |
| dstB = srcB; |
| break; |
| case SDL_COPY_ADD: |
| 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: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| case SDL_COPY_MUL: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| } |
| dstpixel = (dstR << 16) | (dstG << 8) | dstB; |
| *dst = dstpixel; |
| posx += incx; |
| ++dst; |
| } |
| posy += incy; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_RGB888_RGB888_Modulate(SDL_BlitInfo *info) |
| { |
| const int flags = info->flags; |
| const Uint32 modulateR = info->r; |
| const Uint32 modulateG = info->g; |
| const Uint32 modulateB = info->b; |
| Uint32 pixel; |
| 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) { |
| R = (R * modulateR) / 255; |
| G = (G * modulateG) / 255; |
| B = (B * modulateB) / 255; |
| } |
| pixel = (R << 16) | (G << 8) | B; |
| *dst = pixel; |
| ++src; |
| ++dst; |
| } |
| info->src += info->src_pitch; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_RGB888_RGB888_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; |
| Uint32 pixel; |
| Uint32 R, G, B; |
| int srcy, srcx; |
| Uint32 posy, posx; |
| int incy, incx; |
| |
| incy = (info->src_h << 16) / info->dst_h; |
| incx = (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) { |
| R = (R * modulateR) / 255; |
| G = (G * modulateG) / 255; |
| B = (B * modulateB) / 255; |
| } |
| pixel = (R << 16) | (G << 8) | B; |
| *dst = pixel; |
| posx += incx; |
| ++dst; |
| } |
| posy += incy; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_RGB888_RGB888_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; |
| |
| 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; |
| dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; |
| if (flags & SDL_COPY_MODULATE_COLOR) { |
| srcR = (srcR * modulateR) / 255; |
| srcG = (srcG * modulateG) / 255; |
| srcB = (srcB * modulateB) / 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)) { |
| case SDL_COPY_BLEND: |
| dstR = srcR + ((255 - srcA) * dstR) / 255; |
| dstG = srcG + ((255 - srcA) * dstG) / 255; |
| dstB = srcB + ((255 - srcA) * dstB) / 255; |
| break; |
| case SDL_COPY_ADD: |
| 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: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| case SDL_COPY_MUL: |
| dstR = ((srcR * dstR) + (dstR * (255 - srcA))) / 255; if (dstR > 255) dstR = 255; |
| dstG = ((srcG * dstG) + (dstG * (255 - srcA))) / 255; if (dstG > 255) dstG = 255; |
| dstB = ((srcB * dstB) + (dstB * (255 - srcA))) / 255; if (dstB > 255) dstB = 255; |
| break; |
| } |
| dstpixel = (dstR << 16) | (dstG << 8) | dstB; |
| *dst = dstpixel; |
| ++src; |
| ++dst; |
| } |
| info->src += info->src_pitch; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_RGB888_RGB888_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; |
| int srcy, srcx; |
| Uint32 posy, posx; |
| int incy, incx; |
| |
| incy = (info->src_h << 16) / info->dst_h; |
| incx = (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; |
| dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; |
| if (flags & SDL_COPY_MODULATE_COLOR) { |
| srcR = (srcR * modulateR) / 255; |
| srcG = (srcG * modulateG) / 255; |
| srcB = (srcB * modulateB) / 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)) { |
| case SDL_COPY_BLEND: |
| dstR = srcR + ((255 - srcA) * dstR) / 255; |
| dstG = srcG + ((255 - srcA) * dstG) / 255; |
| dstB = srcB + ((255 - srcA) * dstB) / 255; |
| break; |
| case SDL_COPY_ADD: |
| 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: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| case SDL_COPY_MUL: |
| dstR = ((srcR * dstR) + (dstR * (255 - srcA))) / 255; if (dstR > 255) dstR = 255; |
| dstG = ((srcG * dstG) + (dstG * (255 - srcA))) / 255; if (dstG > 255) dstG = 255; |
| dstB = ((srcB * dstB) + (dstB * (255 - srcA))) / 255; if (dstB > 255) dstB = 255; |
| break; |
| } |
| dstpixel = (dstR << 16) | (dstG << 8) | dstB; |
| *dst = dstpixel; |
| posx += incx; |
| ++dst; |
| } |
| posy += incy; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_RGB888_BGR888_Scale(SDL_BlitInfo *info) |
| { |
| Uint32 pixel; |
| Uint32 R, G, B; |
| int srcy, srcx; |
| Uint32 posy, posx; |
| int incy, incx; |
| |
| incy = (info->src_h << 16) / info->dst_h; |
| incx = (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 = (B << 16) | (G << 8) | R; |
| *dst = pixel; |
| posx += incx; |
| ++dst; |
| } |
| posy += incy; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_RGB888_BGR888_Blend(SDL_BlitInfo *info) |
| { |
| const int flags = info->flags; |
| Uint32 srcpixel; |
| Uint32 srcR, srcG, srcB; |
| Uint32 dstpixel; |
| Uint32 dstR, dstG, dstB; |
| |
| 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; |
| switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { |
| case SDL_COPY_BLEND: |
| dstR = srcR; |
| dstG = srcG; |
| dstB = srcB; |
| break; |
| case SDL_COPY_ADD: |
| 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: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| case SDL_COPY_MUL: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| } |
| dstpixel = (dstB << 16) | (dstG << 8) | dstR; |
| *dst = dstpixel; |
| ++src; |
| ++dst; |
| } |
| info->src += info->src_pitch; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_RGB888_BGR888_Blend_Scale(SDL_BlitInfo *info) |
| { |
| const int flags = info->flags; |
| Uint32 srcpixel; |
| Uint32 srcR, srcG, srcB; |
| Uint32 dstpixel; |
| Uint32 dstR, dstG, dstB; |
| int srcy, srcx; |
| Uint32 posy, posx; |
| int incy, incx; |
| |
| incy = (info->src_h << 16) / info->dst_h; |
| incx = (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; |
| switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { |
| case SDL_COPY_BLEND: |
| dstR = srcR; |
| dstG = srcG; |
| dstB = srcB; |
| break; |
| case SDL_COPY_ADD: |
| 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: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| case SDL_COPY_MUL: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| } |
| dstpixel = (dstB << 16) | (dstG << 8) | dstR; |
| *dst = dstpixel; |
| posx += incx; |
| ++dst; |
| } |
| posy += incy; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_RGB888_BGR888_Modulate(SDL_BlitInfo *info) |
| { |
| const int flags = info->flags; |
| const Uint32 modulateR = info->r; |
| const Uint32 modulateG = info->g; |
| const Uint32 modulateB = info->b; |
| Uint32 pixel; |
| 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) { |
| R = (R * modulateR) / 255; |
| G = (G * modulateG) / 255; |
| B = (B * modulateB) / 255; |
| } |
| pixel = (B << 16) | (G << 8) | R; |
| *dst = pixel; |
| ++src; |
| ++dst; |
| } |
| info->src += info->src_pitch; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_RGB888_BGR888_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; |
| Uint32 pixel; |
| Uint32 R, G, B; |
| int srcy, srcx; |
| Uint32 posy, posx; |
| int incy, incx; |
| |
| incy = (info->src_h << 16) / info->dst_h; |
| incx = (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) { |
| R = (R * modulateR) / 255; |
| G = (G * modulateG) / 255; |
| B = (B * modulateB) / 255; |
| } |
| pixel = (B << 16) | (G << 8) | R; |
| *dst = pixel; |
| posx += incx; |
| ++dst; |
| } |
| posy += incy; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_RGB888_BGR888_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; |
| |
| 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; |
| if (flags & SDL_COPY_MODULATE_COLOR) { |
| srcR = (srcR * modulateR) / 255; |
| srcG = (srcG * modulateG) / 255; |
| srcB = (srcB * modulateB) / 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)) { |
| case SDL_COPY_BLEND: |
| dstR = srcR + ((255 - srcA) * dstR) / 255; |
| dstG = srcG + ((255 - srcA) * dstG) / 255; |
| dstB = srcB + ((255 - srcA) * dstB) / 255; |
| break; |
| case SDL_COPY_ADD: |
| 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: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| case SDL_COPY_MUL: |
| dstR = ((srcR * dstR) + (dstR * (255 - srcA))) / 255; if (dstR > 255) dstR = 255; |
| dstG = ((srcG * dstG) + (dstG * (255 - srcA))) / 255; if (dstG > 255) dstG = 255; |
| dstB = ((srcB * dstB) + (dstB * (255 - srcA))) / 255; if (dstB > 255) dstB = 255; |
| break; |
| } |
| dstpixel = (dstB << 16) | (dstG << 8) | dstR; |
| *dst = dstpixel; |
| ++src; |
| ++dst; |
| } |
| info->src += info->src_pitch; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_RGB888_BGR888_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; |
| int srcy, srcx; |
| Uint32 posy, posx; |
| int incy, incx; |
| |
| incy = (info->src_h << 16) / info->dst_h; |
| incx = (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; |
| if (flags & SDL_COPY_MODULATE_COLOR) { |
| srcR = (srcR * modulateR) / 255; |
| srcG = (srcG * modulateG) / 255; |
| srcB = (srcB * modulateB) / 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)) { |
| case SDL_COPY_BLEND: |
| dstR = srcR + ((255 - srcA) * dstR) / 255; |
| dstG = srcG + ((255 - srcA) * dstG) / 255; |
| dstB = srcB + ((255 - srcA) * dstB) / 255; |
| break; |
| case SDL_COPY_ADD: |
| 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: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| case SDL_COPY_MUL: |
| dstR = ((srcR * dstR) + (dstR * (255 - srcA))) / 255; if (dstR > 255) dstR = 255; |
| dstG = ((srcG * dstG) + (dstG * (255 - srcA))) / 255; if (dstG > 255) dstG = 255; |
| dstB = ((srcB * dstB) + (dstB * (255 - srcA))) / 255; if (dstB > 255) dstB = 255; |
| break; |
| } |
| dstpixel = (dstB << 16) | (dstG << 8) | dstR; |
| *dst = dstpixel; |
| posx += incx; |
| ++dst; |
| } |
| posy += incy; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_RGB888_ARGB8888_Scale(SDL_BlitInfo *info) |
| { |
| Uint32 pixel; |
| const Uint32 A = 0xFF; |
| int srcy, srcx; |
| Uint32 posy, posx; |
| int incy, incx; |
| |
| incy = (info->src_h << 16) / info->dst_h; |
| incx = (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_RGB888_ARGB8888_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; |
| 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)) { |
| case SDL_COPY_BLEND: |
| dstR = srcR; |
| dstG = srcG; |
| dstB = srcB; |
| dstA = 0xFF; |
| break; |
| case SDL_COPY_ADD: |
| 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: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| case SDL_COPY_MUL: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| } |
| dstpixel = (dstA << 24) | (dstR << 16) | (dstG << 8) | dstB; |
| *dst = dstpixel; |
| ++src; |
| ++dst; |
| } |
| info->src += info->src_pitch; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_RGB888_ARGB8888_Blend_Scale(SDL_BlitInfo *info) |
| { |
| const int flags = info->flags; |
| Uint32 srcpixel; |
| Uint32 srcR, srcG, srcB; |
| Uint32 dstpixel; |
| Uint32 dstR, dstG, dstB, dstA; |
| int srcy, srcx; |
| Uint32 posy, posx; |
| int incy, incx; |
| |
| incy = (info->src_h << 16) / info->dst_h; |
| incx = (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; |
| 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)) { |
| case SDL_COPY_BLEND: |
| dstR = srcR; |
| dstG = srcG; |
| dstB = srcB; |
| dstA = 0xFF; |
| break; |
| case SDL_COPY_ADD: |
| 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: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| case SDL_COPY_MUL: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| } |
| dstpixel = (dstA << 24) | (dstR << 16) | (dstG << 8) | dstB; |
| *dst = dstpixel; |
| posx += incx; |
| ++dst; |
| } |
| posy += incy; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_RGB888_ARGB8888_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) { |
| R = (R * modulateR) / 255; |
| G = (G * modulateG) / 255; |
| B = (B * modulateB) / 255; |
| } |
| pixel = (A << 24) | (R << 16) | (G << 8) | B; |
| *dst = pixel; |
| ++src; |
| ++dst; |
| } |
| info->src += info->src_pitch; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_RGB888_ARGB8888_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; |
| int srcy, srcx; |
| Uint32 posy, posx; |
| int incy, incx; |
| |
| incy = (info->src_h << 16) / info->dst_h; |
| incx = (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) { |
| R = (R * modulateR) / 255; |
| G = (G * modulateG) / 255; |
| B = (B * modulateB) / 255; |
| } |
| pixel = (A << 24) | (R << 16) | (G << 8) | B; |
| *dst = pixel; |
| posx += incx; |
| ++dst; |
| } |
| posy += incy; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_RGB888_ARGB8888_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; |
| dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); |
| if (flags & SDL_COPY_MODULATE_COLOR) { |
| srcR = (srcR * modulateR) / 255; |
| srcG = (srcG * modulateG) / 255; |
| srcB = (srcB * modulateB) / 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)) { |
| case SDL_COPY_BLEND: |
| dstR = srcR + ((255 - srcA) * dstR) / 255; |
| dstG = srcG + ((255 - srcA) * dstG) / 255; |
| dstB = srcB + ((255 - srcA) * dstB) / 255; |
| dstA = srcA + ((255 - srcA) * dstA) / 255; |
| break; |
| case SDL_COPY_ADD: |
| 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: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| case SDL_COPY_MUL: |
| dstR = ((srcR * dstR) + (dstR * (255 - srcA))) / 255; if (dstR > 255) dstR = 255; |
| dstG = ((srcG * dstG) + (dstG * (255 - srcA))) / 255; if (dstG > 255) dstG = 255; |
| dstB = ((srcB * dstB) + (dstB * (255 - srcA))) / 255; if (dstB > 255) dstB = 255; |
| break; |
| } |
| dstpixel = (dstA << 24) | (dstR << 16) | (dstG << 8) | dstB; |
| *dst = dstpixel; |
| ++src; |
| ++dst; |
| } |
| info->src += info->src_pitch; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_RGB888_ARGB8888_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; |
| int srcy, srcx; |
| Uint32 posy, posx; |
| int incy, incx; |
| |
| incy = (info->src_h << 16) / info->dst_h; |
| incx = (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; |
| dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); |
| if (flags & SDL_COPY_MODULATE_COLOR) { |
| srcR = (srcR * modulateR) / 255; |
| srcG = (srcG * modulateG) / 255; |
| srcB = (srcB * modulateB) / 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)) { |
| case SDL_COPY_BLEND: |
| dstR = srcR + ((255 - srcA) * dstR) / 255; |
| dstG = srcG + ((255 - srcA) * dstG) / 255; |
| dstB = srcB + ((255 - srcA) * dstB) / 255; |
| dstA = srcA + ((255 - srcA) * dstA) / 255; |
| break; |
| case SDL_COPY_ADD: |
| 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: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| case SDL_COPY_MUL: |
| dstR = ((srcR * dstR) + (dstR * (255 - srcA))) / 255; if (dstR > 255) dstR = 255; |
| dstG = ((srcG * dstG) + (dstG * (255 - srcA))) / 255; if (dstG > 255) dstG = 255; |
| dstB = ((srcB * dstB) + (dstB * (255 - srcA))) / 255; if (dstB > 255) dstB = 255; |
| break; |
| } |
| dstpixel = (dstA << 24) | (dstR << 16) | (dstG << 8) | dstB; |
| *dst = dstpixel; |
| posx += incx; |
| ++dst; |
| } |
| posy += incy; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_BGR888_RGB888_Scale(SDL_BlitInfo *info) |
| { |
| Uint32 pixel; |
| Uint32 R, G, B; |
| int srcy, srcx; |
| Uint32 posy, posx; |
| int incy, incx; |
| |
| incy = (info->src_h << 16) / info->dst_h; |
| incx = (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; |
| pixel = (R << 16) | (G << 8) | B; |
| *dst = pixel; |
| posx += incx; |
| ++dst; |
| } |
| posy += incy; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_BGR888_RGB888_Blend(SDL_BlitInfo *info) |
| { |
| const int flags = info->flags; |
| Uint32 srcpixel; |
| Uint32 srcR, srcG, srcB; |
| Uint32 dstpixel; |
| Uint32 dstR, dstG, dstB; |
| |
| 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; |
| 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)) { |
| case SDL_COPY_BLEND: |
| dstR = srcR; |
| dstG = srcG; |
| dstB = srcB; |
| break; |
| case SDL_COPY_ADD: |
| 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: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| case SDL_COPY_MUL: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| } |
| dstpixel = (dstR << 16) | (dstG << 8) | dstB; |
| *dst = dstpixel; |
| ++src; |
| ++dst; |
| } |
| info->src += info->src_pitch; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_BGR888_RGB888_Blend_Scale(SDL_BlitInfo *info) |
| { |
| const int flags = info->flags; |
| Uint32 srcpixel; |
| Uint32 srcR, srcG, srcB; |
| Uint32 dstpixel; |
| Uint32 dstR, dstG, dstB; |
| int srcy, srcx; |
| Uint32 posy, posx; |
| int incy, incx; |
| |
| incy = (info->src_h << 16) / info->dst_h; |
| incx = (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; |
| 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)) { |
| case SDL_COPY_BLEND: |
| dstR = srcR; |
| dstG = srcG; |
| dstB = srcB; |
| break; |
| case SDL_COPY_ADD: |
| 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: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| case SDL_COPY_MUL: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| } |
| dstpixel = (dstR << 16) | (dstG << 8) | dstB; |
| *dst = dstpixel; |
| posx += incx; |
| ++dst; |
| } |
| posy += incy; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_BGR888_RGB888_Modulate(SDL_BlitInfo *info) |
| { |
| const int flags = info->flags; |
| const Uint32 modulateR = info->r; |
| const Uint32 modulateG = info->g; |
| const Uint32 modulateB = info->b; |
| Uint32 pixel; |
| 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) { |
| R = (R * modulateR) / 255; |
| G = (G * modulateG) / 255; |
| B = (B * modulateB) / 255; |
| } |
| pixel = (R << 16) | (G << 8) | B; |
| *dst = pixel; |
| ++src; |
| ++dst; |
| } |
| info->src += info->src_pitch; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_BGR888_RGB888_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; |
| Uint32 pixel; |
| Uint32 R, G, B; |
| int srcy, srcx; |
| Uint32 posy, posx; |
| int incy, incx; |
| |
| incy = (info->src_h << 16) / info->dst_h; |
| incx = (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) { |
| R = (R * modulateR) / 255; |
| G = (G * modulateG) / 255; |
| B = (B * modulateB) / 255; |
| } |
| pixel = (R << 16) | (G << 8) | B; |
| *dst = pixel; |
| posx += incx; |
| ++dst; |
| } |
| posy += incy; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_BGR888_RGB888_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; |
| |
| 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; |
| dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; |
| if (flags & SDL_COPY_MODULATE_COLOR) { |
| srcR = (srcR * modulateR) / 255; |
| srcG = (srcG * modulateG) / 255; |
| srcB = (srcB * modulateB) / 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)) { |
| case SDL_COPY_BLEND: |
| dstR = srcR + ((255 - srcA) * dstR) / 255; |
| dstG = srcG + ((255 - srcA) * dstG) / 255; |
| dstB = srcB + ((255 - srcA) * dstB) / 255; |
| break; |
| case SDL_COPY_ADD: |
| 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: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| case SDL_COPY_MUL: |
| dstR = ((srcR * dstR) + (dstR * (255 - srcA))) / 255; if (dstR > 255) dstR = 255; |
| dstG = ((srcG * dstG) + (dstG * (255 - srcA))) / 255; if (dstG > 255) dstG = 255; |
| dstB = ((srcB * dstB) + (dstB * (255 - srcA))) / 255; if (dstB > 255) dstB = 255; |
| break; |
| } |
| dstpixel = (dstR << 16) | (dstG << 8) | dstB; |
| *dst = dstpixel; |
| ++src; |
| ++dst; |
| } |
| info->src += info->src_pitch; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_BGR888_RGB888_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; |
| int srcy, srcx; |
| Uint32 posy, posx; |
| int incy, incx; |
| |
| incy = (info->src_h << 16) / info->dst_h; |
| incx = (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; |
| dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; |
| if (flags & SDL_COPY_MODULATE_COLOR) { |
| srcR = (srcR * modulateR) / 255; |
| srcG = (srcG * modulateG) / 255; |
| srcB = (srcB * modulateB) / 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)) { |
| case SDL_COPY_BLEND: |
| dstR = srcR + ((255 - srcA) * dstR) / 255; |
| dstG = srcG + ((255 - srcA) * dstG) / 255; |
| dstB = srcB + ((255 - srcA) * dstB) / 255; |
| break; |
| case SDL_COPY_ADD: |
| 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: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| case SDL_COPY_MUL: |
| dstR = ((srcR * dstR) + (dstR * (255 - srcA))) / 255; if (dstR > 255) dstR = 255; |
| dstG = ((srcG * dstG) + (dstG * (255 - srcA))) / 255; if (dstG > 255) dstG = 255; |
| dstB = ((srcB * dstB) + (dstB * (255 - srcA))) / 255; if (dstB > 255) dstB = 255; |
| break; |
| } |
| dstpixel = (dstR << 16) | (dstG << 8) | dstB; |
| *dst = dstpixel; |
| posx += incx; |
| ++dst; |
| } |
| posy += incy; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_BGR888_BGR888_Scale(SDL_BlitInfo *info) |
| { |
| int srcy, srcx; |
| Uint32 posy, posx; |
| int incy, incx; |
| |
| incy = (info->src_h << 16) / info->dst_h; |
| incx = (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_BGR888_BGR888_Blend(SDL_BlitInfo *info) |
| { |
| const int flags = info->flags; |
| Uint32 srcpixel; |
| Uint32 srcR, srcG, srcB; |
| Uint32 dstpixel; |
| Uint32 dstR, dstG, dstB; |
| |
| 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; |
| switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { |
| case SDL_COPY_BLEND: |
| dstR = srcR; |
| dstG = srcG; |
| dstB = srcB; |
| break; |
| case SDL_COPY_ADD: |
| 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: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| case SDL_COPY_MUL: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| } |
| dstpixel = (dstB << 16) | (dstG << 8) | dstR; |
| *dst = dstpixel; |
| ++src; |
| ++dst; |
| } |
| info->src += info->src_pitch; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_BGR888_BGR888_Blend_Scale(SDL_BlitInfo *info) |
| { |
| const int flags = info->flags; |
| Uint32 srcpixel; |
| Uint32 srcR, srcG, srcB; |
| Uint32 dstpixel; |
| Uint32 dstR, dstG, dstB; |
| int srcy, srcx; |
| Uint32 posy, posx; |
| int incy, incx; |
| |
| incy = (info->src_h << 16) / info->dst_h; |
| incx = (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; |
| switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD|SDL_COPY_MUL)) { |
| case SDL_COPY_BLEND: |
| dstR = srcR; |
| dstG = srcG; |
| dstB = srcB; |
| break; |
| case SDL_COPY_ADD: |
| 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: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| case SDL_COPY_MUL: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| } |
| dstpixel = (dstB << 16) | (dstG << 8) | dstR; |
| *dst = dstpixel; |
| posx += incx; |
| ++dst; |
| } |
| posy += incy; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_BGR888_BGR888_Modulate(SDL_BlitInfo *info) |
| { |
| const int flags = info->flags; |
| const Uint32 modulateR = info->r; |
| const Uint32 modulateG = info->g; |
| const Uint32 modulateB = info->b; |
| Uint32 pixel; |
| 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) { |
| R = (R * modulateR) / 255; |
| G = (G * modulateG) / 255; |
| B = (B * modulateB) / 255; |
| } |
| pixel = (B << 16) | (G << 8) | R; |
| *dst = pixel; |
| ++src; |
| ++dst; |
| } |
| info->src += info->src_pitch; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_BGR888_BGR888_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; |
| Uint32 pixel; |
| Uint32 R, G, B; |
| int srcy, srcx; |
| Uint32 posy, posx; |
| int incy, incx; |
| |
| incy = (info->src_h << 16) / info->dst_h; |
| incx = (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) { |
| R = (R * modulateR) / 255; |
| G = (G * modulateG) / 255; |
| B = (B * modulateB) / 255; |
| } |
| pixel = (B << 16) | (G << 8) | R; |
| *dst = pixel; |
| posx += incx; |
| ++dst; |
| } |
| posy += incy; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_BGR888_BGR888_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; |
| |
| 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; |
| if (flags & SDL_COPY_MODULATE_COLOR) { |
| srcR = (srcR * modulateR) / 255; |
| srcG = (srcG * modulateG) / 255; |
| srcB = (srcB * modulateB) / 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)) { |
| case SDL_COPY_BLEND: |
| dstR = srcR + ((255 - srcA) * dstR) / 255; |
| dstG = srcG + ((255 - srcA) * dstG) / 255; |
| dstB = srcB + ((255 - srcA) * dstB) / 255; |
| break; |
| case SDL_COPY_ADD: |
| 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: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| case SDL_COPY_MUL: |
| dstR = ((srcR * dstR) + (dstR * (255 - srcA))) / 255; if (dstR > 255) dstR = 255; |
| dstG = ((srcG * dstG) + (dstG * (255 - srcA))) / 255; if (dstG > 255) dstG = 255; |
| dstB = ((srcB * dstB) + (dstB * (255 - srcA))) / 255; if (dstB > 255) dstB = 255; |
| break; |
| } |
| dstpixel = (dstB << 16) | (dstG << 8) | dstR; |
| *dst = dstpixel; |
| ++src; |
| ++dst; |
| } |
| info->src += info->src_pitch; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_BGR888_BGR888_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; |
| int srcy, srcx; |
| Uint32 posy, posx; |
| int incy, incx; |
| |
| incy = (info->src_h << 16) / info->dst_h; |
| incx = (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; |
| if (flags & SDL_COPY_MODULATE_COLOR) { |
| srcR = (srcR * modulateR) / 255; |
| srcG = (srcG * modulateG) / 255; |
| srcB = (srcB * modulateB) / 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)) { |
| case SDL_COPY_BLEND: |
| dstR = srcR + ((255 - srcA) * dstR) / 255; |
| dstG = srcG + ((255 - srcA) * dstG) / 255; |
| dstB = srcB + ((255 - srcA) * dstB) / 255; |
| break; |
| case SDL_COPY_ADD: |
| 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: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| case SDL_COPY_MUL: |
| dstR = ((srcR * dstR) + (dstR * (255 - srcA))) / 255; if (dstR > 255) dstR = 255; |
| dstG = ((srcG * dstG) + (dstG * (255 - srcA))) / 255; if (dstG > 255) dstG = 255; |
| dstB = ((srcB * dstB) + (dstB * (255 - srcA))) / 255; if (dstB > 255) dstB = 255; |
| break; |
| } |
| dstpixel = (dstB << 16) | (dstG << 8) | dstR; |
| *dst = dstpixel; |
| posx += incx; |
| ++dst; |
| } |
| posy += incy; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_BGR888_ARGB8888_Scale(SDL_BlitInfo *info) |
| { |
| Uint32 pixel; |
| const Uint32 A = 0xFF; |
| Uint32 R, G, B; |
| int srcy, srcx; |
| Uint32 posy, posx; |
| int incy, incx; |
| |
| incy = (info->src_h << 16) / info->dst_h; |
| incx = (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; |
| pixel = (A << 24) | (R << 16) | (G << 8) | B; |
| *dst = pixel; |
| posx += incx; |
| ++dst; |
| } |
| posy += incy; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_BGR888_ARGB8888_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; |
| 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)) { |
| case SDL_COPY_BLEND: |
| dstR = srcR; |
| dstG = srcG; |
| dstB = srcB; |
| dstA = 0xFF; |
| break; |
| case SDL_COPY_ADD: |
| 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: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| case SDL_COPY_MUL: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| } |
| dstpixel = (dstA << 24) | (dstR << 16) | (dstG << 8) | dstB; |
| *dst = dstpixel; |
| ++src; |
| ++dst; |
| } |
| info->src += info->src_pitch; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_BGR888_ARGB8888_Blend_Scale(SDL_BlitInfo *info) |
| { |
| const int flags = info->flags; |
| Uint32 srcpixel; |
| Uint32 srcR, srcG, srcB; |
| Uint32 dstpixel; |
| Uint32 dstR, dstG, dstB, dstA; |
| int srcy, srcx; |
| Uint32 posy, posx; |
| int incy, incx; |
| |
| incy = (info->src_h << 16) / info->dst_h; |
| incx = (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; |
| 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)) { |
| case SDL_COPY_BLEND: |
| dstR = srcR; |
| dstG = srcG; |
| dstB = srcB; |
| dstA = 0xFF; |
| break; |
| case SDL_COPY_ADD: |
| 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: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| case SDL_COPY_MUL: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| } |
| dstpixel = (dstA << 24) | (dstR << 16) | (dstG << 8) | dstB; |
| *dst = dstpixel; |
| posx += incx; |
| ++dst; |
| } |
| posy += incy; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_BGR888_ARGB8888_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) { |
| R = (R * modulateR) / 255; |
| G = (G * modulateG) / 255; |
| B = (B * modulateB) / 255; |
| } |
| pixel = (A << 24) | (R << 16) | (G << 8) | B; |
| *dst = pixel; |
| ++src; |
| ++dst; |
| } |
| info->src += info->src_pitch; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_BGR888_ARGB8888_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; |
| int srcy, srcx; |
| Uint32 posy, posx; |
| int incy, incx; |
| |
| incy = (info->src_h << 16) / info->dst_h; |
| incx = (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) { |
| R = (R * modulateR) / 255; |
| G = (G * modulateG) / 255; |
| B = (B * modulateB) / 255; |
| } |
| pixel = (A << 24) | (R << 16) | (G << 8) | B; |
| *dst = pixel; |
| posx += incx; |
| ++dst; |
| } |
| posy += incy; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_BGR888_ARGB8888_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; |
| dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); |
| if (flags & SDL_COPY_MODULATE_COLOR) { |
| srcR = (srcR * modulateR) / 255; |
| srcG = (srcG * modulateG) / 255; |
| srcB = (srcB * modulateB) / 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)) { |
| case SDL_COPY_BLEND: |
| dstR = srcR + ((255 - srcA) * dstR) / 255; |
| dstG = srcG + ((255 - srcA) * dstG) / 255; |
| dstB = srcB + ((255 - srcA) * dstB) / 255; |
| dstA = srcA + ((255 - srcA) * dstA) / 255; |
| break; |
| case SDL_COPY_ADD: |
| 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: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| case SDL_COPY_MUL: |
| dstR = ((srcR * dstR) + (dstR * (255 - srcA))) / 255; if (dstR > 255) dstR = 255; |
| dstG = ((srcG * dstG) + (dstG * (255 - srcA))) / 255; if (dstG > 255) dstG = 255; |
| dstB = ((srcB * dstB) + (dstB * (255 - srcA))) / 255; if (dstB > 255) dstB = 255; |
| break; |
| } |
| dstpixel = (dstA << 24) | (dstR << 16) | (dstG << 8) | dstB; |
| *dst = dstpixel; |
| ++src; |
| ++dst; |
| } |
| info->src += info->src_pitch; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_BGR888_ARGB8888_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; |
| int srcy, srcx; |
| Uint32 posy, posx; |
| int incy, incx; |
| |
| incy = (info->src_h << 16) / info->dst_h; |
| incx = (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; |
| dstR = (Uint8)(dstpixel >> 16); dstG = (Uint8)(dstpixel >> 8); dstB = (Uint8)dstpixel; dstA = (Uint8)(dstpixel >> 24); |
| if (flags & SDL_COPY_MODULATE_COLOR) { |
| srcR = (srcR * modulateR) / 255; |
| srcG = (srcG * modulateG) / 255; |
| srcB = (srcB * modulateB) / 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)) { |
| case SDL_COPY_BLEND: |
| dstR = srcR + ((255 - srcA) * dstR) / 255; |
| dstG = srcG + ((255 - srcA) * dstG) / 255; |
| dstB = srcB + ((255 - srcA) * dstB) / 255; |
| dstA = srcA + ((255 - srcA) * dstA) / 255; |
| break; |
| case SDL_COPY_ADD: |
| 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: |
| dstR = (srcR * dstR) / 255; |
| dstG = (srcG * dstG) / 255; |
| dstB = (srcB * dstB) / 255; |
| break; |
| case SDL_COPY_MUL: |
| dstR = ((srcR * dstR) + (dstR * (255 - srcA))) / 255; if (dstR > 255) dstR = 255; |
| dstG = ((srcG * dstG) + (dstG * (255 - srcA))) / 255; if (dstG > 255) dstG = 255; |
| dstB = ((srcB * dstB) + (dstB * (255 - srcA))) / 255; if (dstB > 255) dstB = 255; |
| break; |
| } |
| dstpixel = (dstA << 24) | (dstR << 16) | (dstG << 8) | dstB; |
| *dst = dstpixel; |
| posx += incx; |
| ++dst; |
| } |
| posy += incy; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_ARGB8888_RGB888_Scale(SDL_BlitInfo *info) |
| { |
| Uint32 pixel; |
| int srcy, srcx; |
| Uint32 posy, posx; |
| int incy, incx; |
| |
| incy = (info->src_h << 16) / info->dst_h; |
| incx = (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 &= 0xFFFFFF; |
| *dst = pixel; |
| posx += incx; |
| ++dst; |
| } |
| posy += incy; |
| info->dst += info->dst_pitch; |
| } |
| } |
| |
| static void SDL_Blit_ARGB8888_RGB888_Blend(SDL_BlitInfo *info) |
| { |
| const int flags = info->flags; |
| Uint32 srcpixel; |
| Uint32 srcR, srcG, srcB, srcA; |
| Uint32 dstpixel; |
| Uint32 dstR, dstG, dstB; |
| |
| 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; |
| 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) { |
| 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)) { |
| case SDL_COPY_BLEND: |
| dstR = srcR + ((255 - srcA) * dstR) / 255; |
| dstG = srcG + ((255 - srcA) * dstG) / 255; |
| dstB = srcB + ((255 - srcA) * dstB) / 255; |
| break; |
| case SDL_COPY_ADD: |
| dstR = srcR + dstR; if (dstR > 255) dstR = 255; |
| dstG = srcG + |