mirror of https://github.com/encounter/SDL.git
Add a fast path for ARGB888->(A)BGR888 blending with pixel alpha
This commit is contained in:
parent
8b23029d23
commit
c270949b5e
|
@ -575,6 +575,61 @@ BlitRGBtoRGBPixelAlpha(SDL_BlitInfo * info)
|
|||
}
|
||||
}
|
||||
|
||||
/* fast ARGB888->(A)BGR888 blending with pixel alpha */
|
||||
static void
|
||||
BlitRGBtoBGRPixelAlpha(SDL_BlitInfo * info)
|
||||
{
|
||||
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* */
|
||||
DUFFS_LOOP4({
|
||||
Uint32 dalpha;
|
||||
Uint32 d;
|
||||
Uint32 s1;
|
||||
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) {
|
||||
/*
|
||||
* take out the middle component (green), and process
|
||||
* the other two in parallel. One multiply less.
|
||||
*/
|
||||
s1 = s & 0xff00ff;
|
||||
s1 = (s1 >> 16) | (s1 << 16);
|
||||
s &= 0xff00;
|
||||
|
||||
if (alpha == SDL_ALPHA_OPAQUE) {
|
||||
*dstp = 0xff000000 | s | s1;
|
||||
} else {
|
||||
d = *dstp;
|
||||
dalpha = d >> 24;
|
||||
d1 = d & 0xff00ff;
|
||||
d1 = (d1 + ((s1 - d1) * alpha >> 8)) & 0xff00ff;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef __3dNOW__
|
||||
/* fast (as in MMX with prefetch) ARGB888->(A)RGB888 blending with pixel alpha */
|
||||
static void
|
||||
|
@ -1407,6 +1462,12 @@ SDL_CalculateBlitA(SDL_Surface * surface)
|
|||
#endif
|
||||
return BlitRGBtoRGBPixelAlpha;
|
||||
}
|
||||
} else if (sf->Rmask == df->Bmask
|
||||
&& sf->Gmask == df->Gmask
|
||||
&& sf->Bmask == df->Rmask && sf->BytesPerPixel == 4) {
|
||||
if (sf->Amask == 0xff000000) {
|
||||
return BlitRGBtoBGRPixelAlpha;
|
||||
}
|
||||
}
|
||||
return BlitNtoNPixelAlpha;
|
||||
|
||||
|
|
Loading…
Reference in New Issue