//-------------------------------------------------------------------- public void BlendHorizontalLine(int x1, int y, int x2, RGBA_Bytes c, byte cover) { if (c.m_A != 0) { unsafe { int len = x2 - x1 + 1; byte *p = (byte *)_rasterBuffer.GetPixelPointer(y) + x1 * 3; uint alpha = (uint)(((int)(c.A_Byte) * (cover + 1)) >> 8); if (alpha == BaseMask) { byte cr = c.m_R; byte cg = c.m_G; byte cb = c.m_B; do { p[_orderR] = cr; p[_orderG] = cg; p[_orderB] = cb; p += 3; }while (--len != 0); } else { if (cover == 255) { do { _blender.BlendPixel(p, c.m_R, c.m_G, c.m_B, alpha); p += 3; }while (--len != 0); } else { do { #if USE_BLENDER m_Blender.blend_pix(p, c.m_R, c.m_G, c.m_B, alpha); #else unchecked { uint b = p[0]; uint g = p[1]; uint r = p[2]; uint a = p[3]; p[0] = (byte)(((c.m_B - b) * alpha + (b << RGBA_Bytes.BaseShift)) >> RGBA_Bytes.BaseShift); p[1] = (byte)(((c.m_G - g) * alpha + (g << RGBA_Bytes.BaseShift)) >> RGBA_Bytes.BaseShift); p[2] = (byte)(((c.m_R - r) * alpha + (r << RGBA_Bytes.BaseShift)) >> RGBA_Bytes.BaseShift); p[3] = (byte)((alpha + a) - ((alpha * a + BaseMask) >> RGBA_Bytes.BaseShift)); } #endif p += 3; }while (--len != 0); } } } } }
///<summary> ///</summary> ///<param name="blender"></param> ///<param name="p"></param> ///<param name="cr"></param> ///<param name="cg"></param> ///<param name="cb"></param> ///<param name="alpha"></param> ///<param name="cover"></param> public unsafe static void CopyOrBlendPixel(IBlender blender, byte *p, uint cr, uint cg, uint cb, uint alpha, uint cover) { if (blender == null) { throw new ArgumentNullException("Blender"); } if (cover == 255) { CopyOrBlendPixel(blender, p, cr, cg, cb, alpha); } else { if (alpha != 0) { alpha = (alpha * (cover + 1)) >> 8; if (alpha == BaseMask) { p[(int)Order.R] = (byte)cr; p[(int)Order.G] = (byte)cg; p[(int)Order.B] = (byte)cb; } else { blender.BlendPixel(p, cr, cg, cb, alpha, cover); } } } }
///<summary> ///</summary> ///<param name="blender"></param> ///<param name="p"></param> ///<param name="cr"></param> ///<param name="cg"></param> ///<param name="cb"></param> ///<param name="alpha"></param> public unsafe static void CopyOrBlendPixel(IBlender blender, byte *p, uint cr, uint cg, uint cb, uint alpha) { if (blender == null) { throw new ArgumentNullException("blender"); } if (alpha == 0) { return; } if (alpha == BaseMask) { p[(int)Order.R] = (byte)cr; p[(int)Order.G] = (byte)cg; p[(int)Order.B] = (byte)cb; } else { blender.BlendPixel(p, cr, cg, cb, alpha); } }
//-------------------------------------------------------------------- public unsafe static void CopyOrBlendPixel(IBlender Blender, byte* p, uint cr, uint cg, uint cb, uint alpha, uint cover) { if (cover == 255) { CopyOrBlendPixel(Blender, p, cr, cg, cb, alpha); } else { if (alpha != 0) { alpha = (alpha * (cover + 1)) >> 8; if (alpha == base_mask) { p[(int)Order.R] = (byte)cr; p[(int)Order.G] = (byte)cg; p[(int)Order.B] = (byte)cb; p[(int)Order.A] = (byte)base_mask; } else { Blender.BlendPixel(p, cr, cg, cb, alpha, cover); } } } }
//-------------------------------------------------------------------- public unsafe static void CopyOrBlendPixel(IBlender Blender, byte* p, uint cr, uint cg, uint cb, uint alpha) { if (alpha != 0) { if (alpha == base_mask) { p[(int)Order.R] = (byte)cr; p[(int)Order.G] = (byte)cg; p[(int)Order.B] = (byte)cb; p[(int)Order.A] = (byte)base_mask; } else { Blender.BlendPixel(p, cr, cg, cb, alpha); } } }
///<summary> ///</summary> ///<param name="blender"></param> ///<param name="p"></param> ///<param name="cr"></param> ///<param name="cg"></param> ///<param name="cb"></param> ///<param name="alpha"></param> ///<param name="cover"></param> public static unsafe void CopyOrBlendPixel(IBlender blender, byte* p, uint cr, uint cg, uint cb, uint alpha, uint cover) { if (blender == null) throw new ArgumentNullException("Blender"); if (cover == 255) { CopyOrBlendPixel(blender, p, cr, cg, cb, alpha); } else { if (alpha != 0) { alpha = (alpha * (cover + 1)) >> 8; if (alpha == BaseMask) { p[(int)Order.R] = (byte)cr; p[(int)Order.G] = (byte)cg; p[(int)Order.B] = (byte)cb; } else { blender.BlendPixel(p, cr, cg, cb, alpha, cover); } } } }
///<summary> ///</summary> ///<param name="blender"></param> ///<param name="p"></param> ///<param name="cr"></param> ///<param name="cg"></param> ///<param name="cb"></param> ///<param name="alpha"></param> public static unsafe void CopyOrBlendPixel(IBlender blender, byte* p, uint cr, uint cg, uint cb, uint alpha) { if (blender == null) throw new ArgumentNullException("blender"); if (alpha == 0) return; if (alpha == BaseMask) { p[(int)Order.R] = (byte)cr; p[(int)Order.G] = (byte)cg; p[(int)Order.B] = (byte)cb; } else { blender.BlendPixel(p, cr, cg, cb, alpha); } }