SDL  2.0
SDL_blit_A.c File Reference
#include "../SDL_internal.h"
#include "SDL_video.h"
#include "SDL_blit.h"
+ Include dependency graph for SDL_blit_A.c:

Go to the source code of this file.

Macros

#define BLEND16_50(d, s, mask)   ((((s & mask) + (d & mask)) >> 1) + (s & d & (~mask & 0xffff)))
#define BLEND2x16_50(d, s, mask)

Functions

static void BlitNto1SurfaceAlpha (SDL_BlitInfo *info)
static void BlitNto1PixelAlpha (SDL_BlitInfo *info)
static void BlitNto1SurfaceAlphaKey (SDL_BlitInfo *info)
static void BlitRGBtoRGBSurfaceAlpha128 (SDL_BlitInfo *info)
static void BlitRGBtoRGBSurfaceAlpha (SDL_BlitInfo *info)
static void BlitRGBtoRGBPixelAlpha (SDL_BlitInfo *info)
static void Blit16to16SurfaceAlpha128 (SDL_BlitInfo *info, Uint16 mask)
static void Blit565to565SurfaceAlpha (SDL_BlitInfo *info)
static void Blit555to555SurfaceAlpha (SDL_BlitInfo *info)
static void BlitARGBto565PixelAlpha (SDL_BlitInfo *info)
static void BlitARGBto555PixelAlpha (SDL_BlitInfo *info)
static void BlitNtoNSurfaceAlpha (SDL_BlitInfo *info)
static void BlitNtoNSurfaceAlphaKey (SDL_BlitInfo *info)
static void BlitNtoNPixelAlpha (SDL_BlitInfo *info)
SDL_BlitFunc SDL_CalculateBlitA (SDL_Surface *surface)

Macro Definition Documentation

#define BLEND16_50 (   d,
  s,
  mask 
)    ((((s & mask) + (d & mask)) >> 1) + (s & d & (~mask & 0xffff)))

Definition at line 588 of file SDL_blit_A.c.

Referenced by Blit16to16SurfaceAlpha128().

#define BLEND2x16_50 (   d,
  s,
  mask 
)
Value:
(((s & (mask | mask << 16)) >> 1) + ((d & (mask | mask << 16)) >> 1) \
+ (s & d & (~(mask | mask << 16))))

Definition at line 592 of file SDL_blit_A.c.

Referenced by Blit16to16SurfaceAlpha128().

Function Documentation

static void Blit16to16SurfaceAlpha128 ( SDL_BlitInfo info,
Uint16  mask 
)
static

Definition at line 597 of file SDL_blit_A.c.

References BLEND16_50, BLEND2x16_50, d, SDL_BlitInfo::dst, SDL_BlitInfo::dst_h, SDL_BlitInfo::dst_skip, SDL_BlitInfo::dst_w, SDL_BlitInfo::src, and SDL_BlitInfo::src_skip.

Referenced by Blit555to555SurfaceAlpha(), and Blit565to565SurfaceAlpha().

{
int width = info->dst_w;
int height = info->dst_h;
Uint16 *srcp = (Uint16 *) info->src;
int srcskip = info->src_skip >> 1;
Uint16 *dstp = (Uint16 *) info->dst;
int dstskip = info->dst_skip >> 1;
while (height--) {
if (((uintptr_t) srcp ^ (uintptr_t) dstp) & 2) {
/*
* Source and destination not aligned, pipeline it.
* This is mostly a win for big blits but no loss for
* small ones
*/
Uint32 prev_sw;
int w = width;
/* handle odd destination */
if ((uintptr_t) dstp & 2) {
Uint16 d = *dstp, s = *srcp;
*dstp = BLEND16_50(d, s, mask);
dstp++;
srcp++;
w--;
}
srcp++; /* srcp is now 32-bit aligned */
/* bootstrap pipeline with first halfword */
prev_sw = ((Uint32 *) srcp)[-1];
while (w > 1) {
Uint32 sw, dw, s;
sw = *(Uint32 *) srcp;
dw = *(Uint32 *) dstp;
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
s = (prev_sw << 16) + (sw >> 16);
#else
s = (prev_sw >> 16) + (sw << 16);
#endif
prev_sw = sw;
*(Uint32 *) dstp = BLEND2x16_50(dw, s, mask);
dstp += 2;
srcp += 2;
w -= 2;
}
/* final pixel if any */
if (w) {
Uint16 d = *dstp, s;
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
s = (Uint16) prev_sw;
#else
s = (Uint16) (prev_sw >> 16);
#endif
*dstp = BLEND16_50(d, s, mask);
srcp++;
dstp++;
}
srcp += srcskip - 1;
dstp += dstskip;
} else {
/* source and destination are aligned */
int w = width;
/* first odd pixel? */
if ((uintptr_t) srcp & 2) {
Uint16 d = *dstp, s = *srcp;
*dstp = BLEND16_50(d, s, mask);
srcp++;
dstp++;
w--;
}
/* srcp and dstp are now 32-bit aligned */
while (w > 1) {
Uint32 sw = *(Uint32 *) srcp;
Uint32 dw = *(Uint32 *) dstp;
*(Uint32 *) dstp = BLEND2x16_50(dw, sw, mask);
srcp += 2;
dstp += 2;
w -= 2;
}
/* last odd pixel? */
if (w) {
Uint16 d = *dstp, s = *srcp;
*dstp = BLEND16_50(d, s, mask);
srcp++;
dstp++;
}
srcp += srcskip;
dstp += dstskip;
}
}
}
static void Blit555to555SurfaceAlpha ( SDL_BlitInfo info)
static

