// blit an RGBX img void BlitMatteRGBX8Keyed( Img const& srcimg, Box const& srcbox, Img& destimg, Box& destbox, RGBX8 transparent, PenColour const& matte ) { assert(srcimg.Fmt()==FMT_RGBX8); Box destclipped( destbox ); Box srcclipped( srcbox ); clip_blit( srcimg.Bounds(), srcclipped, destimg.Bounds(), destclipped ); const int w = destclipped.w; int y; for( y=0; y<destclipped.h; ++y ) { RGBX8 const* src = srcimg.PtrConst_RGBX8( srcclipped.x+0, srcclipped.y+y ); switch(destimg.Fmt()) { case FMT_I8: scan_matte_RGBX8_I8_keyed(src, destimg.Ptr_I8(destclipped.x+0,destclipped.y+y), w, transparent, matte.idx()); break; case FMT_RGBX8: scan_matte_RGBX8_RGBX8_keyed(src, destimg.Ptr_RGBX8(destclipped.x+0,destclipped.y+y), w, transparent, matte.rgb()); break; case FMT_RGBA8: scan_matte_RGBX8_RGBA8_keyed(src, destimg.Ptr_RGBA8(destclipped.x+0,destclipped.y+y), w, transparent, matte.rgb()); break; default: assert(false); break; } } destbox = destclipped; }
void Blit( Img const& srcimg, Box const& srcbox, Img& destimg, Box& destbox) { assert( srcimg.Fmt() == destimg.Fmt()); Box destclipped( destbox ); Box srcclipped( srcbox ); clip_blit( srcimg.Bounds(), srcclipped, destimg.Bounds(), destclipped ); int y; for( y=0; y<destclipped.h; ++y ) { switch(srcimg.Fmt()) { case FMT_I8: { I8 const* src = srcimg.PtrConst_I8( srcclipped.x+0, srcclipped.y+y ); I8* dest = destimg.Ptr_I8( destclipped.x+0, destclipped.y+y ); std::copy( src,src+destclipped.w, dest); } break; case FMT_RGBX8: { RGBX8 const* src = srcimg.PtrConst_RGBX8( srcclipped.x+0, srcclipped.y+y ); RGBX8* dest = destimg.Ptr_RGBX8( destclipped.x+0, destclipped.y+y ); std::copy( src,src+destclipped.w, dest); } break; case FMT_RGBA8: { RGBA8 const* src = srcimg.PtrConst_RGBA8( srcclipped.x+0, srcclipped.y+y ); RGBA8* dest = destimg.Ptr_RGBA8( destclipped.x+0, destclipped.y+y ); std::copy( src,src+destclipped.w, dest); } break; default: assert(false); break; } } destbox = destclipped; }