private async void TransitionTimerTickAsync(object sender, EventArgs e)
        {
            TransitionTimer.Stop();

            if (progressBar.Value >= 1f)
            {
                progressBar.Value = 0d;
                EnableUI();
                return;
            }

            BlendingModes   blendingMode   = (BlendingModes)blendingMode_ComboBox.SelectedIndex;
            TransitionModes transitionMode = (TransitionModes)transitionMode_ComboBox.SelectedIndex;
            float           opacity        = Convert.ToSingle(opacity_Slider.Value);

            if (transitionMode == TransitionModes.NoTransition)
            {
                await Task.Run(() => Perform(blendingMode, transitionMode, opacity));

                progressBar.Value = 0d;
                EnableUI();
                return;
            }

            float previousPercentage = Convert.ToSingle(progressBar.Value);
            float percentage         = Convert.ToSingle(progressBar.Value += 0.025d);

            await Task.Run(() => Perform(blendingMode, transitionMode, opacity, previousPercentage, percentage));

            TransitionTimer.Start();
        }
        private void Perform(object sender, RoutedEventArgs e)
        {
            if (IsInitialized)
            {
                DisableUI();
                MyImageResult = MyImage1.Clone();

                TransitionModes transitionMode = (TransitionModes)transitionMode_ComboBox.SelectedIndex;

                if (transitionMode != TransitionModes.NoTransition)
                {
                    resultImage.Source = MyImageResult.WriteableBitmap;
                }
                TransitionTimer.Start();
            }
        }
Пример #3
0
        public void HardLight(MyImage myImage2, TransitionModes transitionMode = TransitionModes.NoTransition, float previousPercentage = 0f, float percentage = 1f)
        {
            if (IsBlendingCalculated)
            {
                return;
            }

            percentage         = Calculations.ClampToNormal(percentage);
            previousPercentage = Calculations.ClampToNormal(previousPercentage);

            InitBoundaries(previousPercentage, percentage,
                           out float previousLinearBoundaryX, out float linearBoundaryX, out float previousReversedLinearBoundaryX, out float reversedLinearBoundaryX,
                           out float previousLinearBoundaryY, out float linearBoundaryY, out float previousReversedLinearBoundaryY, out float reversedLinearBoundaryY,
                           out float previousRightHalfLinearBoundaryX, out float rightHalfLinearBoundaryX, out float previousLeftHalfLinearBoundaryX, out float leftHalfLinearBoundaryX,
                           out float previousLowerHalfLinearBoundaryY, out float lowerHalfLinearBoundaryY, out float previousHigherHalfLinearBoundaryY, out float higherHalfLinearBoundaryY,
                           out float previusRadiusBoundary, out float radiusBoundary);

            int[] nums = Enumerable.Range(0, ByteArray.PrimitiveArray.Length / Channels).Select(i => i * Channels).ToArray();
            Parallel.ForEach(nums, i =>
            {
                Point coordinates = ByteArray.GetCoordinates(i);

                bool isValid = ValidateBoundaries(coordinates, transitionMode,
                                                  previousLinearBoundaryX, linearBoundaryX, previousReversedLinearBoundaryX, reversedLinearBoundaryX,
                                                  previousLinearBoundaryY, linearBoundaryY, previousReversedLinearBoundaryY, reversedLinearBoundaryY,
                                                  previousLeftHalfLinearBoundaryX, leftHalfLinearBoundaryX, previousRightHalfLinearBoundaryX, rightHalfLinearBoundaryX,
                                                  previousHigherHalfLinearBoundaryY, higherHalfLinearBoundaryY, previousLowerHalfLinearBoundaryY, lowerHalfLinearBoundaryY,
                                                  previusRadiusBoundary, radiusBoundary);

                if (!isValid)
                {
                    return;
                }
                ;

                for (int channel = 0; channel < Channels; channel++)
                {
                    ByteArray.PrimitiveArray[i + channel] = Calculations.ClampToByte(Blending.HardLight(ByteArray.PrimitiveArray[i + channel], myImage2.ByteArray.PrimitiveArray[i + channel]));
                }
            });

            WriteableBitmap writeableBitmap = new WriteableBitmap(BitmapSource.Create(Width, Height, 96, 96, PixelFormats.Bgr32, null, ByteArray.PrimitiveArray, ByteArray.Stride));

            WriteableBitmap = writeableBitmap;
        }
        private void Perform(BlendingModes blendingMode, TransitionModes transitionMode, float opacity, float previousPercentage = 0f, float percentage = 1f)
        {
            switch (blendingMode)
            {
            case BlendingModes.Opacity:
                MyImageResult.Opacity(MyImage2, opacity, transitionMode, previousPercentage, percentage);
                break;

            case BlendingModes.Darken:
                MyImageResult.Darken(MyImage2, transitionMode, previousPercentage, percentage);
                break;

            case BlendingModes.Multiply:
                MyImageResult.Multiply(MyImage2, transitionMode, previousPercentage, percentage);
                break;

            case BlendingModes.Lighten:
                MyImageResult.Lighten(MyImage2, transitionMode, previousPercentage, percentage);
                break;

            case BlendingModes.Screen:
                MyImageResult.Screen(MyImage2, transitionMode, previousPercentage, percentage);
                break;

            case BlendingModes.ColorBurn:
                MyImageResult.ColorBurn(MyImage2, transitionMode, previousPercentage, percentage);
                break;

            case BlendingModes.LinearBurn:
                MyImageResult.LinearBurn(MyImage2, transitionMode, previousPercentage, percentage);
                break;

            case BlendingModes.ColorDodge:
                MyImageResult.ColorDodge(MyImage2, transitionMode, previousPercentage, percentage);
                break;

            case BlendingModes.LinearDodge:
                MyImageResult.LinearDodge(MyImage2, transitionMode, previousPercentage, percentage);
                break;

            case BlendingModes.Overlay:
                MyImageResult.Overlay(MyImage2, transitionMode, previousPercentage, percentage);
                break;

            case BlendingModes.SoftLight:
                MyImageResult.SoftLight(MyImage2, transitionMode, previousPercentage, percentage);
                break;

            case BlendingModes.HardLight:
                MyImageResult.HardLight(MyImage2, transitionMode, previousPercentage, percentage);
                break;

            case BlendingModes.Difference:
                MyImageResult.Difference(MyImage2, transitionMode, previousPercentage, percentage);
                break;
            }

            WriteableBitmap writeableBitmap;

            if (transitionMode == TransitionModes.Fade)
            {
                writeableBitmap = MyImageResult.Fade(MyImage1, percentage);
            }
            else
            {
                writeableBitmap = MyImageResult.WriteableBitmap.Clone();
                writeableBitmap.Freeze();
            }

            Dispatcher.Invoke(() =>
            {
                resultImage.Source = writeableBitmap;
            });
        }