Definition at line 1015 of file SDL_blit_A.c.

References SDL_BlitInfo::a, Blit16to16SurfaceAlpha128(), d, SDL_BlitInfo::dst, SDL_BlitInfo::dst_h, SDL_BlitInfo::dst_skip, SDL_BlitInfo::dst_w, DUFFS_LOOP4, SDL_BlitInfo::src, and SDL_BlitInfo::src_skip.

Referenced by SDL_CalculateBlitA().

{
unsigned alpha = info->a; /* downscale alpha to 5 bits */
if (alpha == 128) {
} else {
int width = info->dst_w;
int height = info->dst_h;
Uint16 *srcp = (Uint16 *) info->src;
int srcskip = info->src_skip >> 1;
Uint16 *dstp = (Uint16 *) info->dst;
int dstskip = info->dst_skip >> 1;
alpha >>= 3; /* downscale alpha to 5 bits */
while (height--) {
/* *INDENT-OFF* */
Uint32 s = *srcp++;
Uint32 d = *dstp;
/*
* shift out the middle component (green) to
* the high 16 bits, and process all three RGB
* components at the same time.
*/
s = (s | s << 16) & 0x03e07c1f;
d = (d | d << 16) & 0x03e07c1f;
d += (s - d) * alpha >> 5;
d &= 0x03e07c1f;
*dstp++ = (Uint16)(d | d >> 16);
}, width);
/* *INDENT-ON* */
srcp += srcskip;
dstp += dstskip;
}
}
}
static void Blit565to565SurfaceAlpha ( SDL_BlitInfo info)
static

Definition at line 976 of file SDL_blit_A.c.

References SDL_BlitInfo::a, Blit16to16SurfaceAlpha128(), d, SDL_BlitInfo::dst, SDL_BlitInfo::dst_h, SDL_BlitInfo::dst_skip, SDL_BlitInfo::dst_w, DUFFS_LOOP4, SDL_BlitInfo::src, and SDL_BlitInfo::src_skip.

Referenced by SDL_CalculateBlitA().

{
unsigned alpha = info->a;
if (alpha == 128) {
} else {
int width = info->dst_w;
int height = info->dst_h;
Uint16 *srcp = (Uint16 *) info->src;
int srcskip = info->src_skip >> 1;
Uint16 *dstp = (Uint16 *) info->dst;
int dstskip = info->dst_skip >> 1;
alpha >>= 3; /* downscale alpha to 5 bits */
while (height--) {
/* *INDENT-OFF* */
Uint32 s = *srcp++;
Uint32 d = *dstp;
/*
* shift out the middle component (green) to
* the high 16 bits, and process all three RGB
* components at the same time.
*/
s = (s | s << 16) & 0x07e0f81f;
d = (d | d << 16) & 0x07e0f81f;
d += (s - d) * alpha >> 5;
d &= 0x07e0f81f;
*dstp++ = (Uint16)(d | d >> 16);
}, width);
/* *INDENT-ON* */
srcp += srcskip;
dstp += dstskip;
}
}
}
static void BlitARGBto555PixelAlpha ( SDL_BlitInfo info)
static

