- destination alpha saving for CImage

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@2211 dfc29bdd-3216-0410-991c-e03cc46cb475
master
engineer_apple 2009-02-11 23:53:15 +00:00
parent 6ad288bf1a
commit 7ddbd4f886
3 changed files with 31 additions and 17 deletions

View File

@ -2052,6 +2052,7 @@ void runGame ( GameData *game )
#pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")
#endif
/*!
*/
int IRRCALLCONV main(int argc, char* argv[])

View File

@ -287,9 +287,10 @@ static void RenderLine32_Blend(video::IImage *t,
m = dy << 1;
run = dx;
const u32 packA = packAlpha ( alpha );
while ( run )
{
*dst = PixelBlend32( *dst, argb, alpha );
*dst = packA | PixelBlend32( *dst, argb, alpha );
dst = (u32*) ( (u8*) dst + xInc ); // x += xInc
d += m;
@ -374,8 +375,8 @@ static void RenderLine16_Decal(video::IImage *t,
static void RenderLine16_Blend(video::IImage *t,
const core::position2d<s32> &p0,
const core::position2d<s32> &p1,
u32 argb,
u32 alpha)
u16 argb,
u16 alpha)
{
s32 dx = p1.X - p0.X;
s32 dy = p1.Y - p0.Y;
@ -418,9 +419,10 @@ static void RenderLine16_Blend(video::IImage *t,
m = dy << 1;
run = dx;
const u16 packA = alpha ? 0x8000 : 0;
while ( run )
{
*dst = PixelBlend16( *dst, argb, alpha );
*dst = packA | PixelBlend16( *dst, argb, alpha );
dst = (u16*) ( (u8*) dst + xInc ); // x += xInc
d += m;
@ -724,14 +726,16 @@ static void executeBlit_ColorAlpha_16_to_16( const SBlitJob * job )
{
u16 *dst = (u16*) job->dst;
const u32 alpha = extractAlpha( job->argb ) >> 3;
const u16 alpha = extractAlpha( job->argb ) >> 3;
if ( 0 == alpha )
return;
const u32 src = video::A8R8G8B8toA1R5G5B5( job->argb );
for ( s32 dy = 0; dy != job->height; ++dy )
{
for ( s32 dx = 0; dx != job->width; ++dx )
{
dst[dx] = PixelBlend16( dst[dx], src, alpha );
dst[dx] = 0x8000 | PixelBlend16( dst[dx], src, alpha );
}
dst = (u16*) ( (u8*) (dst) + job->dstPitch );
}
@ -750,7 +754,7 @@ static void executeBlit_ColorAlpha_32_to_32( const SBlitJob * job )
{
for ( s32 dx = 0; dx != job->width; ++dx )
{
dst[dx] = PixelBlend32( dst[dx], src, alpha );
dst[dx] = (job->argb & 0xFF000000 ) | PixelBlend32( dst[dx], src, alpha );
}
dst = (u32*) ( (u8*) (dst) + job->dstPitch );
}

View File

@ -182,17 +182,17 @@ REALINLINE u32 PixelBlend32 ( const u32 c2, const u32 c1, u32 alpha )
Pixel = dest * ( 1 - alpha ) + source * alpha
alpha [0;32]
*/
inline u16 PixelBlend16 ( const u16 c2, const u32 c1, const u32 alpha )
inline u16 PixelBlend16 ( const u16 c2, const u32 c1, const u16 alpha )
{
u32 srcRB = c1 & 0x7C1F;
u32 srcXG = c1 & 0x03E0;
u16 srcRB = c1 & 0x7C1F;
u16 srcXG = c1 & 0x03E0;
u32 dstRB = c2 & 0x7C1F;
u32 dstXG = c2 & 0x03E0;
u16 dstRB = c2 & 0x7C1F;
u16 dstXG = c2 & 0x03E0;
u32 rb = srcRB - dstRB;
u32 xg = srcXG - dstXG;
u16 rb = srcRB - dstRB;
u16 xg = srcXG - dstXG;
rb *= alpha;
xg *= alpha;
@ -230,14 +230,23 @@ inline u32 PixelLerp32 ( const u32 source, const u32 value )
}
/*
return alpha in [0;256] Granularity
add highbit alpha ( alpha > 127 ? + 1 )
return alpha in [0;256] Granularity rom 32-Bit ARGB
add highbit alpha ( alpha > 127 ? + 1 )
*/
inline u32 extractAlpha ( const u32 c )
{
return ( c >> 24 ) + ( c >> 31 );
}
/*
return alpha in [0;255] Granularity and 32-Bit ARGB
add highbit alpha ( alpha > 127 ? + 1 )
*/
inline u32 packAlpha ( const u32 c )
{
return (c > 127 ? c - 1 : c) << 24;
}
/*
Pixel = c0 * (c1/31). c0 Alpha retain
*/
@ -384,7 +393,7 @@ inline u32 PixelBlend32 ( const u32 c2, const u32 c1 )
rb &= 0x00FF00FF;
xg &= 0x0000FF00;
return rb | xg;
return (c1 & 0xFF000000) | rb | xg;
}