/// <summary> /// Смешивает последовательность пикселей. /// </summary> /// <param name="span">Последовательность пикселей</param> public void BlendSpan(PixelSpan span) { int shift = _width * span.Y + span.X; Int32[] spanPixels = span.PixelValues; int length = spanPixels.Length; int shiftIncrement = 1; if (span.Orientation == Orientation.Vertical) { shiftIncrement = _width; } for (int i = 0; i < length; i++) { Int32 pixelData = spanPixels[i]; byte alpha = (byte)(pixelData >> 24 & 0xFF); if (alpha == 255) { _buffer[shift] = pixelData; shift += shiftIncrement; continue; } // целесообразность проверки под вопросом if (alpha == 0) { shift += shiftIncrement; continue; } Int32 oldPixelData = _buffer[shift]; byte oldAlpha = (byte)((oldPixelData >> 24 & 0xFF)); if (oldAlpha == 0) { _buffer[shift] = pixelData; shift += shiftIncrement; continue; } byte newAlpha = (byte)(alpha + oldAlpha - alpha * oldAlpha / 255f); float a1 = alpha / 255f; float a0 = (1 - a1) * oldAlpha / 255f; a0 = a0 / (a1 + a0); a1 = 1 - a0; Int32 b1 = newAlpha << 24; Int32 b2 = (byte)((oldPixelData >> 16 & 0xFF) * a0 + (pixelData >> 16 & 0xFF) * a1) << 16; Int32 b3 = (byte)((oldPixelData >> 8 & 0xFF) * a0 + (pixelData >> 8 & 0xFF) * a1) << 8; Int32 b4 = (byte)((oldPixelData & 0xFF) * a0 + (pixelData & 0xFF) * a1); _buffer[shift] = b1 | b2 | b3 | b4; shift += shiftIncrement; } }
/// <summary> /// Записывает в буфер последовательность пикселей. /// </summary> /// <param name="span">Последовательность пикселей</param> public void SetSpan(PixelSpan span) { int shift = _width * span.Y + span.X; Int32[] pixels = span.PixelValues; int length = pixels.Length; int shiftIncrement = 1; if (span.Orientation == Orientation.Vertical) { shiftIncrement = _width; } for (int i = 0; i < length; i++) { _buffer[shift] = pixels[i]; shift += shiftIncrement; } }
/// <summary> /// Смешивает последовательность пикселей. /// </summary> /// <param name="span">Последовательность пикселей</param> public void BlendSpan(PixelSpan span) { int shift = _width * span.Y + span.X; Int32[] spanPixels = span.PixelValues; int length = spanPixels.Length; int shiftIncrement = 1; if (span.Orientation == Orientation.Vertical) shiftIncrement = _width; for (int i = 0; i < length; i++) { Int32 pixelData = spanPixels[i]; byte alpha = (byte)(pixelData >> 24 & 0xFF); if (alpha == 255) { _buffer[shift] = pixelData; shift += shiftIncrement; continue; } // целесообразность проверки под вопросом if (alpha == 0) { shift += shiftIncrement; continue; } Int32 oldPixelData = _buffer[shift]; byte oldAlpha = (byte)((oldPixelData >> 24 & 0xFF)); if (oldAlpha == 0) { _buffer[shift] = pixelData; shift += shiftIncrement; continue; } byte newAlpha = (byte)(alpha + oldAlpha - alpha * oldAlpha / 255f); float a1 = alpha / 255f; float a0 = (1 - a1) * oldAlpha / 255f; a0 = a0 / (a1 + a0); a1 = 1 - a0; Int32 b1 = newAlpha << 24; Int32 b2 = (byte)((oldPixelData >> 16 & 0xFF) * a0 + (pixelData >> 16 & 0xFF) * a1) << 16; Int32 b3 = (byte)((oldPixelData >> 8 & 0xFF) * a0 + (pixelData >> 8 & 0xFF) * a1) << 8; Int32 b4 = (byte)((oldPixelData & 0xFF) * a0 + (pixelData & 0xFF) * a1); _buffer[shift] = b1 | b2 | b3 | b4; shift += shiftIncrement; } }
/// <summary> /// Записывает в буфер последовательность пикселей. /// </summary> /// <param name="span">Последовательность пикселей</param> public void SetSpan(PixelSpan span) { int shift = _width * span.Y + span.X; Int32[] pixels = span.PixelValues; int length = pixels.Length; int shiftIncrement = 1; if (span.Orientation == Orientation.Vertical) shiftIncrement = _width; for (int i = 0; i < length; i++) { _buffer[shift] = pixels[i]; shift += shiftIncrement; } }