Горизонтальная или вертикальная последовательность пикселей.
Пример #1
0
        /// <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;
            }
        }
Пример #2
0
        /// <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;
            }
        }
Пример #3
0
        /// <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;
            }
        }
Пример #4
0
        /// <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;
            }
        }