public override void Execute()
        {
            if (models.NumEnabled != 2)
            {
                models.Window.ShowErrorDialog("Exactly two image equations should be visible for gif exporting.");
                return;
            }

            var ids = models.GetEnabledPipelines();
            // images valid?
            var img1 = models.Pipelines[ids[0]].Image;
            var img2 = models.Pipelines[ids[1]].Image;

            if (img1 == null)
            {
                return;
            }
            if (img2 == null)
            {
                return;
            }

            // ReSharper disable once CompareOfFloatsByEqualityOperator
            if (models.Display.Multiplier != 1.0f)
            {
                models.Window.ShowErrorDialog("This mode only works with multiplier = 1.0 at the moment...");
                return;
            }

            var sfd = new SaveFileDialog
            {
                Filter = "Graphics Interchange Format (*.gif)|*.gif",
                // TODO set export directory
                // TODO set filename
            };

            if (sfd.ShowDialog(models.Window.TopmostWindow) != true)
            {
                return;
            }

            var dia = new GifExportDialog(viewModel);

            if (models.Window.ShowDialog(dia) != true)
            {
                return;
            }

            throw new NotImplementedException();

            /*models.Gif.CreateGif(img1, img2, new GifModel.Config
             * {
             *  Filename = sfd.FileName,
             *  FramesPerSecond = viewModel.FramesPerSecond,
             *  SliderWidth = viewModel.SliderSize,
             *  NumSeconds = viewModel.TotalSeconds
             * });*/
        }
Exemplo n.º 2
0
        public override async void Execute()
        {
            if (models.NumEnabled != 2)
            {
                models.Window.ShowErrorDialog("Exactly two image equations should be visible for exporting");
                return;
            }

            if (models.Images.ImageType != typeof(TextureArray2D))
            {
                models.Window.ShowErrorDialog("Only 2D textures are supported");
                return;
            }

            if (!FFMpeg.IsAvailable())
            {
                if (models.Window.ShowYesNoDialog("ffmpeg is required for this feature. " +
                                                  "Please download the ffmpeg binaries and place them in the ImageViewer root directory. " +
                                                  "Open ffmpeg download page and ImageViewer root?", "download ffmpeg?"))
                {
                    var root = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
                    if (root != null)
                    {
                        System.Diagnostics.Process.Start(root);
                    }
                    System.Diagnostics.Process.Start("https://www.ffmpeg.org/download.html");
                }
                return;
            }

            var ids = models.GetEnabledPipelines();
            // images valid?
            var img1 = models.Pipelines[ids[0]].Image;
            var img2 = models.Pipelines[ids[1]].Image;

            if (img1 == null)
            {
                return;
            }
            if (img2 == null)
            {
                return;
            }

            // ReSharper disable once CompareOfFloatsByEqualityOperator
            if (models.Display.Multiplier != 1.0f)
            {
                models.Window.ShowInfoDialog("Export will ignore image multiplier");
            }

            path.InitFromEquations(models);

            var sfd = new SaveFileDialog
            {
                Filter           = "MPEG-4 (*.mp4)|*.mp4",
                InitialDirectory = path.Directory,
                FileName         = path.Filename
            };

            if (sfd.ShowDialog(models.Window.TopmostWindow) != true)
            {
                return;
            }

            path.UpdateFromFilename(sfd.FileName, updateExtension: false);

            viewModel.InitTitles(models);
            var dia = new GifExportDialog(viewModel);

            if (models.Window.ShowDialog(dia) != true)
            {
                return;
            }

            // get tmp directory
            var tmpDir = Path.Combine(Path.GetTempPath(), Path.GetFileNameWithoutExtension(Path.GetTempFileName()));

            System.IO.Directory.CreateDirectory(tmpDir);
            var tmpName = tmpDir + "\\frame";

            // delete old file if it existed (otherwise ffmpeg will hang)
            System.IO.File.Delete(sfd.FileName);

            GifModel.Config config = new GifModel.Config
            {
                Filename        = sfd.FileName,
                TmpFilename     = tmpName,
                FramesPerSecond = viewModel.FramesPerSecond,
                SliderWidth     = viewModel.SliderSize,
                NumSeconds      = viewModel.TotalSeconds,
                Label1          = viewModel.Title1,
                Label2          = viewModel.Title2,
                Left            = (TextureArray2D)img1,
                Right           = (TextureArray2D)img2,
                Overlay         = (TextureArray2D)models.Overlay.Overlay
            };

            models.Gif.CreateGif(config, models.SharedModel);

            await models.Progress.WaitForTaskAsync();

            // delete tmp directory
            try
            {
                System.IO.Directory.Delete(tmpDir, true);
            }
            catch (Exception)
            {
                // ignored
            }

            if (models.Progress.LastTaskCancelledByUser)
            {
                return;
            }

            if (!String.IsNullOrEmpty(models.Progress.LastError))
            {
                models.Window.ShowErrorDialog(models.Progress.LastError);
            }
            else if (askForVideo)
            {
                askForVideo = models.Window.ShowYesNoDialog("Open video?", "Finished exporting");
                if (askForVideo)
                {
                    System.Diagnostics.Process.Start(config.Filename);
                }
            }
        }
        /// <summary>
        /// draws the active view
        /// </summary>
        /// <param name="size">actual size in pixel, not dpi independent size</param>
        public void Repaint(Size size)
        {
            var dev = Device.Get();

            var visible = models.GetEnabledPipelines();

            var scissorsPos = new Point(mousePosition.X, mousePosition.Y);

            if (visible.Count < 2)
            {
                fixedMousePosition = null;
            }
            if (fixedMousePosition != null)
            {
                scissorsPos = new Point(fixedMousePosition.Value.X, fixedMousePosition.Value.Y);
            }

            if (visible.Count == 1)
            {
                // draw single image
                currentView.Draw(models.Pipelines[visible[0]].Image);
            }
            else if (visible.Count == 2)
            {
                // draw two images in split view

                scissorsPos.X = Math.Min(size.Width - 1, Math.Max(0, scissorsPos.X));
                scissorsPos.Y = Math.Min(size.Height - 1, Math.Max(0, scissorsPos.Y));

                if (models.Display.Split == DisplayModel.SplitMode.Vertical)
                {
                    dev.Rasterizer.SetScissorRectangle(0, 0, scissorsPos.X, size.Height);
                }
                else
                {
                    dev.Rasterizer.SetScissorRectangle(0, 0, size.Width, scissorsPos.Y);
                }

                // first image
                currentView.Draw(models.Pipelines[visible[0]].Image);

                if (models.Display.Split == DisplayModel.SplitMode.Vertical)
                {
                    dev.Rasterizer.SetScissorRectangle(scissorsPos.X, 0, size.Width, size.Height);
                }
                else
                {
                    dev.Rasterizer.SetScissorRectangle(0, scissorsPos.Y, size.Width, size.Height);
                }

                // second image
                currentView.Draw(models.Pipelines[visible[1]].Image);
            }
            else if (visible.Count == 3 || visible.Count == 4)
            {
                scissorsPos.X = Math.Min(size.Width - 1, Math.Max(0, scissorsPos.X));
                scissorsPos.Y = Math.Min(size.Height - 1, Math.Max(0, scissorsPos.Y));

                // upper left
                dev.Rasterizer.SetScissorRectangle(0, 0, scissorsPos.X, scissorsPos.Y);
                currentView.Draw(models.Pipelines[visible[0]].Image);

                // upper right
                dev.Rasterizer.SetScissorRectangle(scissorsPos.X, 0, size.Width, scissorsPos.Y);
                currentView.Draw(models.Pipelines[visible[1]].Image);

                // draw third texture (entire bottom if only 3 are visible, lower left if 4 are visible)
                dev.Rasterizer.SetScissorRectangle(0, scissorsPos.Y, visible.Count == 3 ? size.Width : scissorsPos.X, size.Height);
                currentView.Draw(models.Pipelines[visible[2]].Image);

                if (visible.Count == 4)
                {
                    dev.Rasterizer.SetScissorRectangle(scissorsPos.X, scissorsPos.Y, size.Width, size.Height);
                    currentView.Draw(models.Pipelines[visible[3]].Image);
                }
            }
        }