Definition at line 1100 of file SDL_blit_A.c.

References d, SDL_BlitInfo::dst, SDL_BlitInfo::dst_h, SDL_BlitInfo::dst_skip, SDL_BlitInfo::dst_w, DUFFS_LOOP4, SDL_ALPHA_OPAQUE, SDL_BlitInfo::src, and SDL_BlitInfo::src_skip.

Referenced by SDL_CalculateBlitA().

{
int width = info->dst_w;
int height = info->dst_h;
Uint32 *srcp = (Uint32 *) info->src;
int srcskip = info->src_skip >> 2;
Uint16 *dstp = (Uint16 *) info->dst;
int dstskip = info->dst_skip >> 1;
while (height--) {
/* *INDENT-OFF* */
unsigned alpha;
Uint32 s = *srcp;
alpha = s >> 27; /* downscale alpha to 5 bits */
/* FIXME: Here we special-case opaque alpha since the
compositioning used (>>8 instead of /255) doesn't handle
it correctly. Also special-case alpha=0 for speed?
Benchmark this! */
if(alpha) {
if(alpha == (SDL_ALPHA_OPAQUE >> 3)) {
*dstp = (Uint16)((s >> 9 & 0x7c00) + (s >> 6 & 0x3e0) + (s >> 3 & 0x1f));
} else {
Uint32 d = *dstp;
/*
* convert source and destination to G0RAB65565
* and blend all components at the same time
*/
s = ((s & 0xf800) << 10) + (s >> 9 & 0x7c00)
+ (s >> 3 & 0x1f);
d = (d | d << 16) & 0x03e07c1f;
d += (s - d) * alpha >> 5;
d &= 0x03e07c1f;
*dstp = (Uint16)(d | d >> 16);
}
}
srcp++;
dstp++;
}, width);
/* *INDENT-ON* */
srcp += srcskip;
dstp += dstskip;
}
}
static void BlitARGBto565PixelAlpha ( SDL_BlitInfo info)
static

Definition at line 1054 of file SDL_blit_A.c.

References d, SDL_BlitInfo::dst, SDL_BlitInfo::dst_h, SDL_BlitInfo::dst_skip, SDL_BlitInfo::dst_w, DUFFS_LOOP4, SDL_ALPHA_OPAQUE, SDL_BlitInfo::src, and SDL_BlitInfo::src_skip.

Referenced by SDL_CalculateBlitA().

{
int width = info->dst_w;
int height = info->dst_h;
Uint32 *srcp = (Uint32 *) info->src;
int srcskip = info->src_skip >> 2;
Uint16 *dstp = (Uint16 *) info->dst;
int dstskip = info->dst_skip >> 1;
while (height--) {
/* *INDENT-OFF* */
Uint32 s = *srcp;
unsigned alpha = s >> 27; /* downscale alpha to 5 bits */
/* FIXME: Here we special-case opaque alpha since the
compositioning used (>>8 instead of /255) doesn't handle
it correctly. Also special-case alpha=0 for speed?
Benchmark this! */
if(alpha) {
if(alpha == (SDL_ALPHA_OPAQUE >> 3)) {
*dstp = (Uint16)((s >> 8 & 0xf800) + (s >> 5 & 0x7e0) + (s >> 3 & 0x1f));
} else {
Uint32 d = *dstp;
/*
* convert source and destination to G0RAB65565
* and blend all components at the same time
*/
s = ((s & 0xfc00) << 11) + (s >> 8 & 0xf800)
+ (s >> 3 & 0x1f);
d = (d | d << 16) & 0x07e0f81f;
d += (s - d) * alpha >> 5;
d &= 0x07e0f81f;
*dstp = (Uint16)(d | d >> 16);
}
}
srcp++;
dstp++;
}, width);
/* *INDENT-ON* */
srcp += srcskip;
dstp += dstskip;
}
}
static void BlitNto1PixelAlpha ( SDL_BlitInfo info)
static

Definition at line 77 of file SDL_blit_A.c.

References ALPHA_BLEND_RGB, SDL_Color::b, SDL_PixelFormat::BytesPerPixel, SDL_Palette::colors, DISEMBLE_RGBA, SDL_BlitInfo::dst, SDL_BlitInfo::dst_fmt, SDL_BlitInfo::dst_h, SDL_BlitInfo::dst_skip, SDL_BlitInfo::dst_w, DUFFS_LOOP4, SDL_Color::g, NULL, SDL_PixelFormat::palette, SDL_Color::r, SDL_BlitInfo::src, SDL_BlitInfo::src_fmt, SDL_BlitInfo::src_skip, and SDL_BlitInfo::table.

