写给底层搬运工看的 : )
__forceinline void AlphaBlendPixel( ULONG& dst_bgra,ULONG src_bgra ){
register ULONG src_Alpha = ULongToBGRA(src_bgra)->Alpha;
if( src_Alpha <= 1 )return; // 完全透明的点就不需要处理了
if( src_Alpha >= 254 ){ dst_bgra = src_bgra; return; }
__m128i src_alpha, dst_alpha, _mZero = _mm_setzero_si128();
src_alpha.m128i_u16[0] = src_alpha.m128i_u16[1] = src_alpha.m128i_u16[2] = src_alpha.m128i_u16[3] = (USHORT)src_Alpha;
dst_alpha.m128i_u64[0] = 0xFF00FF00FF00FF;
dst_bgra = _mm_packus_epi16(
_mm_srl_epi16(
_mm_add_epi16(
_mm_mullo_epi16( _mm_unpacklo_epi8( _mm_cvtsi32_si128( dst_bgra ), _mZero), _mm_sub_epi16( dst_alpha, src_alpha ) ),
_mm_mullo_epi16( _mm_unpacklo_epi8( _mm_cvtsi32_si128( src_bgra ), _mZero), src_alpha )
),
_mm_cvtsi32_si128( 8 )
),
_mZero
).m128i_u32[0];
}
转载请注明出处。多谢.