Пример #5
0
        private bool ValidateBoundaries(Point coordinates, TransitionModes transitionMode,
                                        float previousLinearBoundaryX, float linearBoundaryX, float previousReversedLinearBoundaryX, float reversedLinearBoundaryX,
                                        float previousLinearBoundaryY, float linearBoundaryY, float previousReversedLinearBoundaryY, float reversedLinearBoundaryY,
                                        float previousLeftHalfLinearBoundaryX, float leftHalfLinearBoundaryX, float previousRightHalfLinearBoundaryX, float rightHalfLinearBoundaryX,
                                        float previousHigherHalfLinearBoundaryY, float higherHalfLinearBoundaryY, float previousLowerHalfLinearBoundaryY, float lowerHalfLinearBoundaryY,
                                        float previusRadiusBoundary, float radiusBoundary)
        {
            bool isValid = true;

            switch (transitionMode)
            {
            case TransitionModes.NoTransition:
                break;

            case TransitionModes.WipeLeftToRight:
                if (coordinates.X < previousLinearBoundaryX || coordinates.X >= linearBoundaryX)
                {
                    isValid = false;
                }
                break;

            case TransitionModes.WipeRightToLeft:
                if (coordinates.X >= previousReversedLinearBoundaryX || coordinates.X < reversedLinearBoundaryX)
                {
                    isValid = false;
                }
                break;

            case TransitionModes.WipeTopToBottom:
                if (coordinates.Y < previousLinearBoundaryY || coordinates.Y >= linearBoundaryY)
                {
                    isValid = false;
                }
                break;

            case TransitionModes.WipeBottomToTop:
                if (coordinates.Y >= previousReversedLinearBoundaryY || coordinates.Y < reversedLinearBoundaryY)
                {
                    isValid = false;
                }
                break;

            case TransitionModes.HorizontalSplit:
                if (coordinates.Y < higherHalfLinearBoundaryY ||
                    (previousLowerHalfLinearBoundaryY != previousHigherHalfLinearBoundaryY &&
                     coordinates.Y >= previousHigherHalfLinearBoundaryY &&
                     coordinates.Y <= previousLowerHalfLinearBoundaryY) ||
                    coordinates.Y > lowerHalfLinearBoundaryY)
                {
                    isValid = false;
                }
                break;

            case TransitionModes.VerticalSplit:
                if (coordinates.X < leftHalfLinearBoundaryX ||
                    (previousLeftHalfLinearBoundaryX != previousRightHalfLinearBoundaryX &&
                     coordinates.X >= previousLeftHalfLinearBoundaryX &&
                     coordinates.X <= previousRightHalfLinearBoundaryX) ||
                    coordinates.X > rightHalfLinearBoundaryX)
                {
                    isValid = false;
                }
                break;

            case TransitionModes.Fade:
                IsBlendingCalculated = true;
                break;

            case TransitionModes.Rectangle:
                if (coordinates.Y < higherHalfLinearBoundaryY ||
                    coordinates.Y >= lowerHalfLinearBoundaryY ||
                    coordinates.X < leftHalfLinearBoundaryX ||
                    coordinates.X >= rightHalfLinearBoundaryX ||
                    ((previousLowerHalfLinearBoundaryY != previousHigherHalfLinearBoundaryY ||
                      previousLeftHalfLinearBoundaryX != previousRightHalfLinearBoundaryX) &&
                     coordinates.Y >= previousHigherHalfLinearBoundaryY &&
                     coordinates.Y < previousLowerHalfLinearBoundaryY &&
                     coordinates.X >= previousLeftHalfLinearBoundaryX &&
                     coordinates.X < previousRightHalfLinearBoundaryX
                    ))
                {
                    isValid = false;
                }
                break;

            case TransitionModes.Circle:
                double radius = Math.Sqrt(Math.Pow(coordinates.X - Convert.ToDouble(Width / 2), 2) + Math.Pow(coordinates.Y - Convert.ToDouble(Height / 2), 2));
                if (radius < previusRadiusBoundary || radius >= radiusBoundary)
                {
                    isValid = false;
                }
                break;
            }

            return(isValid);
        }