Referenced by SDL_CalculateBlitA().

{
int width = info->dst_w;
int height = info->dst_h;
Uint8 *src = info->src;
int srcskip = info->src_skip;
Uint8 *dst = info->dst;
int dstskip = info->dst_skip;
Uint8 *palmap = info->table;
SDL_PixelFormat *srcfmt = info->src_fmt;
SDL_PixelFormat *dstfmt = info->dst_fmt;
int srcbpp = srcfmt->BytesPerPixel;
Uint32 Pixel;
unsigned sR, sG, sB, sA;
unsigned dR, dG, dB;
while (height--) {
/* *INDENT-OFF* */
{
DISEMBLE_RGBA(src,srcbpp,srcfmt,Pixel,sR,sG,sB,sA);
dR = dstfmt->palette->colors[*dst].r;
dG = dstfmt->palette->colors[*dst].g;
dB = dstfmt->palette->colors[*dst].b;
ALPHA_BLEND_RGB(sR, sG, sB, sA, dR, dG, dB);
dR &= 0xff;
dG &= 0xff;
dB &= 0xff;
/* Pack RGB into 8bit pixel */
if ( palmap == NULL ) {
*dst =((dR>>5)<<(3+2))|((dG>>5)<<(2))|((dB>>6)<<(0));
} else {
*dst = palmap[((dR>>5)<<(3+2))|((dG>>5)<<(2))|((dB>>6)<<(0))];
}
dst++;
src += srcbpp;
},
/* *INDENT-ON* */
src += srcskip;
dst += dstskip;
}
}
static void BlitNto1SurfaceAlpha ( SDL_BlitInfo info)
static

Definition at line 30 of file SDL_blit_A.c.

References SDL_BlitInfo::a, ALPHA_BLEND_RGB, SDL_Color::b, SDL_PixelFormat::BytesPerPixel, SDL_Palette::colors, DISEMBLE_RGB, SDL_BlitInfo::dst, SDL_BlitInfo::dst_fmt, SDL_BlitInfo::dst_h, SDL_BlitInfo::dst_skip, SDL_BlitInfo::dst_w, DUFFS_LOOP4, SDL_Color::g, NULL, SDL_PixelFormat::palette, SDL_Color::r, SDL_BlitInfo::src, SDL_BlitInfo::src_fmt, SDL_BlitInfo::src_skip, and SDL_BlitInfo::table.

Referenced by SDL_CalculateBlitA().

{
int width = info->dst_w;
int height = info->dst_h;
Uint8 *src = info->src;
int srcskip = info->src_skip;
Uint8 *dst = info->dst;
int dstskip = info->dst_skip;
Uint8 *palmap = info->table;
SDL_PixelFormat *srcfmt = info->src_fmt;
SDL_PixelFormat *dstfmt = info->dst_fmt;
int srcbpp = srcfmt->BytesPerPixel;
Uint32 Pixel;
unsigned sR, sG, sB;
unsigned dR, dG, dB;
const unsigned A = info->a;
while (height--) {
/* *INDENT-OFF* */
{
DISEMBLE_RGB(src, srcbpp, srcfmt, Pixel, sR, sG, sB);
dR = dstfmt->palette->colors[*dst].r;
dG = dstfmt->palette->colors[*dst].g;
dB = dstfmt->palette->colors[*dst].b;
ALPHA_BLEND_RGB(sR, sG, sB, A, dR, dG, dB);
dR &= 0xff;
dG &= 0xff;
dB &= 0xff;
/* Pack RGB into 8bit pixel */
if ( palmap == NULL ) {
*dst =((dR>>5)<<(3+2))|((dG>>5)<<(2))|((dB>>6)<<(0));
} else {
*dst = palmap[((dR>>5)<<(3+2))|((dG>>5)<<(2))|((dB>>6)<<(0))];
}
dst++;
src += srcbpp;
},
/* *INDENT-ON* */
src += srcskip;
dst += dstskip;
}
}
static void BlitNto1SurfaceAlphaKey ( SDL_BlitInfo info)
static

Definition at line 123 of file SDL_blit_A.c.

