/// <summary>
        /// Start rendering full Animation.
        /// </summary>
        private void btnStart_Click(object sender, EventArgs e)
        {
            _pictureSize     = ParameterDict.Current.GetDouble("Animation.Size");
            _animationSmooth = ParameterDict.Current.GetBool("Animation.Smooth");
            _inAnimation     = true;
            ParameterInput.MainParameterInput.SetButtonsToStart();
            CreateAnimationSteps(tbAnimationDescription.Text);
            if (_animationSteps.Steps.Count == 0)
            {
                return;
            }
            btnStart.Enabled          = false;
            btnStop.Enabled           = true;
            btnStop.Visible           = true;
            _animationAbort           = false;
            lblAnimationProgress.Text = "run ...";
            // Prepare AnimationHistory
            ParameterHistory animationHistory = new ParameterHistory();

            for (int i = 0; i < _animationSteps.Steps.Count; i++)
            {
                AnimationPoint ap = _animationSteps.Steps[i];
                _dataPerTime.Load(ap.Time);
                ParameterDict.Current.SetDouble("View.Size", _pictureSize);
                animationHistory.Save();
            }
            // Compute each Animation frame.
            for (int i = 1; i < _animationSteps.Steps.Count; i++)
            {
                AnimationPoint ap1 = _animationSteps.Steps[i - 1];
                AnimationPoint ap2 = _animationSteps.Steps[i];
                ComputeAnimationPart(ap1.Time, ap2.Time, ap2.Steps, animationHistory, i - 1);
                if (_animationAbort)
                {
                    break;
                }
            }
            if (_animationSteps.Steps.Count > 0)
            {
                ComputeAnimationPart(_animationSteps.Steps[_animationSteps.Steps.Count - 1].Time, _animationSteps.Steps[_animationSteps.Steps.Count - 1].Time, 1, animationHistory, _animationSteps.Steps.Count - 1);
            }
            btnStop.Visible           = false;
            btnStart.Enabled          = true;
            lblAnimationProgress.Text = "ready";
            _animationAbort           = false;
            _inAnimation = false;
            ParameterInput.MainParameterInput.SetButtonsToStop();
        }
 /// <summary>
 /// Compute part of animation.
 /// </summary>
 private void ComputeAnimationPart(int from, int to, int steps, ParameterHistory animationHistory, int historyIndex)
 {
     lblAnimationProgress.Text = "compute: " + from.ToString() + " " + to.ToString();
     for (int i = 0; i < steps && !_animationAbort; i++)
     {
         lblAnimationProgress.Text = "compute: " + from.ToString() + " " + to.ToString() + " Step " + i.ToString() + " (from " + steps.ToString() + ")";
         double r = 1.0 / steps * (double)i;
         Application.DoEvents();
         if (_animationSmooth)
         {
             animationHistory.LoadSmoothed(r + historyIndex);
         }
         else
         {
             animationHistory.Load(r + historyIndex);
         }
         int updateSteps = ParameterDict.Current.GetInt("View.UpdateSteps");
         if (updateSteps <= 0)
         {
             updateSteps = 0;
         }
         if (updateSteps > 1)
         {
             ParameterDict.Current.SetInt("View.UpdateSteps", updateSteps - 1);
         }
         ResultImageView.PublicForm.SetPictureBoxSize();
         Fractrace.Scheduler.PaintJob paintJob = new Scheduler.PaintJob(ResultImageView.PublicForm, ResultImageView.PublicForm.GestaltPicture);
         _currentPaintJob = paintJob;
         paintJob.Run(updateSteps);
         ResultImageView.PublicForm.CallDrawImage();
         if (_stepPreviewControls.ContainsKey(from))
         {
             _stepPreviewControls[from].UpdateComputedStep(i);
         }
     }
 }
 /// <summary>
 /// Compute part of animation.
 /// </summary>
 private void ComputeAnimationPart(int from, int to, int steps, ParameterHistory animationHistory, int historyIndex)
 {
     lblAnimationProgress.Text = "compute: " + from.ToString() + " " + to.ToString();
     for (int i = 0; i < steps && !_animationAbort; i++)
     {
         lblAnimationProgress.Text = "compute: " + from.ToString() + " " + to.ToString() + " Step " + i.ToString() + " (from " + steps.ToString() + ")";
         double r = 1.0 / steps * (double)i;
         Application.DoEvents();
         if (_animationSmooth)
             animationHistory.LoadSmoothed(r + historyIndex);
         else
             animationHistory.Load(r + historyIndex);
         int updateSteps = ParameterDict.Current.GetInt("View.UpdateSteps");
         if (updateSteps <= 0)
             updateSteps = 0;
         if (updateSteps > 1)
             ParameterDict.Current.SetInt("View.UpdateSteps", updateSteps - 1);
         ResultImageView.PublicForm.SetPictureBoxSize();
         Fractrace.Scheduler.PaintJob paintJob = new Scheduler.PaintJob(ResultImageView.PublicForm, ResultImageView.PublicForm.GestaltPicture);
         _currentPaintJob = paintJob;
         paintJob.Run(updateSteps);
         ResultImageView.PublicForm.CallDrawImage();
         if (_stepPreviewControls.ContainsKey(from))
             _stepPreviewControls[from].UpdateComputedStep(i);
     }
 }