Example #1
0
        /// <summary>
        /// Performs the given action on the source image.
        /// </summary>
        /// <typeparam name="T">The pixel format.</typeparam>
        /// <typeparam name="TP">The packed format. <example>long, float.</example></typeparam>
        /// <param name="source">The image to perform the action against.</param>
        /// <param name="clone">Whether to clone the image.</param>
        /// <param name="action">The <see cref="Action"/> to perform against the image.</param>
        /// <returns>The <see cref="Image{T, TP}"/>.</returns>
        private static Image <T, TP> PerformAction <T, TP>(Image <T, TP> source, bool clone, Action <ImageBase <T, TP>, ImageBase <T, TP> > action)
            where T : IPackedVector <TP>
            where TP : struct
        {
            Image <T, TP> transformedImage = clone
                ? new Image <T, TP>(source)
                : new Image <T, TP>();

            // Several properties still require copying
            if (!clone)
            {
                transformedImage.CopyProperties(source);
            }

            action(source, transformedImage);

            for (int i = 0; i < source.Frames.Count; i++)
            {
                ImageFrame <T, TP> sourceFrame     = source.Frames[i];
                ImageFrame <T, TP> tranformedFrame = clone
                    ? new ImageFrame <T, TP>(sourceFrame)
                    : new ImageFrame <T, TP> {
                    FrameDelay = sourceFrame.FrameDelay
                };

                action(sourceFrame, tranformedFrame);

                if (!clone)
                {
                    transformedImage.Frames.Add(tranformedFrame);
                }
                else
                {
                    transformedImage.Frames[i] = tranformedFrame;
                }
            }

            source = transformedImage;
            return(source);
        }