References SDL_BlitInfo::a, ALPHA_BLEND_RGB, SDL_Color::b, SDL_PixelFormat::BytesPerPixel, SDL_BlitInfo::colorkey, SDL_Palette::colors, DISEMBLE_RGB, SDL_BlitInfo::dst, SDL_BlitInfo::dst_fmt, SDL_BlitInfo::dst_h, SDL_BlitInfo::dst_skip, SDL_BlitInfo::dst_w, DUFFS_LOOP, SDL_Color::g, NULL, SDL_PixelFormat::palette, SDL_Color::r, SDL_BlitInfo::src, SDL_BlitInfo::src_fmt, SDL_BlitInfo::src_skip, and SDL_BlitInfo::table.

Referenced by SDL_CalculateBlitA().

{
int width = info->dst_w;
int height = info->dst_h;
Uint8 *src = info->src;
int srcskip = info->src_skip;
Uint8 *dst = info->dst;
int dstskip = info->dst_skip;
Uint8 *palmap = info->table;
SDL_PixelFormat *srcfmt = info->src_fmt;
SDL_PixelFormat *dstfmt = info->dst_fmt;
int srcbpp = srcfmt->BytesPerPixel;
Uint32 ckey = info->colorkey;
Uint32 Pixel;
unsigned sR, sG, sB;
unsigned dR, dG, dB;
const unsigned A = info->a;
while (height--) {
/* *INDENT-OFF* */
{
DISEMBLE_RGB(src, srcbpp, srcfmt, Pixel, sR, sG, sB);
if ( Pixel != ckey ) {
dR = dstfmt->palette->colors[*dst].r;
dG = dstfmt->palette->colors[*dst].g;
dB = dstfmt->palette->colors[*dst].b;
ALPHA_BLEND_RGB(sR, sG, sB, A, dR, dG, dB);
dR &= 0xff;
dG &= 0xff;
dB &= 0xff;
/* Pack RGB into 8bit pixel */
if ( palmap == NULL ) {
*dst =((dR>>5)<<(3+2))|((dG>>5)<<(2))|((dB>>6)<<(0));
} else {
*dst = palmap[((dR>>5)<<(3+2))|((dG>>5)<<(2))|((dB>>6)<<(0))];
}
}
dst++;
src += srcbpp;
},
/* *INDENT-ON* */
src += srcskip;
dst += dstskip;
}
}
static void BlitNtoNPixelAlpha ( SDL_BlitInfo info)
static

Definition at line 1227 of file SDL_blit_A.c.

References ALPHA_BLEND_RGBA, ASSEMBLE_RGBA, SDL_PixelFormat::BytesPerPixel, DISEMBLE_RGBA, SDL_BlitInfo::dst, SDL_BlitInfo::dst_fmt, SDL_BlitInfo::dst_h, SDL_BlitInfo::dst_skip, SDL_BlitInfo::dst_w, DUFFS_LOOP4, SDL_BlitInfo::src, SDL_BlitInfo::src_fmt, and SDL_BlitInfo::src_skip.

Referenced by SDL_CalculateBlitA().

{
int width = info->dst_w;
int height = info->dst_h;
Uint8 *src = info->src;
int srcskip = info->src_skip;
Uint8 *dst = info->dst;
int dstskip = info->dst_skip;
SDL_PixelFormat *srcfmt = info->src_fmt;
SDL_PixelFormat *dstfmt = info->dst_fmt;
int srcbpp;
int dstbpp;
Uint32 Pixel;
unsigned sR, sG, sB, sA;
unsigned dR, dG, dB, dA;
/* Set up some basic variables */
srcbpp = srcfmt->BytesPerPixel;
dstbpp = dstfmt->BytesPerPixel;
while (height--) {
/* *INDENT-OFF* */
{
DISEMBLE_RGBA(src, srcbpp, srcfmt, Pixel, sR, sG, sB, sA);
if(sA) {
DISEMBLE_RGBA(dst, dstbpp, dstfmt, Pixel, dR, dG, dB, dA);
ALPHA_BLEND_RGBA(sR, sG, sB, sA, dR, dG, dB, dA);
ASSEMBLE_RGBA(dst, dstbpp, dstfmt, dR, dG, dB, dA);
}
src += srcbpp;
dst += dstbpp;
},
/* *INDENT-ON* */
src += srcskip;
dst += dstskip;
}
}
static void BlitNtoNSurfaceAlpha ( SDL_BlitInfo info)
static

