OSDN Git Service

a597de9ebc6f028441bcada22b59ef606b0ddd62
[handbrake-jp/handbrake-jp-git.git] / win / C# / Controls / PictureSettings.cs
1 using System;\r
2 using System.Drawing;\r
3 using System.Globalization;\r
4 using System.Windows.Forms;\r
5 using Handbrake.Parsing;\r
6 \r
7 namespace Handbrake.Controls\r
8 {\r
9     // TODO\r
10     // - Tie in the cropping controls.\r
11     \r
12     public partial class PictureSettings : UserControl\r
13     {\r
14         private static readonly CultureInfo Culture = new CultureInfo("en-US", false);\r
15 \r
16         // Globals\r
17         public int maxWidth, maxHeight;\r
18         int widthVal, heightVal;\r
19         private double darValue;\r
20         private double storageAspect; // Storage Aspect Cache for current source and title\r
21         public Title selectedTitle { private get; set; }\r
22         private Boolean heightChangeGuard;\r
23         private Boolean looseAnamorphicHeightGuard;\r
24         private Boolean heightModJumpGaurd;\r
25 \r
26         // Window Setup\r
27         public PictureSettings()\r
28         {\r
29             InitializeComponent();\r
30             lbl_max.Text = "";\r
31             drop_modulus.SelectedIndex = 0;\r
32             storageAspect = 0;\r
33         }\r
34         public void setComponentsAfterScan(Title st)\r
35         {\r
36             storageAspect = 0;\r
37             selectedTitle = st;\r
38             // Set the Aspect Ratio\r
39             lbl_Aspect.Text = selectedTitle.AspectRatio.ToString(Culture);\r
40             lbl_src_res.Text = selectedTitle.Resolution.Width + " x " + selectedTitle.Resolution.Height;\r
41 \r
42             // Set the Recommended Cropping values\r
43             crop_top.Text = selectedTitle.AutoCropDimensions[0].ToString();\r
44             crop_bottom.Text = selectedTitle.AutoCropDimensions[1].ToString();\r
45             crop_left.Text = selectedTitle.AutoCropDimensions[2].ToString();\r
46             crop_right.Text = selectedTitle.AutoCropDimensions[3].ToString();\r
47 \r
48 \r
49             // Set the Resolution Boxes\r
50             text_width.Value = selectedTitle.Resolution.Width;\r
51 \r
52             if (drp_anamorphic.SelectedIndex == 0)\r
53                 text_height.Value = cacluateHeight(selectedTitle.Resolution.Width);\r
54             else if (drp_anamorphic.SelectedIndex == 1 || drp_anamorphic.SelectedIndex == 3)\r
55             {\r
56                 heightModJumpGaurd = true;\r
57                 text_height.Value = selectedTitle.Resolution.Height - (int) crop_top.Value - (int) crop_bottom.Value;\r
58             }\r
59             else if (drp_anamorphic.SelectedIndex == 2)\r
60             {\r
61                 heightModJumpGaurd = false;\r
62                 text_height.Value = selectedTitle.Resolution.Height - (int)crop_top.Value - (int)crop_bottom.Value;\r
63             }\r
64 \r
65             if (drp_anamorphic.SelectedIndex == 3)\r
66             {\r
67                 txt_parWidth.Text = selectedTitle.ParVal.Width.ToString();\r
68                 txt_parHeight.Text = selectedTitle.ParVal.Height.ToString();\r
69                 txt_displayWidth.Text = displayWidth().ToString();\r
70             }\r
71 \r
72             setMax();\r
73         }\r
74         public void setMax()\r
75         {\r
76             if (maxWidth != 0 && maxHeight != 0)\r
77                 lbl_max.Text = "Max Width / Height";\r
78             else if (maxWidth != 0)\r
79                 lbl_max.Text = "Max Width";\r
80             else\r
81                 lbl_max.Text = "";\r
82         }\r
83 \r
84         // Basic Picture Setting Controls\r
85         private void text_width_ValueChanged(object sender, EventArgs e)\r
86         {\r
87             maxWidth = 0;\r
88             setMax();\r
89             \r
90             // Get the Modulus\r
91             int mod;\r
92             int.TryParse(drop_modulus.SelectedItem.ToString(), out mod);\r
93 \r
94             // Increase or decrease value by the correct mod.\r
95             text_width.Value = widthChangeMod(mod);\r
96 \r
97             // Mode Switch\r
98             switch (drp_anamorphic.SelectedIndex)\r
99             {\r
100                 case 0:\r
101                     if (calculateUnchangeValue(true) != -1 && check_KeepAR.Checked)\r
102                         text_height.Value = calculateUnchangeValue(true);\r
103                     break;\r
104                 case 1:\r
105                     lbl_anamorphic.Text = strictAnamorphic();\r
106                     break;\r
107                 case 2:\r
108                     lbl_anamorphic.Text = looseAnamorphic();\r
109                     break;\r
110                 case 3:\r
111                     customAnamorphic(text_width);\r
112                     break;\r
113             }\r
114                 \r
115         }\r
116         private void text_height_ValueChanged(object sender, EventArgs e)\r
117         {\r
118             maxHeight = 0;\r
119             setMax();\r
120 \r
121             // Get the Modulus\r
122             int mod;\r
123             int.TryParse(drop_modulus.SelectedItem.ToString(), out mod);\r
124 \r
125             // Increase or decrease value by the correct mod.\r
126             if (drp_anamorphic.SelectedIndex != 2 && !heightModJumpGaurd)\r
127             {\r
128                 decimal val = heightChangeMod(mod);\r
129                 heightChangeGuard = true;\r
130                 if (text_height.Value != val)\r
131                 {\r
132                     heightChangeGuard = false;\r
133                     text_height.Value = val;\r
134                 }\r
135             }\r
136 \r
137             // Mode Switch\r
138             switch (drp_anamorphic.SelectedIndex)\r
139             {\r
140                 case 0:\r
141                     if (drp_anamorphic.SelectedIndex != 3)\r
142                     {\r
143                         if (calculateUnchangeValue(false) != -1)\r
144                             text_width.Value = calculateUnchangeValue(false);\r
145                     }\r
146                     break;\r
147                 case 1:\r
148                     lbl_anamorphic.Text = strictAnamorphic();\r
149                     break;\r
150                 case 2:\r
151                     if (!looseAnamorphicHeightGuard)\r
152                         lbl_anamorphic.Text = looseAnamorphic();\r
153                     break;\r
154                 case 3:\r
155                     if (!heightChangeGuard)\r
156                         customAnamorphic(text_height);\r
157                     break;\r
158             }\r
159             heightChangeGuard = false;\r
160             looseAnamorphicHeightGuard = false;\r
161             heightModJumpGaurd = false;\r
162         }\r
163         private void check_KeepAR_CheckedChanged(object sender, EventArgs e)\r
164         {\r
165             // Recalculate Height based on width when enabled\r
166             if (drp_anamorphic.SelectedIndex != 3 && check_KeepAR.Checked && selectedTitle != null)\r
167                 text_height.Value = cacluateHeight(widthVal);\r
168 \r
169             // Enable Par Width/Height Check boxes if Keep AR is enabled, otherwise disable them\r
170             if (check_KeepAR.Checked)\r
171             {\r
172                 txt_parWidth.Enabled = false;\r
173                 txt_parHeight.Enabled = false;\r
174             }\r
175             else\r
176             {\r
177                 txt_parWidth.Enabled = true;\r
178                 txt_parHeight.Enabled = true;\r
179             }\r
180         }\r
181         private void drp_anamorphic_SelectedIndexChanged(object sender, EventArgs e)\r
182         {\r
183             switch (drp_anamorphic.SelectedIndex)\r
184             {\r
185                 case 0: // None\r
186                     text_height.Enabled = true;\r
187                     text_width.Enabled = true;\r
188                     check_KeepAR.CheckState = CheckState.Checked;\r
189                     check_KeepAR.Enabled = true;\r
190                     disableCustomAnaControls();\r
191                     if (selectedTitle != null)\r
192                     {\r
193                         text_width.Value = selectedTitle.Resolution.Width;\r
194                         text_height.Value = selectedTitle.Resolution.Height;\r
195                     }\r
196                     check_KeepAR.Enabled = true;\r
197                     lbl_anamorphic.Text = "";\r
198                     lbl_anamprohicLbl.Visible = false;\r
199                     break;\r
200                 case 1: // Strict\r
201                     if (selectedTitle != null)\r
202                     {\r
203                         heightModJumpGaurd = true;\r
204                         text_width.Value = selectedTitle.Resolution.Width - (int)crop_left.Value - (int)crop_right.Value;\r
205                         text_height.Value = selectedTitle.Resolution.Height - (int)crop_top.Value - (int)crop_bottom.Value;\r
206                     }\r
207                     text_height.Enabled = false;\r
208                     text_width.Enabled = false;\r
209                     check_KeepAR.CheckState = CheckState.Unchecked;\r
210                     check_KeepAR.Enabled = false;\r
211                     disableCustomAnaControls();\r
212                     lbl_anamorphic.Text = strictAnamorphic();\r
213                     lbl_anamprohicLbl.Visible = true;\r
214                     break;\r
215                 case 2: // Loose\r
216                     disableCustomAnaControls();\r
217                     storageAspect = 0;\r
218                     text_height.Enabled = false;\r
219                     text_width.Enabled = true;\r
220                     if (selectedTitle != null)\r
221                     {\r
222                         heightModJumpGaurd = true;\r
223                         text_width.Value = selectedTitle.Resolution.Width;\r
224                         text_height.Value = selectedTitle.Resolution.Height - (int) crop_top.Value - (int) crop_bottom.Value;\r
225                     }\r
226                     lbl_anamorphic.Text = looseAnamorphic();\r
227                     lbl_anamprohicLbl.Visible = true;\r
228                     break;\r
229                 case 3: // Custom\r
230 \r
231                     // Display Elements\r
232                     enableCustomAnaControls();\r
233                     text_height.Enabled = true;\r
234                     text_width.Enabled = true;\r
235 \r
236                     // Actual Work  \r
237                     if (selectedTitle != null)\r
238                     {\r
239                         heightModJumpGaurd = true;\r
240                         widthVal = selectedTitle.Resolution.Width;\r
241                         text_width.Value = selectedTitle.Resolution.Width - (int)crop_left.Value - (int)crop_right.Value;\r
242                         text_height.Value = selectedTitle.Resolution.Height - (int)crop_top.Value - (int)crop_bottom.Value;\r
243                         txt_parWidth.Text = selectedTitle.ParVal.Width.ToString();\r
244                         txt_parHeight.Text = selectedTitle.ParVal.Height.ToString();\r
245                         txt_displayWidth.Text = displayWidth().ToString();\r
246                     }\r
247    \r
248                     darValue = calculateDar();\r
249 \r
250                     check_KeepAR.CheckState = CheckState.Checked;\r
251                     check_KeepAR.Enabled = true;\r
252                     lbl_anamprohicLbl.Visible = true;\r
253 \r
254                     break;\r
255             }\r
256         }\r
257 \r
258         // Custom Anamorphic Controls\r
259         private void txt_displayWidth_Keyup(object sender, KeyEventArgs e)\r
260         {\r
261             if (e.KeyCode == Keys.Enter)\r
262                 customAnamorphic(txt_displayWidth);\r
263         }\r
264         private void txt_parHeight_Keyup(object sender, KeyEventArgs e)\r
265         {\r
266             if (e.KeyCode == Keys.Enter)\r
267                 customAnamorphic(txt_parHeight);\r
268         }\r
269         private void txt_parWidth_Keyup(object sender, KeyEventArgs e)\r
270         {\r
271             if (e.KeyCode == Keys.Enter)\r
272                 customAnamorphic(txt_parWidth);\r
273         }\r
274         \r
275         // Cropping Controls\r
276         private void check_autoCrop_CheckedChanged(object sender, EventArgs e)\r
277         {\r
278             crop_left.Enabled = false;\r
279             crop_right.Enabled = false;\r
280             crop_top.Enabled = false;\r
281             crop_bottom.Enabled = false;\r
282         }\r
283         private void check_customCrop_CheckedChanged(object sender, EventArgs e)\r
284         {\r
285             crop_left.Enabled = true;\r
286             crop_right.Enabled = true;\r
287             crop_top.Enabled = true;\r
288             crop_bottom.Enabled = true;\r
289             if (selectedTitle != null)\r
290             {\r
291                 crop_top.Text = selectedTitle.AutoCropDimensions[0].ToString();\r
292                 crop_bottom.Text = selectedTitle.AutoCropDimensions[1].ToString();\r
293                 crop_left.Text = selectedTitle.AutoCropDimensions[2].ToString();\r
294                 crop_right.Text = selectedTitle.AutoCropDimensions[3].ToString();\r
295             }\r
296             else\r
297             {\r
298                 crop_left.Text = "0";\r
299                 crop_right.Text = "0";\r
300                 crop_top.Text = "0";\r
301                 crop_bottom.Text = "0";\r
302             }\r
303         }\r
304         private void crop_left_ValueChanged(object sender, EventArgs e)\r
305         {\r
306             if (crop_left.Value % 2 != 0)\r
307                 crop_left.Value++;\r
308         }\r
309         private void crop_right_ValueChanged(object sender, EventArgs e)\r
310         {\r
311             if (crop_right.Value % 2 != 0)\r
312                 crop_right.Value++;\r
313         }\r
314         private void crop_top_ValueChanged(object sender, EventArgs e)\r
315         {\r
316             if (crop_top.Value % 2 != 0)\r
317                 crop_top.Value++;\r
318         }\r
319         private void crop_bottom_ValueChanged(object sender, EventArgs e)\r
320         {\r
321             if (crop_bottom.Value % 2 != 0)\r
322                 crop_bottom.Value++;\r
323         }\r
324 \r
325         // Custom Anamorphic Code\r
326         private void customAnamorphic(Control control)\r
327         {\r
328             // Get and parse all the required values\r
329             int cropLeft = (int)crop_left.Value;\r
330             int cropRight = (int)crop_right.Value;\r
331 \r
332             int width = (int)text_width.Value;\r
333             int cropped_width = width - cropLeft - cropRight;\r
334 \r
335             int mod = 16;\r
336             int.TryParse(drop_modulus.SelectedItem.ToString(), out mod);\r
337 \r
338             int parW, parH;\r
339             double displayWidth;\r
340             int.TryParse(txt_parWidth.Text, out parW);\r
341             int.TryParse(txt_parHeight.Text, out parH);\r
342             double.TryParse(txt_displayWidth.Text, out displayWidth);\r
343 \r
344             /* NOT KEEPING DISPLAY ASPECT\r
345              * Changing STORAGE WIDTH changes DISPLAY WIDTH to STORAGE WIDTH * PIXEL WIDTH / PIXEL HEIGHT\r
346              * Changing PIXEL dimensions changes DISPLAY WIDTH to STORAGE WIDTH * PIXEL WIDTH / PIXEL HEIGHT\r
347              * Changing DISPLAY WIDTH changes PIXEL WIDTH to DISPLAY WIDTH and PIXEL HEIGHT to STORAGE WIDTH\r
348              * Changing HEIGHT just....changes the height.\r
349              */\r
350             if (!check_KeepAR.Checked)\r
351             {\r
352                 switch (control.Name)\r
353                 {\r
354                     case "text_width":\r
355                         double dw = (double)cropped_width * parW / parH;\r
356                         dw = Math.Round(dw, 2);\r
357                         txt_displayWidth.Text = dw.ToString();\r
358                         break;\r
359                     case "txt_parWidth":\r
360                         double dwpw = (double)cropped_width * parW / parH;\r
361                         dwpw = Math.Round(dwpw, 2);\r
362                         txt_displayWidth.Text = dwpw.ToString();\r
363                         break;\r
364                     case "txt_parHeight":\r
365                         double dwph = (double)cropped_width * parW / parH;\r
366                         dwph = Math.Round(dwph, 2);\r
367                         txt_displayWidth.Text = dwph.ToString();\r
368                         break;\r
369                     case "txt_displayWidth":\r
370                         txt_parWidth.Text = Math.Round(displayWidth, 0).ToString();\r
371                         txt_parHeight.Text = text_width.Text;\r
372                         break;\r
373                 }\r
374             }\r
375 \r
376             /*\r
377              * KEEPING DISPLAY ASPECT RATIO\r
378              * DAR = DISPLAY WIDTH / DISPLAY HEIGHT (cache after every modification)\r
379              * Disable editing: PIXEL WIDTH, PIXEL HEIGHT\r
380              * Changing DISPLAY WIDTH:\r
381              *     Changes HEIGHT to keep DAR\r
382              *     Changes PIXEL WIDTH to new DISPLAY WIDTH\r
383              *     Changes PIXEL HEIGHT to STORAGE WIDTH\r
384              * Changing HEIGHT\r
385              *     Changes DISPLAY WIDTH to keep DAR\r
386              *     Changes PIXEL WIDTH to new DISPLAY WIDTH\r
387              *     Changes PIXEL HEIGHT to STORAGE WIDTH\r
388              * Changing STORAGE_WIDTH:\r
389              *     Changes PIXEL WIDTH to DISPLAY WIDTH\r
390              *     Changes PIXEL HEIGHT to new STORAGE WIDTH \r
391              */\r
392 \r
393             if (check_KeepAR.Checked)\r
394             {\r
395                 switch (control.Name)\r
396                 {\r
397                     case "txt_displayWidth":\r
398                         heightChangeGuard = true;\r
399                         text_height.Value = (decimal)getHeightKeepDar();  //Changes HEIGHT to keep DAR\r
400                         //darValue = calculateDar(); // Cache the dar value\r
401                         txt_parWidth.Text = txt_displayWidth.Text;\r
402                         txt_parHeight.Text = cropped_width.ToString();\r
403                         break;\r
404                     case "text_height":\r
405                         heightChangeGuard = true;\r
406                         txt_displayWidth.Text = getDisplayWidthKeepDar().ToString();  //Changes DISPLAY WIDTH to keep DAR\r
407                         txt_parWidth.Text = txt_displayWidth.Text;\r
408                         txt_parHeight.Text = cropped_width.ToString();\r
409                         break; \r
410                     case "text_width":\r
411                         txt_parWidth.Text = txt_displayWidth.Text;\r
412                         txt_parHeight.Text = cropped_width.ToString();\r
413                         break;\r
414                 }\r
415             }\r
416         }\r
417         private double getDisplayWidthKeepDar()\r
418         {\r
419             double displayWidth;\r
420             double.TryParse(txt_displayWidth.Text, out displayWidth);\r
421             double currentDar = calculateDar();\r
422             double newDwValue = displayWidth;\r
423 \r
424             // Correct display width up or down to correct for dar.           \r
425             if (currentDar > darValue)\r
426             {\r
427                 while (currentDar > darValue)\r
428                 {\r
429                     displayWidth--;\r
430                     newDwValue = displayWidth;\r
431                     currentDar = calculateDarByVal(text_height.Value, displayWidth);\r
432                 }\r
433             }\r
434             else\r
435             {\r
436                 while (currentDar < darValue)\r
437                 {\r
438                     displayWidth++;\r
439                     newDwValue = displayWidth;\r
440                     currentDar = calculateDarByVal(text_height.Value, displayWidth);\r
441                 }\r
442             }\r
443 \r
444             return Math.Round(newDwValue, 2);\r
445         }\r
446         private double getHeightKeepDar()\r
447         {\r
448             double displayWidth;\r
449             double.TryParse(txt_displayWidth.Text, out displayWidth);\r
450             double currentDar = calculateDar();\r
451             double newHeightVal = heightVal;\r
452 \r
453             // Correct display width up or down.\r
454             if (currentDar > darValue)\r
455             {\r
456                 while (currentDar > darValue)\r
457                 {\r
458                     heightVal++;\r
459                     newHeightVal = heightVal;\r
460                     currentDar = calculateDarByVal(heightVal, displayWidth);\r
461                 }\r
462             }\r
463             else\r
464             {\r
465                 while (currentDar < darValue)\r
466                 {\r
467                     heightVal--;\r
468                     newHeightVal = heightVal;\r
469                     currentDar = calculateDarByVal(heightVal, displayWidth);\r
470                 }\r
471             }\r
472 \r
473             return newHeightVal;\r
474         }\r
475         private double calculateDar()\r
476         {\r
477             // DAR = DISPLAY WIDTH / DISPLAY HEIGHT (cache after every modification)\r
478             double displayWidth;\r
479             double.TryParse(txt_displayWidth.Text, out displayWidth);\r
480 \r
481             double calculatedDar = displayWidth / (int)text_height.Value;\r
482 \r
483             return calculatedDar;\r
484         }\r
485         private double calculateDarByVal(decimal croppedHeight, double displayWidth)\r
486         {\r
487             // DAR = DISPLAY WIDTH / DISPLAY HEIGHT (cache after every modification)\r
488             double calculatedDar = darValue;\r
489             if (croppedHeight > 0)\r
490                 calculatedDar = displayWidth / (double)croppedHeight;\r
491 \r
492             return calculatedDar;\r
493         }\r
494         private int displayWidth()\r
495         {\r
496             if (selectedTitle != null)\r
497             {\r
498                 int actualWidth = (int)text_width.Value;\r
499                 int displayWidth = 0;\r
500                 int parW, parH;\r
501 \r
502                 int.TryParse(txt_parWidth.Text, out parW);\r
503                 int.TryParse(txt_parHeight.Text, out parH);\r
504 \r
505                 if (drp_anamorphic.SelectedIndex != 3)\r
506                     displayWidth = (actualWidth * selectedTitle.ParVal.Width / selectedTitle.ParVal.Height);\r
507                 else if (parW > 0 && parH > 0)\r
508                     displayWidth = (actualWidth * parW / parH);\r
509 \r
510                 return displayWidth;\r
511             }\r
512             return -1;\r
513         }\r
514 \r
515         // Resolution calculation and controls\r
516         private decimal widthChangeMod(int mod)\r
517         {\r
518             // Increase or decrease the height based on the users input.\r
519             decimal returnVal = text_width.Value > widthVal ? getResolutionJump(mod, text_width.Value, true) : getResolutionJump(mod, text_width.Value, false);\r
520 \r
521             // Make sure we don't go above source value\r
522             if (selectedTitle != null)\r
523                 if (selectedTitle.Resolution.Width < returnVal)\r
524                     returnVal = selectedTitle.Resolution.Width;\r
525 \r
526             if (returnVal < 64)\r
527                 returnVal = 64;\r
528 \r
529             // Set the global tracker\r
530             widthVal = (int)returnVal;\r
531 \r
532             return returnVal;\r
533         }\r
534         private decimal heightChangeMod(int mod)\r
535         {\r
536             // Increase or decrease the height based on the users input.\r
537             decimal returnVal = text_height.Value > heightVal ? getResolutionJump(mod, text_height.Value, true) : getResolutionJump(mod, text_height.Value, false);\r
538 \r
539             // Make sure we don't go above source value\r
540             if (selectedTitle != null)\r
541                 if (selectedTitle.Resolution.Height < returnVal)\r
542                     returnVal = selectedTitle.Resolution.Height;\r
543 \r
544             if (returnVal < 64)\r
545                 returnVal = 64;\r
546 \r
547             // Set the global tracker\r
548             heightVal = (int)returnVal;\r
549 \r
550             return returnVal;\r
551         }\r
552         private decimal calculateUnchangeValue(Boolean widthChangeFromControl)\r
553         {\r
554             decimal newValue = -1;\r
555             if (selectedTitle != null && drp_anamorphic.SelectedIndex != 3 && drp_anamorphic.SelectedIndex != 2)\r
556                 if (widthChangeFromControl)\r
557                     newValue = cacluateHeight(widthVal);\r
558                 else\r
559                 {\r
560                     if (check_KeepAR.Checked)\r
561                         newValue = cacluateWidth(heightVal);\r
562                 }\r
563 \r
564             return newValue;\r
565         }\r
566         private int getResolutionJump(int mod, decimal value, Boolean up)\r
567         {\r
568             if (up)\r
569                 while ((value % mod) != 0)\r
570                     value++;\r
571             else\r
572                 while ((value % mod) != 0)\r
573                     value--;\r
574 \r
575             return (int)value;\r
576         }\r
577         private double getModulusAuto(int mod, double value)\r
578         {\r
579             int modDiv2 = mod / 2;\r
580 \r
581             if ((value % mod) != 0)\r
582             {\r
583                 double modVal = (int)value % mod;\r
584                 if (modVal >= modDiv2)\r
585                 {\r
586                     modVal = 16 - modVal;\r
587                     value = (int)value + (int)modVal;\r
588                 }\r
589                 else\r
590                 {\r
591                     value = (int)value - (int)modVal;\r
592                 }\r
593             }\r
594             return value;\r
595         }\r
596         private int cacluateHeight(int width)\r
597         {\r
598             if (selectedTitle != null)\r
599             {\r
600                 int aw = 0;\r
601                 int ah = 0;\r
602                 if (selectedTitle.AspectRatio.ToString(Culture) == "1.78")\r
603                 {\r
604                     aw = 16;\r
605                     ah = 9;\r
606                 }\r
607                 else if (selectedTitle.AspectRatio.ToString(Culture) == "1.33")\r
608                 {\r
609                     aw = 4;\r
610                     ah = 3;\r
611                 }\r
612 \r
613                 if (aw != 0)\r
614                 {\r
615                     // Crop_Width = Title->Width - crop_Left - crop_right\r
616                     // Crop_Height = Title->Height - crop_top - crop_bottom\r
617                     double crop_width = selectedTitle.Resolution.Width - (double) crop_left.Value -\r
618                                         (double) crop_right.Value;\r
619                     double crop_height = selectedTitle.Resolution.Height - (double) crop_top.Value -\r
620                                          (double) crop_bottom.Value;\r
621 \r
622                     double new_height = (width*selectedTitle.Resolution.Width*ah*crop_height)/\r
623                                         (selectedTitle.Resolution.Height*aw*crop_width);\r
624 \r
625                     if (drp_anamorphic.SelectedIndex == 3)\r
626                         new_height = getModulusAuto(int.Parse(drop_modulus.SelectedItem.ToString()), new_height);\r
627                     else\r
628                         new_height = getModulusAuto(16, new_height);\r
629 \r
630                     //16 * (421 / 16)\r
631                     //double z = ( 16 * (( y + 8 ) / 16 ) );\r
632                     int x = int.Parse(new_height.ToString());\r
633                     if (x < 64)\r
634                         x = 64;\r
635                     return x;\r
636                 }\r
637             }\r
638             return 64;\r
639         }\r
640         private int cacluateWidth(int height)\r
641         {\r
642             int aw = 0;\r
643             int ah = 0;\r
644             if (selectedTitle.AspectRatio.ToString(Culture) == "1.78")\r
645             {\r
646                 aw = 16;\r
647                 ah = 9;\r
648             }\r
649             else if (selectedTitle.AspectRatio.ToString(Culture) == "1.33")\r
650             {\r
651                 aw = 4;\r
652                 ah = 3;\r
653             }\r
654 \r
655             if (aw != 0)\r
656             {\r
657 \r
658                 double crop_width = selectedTitle.Resolution.Width - (double)crop_left.Value - (double)crop_right.Value;\r
659                 double crop_height = selectedTitle.Resolution.Height - (double)crop_top.Value - (double)crop_bottom.Value;\r
660 \r
661                 double new_width = (height * selectedTitle.Resolution.Height * aw * crop_width) /\r
662                                     (selectedTitle.Resolution.Width * ah * crop_height);\r
663 \r
664                 if (drp_anamorphic.SelectedIndex == 3)\r
665                     new_width = getModulusAuto(int.Parse(drop_modulus.SelectedItem.ToString()), new_width);\r
666                 else\r
667                     new_width = getModulusAuto(16, new_width);\r
668 \r
669 \r
670                 int x = int.Parse(new_width.ToString());\r
671 \r
672                 if (x < 64)\r
673                     x = 64;\r
674 \r
675                 return x;\r
676             }\r
677             return 64;\r
678         }\r
679 \r
680         // Calculate Resolution for Anamorphic functions\r
681         private string strictAnamorphic()\r
682         {\r
683             // TODO Make sure cropping is Mod2\r
684             if (selectedTitle != null)\r
685             {\r
686                 // Calculate the Actual Height\r
687                 int actualWidth = (int)text_width.Value - (int)crop_left.Value - (int)crop_right.Value; ;\r
688                 int actualHeight = selectedTitle.Resolution.Height - (int)crop_top.Value - (int)crop_bottom.Value;\r
689 \r
690                 // Calculate Actual Width\r
691                 double displayWidth = ((double)actualWidth * selectedTitle.ParVal.Width / selectedTitle.ParVal.Height);\r
692                 return Math.Round(displayWidth, 0) + "x" + actualHeight;\r
693             }\r
694             return "Select a Title";\r
695         }\r
696         private string looseAnamorphic()\r
697         {\r
698             if (selectedTitle != null)\r
699             {\r
700                 // Get some values\r
701                 int actualWidth = (int)text_width.Value - (int)crop_left.Value - (int)crop_right.Value;\r
702 \r
703                 int source_display_width = selectedTitle.Resolution.Width * selectedTitle.ParVal.Width / selectedTitle.ParVal.Height;\r
704                 int source_cropped_height = selectedTitle.Resolution.Height - (int)crop_top.Value - (int)crop_bottom.Value;\r
705 \r
706                 // Calculate storage Aspect and cache it for reuse\r
707                 if (storageAspect == 0)\r
708                     storageAspect = (double)actualWidth / source_cropped_height;               \r
709 \r
710                 // Calculate the new height based on the input cropped width\r
711                 double hcalc = (actualWidth / storageAspect) + 0.5;\r
712                 double newHeight = getModulusAuto(16, hcalc);\r
713                 looseAnamorphicHeightGuard = true;\r
714 \r
715                 if (newHeight < 64)\r
716                     newHeight = 64;\r
717                 text_height.Value = (decimal)newHeight;   // BUG Out of Range Exception with Width too low here.\r
718 \r
719                 // Calculate the anamorphic width\r
720                 double parW = newHeight * source_display_width / source_cropped_height;\r
721                 double parH = actualWidth;\r
722                 double displayWidth = (actualWidth * parW / parH);\r
723 \r
724                 // Now correct DisplayWidth to maintain Aspect ratio.  ActualHeight was mod16'd and thus AR is slightly different than the worked out displayWidths\r
725                 return Math.Truncate(displayWidth) + "x" + newHeight;  \r
726             }\r
727             return "Select a Title";\r
728 \r
729         }\r
730         \r
731         // GUI\r
732         private void disableCustomAnaControls()\r
733         {\r
734             // Disable Custom Anamorphic Stuff\r
735             lbl_modulus.Visible = false;\r
736             lbl_displayWidth.Visible = false;\r
737             lbl_parWidth.Visible = false;\r
738             lbl_parHeight.Visible = false;\r
739             drop_modulus.Visible = false;\r
740             txt_displayWidth.Visible = false;\r
741             txt_parWidth.Visible = false;\r
742             txt_parHeight.Visible = false;\r
743             check_KeepAR.Enabled = false;\r
744         }\r
745         private void enableCustomAnaControls()\r
746         {\r
747             // Disable Custom Anamorphic Stuff\r
748             lbl_modulus.Visible = true;\r
749             lbl_displayWidth.Visible = true;\r
750             lbl_parWidth.Visible = true;\r
751             lbl_parHeight.Visible = true;\r
752             drop_modulus.Visible = true;\r
753             txt_displayWidth.Visible = true;\r
754             txt_parWidth.Visible = true;\r
755             txt_parHeight.Visible = true;\r
756             check_KeepAR.Enabled = true;\r
757         }\r
758 \r
759     }\r
760 }