Exemplo n.º 4
0
        public override void Execute()
        {
            if (models.NumEnabled != 2)
            {
                models.Window.ShowErrorDialog("Exactly two image equations should be visible for exporting");
                return;
            }

            if (models.Images.ImageType != typeof(TextureArray2D))
            {
                models.Window.ShowErrorDialog("Only 2D textures are supported");
                return;
            }

            if (!FFMpeg.IsAvailable())
            {
                models.Window.ShowErrorDialog("ffmpeg is required for this feature. Please download the ffmpeg binaries and place them in the ImageViewer root directory");
                return;
            }

            var ids = models.GetEnabledPipelines();
            // images valid?
            var img1 = models.Pipelines[ids[0]].Image;
            var img2 = models.Pipelines[ids[1]].Image;

            if (img1 == null)
            {
                return;
            }
            if (img2 == null)
            {
                return;
            }

            // ReSharper disable once CompareOfFloatsByEqualityOperator
            if (models.Display.Multiplier != 1.0f)
            {
                models.Window.ShowInfoDialog("Export will ignore image multiplier");
            }

            // export directory fallback
            var firstImageId = models.Pipelines[ids[0]].Color.FirstImageId;
            var firstImage   = models.Images.Images[firstImageId].Filename;

            var sfd = new SaveFileDialog
            {
                Filter           = "MPEG-4 (*.mp4)|*.mp4",
                InitialDirectory = ExportCommand.GetExportDirectory(firstImage),
                FileName         = System.IO.Path.GetFileNameWithoutExtension(firstImage)
            };

            if (sfd.ShowDialog(models.Window.TopmostWindow) != true)
            {
                return;
            }

            ExportCommand.SetExportDirectory(System.IO.Path.GetDirectoryName(sfd.FileName));

            var dia = new GifExportDialog(viewModel);

            if (models.Window.ShowDialog(dia) != true)
            {
                return;
            }

            // get tmp directory
            var tmpDir = Path.Combine(Path.GetTempPath(), Path.GetFileNameWithoutExtension(Path.GetTempFileName()));

            System.IO.Directory.CreateDirectory(tmpDir);
            var tmpName = tmpDir + "\\frame";

            // delete old file if it existed (otherwise ffmpeg will hang)
            System.IO.File.Delete(sfd.FileName);

            models.Gif.CreateGif((TextureArray2D)img1, (TextureArray2D)img2, new GifModel.Config
            {
                Filename        = sfd.FileName,
                TmpFilename     = tmpName,
                FramesPerSecond = viewModel.FramesPerSecond,
                SliderWidth     = viewModel.SliderSize,
                NumSeconds      = viewModel.TotalSeconds
            });
        }