Definition at line 1147 of file SDL_blit_A.c.

References SDL_BlitInfo::a, ALPHA_BLEND_RGBA, ASSEMBLE_RGBA, SDL_PixelFormat::BytesPerPixel, DISEMBLE_RGB, DISEMBLE_RGBA, SDL_BlitInfo::dst, SDL_BlitInfo::dst_fmt, SDL_BlitInfo::dst_h, SDL_BlitInfo::dst_skip, SDL_BlitInfo::dst_w, DUFFS_LOOP4, SDL_BlitInfo::src, SDL_BlitInfo::src_fmt, and SDL_BlitInfo::src_skip.

Referenced by SDL_CalculateBlitA().

{
int width = info->dst_w;
int height = info->dst_h;
Uint8 *src = info->src;
int srcskip = info->src_skip;
Uint8 *dst = info->dst;
int dstskip = info->dst_skip;
SDL_PixelFormat *srcfmt = info->src_fmt;
SDL_PixelFormat *dstfmt = info->dst_fmt;
int srcbpp = srcfmt->BytesPerPixel;
int dstbpp = dstfmt->BytesPerPixel;
Uint32 Pixel;
unsigned sR, sG, sB;
unsigned dR, dG, dB, dA;
const unsigned sA = info->a;
if (sA) {
while (height--) {
/* *INDENT-OFF* */
{
DISEMBLE_RGB(src, srcbpp, srcfmt, Pixel, sR, sG, sB);
DISEMBLE_RGBA(dst, dstbpp, dstfmt, Pixel, dR, dG, dB, dA);
ALPHA_BLEND_RGBA(sR, sG, sB, sA, dR, dG, dB, dA);
ASSEMBLE_RGBA(dst, dstbpp, dstfmt, dR, dG, dB, dA);
src += srcbpp;
dst += dstbpp;
},
/* *INDENT-ON* */
src += srcskip;
dst += dstskip;
}
}
}
static void BlitNtoNSurfaceAlphaKey ( SDL_BlitInfo info)
static

Definition at line 1186 of file SDL_blit_A.c.

References SDL_BlitInfo::a, ALPHA_BLEND_RGBA, ASSEMBLE_RGBA, SDL_PixelFormat::BytesPerPixel, SDL_BlitInfo::colorkey, DISEMBLE_RGBA, SDL_BlitInfo::dst, SDL_BlitInfo::dst_fmt, SDL_BlitInfo::dst_h, SDL_BlitInfo::dst_skip, SDL_BlitInfo::dst_w, DUFFS_LOOP4, RETRIEVE_RGB_PIXEL, RGB_FROM_PIXEL, SDL_BlitInfo::src, SDL_BlitInfo::src_fmt, and SDL_BlitInfo::src_skip.

Referenced by SDL_CalculateBlitA().

{
int width = info->dst_w;
int height = info->dst_h;
Uint8 *src = info->src;
int srcskip = info->src_skip;
Uint8 *dst = info->dst;
int dstskip = info->dst_skip;
SDL_PixelFormat *srcfmt = info->src_fmt;
SDL_PixelFormat *dstfmt = info->dst_fmt;
Uint32 ckey = info->colorkey;
int srcbpp = srcfmt->BytesPerPixel;
int dstbpp = dstfmt->BytesPerPixel;
Uint32 Pixel;
unsigned sR, sG, sB;
unsigned dR, dG, dB, dA;
const unsigned sA = info->a;
while (height--) {
/* *INDENT-OFF* */
{
RETRIEVE_RGB_PIXEL(src, srcbpp, Pixel);
if(sA && Pixel != ckey) {
RGB_FROM_PIXEL(Pixel, srcfmt, sR, sG, sB);
DISEMBLE_RGBA(dst, dstbpp, dstfmt, Pixel, dR, dG, dB, dA);
ALPHA_BLEND_RGBA(sR, sG, sB, sA, dR, dG, dB, dA);
ASSEMBLE_RGBA(dst, dstbpp, dstfmt, dR, dG, dB, dA);
}
src += srcbpp;
dst += dstbpp;
},
/* *INDENT-ON* */
src += srcskip;
dst += dstskip;
}
}
static void BlitRGBtoRGBPixelAlpha ( SDL_BlitInfo info)
static

Definition at line 461 of file SDL_blit_A.c.

