/// <summary> /// The get picture settings. /// </summary> /// <returns> /// The <see cref="PictureSize.PictureSettingsJob"/>. /// </returns> private PictureSize.PictureSettingsJob GetPictureSettings(ChangedPictureField changedField) { PictureSize.PictureSettingsJob job = new PictureSize.PictureSettingsJob { Width = this.Width, Height = this.Height, ItuPar = false, Modulus = this.SelectedModulus, ParW = this.ParWidth, ParH = this.ParHeight, MaxWidth = this.MaxWidth, MaxHeight = this.MaxHeight, KeepDisplayAspect = this.MaintainAspectRatio, AnamorphicMode = this.SelectedAnamorphicMode, Crop = new Cropping(this.CropTop, this.CropBottom, this.CropLeft, this.CropRight), }; if (this.SelectedAnamorphicMode == Anamorphic.Custom) { if (changedField == ChangedPictureField.DisplayWidth) { var displayWidth = this.DisplayWidth; job.ParW = (int)displayWidth; // num job.ParH = job.Width; // den } } // Reduce the Par W/H if we can. Don't do it while the user is altering the PAR controls through as it will mess with the result. if (changedField != ChangedPictureField.ParH && changedField != ChangedPictureField.ParW) { long x, y; HandBrakeUtils.Reduce(job.ParW, job.ParH, out x, out y); job.ParW = (int)y; job.ParH = (int)x; } return(job); }
/// <summary> /// Recalculate the picture settings when the user changes a particular field defined in the ChangedPictureField enum. /// The properties in this class are dumb. They simply call this method if there is a change. /// It is the job of this method to update all affected private fields and raise change notifications. /// </summary> /// <param name="changedField"> /// The changed field. /// </param> private void RecaulcatePictureSettingsProperties(ChangedPictureField changedField) { // Sanity Check if (this.currentTitle == null) { return; } // Step 1, Update what controls are visible. this.UpdateVisibileControls(); // Step 2, Set sensible defaults if (changedField == ChangedPictureField.Anamorphic && (this.SelectedAnamorphicMode == Anamorphic.None || this.SelectedAnamorphicMode == Anamorphic.Loose)) { this.Task.Width = this.sourceResolution.Width > this.MaxWidth ? this.MaxWidth : this.sourceResolution.Width; this.Task.KeepDisplayAspect = true; } // Choose which setting to keep. PictureSize.KeepSetting setting = PictureSize.KeepSetting.HB_KEEP_WIDTH; switch (changedField) { case ChangedPictureField.Width: setting = PictureSize.KeepSetting.HB_KEEP_WIDTH; break; case ChangedPictureField.Height: setting = PictureSize.KeepSetting.HB_KEEP_HEIGHT; break; } // Step 2, For the changed field, call hb_set_anamorphic_size and process the results. PictureSize.AnamorphicResult result = PictureSize.hb_set_anamorphic_size2(this.GetPictureSettings(changedField), this.GetPictureTitleInfo(), setting); double dispWidth = Math.Round((result.OutputWidth * result.OutputParWidth / result.OutputParHeight), 0); this.Task.Width = result.OutputWidth; this.Task.Height = result.OutputHeight; long x, y; HandBrakeUtils.Reduce((int)Math.Round(result.OutputParWidth, 0), (int)Math.Round(result.OutputParHeight, 0), out x, out y); this.Task.PixelAspectX = (int)Math.Round(result.OutputParWidth, 0); this.Task.PixelAspectY = (int)Math.Round(result.OutputParHeight, 0); this.Task.DisplayWidth = dispWidth; // Step 3, Set the display width label to indicate the output. this.DisplaySize = this.sourceResolution == null || this.sourceResolution.IsEmpty ? string.Empty : string.Format(Resources.PictureSettingsViewModel_StorageDisplayLabel, dispWidth, result.OutputHeight, this.ParWidth, this.ParHeight); // Step 4, Force an update on all the UI elements. this.NotifyOfPropertyChange(() => this.Width); this.NotifyOfPropertyChange(() => this.Height); this.NotifyOfPropertyChange(() => this.DisplayWidth); this.NotifyOfPropertyChange(() => this.ParWidth); this.NotifyOfPropertyChange(() => this.ParHeight); this.NotifyOfPropertyChange(() => this.CropTop); this.NotifyOfPropertyChange(() => this.CropBottom); this.NotifyOfPropertyChange(() => this.CropLeft); this.NotifyOfPropertyChange(() => this.CropRight); this.NotifyOfPropertyChange(() => this.SelectedModulus); this.NotifyOfPropertyChange(() => this.MaintainAspectRatio); // Step 5, Update the Preview if (delayedPreviewprocessor != null && this.Task != null && this.StaticPreviewViewModel != null && this.StaticPreviewViewModel.IsOpen) { delayedPreviewprocessor.PerformTask(() => this.StaticPreviewViewModel.UpdatePreviewFrame(this.Task, this.scannedSource), 800); } }