static unsafe void CopyOrBlend32_BasedOnAlphaAndCover(PixelBlenderBGRA recieveBlender, int[] destBuffer, int destArrayOffset, Color sourceColor, int cover) { if (cover == 255) { fixed(int *destAdd = &destBuffer[destArrayOffset]) { PixelBlenderBGRA.Blend32PixelInternal(destAdd, sourceColor); //CopyOrBlend32_BasedOnAlpha(recieveBlender, destBuffer, destArrayOffset, sourceColor); } } else { //if (sourceColor.m_A != 0) { #if false // we blend regardless of the alpha so that we can get Light Opacity working (used this way we have addative and faster blending in one blender) LBB if (sourceColor.m_A == base_mask) { Blender.CopyPixel(pDestBuffer, sourceColor); } else #endif fixed(int *destAdd = &destBuffer[destArrayOffset]) { PixelBlenderBGRA.Blend32PixelInternal(destAdd, sourceColor.NewFromChangeCoverage(cover)); //recieveBlender.BlendPixel(destBuffer, destArrayOffset, sourceColor.NewFromChangeCoverage(cover)); } } } }
public void BlendColorVSpan(int x, int y, int len, Color[] colors, int colorsIndex, byte[] covers, int coversIndex, bool firstCoverForAll) { //int bufferOffset = GetBufferOffsetXY(x, y); int bufferOffset32 = GetBufferOffsetXY32(x, y); int scanWidthBytes = System.Math.Abs(Stride); if (!firstCoverForAll) { unsafe { fixed(int *head = &raw_buffer32[0]) { int actualWidth = scanWidthBytes / 4; do { CopyOrBlend32_BasedOnAlphaAndCover(_recvBlender32, head, bufferOffset32, colors[colorsIndex], covers[coversIndex++]); //bufferOffset += actualWidth; bufferOffset32++; ++colorsIndex; }while (--len != 0); } } } else { if (covers[coversIndex] == 255) { unsafe { fixed(int *destH = &raw_buffer32[0]) { int *destBuffer = (int *)destH; int actualWidth = scanWidthBytes / 4; do { PixelBlenderBGRA.Blend32PixelInternal(destBuffer, colors[colorsIndex]); //CopyOrBlend32_BasedOnAlpha(_recvBlender32, m_ByteBuffer, bufferOffset, colors[colorsIndex]); //bufferOffset += scanWidthBytes; ++colorsIndex; destBuffer += actualWidth; }while (--len != 0); } } } else { unsafe { fixed(int *head = &raw_buffer32[0]) { int actualWidth = scanWidthBytes / 4; do { CopyOrBlend32_BasedOnAlphaAndCover(_recvBlender32, head, bufferOffset32, colors[colorsIndex], covers[coversIndex]); // bufferOffset += actualWidth; ++colorsIndex; }while (--len != 0); } } } } }