References d, SDL_BlitInfo::dst, SDL_BlitInfo::dst_h, SDL_BlitInfo::dst_skip, SDL_BlitInfo::dst_w, DUFFS_LOOP4, SDL_ALPHA_OPAQUE, SDL_BlitInfo::src, and SDL_BlitInfo::src_skip.

Referenced by SDL_CalculateBlitA().

{
int width = info->dst_w;
int height = info->dst_h;
Uint32 *srcp = (Uint32 *) info->src;
int srcskip = info->src_skip >> 2;
Uint32 *dstp = (Uint32 *) info->dst;
int dstskip = info->dst_skip >> 2;
while (height--) {
/* *INDENT-OFF* */
Uint32 dalpha;
Uint32 d1;
Uint32 s = *srcp;
Uint32 alpha = s >> 24;
/* FIXME: Here we special-case opaque alpha since the
compositioning used (>>8 instead of /255) doesn't handle
it correctly. Also special-case alpha=0 for speed?
Benchmark this! */
if (alpha) {
if (alpha == SDL_ALPHA_OPAQUE) {
*dstp = *srcp;
} else {
/*
* take out the middle component (green), and process
* the other two in parallel. One multiply less.
*/
d = *dstp;
dalpha = d >> 24;
s1 = s & 0xff00ff;
d1 = d & 0xff00ff;
d1 = (d1 + ((s1 - d1) * alpha >> 8)) & 0xff00ff;
s &= 0xff00;
d &= 0xff00;
d = (d + ((s - d) * alpha >> 8)) & 0xff00;
dalpha = alpha + (dalpha * (alpha ^ 0xFF) >> 8);
*dstp = d1 | d | (dalpha << 24);
}
}
++srcp;
++dstp;
}, width);
/* *INDENT-ON* */
srcp += srcskip;
dstp += dstskip;
}
}
static void BlitRGBtoRGBSurfaceAlpha ( SDL_BlitInfo info)
static

Definition at line 419 of file SDL_blit_A.c.

References SDL_BlitInfo::a, BlitRGBtoRGBSurfaceAlpha128(), d, SDL_BlitInfo::dst, SDL_BlitInfo::dst_h, SDL_BlitInfo::dst_skip, SDL_BlitInfo::dst_w, DUFFS_LOOP4, SDL_BlitInfo::src, and SDL_BlitInfo::src_skip.

Referenced by SDL_CalculateBlitA().

{
unsigned alpha = info->a;
if (alpha == 128) {
} else {
int width = info->dst_w;
int height = info->dst_h;
Uint32 *srcp = (Uint32 *) info->src;
int srcskip = info->src_skip >> 2;
Uint32 *dstp = (Uint32 *) info->dst;
int dstskip = info->dst_skip >> 2;
Uint32 d1;
while (height--) {
/* *INDENT-OFF* */
s = *srcp;
d = *dstp;
s1 = s & 0xff00ff;
d1 = d & 0xff00ff;
d1 = (d1 + ((s1 - d1) * alpha >> 8))
& 0xff00ff;
s &= 0xff00;
d &= 0xff00;
d = (d + ((s - d) * alpha >> 8)) & 0xff00;
*dstp = d1 | d | 0xff000000;
++srcp;
++dstp;
}, width);
/* *INDENT-ON* */
srcp += srcskip;
dstp += dstskip;
}
}
}
static void BlitRGBtoRGBSurfaceAlpha128 ( SDL_BlitInfo info)
static

Definition at line 394 of file SDL_blit_A.c.

References d, SDL_BlitInfo::dst, SDL_BlitInfo::dst_h, SDL_BlitInfo::dst_skip, SDL_BlitInfo::dst_w, DUFFS_LOOP4, SDL_BlitInfo::src, and SDL_BlitInfo::src_skip.

Referenced by BlitRGBtoRGBSurfaceAlpha().

{
int width = info->dst_w;
int height = info->dst_h;
Uint32 *srcp = (Uint32 *) info->src;
int srcskip = info->src_skip >> 2;
Uint32 *dstp = (Uint32 *) info->dst;
int dstskip = info->dst_skip >> 2;
while (height--) {
/* *INDENT-OFF* */
Uint32 s = *srcp++;
Uint32 d = *dstp;
*dstp++ = ((((s & 0x00fefefe) + (d & 0x00fefefe)) >> 1)
+ (s & d & 0x00010101)) | 0xff000000;
}, width);
/* *INDENT-ON* */
srcp += srcskip;
dstp += dstskip;
}
}
SDL_BlitFunc SDL_CalculateBlitA ( SDL_Surface surface)

