summaryrefslogtreecommitdiffstats
path: root/win/CS
diff options
context:
space:
mode:
authorsr55 <[email protected]>2017-07-04 22:08:26 +0100
committersr55 <[email protected]>2017-07-04 22:08:44 +0100
commit63e20c1d2c79792c092fbe943a0fd5a9d49e6958 (patch)
treecf61ca9caf424cf8688089d690e2e6c43b7a04e5 /win/CS
parentdfe48634d770a386d43ef4d8d21bc537ee02a090 (diff)
WinGui: Don't enable the Display Width control for Custom Anamorphic when KeepAR is checked. Implement Reduce function for PAR so that the behaviour matches the Linux GUI. Couple of Logic and ordering bug fixes.
Diffstat (limited to 'win/CS')
-rw-r--r--win/CS/HandBrake.ApplicationServices/Interop/HandBrakeUtils.cs23
-rw-r--r--win/CS/HandBrakeWPF/ViewModels/PictureSettingsViewModel.cs37
-rw-r--r--win/CS/HandBrakeWPF/Views/PictureSettingsView.xaml2
3 files changed, 46 insertions, 16 deletions
diff --git a/win/CS/HandBrake.ApplicationServices/Interop/HandBrakeUtils.cs b/win/CS/HandBrake.ApplicationServices/Interop/HandBrakeUtils.cs
index 1acb411b0..b8fb24778 100644
--- a/win/CS/HandBrake.ApplicationServices/Interop/HandBrakeUtils.cs
+++ b/win/CS/HandBrake.ApplicationServices/Interop/HandBrakeUtils.cs
@@ -304,6 +304,29 @@ namespace HandBrake.ApplicationServices.Interop
return JsonConvert.DeserializeObject<Geometry>(result);
}
+ public static void Reduce(long den, long num, out long x, out long y)
+ {
+ // find the greatest common divisor of num & den by Euclid's algorithm
+ long n = num, d = den;
+ while (d > 0)
+ {
+ long t = d;
+ d = n % d;
+ n = t;
+ }
+
+ // at this point n is the gcd. if it's non-zero remove it from num
+ // and den. Otherwise just return the original values.
+ if (n > 0)
+ {
+ num /= n;
+ den /= n;
+ }
+
+ x = num;
+ y = den;
+ }
+
/// <summary>
/// Sends the message logged event to any registered listeners.
/// </summary>
diff --git a/win/CS/HandBrakeWPF/ViewModels/PictureSettingsViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/PictureSettingsViewModel.cs
index 42cbf0943..f4afb5109 100644
--- a/win/CS/HandBrakeWPF/ViewModels/PictureSettingsViewModel.cs
+++ b/win/CS/HandBrakeWPF/ViewModels/PictureSettingsViewModel.cs
@@ -13,6 +13,7 @@ namespace HandBrakeWPF.ViewModels
using System.Collections.Generic;
using System.Globalization;
+ using HandBrake.ApplicationServices.Interop;
using HandBrake.ApplicationServices.Interop.Model;
using HandBrake.ApplicationServices.Interop.Model.Encoding;
@@ -428,7 +429,7 @@ namespace HandBrakeWPF.ViewModels
/// <summary>
/// Gets or sets DisplayWidth.
/// </summary>
- public int DisplayWidth
+ public long DisplayWidth
{
get
{
@@ -866,7 +867,7 @@ namespace HandBrakeWPF.ViewModels
/// <returns>
/// The <see cref="PictureSize.PictureSettingsJob"/>.
/// </returns>
- private PictureSize.PictureSettingsJob GetPictureSettings()
+ private PictureSize.PictureSettingsJob GetPictureSettings(ChangedPictureField changedField)
{
PictureSize.PictureSettingsJob job = new PictureSize.PictureSettingsJob
{
@@ -883,16 +884,23 @@ namespace HandBrakeWPF.ViewModels
Crop = new Cropping(this.CropTop, this.CropBottom, this.CropLeft, this.CropRight),
};
- if (this.SelectedAnamorphicMode == Anamorphic.Loose)
+ if (this.SelectedAnamorphicMode == Anamorphic.Custom)
{
- job.ParW = sourceParValues.Width;
- job.ParH = sourceParValues.Height;
+ if (changedField == ChangedPictureField.DisplayWidth)
+ {
+ var displayWidth = this.DisplayWidth;
+ job.ParW = (int)displayWidth; // num
+ job.ParH = job.Width; // den
+ }
}
- if (SelectedAnamorphicMode == Anamorphic.Custom)
+ // 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)
{
- job.ParW = this.DisplayWidth; // num
- job.ParH = this.Width; // den
+ long x, y;
+ HandBrakeUtils.Reduce(job.ParW, job.ParH, out x, out y);
+ job.ParW = (int)y;
+ job.ParH = (int)x;
}
return job;
@@ -939,23 +947,22 @@ namespace HandBrakeWPF.ViewModels
}
// 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(), this.GetPictureTitleInfo(), setting);
+ 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.
- double dispWidth = Math.Round((result.OutputWidth * result.OutputParWidth / result.OutputParHeight), 0);
this.DisplaySize = this.sourceResolution == null || this.sourceResolution.IsEmpty
? string.Empty
: string.Format(Resources.PictureSettingsViewModel_StorageDisplayLabel, dispWidth, result.OutputHeight, this.ParWidth, this.ParHeight);
- if (changedField != ChangedPictureField.DisplayWidth)
- {
- this.Task.DisplayWidth = (int)dispWidth;
- }
-
// Step 4, Force an update on all the UI elements.
this.NotifyOfPropertyChange(() => this.Width);
this.NotifyOfPropertyChange(() => this.Height);
diff --git a/win/CS/HandBrakeWPF/Views/PictureSettingsView.xaml b/win/CS/HandBrakeWPF/Views/PictureSettingsView.xaml
index c6e19a89b..83540d253 100644
--- a/win/CS/HandBrakeWPF/Views/PictureSettingsView.xaml
+++ b/win/CS/HandBrakeWPF/Views/PictureSettingsView.xaml
@@ -93,7 +93,7 @@
<Label Content="{x:Static Properties:ResourcesUI.PictureSettingsView_PAR}" Grid.Row="1" Grid.Column="0" />
<controls:NumberBox Width="60" Number="{Binding DisplayWidth, Mode=TwoWay}" Grid.Row="0" Grid.Column="1" HorizontalAlignment="Left" Margin="0,0,0,5"
- AllowEmpty="False" />
+ AllowEmpty="False" IsEnabled="{Binding MaintainAspectRatio, Converter={StaticResource boolConverter}, ConverterParameter=true}" />
<StackPanel Orientation="Horizontal" Grid.Row="1" Grid.Column="1">
<controls:NumberBox Width="60" Number="{Binding ParWidth, Mode=TwoWay}" HorizontalAlignment="Left" AllowEmpty="False"
IsEnabled="{Binding MaintainAspectRatio, Converter={StaticResource boolConverter}, ConverterParameter=true}" Margin="0,0,0,5"