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);
                        }
                    }
                }
            }
        }