Definition at line 1269 of file SDL_blit_A.c.

References SDL_PixelFormat::Aloss, SDL_PixelFormat::Amask, SDL_PixelFormat::Ashift, Blit555to555SurfaceAlpha(), Blit565to565SurfaceAlpha(), BlitARGBto555PixelAlpha(), BlitARGBto565PixelAlpha(), BlitNto1PixelAlpha(), BlitNto1SurfaceAlpha(), BlitNto1SurfaceAlphaKey(), BlitNtoNPixelAlpha(), BlitNtoNSurfaceAlpha(), BlitNtoNSurfaceAlphaKey(), BlitRGBtoRGBPixelAlpha(), BlitRGBtoRGBSurfaceAlpha(), SDL_PixelFormat::Bmask, SDL_PixelFormat::Bshift, SDL_PixelFormat::BytesPerPixel, SDL_BlitMap::dst, SDL_BlitInfo::flags, SDL_Surface::format, SDL_PixelFormat::Gmask, SDL_PixelFormat::Gshift, SDL_BlitMap::identity, SDL_BlitMap::info, SDL_Surface::map, NULL, SDL_PixelFormat::Rmask, SDL_PixelFormat::Rshift, SDL_COPY_BLEND, SDL_COPY_COLORKEY, SDL_COPY_MODULATE_ALPHA, SDL_COPY_RLE_MASK, SDL_Has3DNow, and SDL_HasMMX.

Referenced by SDL_CalculateBlit().

{
SDL_PixelFormat *sf = surface->format;
SDL_PixelFormat *df = surface->map->dst->format;
switch (surface->map->info.flags & ~SDL_COPY_RLE_MASK) {
/* Per-pixel alpha blits */
switch (df->BytesPerPixel) {
case 1:
case 2:
if (sf->BytesPerPixel == 4 && sf->Amask == 0xff000000
&& sf->Gmask == 0xff00
&& ((sf->Rmask == 0xff && df->Rmask == 0x1f)
|| (sf->Bmask == 0xff && df->Bmask == 0x1f))) {
if (df->Gmask == 0x7e0)
else if (df->Gmask == 0x3e0)
}
case 4:
if (sf->Rmask == df->Rmask
&& sf->Gmask == df->Gmask
&& sf->Bmask == df->Bmask && sf->BytesPerPixel == 4) {
#if defined(__MMX__) || defined(__3dNOW__)
if (sf->Rshift % 8 == 0
&& sf->Gshift % 8 == 0
&& sf->Bshift % 8 == 0
&& sf->Ashift % 8 == 0 && sf->Aloss == 0) {
#ifdef __3dNOW__
if (SDL_Has3DNow())
return BlitRGBtoRGBPixelAlphaMMX3DNOW;
#endif
#ifdef __MMX__
if (SDL_HasMMX())
return BlitRGBtoRGBPixelAlphaMMX;
#endif
}
#endif /* __MMX__ || __3dNOW__ */
if (sf->Amask == 0xff000000) {
}
}
case 3:
default:
break;
}
if (sf->Amask == 0) {
/* Per-surface alpha blits */
switch (df->BytesPerPixel) {
case 1:
case 2:
if (surface->map->identity) {
if (df->Gmask == 0x7e0) {
#ifdef __MMX__
if (SDL_HasMMX())
return Blit565to565SurfaceAlphaMMX;
else
#endif
} else if (df->Gmask == 0x3e0) {
#ifdef __MMX__
if (SDL_HasMMX())
return Blit555to555SurfaceAlphaMMX;
else
#endif
}
}
case 4:
if (sf->Rmask == df->Rmask
&& sf->Gmask == df->Gmask
&& sf->Bmask == df->Bmask && sf->BytesPerPixel == 4) {
#ifdef __MMX__
if (sf->Rshift % 8 == 0
&& sf->Gshift % 8 == 0
&& sf->Bshift % 8 == 0 && SDL_HasMMX())
return BlitRGBtoRGBSurfaceAlphaMMX;
#endif
if ((sf->Rmask | sf->Gmask | sf->Bmask) == 0xffffff) {
}
}
case 3:
default:
}
}
break;
if (sf->Amask == 0) {
if (df->BytesPerPixel == 1) {
} else {
}
}
break;
}
return NULL;
}