summaryrefslogtreecommitdiffstats
path: root/macosx
diff options
context:
space:
mode:
Diffstat (limited to 'macosx')
-rw-r--r--macosx/Controller.h1
-rw-r--r--macosx/Controller.m309
-rw-r--r--macosx/English.lproj/PictureSettings.xib237
-rw-r--r--macosx/HBPreviewController.h19
-rw-r--r--macosx/HBPreviewController.m92
-rw-r--r--macosx/HBPreviewGenerator.h7
-rw-r--r--macosx/HBPreviewGenerator.m37
-rw-r--r--macosx/PictureController.h15
-rw-r--r--macosx/PictureController.m566
9 files changed, 370 insertions, 913 deletions
diff --git a/macosx/Controller.h b/macosx/Controller.h
index 380e8b0b7..77b66c0e3 100644
--- a/macosx/Controller.h
+++ b/macosx/Controller.h
@@ -193,7 +193,6 @@ extern NSString *keyTitleTag;
- (IBAction) formatPopUpChanged: (id) sender;
- (IBAction) autoSetM4vExtension: (id) sender;
-- (void) prepareJob;
- (IBAction) browseFile: (id) sender;
- (IBAction) showPicturePanel: (id) sender;
diff --git a/macosx/Controller.m b/macosx/Controller.m
index ec3c6b46c..39377cfd4 100644
--- a/macosx/Controller.m
+++ b/macosx/Controller.m
@@ -21,9 +21,8 @@
#import "HBAudioDefaults.h"
#import "HBSubtitlesDefaults.h"
-#import "HBJob.h"
-
#import "HBCore.h"
+#import "HBJob.h"
NSString *HBContainerChangedNotification = @"HBContainerChangedNotification";
NSString *keyContainerTag = @"keyContainerTag";
@@ -79,6 +78,7 @@ NSString *keyTitleTag = @"keyTitleTag";
// Inits the controllers
outputPanel = [[HBOutputPanelController alloc] init];
fPictureController = [[HBPictureController alloc] init];
+ fPreviewController = [[HBPreviewController alloc] init];
fQueueController = [[HBQueueController alloc] init];
// we init the HBPresetsManager class
@@ -110,9 +110,11 @@ NSString *keyTitleTag = @"keyTitleTag";
int loggingLevel = [[[NSUserDefaults standardUserDefaults] objectForKey:@"LoggingLevel"] intValue];
// Init libhb
_core = [[HBCore alloc] initWithLoggingLevel:loggingLevel];
+ _core.name = @"ScanCore";
// Init a separate instance of libhb for user scanning and setting up jobs
_queueCore = [[HBCore alloc] initWithLoggingLevel:loggingLevel];
+ _queueCore.name = @"QueueCore";
// Registers the observers to the cores notifications.
[self registerScanCoreNotifications];
@@ -122,13 +124,17 @@ NSString *keyTitleTag = @"keyTitleTag";
[GrowlApplicationBridge setGrowlDelegate: self];
[fPictureController setDelegate:self];
- [fPictureController setHandle:self.core.hb_handle];
+
+ fPreviewController.delegate = self;
+ [fPreviewController setCore:self.core];
[fQueueController setHandle:self.queueCore.hb_handle];
[fQueueController setHBController:self];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(autoSetM4vExtension:) name:HBMixdownChangedNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateMp4Checkboxes:) name:HBVideoEncoderChangedNotification object:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pictureSettingsDidChange) name:HBPictureChangedNotification object:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pictureSettingsDidChange) name:HBFiltersChangedNotification object:nil];
dockIconProgress = 0;
}
@@ -569,9 +575,6 @@ NSString *keyTitleTag = @"keyTitleTag";
stringWithFormat:@"%@/Desktop/Movie.mp4",
NSHomeDirectory()]];
- /* Set Auto Crop to On at launch */
- [fPictureController setAutoCrop:YES];
-
/* Bottom */
[fStatusField setStringValue: @""];
@@ -1465,7 +1468,8 @@ NSString *keyTitleTag = @"keyTitleTag";
// Notify anyone interested (audio/subtitles/chapters controller) that there's no title
fTitle = NULL;
- [fPictureController setTitle:NULL];
+ fPictureController.picture = nil;
+ fPreviewController.job = nil;
[[NSNotificationCenter defaultCenter] postNotification:
[NSNotification notificationWithName: HBTitleChangedNotification
@@ -1547,7 +1551,9 @@ NSString *keyTitleTag = @"keyTitleTag";
SuccessfulScan = NO;
// Notify PictureController that there's no title
- [fPictureController setTitle:NULL];
+ fPictureController.picture = nil;
+ fPictureController.filters = nil;
+ fPreviewController.job = nil;
// Notify anyone interested (video/audio/subtitles/chapters controller) that there's no title
[[NSNotificationCenter defaultCenter] postNotification:
@@ -2006,10 +2012,7 @@ static void queueFSEventStreamCallback(
hb_list_t * list = hb_get_titles(self.core.hb_handle);
hb_title_t * title = (hb_title_t *) hb_list_item( list,
(int)[fSrcTitlePopUp indexOfSelectedItem] );
- hb_job_t * job = title->job;
-
-
-
+
/* We use a number system to set the encode status of the queue item
* 0 == already encoded
* 1 == is being encoded
@@ -2087,13 +2090,7 @@ static void queueFSEventStreamCallback(
[fVideoController.video prepareVideoForQueueFileJob:queueFileJob];
/* Picture Sizing */
- [queueFileJob setObject:[NSNumber numberWithInt:fTitle->job->width] forKey:@"PictureWidth"];
- [queueFileJob setObject:[NSNumber numberWithInt:fTitle->job->height] forKey:@"PictureHeight"];
- [queueFileJob setObject:[NSNumber numberWithInt:fTitle->job->anamorphic.keep_display_aspect] forKey:@"PictureKeepRatio"];
- [queueFileJob setObject:[NSNumber numberWithInt:fTitle->job->anamorphic.mode] forKey:@"PicturePAR"];
- [queueFileJob setObject:[NSNumber numberWithInt:fTitle->job->modulus] forKey:@"PictureModulus"];
- [queueFileJob setObject:[NSNumber numberWithInt:fTitle->job->par.num] forKey:@"PicturePARPixelWidth"];
- [queueFileJob setObject:[NSNumber numberWithInt:fTitle->job->par.den] forKey:@"PicturePARPixelHeight"];
+ [fPictureController.picture preparePictureForQueueFileJob:queueFileJob];
/* Text summaries of various settings */
[queueFileJob setObject:[NSString stringWithString:[self pictureSettingsSummary]]
@@ -2102,13 +2099,6 @@ static void queueFSEventStreamCallback(
forKey:@"PictureFiltersSummary"];
[queueFileJob setObject:[NSString stringWithString:[self muxerOptionsSummary]]
forKey:@"MuxerOptionsSummary"];
-
- /* Set crop settings here */
- [queueFileJob setObject:[NSNumber numberWithInt:[fPictureController autoCrop]] forKey:@"PictureAutoCrop"];
- [queueFileJob setObject:[NSNumber numberWithInt:job->crop[0]] forKey:@"PictureTopCrop"];
- [queueFileJob setObject:[NSNumber numberWithInt:job->crop[1]] forKey:@"PictureBottomCrop"];
- [queueFileJob setObject:[NSNumber numberWithInt:job->crop[2]] forKey:@"PictureLeftCrop"];
- [queueFileJob setObject:[NSNumber numberWithInt:job->crop[3]] forKey:@"PictureRightCrop"];
/* Picture Filters */
HBFilters *filters = fPictureController.filters;
@@ -2155,8 +2145,8 @@ static void queueFSEventStreamCallback(
/* Codecs */
/* Framerate */
- [queueFileJob setObject:[NSNumber numberWithInt:title->vrate.num] forKey:@"JobVrate"];
- [queueFileJob setObject:[NSNumber numberWithInt:title->vrate.den] forKey:@"JobVrateBase"];
+ [queueFileJob setObject:[NSNumber numberWithInt:title->vrate.num] forKey:@"JobVrate"];
+ [queueFileJob setObject:[NSNumber numberWithInt:title->vrate.den] forKey:@"JobVrateBase"];
/* we need to auto relase the queueFileJob and return it */
[queueFileJob autorelease];
@@ -2266,7 +2256,7 @@ static void queueFSEventStreamCallback(
{
hb_list_t * list = hb_get_titles( self.queueCore.hb_handle );
hb_title_t * title = (hb_title_t *) hb_list_item( list,0 ); // is always zero since now its a single title scan
- hb_job_t * job = title->job;
+ hb_job_t * job = hb_job_init(title);
if( !hb_list_count( list ) )
{
@@ -2277,7 +2267,7 @@ static void queueFSEventStreamCallback(
[HBUtilities writeToActivityLog: "Preset: %s", [[queueToApply objectForKey:@"PresetName"] UTF8String]];
[HBUtilities writeToActivityLog: "processNewQueueEncode number of passes expected is: %d", ([[queueToApply objectForKey:@"VideoTwoPass"] intValue] + 1)];
hb_job_set_file(job, [[queueToApply objectForKey:@"DestinationPath"] UTF8String]);
- [self prepareJob];
+ [self prepareJob:job];
/*
* If scanning we need to do some extra setup of the job.
@@ -2370,8 +2360,8 @@ static void queueFSEventStreamCallback(
*/
- (IBAction)applyQueueSettingsToMainWindow:(id)sender
{
- NSMutableDictionary * queueToApply = [QueueFileArray objectAtIndex:fqueueEditRescanItemNum];
- hb_job_t * job = fTitle->job;
+ NSDictionary *queueToApply = [QueueFileArray objectAtIndex:fqueueEditRescanItemNum];
+
if (queueToApply)
{
[HBUtilities writeToActivityLog: "applyQueueSettingsToMainWindow: queue item found"];
@@ -2416,40 +2406,9 @@ static void queueFSEventStreamCallback(
[fSubtitlesViewController addTracksFromQueue:[queueToApply objectForKey:@"SubtitleList"]];
/* Picture Settings */
-
- /* If Cropping is set to custom, then recall all four crop values from
- when the preset was created and apply them */
- if ([[queueToApply objectForKey:@"PictureAutoCrop"] intValue] == 0)
- {
- [fPictureController setAutoCrop:NO];
-
- /* Here we use the custom crop values saved at the time the preset was saved */
- job->crop[0] = [[queueToApply objectForKey:@"PictureTopCrop"] intValue];
- job->crop[1] = [[queueToApply objectForKey:@"PictureBottomCrop"] intValue];
- job->crop[2] = [[queueToApply objectForKey:@"PictureLeftCrop"] intValue];
- job->crop[3] = [[queueToApply objectForKey:@"PictureRightCrop"] intValue];
-
- }
- else /* if auto crop has been saved in preset, set to auto and use post scan auto crop */
- {
- [fPictureController setAutoCrop:YES];
- /* Here we use the auto crop values determined right after scan */
- job->crop[0] = fTitle->crop[0];
- job->crop[1] = fTitle->crop[1];
- job->crop[2] = fTitle->crop[2];
- job->crop[3] = fTitle->crop[3];
-
- }
-
- job->anamorphic.mode = [[queueToApply objectForKey:@"PicturePAR"] intValue];
- job->modulus = [[queueToApply objectForKey:@"PictureModulus"] intValue];
- job->maxWidth = job->maxHeight = 0;
- job->anamorphic.keep_display_aspect = [[queueToApply objectForKey:@"PictureKeepRatio"] intValue];
- job->width = [[queueToApply objectForKey:@"PictureWidth"] intValue];
- job->height = [[queueToApply objectForKey:@"PictureHeight"] intValue];
+ [fPictureController.picture applyPictureSettingsFromQueue:queueToApply];
/* Filters */
-
HBFilters *filters = [fPictureController filters];
/* We only allow *either* Decomb or Deinterlace. So check for the PictureDecombDeinterlace key. */
@@ -2523,7 +2482,6 @@ static void queueFSEventStreamCallback(
filters.grayscale = [queueToApply[@"VideoGrayScale"] boolValue];
/* we call SetTitle: in fPictureController so we get an instant update in the Picture Settings window */
- [fPictureController setTitle:fTitle];
[self pictureSettingsDidChange];
[fPresetSelectedDisplay setStringValue:queueToApply[@"PresetName"]];
@@ -2560,6 +2518,23 @@ static void queueFSEventStreamCallback(
/* Video Encoder */
[fVideoController.video prepareVideoForJobPreview:job andTitle:title];
+ /* Picture Size Settings */
+ HBPicture *pict = self.job.picture;
+ job->width = pict.width;
+ job->height = pict.height;
+
+ job->anamorphic.keep_display_aspect = pict.keepDisplayAspect;
+ job->anamorphic.mode = pict.anamorphicMode;
+ job->modulus = pict.modulus;
+ job->par.num = pict.parWidth;
+ job->par.den = pict.parHeight;
+
+ /* Here we use the crop values saved at the time the preset was saved */
+ job->crop[0] = pict.cropTop;
+ job->crop[1] = pict.cropBottom;
+ job->crop[2] = pict.cropLeft;
+ job->crop[3] = pict.cropRight;
+
/* Subtitle settings */
BOOL one_burned = NO;
int i = 0;
@@ -2854,13 +2829,13 @@ static void queueFSEventStreamCallback(
#pragma mark -
#pragma mark Job Handling
-- (void) prepareJob
-{
-
+- (void) prepareJob:(hb_job_t *)job
+{
NSDictionary * queueToApply = [QueueFileArray objectAtIndex:currentQueueEncodeIndex];
+
hb_list_t * list = hb_get_titles(self.queueCore.hb_handle);
hb_title_t * title = (hb_title_t *) hb_list_item( list,0 ); // is always zero since now its a single title scan
- hb_job_t * job = title->job;
+
hb_audio_config_t * audio;
hb_filter_object_t * filter;
/* Title Angle for dvdnav */
@@ -3794,19 +3769,21 @@ static void queueFSEventStreamCallback(
- (IBAction) titlePopUpChanged: (id) sender
{
- hb_list_t * list = hb_get_titles( self.core.hb_handle );
- hb_title_t * title = (hb_title_t*)
- hb_list_item( list, (int)[fSrcTitlePopUp indexOfSelectedItem] );
-
// If there is already a title load, save the current settings to a preset
if (titleLoaded)
{
self.selectedPreset = [self createPresetFromCurrentSettings];
}
+ HBTitle *hbtitle = [self.core.titles objectAtIndex:fSrcTitlePopUp.indexOfSelectedItem];
+ self.job = [[[HBJob alloc] initWithTitle:hbtitle
+ url:[NSURL fileURLWithPath:fSrcDVD2Field.stringValue]
+ andPreset:self.selectedPreset] autorelease];
+
+ hb_title_t *title = hbtitle.hb_title;
+
/* If we are a stream type and a batch scan, grok the output file name from title->name upon title change */
- if ((title->type == HB_STREAM_TYPE || title->type == HB_FF_STREAM_TYPE) &&
- hb_list_count( list ) > 1 )
+ if ((title->type == HB_STREAM_TYPE || title->type == HB_FF_STREAM_TYPE) && self.core.titles.count)
{
/* we set the default name according to the new title->name */
[fDstFile2Field setStringValue: [NSString stringWithFormat:
@@ -3854,9 +3831,10 @@ static void queueFSEventStreamCallback(
/* Start Get and set the initial pic size for display */
fTitle = title;
-
- /* Set Auto Crop to on upon selecting a new title */
- [fPictureController setAutoCrop:YES];
+
+ fPictureController.picture = self.job.picture;
+ fPictureController.filters = self.job.filters;
+ fPreviewController.job = self.job;
/* Update the others views */
[[NSNotificationCenter defaultCenter] postNotification:
@@ -3866,13 +3844,16 @@ static void queueFSEventStreamCallback(
[NSData dataWithBytesNoCopy: &fTitle length: sizeof(fTitle) freeWhenDone: NO], keyTitleTag,
nil]]];
+ /* Set Auto Crop to on upon selecting a new title */
+ fPictureController.picture.autocrop = YES;
+
/* If Auto Naming is on. We create an output filename of dvd name - title number */
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"DefaultAutoNaming"])
{
[self updateFileName];
}
- /* apply the current preset */
+ /* apply the current preset */
[self applyPreset:self.selectedPreset];
}
@@ -4107,31 +4088,31 @@ the user is using "Custom" settings by determining the sender*/
fVideoController.pictureFilters = fPictureController.filters.summary;
/* Store storage resolution for unparse */
- if (fTitle)
- {
- fVideoController.video.widthForUnparse = fTitle->job->width;
- fVideoController.video.heightForUnparse = fTitle->job->height;
- }
+ fVideoController.video.widthForUnparse = fPictureController.picture.width;
+ fVideoController.video.heightForUnparse = fPictureController.picture.height;
+
+ [fPreviewController reloadPreviews];
}
#pragma mark -
#pragma mark - Text Summaries
-- (NSString*) pictureSettingsSummary
+- (NSString *)pictureSettingsSummary
{
NSMutableString *summary = [NSMutableString stringWithString:@""];
- if (fPictureController && fTitle && fTitle->job)
+ if (fPictureController.picture)
{
- [summary appendString:[fPictureController pictureSizeInfoString]];
- if (fTitle->job->anamorphic.mode != HB_ANAMORPHIC_STRICT)
+ HBPicture *pict = fPictureController.picture;
+ [summary appendString:fPictureController.picture.info];
+ if (pict.anamorphicMode != HB_ANAMORPHIC_STRICT)
{
// anamorphic is not Strict, show the modulus
- [summary appendFormat:@", Modulus: %d", fTitle->job->modulus];
+ [summary appendFormat:@", Modulus: %d", pict.modulus];
}
[summary appendFormat:@", Crop: %s %d/%d/%d/%d",
- [fPictureController autoCrop] ? "Auto" : "Custom",
- fTitle->job->crop[0], fTitle->job->crop[1],
- fTitle->job->crop[2], fTitle->job->crop[3]];
+ pict.autocrop ? "Auto" : "Custom",
+ pict.cropTop, pict.cropBottom,
+ pict.cropLeft, pict.cropRight];
}
return [NSString stringWithString:summary];
}
@@ -4232,12 +4213,12 @@ the user is using "Custom" settings by determining the sender*/
- (IBAction) showPicturePanel: (id) sender
{
- [fPictureController showPictureWindow:sender];
+ [fPictureController showPictureWindow];
}
- (IBAction) showPreviewWindow: (id) sender
{
- [fPictureController showPreviewWindow:sender];
+ [fPreviewController showWindow:sender];
}
#pragma mark - Preset Methods
@@ -4249,7 +4230,6 @@ the user is using "Custom" settings by determining the sender*/
self.selectedPreset = preset;
self.customPreset = NO;
- hb_job_t * job = fTitle->job;
NSDictionary *chosenPreset = preset.content;
[fPresetSelectedDisplay setStringValue:[chosenPreset objectForKey:@"PresetName"]];
@@ -4291,126 +4271,8 @@ the user is using "Custom" settings by determining the sender*/
[fSubtitlesViewController applySettingsFromPreset:chosenPreset];
/* Picture Settings */
- /* Note: objectForKey:@"UsesPictureSettings" refers to picture size, which encompasses:
- * height, width, keep ar, anamorphic and crop settings.
- * picture filters are handled separately below.
- */
- int maxWidth = fTitle->geometry.width - job->crop[2] - job->crop[3];
- int maxHeight = fTitle->geometry.height - job->crop[0] - job->crop[1];
- job->maxWidth = job->maxHeight = 0;
- /* Check to see if the objectForKey:@"UsesPictureSettings is greater than 0, as 0 means use picture sizing "None"
- * ( 2 is use max for source and 1 is use exact size when the preset was created ) and the
- * preset completely ignores any picture sizing values in the preset.
- */
- if ([[chosenPreset objectForKey:@"UsesPictureSettings"] intValue] > 0)
- {
- /* If Cropping is set to custom, then recall all four crop values from
- when the preset was created and apply them */
- if ([[chosenPreset objectForKey:@"PictureAutoCrop"] intValue] == 0)
- {
- [fPictureController setAutoCrop:NO];
-
- /* Here we use the custom crop values saved at the time the preset was saved */
- job->crop[0] = [[chosenPreset objectForKey:@"PictureTopCrop"] intValue];
- job->crop[1] = [[chosenPreset objectForKey:@"PictureBottomCrop"] intValue];
- job->crop[2] = [[chosenPreset objectForKey:@"PictureLeftCrop"] intValue];
- job->crop[3] = [[chosenPreset objectForKey:@"PictureRightCrop"] intValue];
-
- }
- else /* if auto crop has been saved in preset, set to auto and use post scan auto crop */
- {
- [fPictureController setAutoCrop:YES];
- /* Here we use the auto crop values determined right after scan */
- job->crop[0] = fTitle->crop[0];
- job->crop[1] = fTitle->crop[1];
- job->crop[2] = fTitle->crop[2];
- job->crop[3] = fTitle->crop[3];
- }
-
- /* crop may have changed, reset maxWidth/maxHeight */
- maxWidth = fTitle->geometry.width - job->crop[2] - job->crop[3];
- maxHeight = fTitle->geometry.height - job->crop[0] - job->crop[1];
-
- /* Set modulus */
- if ([chosenPreset objectForKey:@"PictureModulus"])
- {
- job->modulus = [[chosenPreset objectForKey:@"PictureModulus"] intValue];
- }
- else
- {
- job->modulus = 16;
- }
-
- /*
- * Assume max picture settings initially
- */
- job->anamorphic.mode = [[chosenPreset objectForKey:@"PicturePAR"] intValue];
- job->width = fTitle->geometry.width - job->crop[2] - job->crop[3];
- job->height = fTitle->geometry.height - job->crop[0] - job->crop[1];
- job->anamorphic.keep_display_aspect = [[chosenPreset objectForKey:@"PictureKeepRatio"] intValue];
-
- /* Check to see if the objectForKey:@"UsesPictureSettings" is 2,
- * which means "Use max. picture size for source"
- * If not 2 it must be 1 here which means "Use the picture
- * size specified in the preset"
- */
- if ([[chosenPreset objectForKey:@"UsesPictureSettings"] intValue] != 2 &&
- [[chosenPreset objectForKey:@"UsesMaxPictureSettings"] intValue] != 1)
- {
- /*
- * if the preset specifies neither max. width nor height
- * (both are 0), use the max. picture size
- *
- * if the specified non-zero dimensions exceed those of the
- * source, also use the max. picture size (no upscaling)
- */
- if ([[chosenPreset objectForKey:@"PictureWidth"] intValue] > 0)
- {
- job->maxWidth = [[chosenPreset objectForKey:@"PictureWidth"] intValue];
- }
- if ([[chosenPreset objectForKey:@"PictureHeight"] intValue] > 0)
- {
- job->maxHeight = [[chosenPreset objectForKey:@"PictureHeight"] intValue];
- }
- }
- }
- /* Modulus added to maxWidth/maxHeight to allow a small amount of
- * upscaling to the next mod boundary. This does not apply to
- * explicit limits set for device compatibility. It only applies
- * when limiting to cropped title dimensions.
- */
- maxWidth += job->modulus - 1;
- maxHeight += job->modulus - 1;
- if (job->maxWidth == 0 || job->maxWidth > maxWidth)
- job->maxWidth = maxWidth;
- if (job->maxHeight == 0 || job->maxHeight > maxHeight)
- job->maxHeight = maxHeight;
-
- hb_geometry_t srcGeo, resultGeo;
- hb_geometry_settings_t uiGeo;
-
- srcGeo.width = fTitle->geometry.width;
- srcGeo.height = fTitle->geometry.height;
- srcGeo.par = fTitle->geometry.par;
-
- uiGeo.mode = job->anamorphic.mode;
- uiGeo.keep = !!job->anamorphic.keep_display_aspect * HB_KEEP_DISPLAY_ASPECT;
- uiGeo.itu_par = 0;
- uiGeo.modulus = job->modulus;
- memcpy(uiGeo.crop, job->crop, sizeof(int[4]));
- uiGeo.geometry.width = job->width;
- uiGeo.geometry.height = job->height;
- uiGeo.geometry.par = job->par;
- uiGeo.maxWidth = job->maxWidth;
- uiGeo.maxHeight = job->maxHeight;
- hb_set_anamorphic_size2(&srcGeo, &uiGeo, &resultGeo);
-
- job->width = resultGeo.width;
- job->height = resultGeo.height;
- job->par = resultGeo.par;
-
/* we call SetTitle: in fPictureController so we get an instant update in the Picture Settings window */
- [fPictureController setTitle:fTitle];
+ [fPictureController.picture applySettingsFromPreset:chosenPreset];
[fPictureController.filters applySettingsFromPreset:chosenPreset];
[self pictureSettingsDidChange];
}
@@ -4451,7 +4313,7 @@ the user is using "Custom" settings by determining the sender*/
{
/* Show the add panel */
HBAddPresetController *addPresetController = [[HBAddPresetController alloc] initWithPreset:[self createPresetFromCurrentSettings]
- videoSize:NSMakeSize(fTitle->job->width, fTitle->job->height)];
+ videoSize:NSMakeSize(fPictureController.picture.width, fPictureController.picture.height)];
[NSApp beginSheet:addPresetController.window modalForWindow:fWindow modalDelegate:self didEndSelector:@selector(sheetDidEnd:returnCode:contextInfo:) contextInfo:addPresetController];
}
@@ -4498,26 +4360,15 @@ the user is using "Custom" settings by determining the sender*/
// Video encoder
[fVideoController.video prepareVideoForPreset:preset];
- // Picture Sizing
preset[@"PictureWidth"] = currentPreset[@"PictureWidth"];
preset[@"PictureHeight"] = currentPreset[@"PictureHeight"];
- hb_job_t *job = fTitle->job;
- preset[@"PictureKeepRatio"] = @(job->anamorphic.keep_display_aspect);
- preset[@"PicturePAR"] = @(job->anamorphic.mode);
- preset[@"PictureModulus"] = @(job->modulus);
-
- // Set crop settings
- preset[@"PictureAutoCrop"] = @(fPictureController.autoCrop);
-
- preset[@"PictureTopCrop"] = @(job->crop[0]);
- preset[@"PictureBottomCrop"] = @(job->crop[1]);
- preset[@"PictureLeftCrop"] = @(job->crop[2]);
- preset[@"PictureRightCrop"] = @(job->crop[3]);
-
// Picture Filters
[fPictureController.filters prepareFiltersForPreset:preset];
+ // Picture Size
+ [fPictureController.picture preparePictureForPreset:preset];
+
// Audio
[fAudioController.settings prepareAudioDefaultsForPreset:preset];
diff --git a/macosx/English.lproj/PictureSettings.xib b/macosx/English.lproj/PictureSettings.xib
index f7f43f608..9fac46c13 100644
--- a/macosx/English.lproj/PictureSettings.xib
+++ b/macosx/English.lproj/PictureSettings.xib
@@ -1,23 +1,14 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="6250" systemVersion="14B23" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none">
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="6254" systemVersion="14C81f" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none">
<dependencies>
<deployment version="1060" identifier="macosx"/>
<development version="5100" identifier="xcode"/>
- <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="6250"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="6254"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="HBPictureController">
<connections>
<outlet property="fAnamorphicPopUp" destination="132" id="140"/>
- <outlet property="fCropBottomField" destination="10" id="53"/>
- <outlet property="fCropBottomStepper" destination="14" id="54"/>
- <outlet property="fCropLeftField" destination="11" id="55"/>
- <outlet property="fCropLeftStepper" destination="19" id="56"/>
- <outlet property="fCropMatrix" destination="16" id="57"/>
- <outlet property="fCropRightField" destination="9" id="58"/>
- <outlet property="fCropRightStepper" destination="15" id="59"/>
- <outlet property="fCropTopField" destination="13" id="60"/>
- <outlet property="fCropTopStepper" destination="12" id="61"/>
<outlet property="fDeblockField" destination="291" id="372"/>
<outlet property="fDecombBox" destination="315" id="364"/>
<outlet property="fDecombDeinterlaceBox" destination="287" id="360"/>
@@ -29,23 +20,11 @@
<outlet property="fDenoiseTuneLabel" destination="gpP-sp-Lev" id="Q7g-G7-JZZ"/>
<outlet property="fDenoiseTunePopUp" destination="Upd-5E-OpR" id="5UN-Gt-l11"/>
<outlet property="fDetelecineBox" destination="286" id="356"/>
- <outlet property="fDisplayWidthField" destination="396" id="407"/>
- <outlet property="fDisplayWidthLabel" destination="402" id="526"/>
- <outlet property="fHeightField" destination="43" id="66"/>
- <outlet property="fHeightStepper" destination="46" id="67"/>
- <outlet property="fModulusLabel" destination="390" id="532"/>
- <outlet property="fModulusPopUp" destination="384" id="392"/>
- <outlet property="fParHeightField" destination="442" id="449"/>
- <outlet property="fParHeightLabel" destination="446" id="525"/>
- <outlet property="fParWidthField" destination="440" id="448"/>
- <outlet property="fParWidthLabel" destination="444" id="524"/>
+ <outlet property="fHeightStepper" destination="46" id="cLy-f3-fot"/>
<outlet property="fPictureCropBox" destination="7" id="242"/>
<outlet property="fPictureSizeBox" destination="436" id="437"/>
- <outlet property="fRatioCheck" destination="45" id="74"/>
<outlet property="fSizeFilterView" destination="281" id="419"/>
- <outlet property="fSizeInfoField" destination="278" id="280"/>
- <outlet property="fWidthField" destination="42" id="68"/>
- <outlet property="fWidthStepper" destination="44" id="69"/>
+ <outlet property="fWidthStepper" destination="44" id="z49-FB-Xci"/>
<outlet property="window" destination="5" id="184"/>
</connections>
</customObject>
@@ -61,7 +40,7 @@
<autoresizingMask key="autoresizingMask"/>
<userGuides>
<userLayoutGuide affinity="minY"/>
- <userLayoutGuide location="115" affinity="minX"/>
+ <userLayoutGuide location="114" affinity="minX"/>
</userGuides>
<subviews>
<textField verticalHuggingPriority="750" id="262">
@@ -81,6 +60,9 @@
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="calibratedRGB"/>
</textFieldCell>
+ <connections>
+ <binding destination="-2" name="value" keyPath="self.picture.info" id="Qs2-Ni-TWK"/>
+ </connections>
</textField>
<tabView controlSize="mini" initialItem="282" id="281">
<rect key="frame" x="-12" y="18" width="658" height="216"/>
@@ -107,6 +89,13 @@
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
+ <connections>
+ <binding destination="-2" name="hidden" keyPath="self.picture.customAnamorphicEnabled" id="aUz-kE-qa4">
+ <dictionary key="options">
+ <string key="NSValueTransformerName">NSNegateBoolean</string>
+ </dictionary>
+ </binding>
+ </connections>
</textField>
<textField verticalHuggingPriority="750" id="396">
<rect key="frame" x="278" y="106" width="61" height="16"/>
@@ -117,7 +106,18 @@
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
- <action selector="settingsChanged:" target="-2" id="EIO-m9-bQ5"/>
+ <binding destination="-2" name="enabled" keyPath="self.picture.keepDisplayAspect" previousBinding="zMs-ue-T1n" id="gD3-Yl-3au">
+ <dictionary key="options">
+ <string key="NSValueTransformerName">NSNegateBoolean</string>
+ </dictionary>
+ </binding>
+ <binding destination="-2" name="hidden" keyPath="self.picture.customAnamorphicEnabled" previousBinding="gD3-Yl-3au" id="PSj-Fl-3Ni">
+ <dictionary key="options">
+ <string key="NSValueTransformerName">NSNegateBoolean</string>
+ </dictionary>
+ </binding>
+ <binding destination="-2" name="editable" keyPath="self.picture.customAnamorphicEnabled" id="zMs-ue-T1n"/>
+ <binding destination="-2" name="value" keyPath="self.picture.displayWidth" id="nMg-v2-Fvg"/>
</connections>
</textField>
<textField verticalHuggingPriority="750" id="440">
@@ -129,7 +129,18 @@
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
- <action selector="settingsChanged:" target="-2" id="Ip6-Hp-U6K"/>
+ <binding destination="-2" name="enabled" keyPath="self.picture.keepDisplayAspect" previousBinding="Wvz-jo-lwE" id="b7l-Ej-dxa">
+ <dictionary key="options">
+ <string key="NSValueTransformerName">NSNegateBoolean</string>
+ </dictionary>
+ </binding>
+ <binding destination="-2" name="hidden" keyPath="self.picture.customAnamorphicEnabled" previousBinding="b7l-Ej-dxa" id="4ER-Vi-m2V">
+ <dictionary key="options">
+ <string key="NSValueTransformerName">NSNegateBoolean</string>
+ </dictionary>
+ </binding>
+ <binding destination="-2" name="editable" keyPath="self.picture.customAnamorphicEnabled" id="Wvz-jo-lwE"/>
+ <binding destination="-2" name="value" keyPath="self.picture.parWidth" id="PXg-GA-vo6"/>
</connections>
</textField>
<textField verticalHuggingPriority="750" id="442">
@@ -141,7 +152,18 @@
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
- <action selector="settingsChanged:" target="-2" id="YvM-ki-flP"/>
+ <binding destination="-2" name="enabled" keyPath="self.picture.keepDisplayAspect" previousBinding="Vjg-8L-veN" id="kG8-EC-OJR">
+ <dictionary key="options">
+ <string key="NSValueTransformerName">NSNegateBoolean</string>
+ </dictionary>
+ </binding>
+ <binding destination="-2" name="hidden" keyPath="self.picture.customAnamorphicEnabled" previousBinding="kG8-EC-OJR" id="6PT-Pz-qs1">
+ <dictionary key="options">
+ <string key="NSValueTransformerName">NSNegateBoolean</string>
+ </dictionary>
+ </binding>
+ <binding destination="-2" name="editable" keyPath="self.picture.customAnamorphicEnabled" id="Vjg-8L-veN"/>
+ <binding destination="-2" name="value" keyPath="self.picture.parHeight" id="HrI-5d-evg"/>
</connections>
</textField>
<textField verticalHuggingPriority="750" id="444">
@@ -152,6 +174,13 @@
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
+ <connections>
+ <binding destination="-2" name="hidden" keyPath="self.picture.customAnamorphicEnabled" id="Gp6-pf-QeR">
+ <dictionary key="options">
+ <string key="NSValueTransformerName">NSNegateBoolean</string>
+ </dictionary>
+ </binding>
+ </connections>
</textField>
<textField verticalHuggingPriority="750" id="446">
<rect key="frame" x="202" y="56" width="71" height="16"/>
@@ -161,6 +190,13 @@
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
+ <connections>
+ <binding destination="-2" name="hidden" keyPath="self.picture.customAnamorphicEnabled" id="IQs-tB-UlR">
+ <dictionary key="options">
+ <string key="NSValueTransformerName">NSNegateBoolean</string>
+ </dictionary>
+ </binding>
+ </connections>
</textField>
<stepper horizontalHuggingPriority="750" verticalHuggingPriority="750" id="44">
<rect key="frame" x="143" y="103" width="15" height="22"/>
@@ -169,25 +205,28 @@
<font key="font" metaFont="smallSystem"/>
</stepperCell>
<connections>
- <action selector="settingsChanged:" target="-2" id="je3-pw-SC3"/>
+ <binding destination="-2" name="maxValue" keyPath="self.picture.maxWidth" id="P3g-UC-vRH"/>
+ <binding destination="-2" name="value" keyPath="self.picture.width" previousBinding="P3g-UC-vRH" id="Ilz-OP-M5c"/>
+ <binding destination="-2" name="enabled" keyPath="self.picture.widthEditable" id="ied-mi-MjS"/>
</connections>
</stepper>
<popUpButton verticalHuggingPriority="750" id="384">
<rect key="frame" x="75" y="15" width="46" height="15"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
- <popUpButtonCell key="cell" type="push" title="16" bezelStyle="rounded" alignment="left" controlSize="mini" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" inset="2" selectedItem="387" id="385">
+ <popUpButtonCell key="cell" type="push" title="4" bezelStyle="rounded" alignment="left" controlSize="mini" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" inset="2" selectedItem="389" id="385">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="miniSystem"/>
<menu key="menu" title="OtherViews" id="386">
<items>
- <menuItem title="16" state="on" id="387"/>
+ <menuItem title="16" id="387"/>
<menuItem title="8" id="388"/>
- <menuItem title="4" id="389"/>
+ <menuItem title="4" state="on" id="389"/>
+ <menuItem title="2" id="Fx1-DI-r18"/>
</items>
</menu>
</popUpButtonCell>
<connections>
- <action selector="settingsChanged:" target="-2" id="fS2-p2-Ldc"/>
+ <binding destination="-2" name="selectedValue" keyPath="self.picture.modulus" id="anc-Ha-mxE"/>
</connections>
</popUpButton>
<textField verticalHuggingPriority="750" id="42">
@@ -202,7 +241,13 @@
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
- <action selector="settingsChanged:" target="-2" id="EJC-vL-fSK"/>
+ <binding destination="-2" name="editable" keyPath="self.picture.widthEditable" id="YBx-pZ-bPA"/>
+ <binding destination="-2" name="value" keyPath="self.picture.width" id="Dr6-U5-h7T">
+ <dictionary key="options">
+ <integer key="NSNullPlaceholder" value="0"/>
+ <bool key="NSValidatesImmediately" value="YES"/>
+ </dictionary>
+ </binding>
</connections>
</textField>
<stepper horizontalHuggingPriority="750" verticalHuggingPriority="750" id="46">
@@ -212,7 +257,9 @@
<font key="font" metaFont="smallSystem"/>
</stepperCell>
<connections>
- <action selector="settingsChanged:" target="-2" id="77Y-D7-WA9"/>
+ <binding destination="-2" name="value" keyPath="self.picture.height" previousBinding="nJk-wN-aaB" id="l4c-7G-SMf"/>
+ <binding destination="-2" name="enabled" keyPath="self.picture.heightEditable" id="Fdi-IK-Y16"/>
+ <binding destination="-2" name="maxValue" keyPath="self.picture.maxHeight" id="nJk-wN-aaB"/>
</connections>
</stepper>
<textField verticalHuggingPriority="750" id="138">
@@ -236,19 +283,19 @@
<popUpButton verticalHuggingPriority="750" id="132">
<rect key="frame" x="75" y="38" width="80" height="15"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
- <popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" controlSize="mini" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" inset="2" selectedItem="135" id="173">
+ <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" controlSize="mini" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" inset="2" id="173">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="miniSystem"/>
<menu key="menu" title="OtherViews" id="134">
<items>
- <menuItem title="Item 1" state="on" id="135"/>
+ <menuItem title="Item 1" id="135"/>
<menuItem title="Item 2" id="136"/>
<menuItem title="Item 3" id="137"/>
</items>
</menu>
</popUpButtonCell>
<connections>
- <action selector="settingsChanged:" target="-2" id="OGE-xz-yb7"/>
+ <binding destination="-2" name="selectedIndex" keyPath="self.picture.anamorphicMode" id="nZC-Kh-dDe"/>
</connections>
</popUpButton>
<textField verticalHuggingPriority="750" id="390">
@@ -284,7 +331,13 @@
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
- <action selector="settingsChanged:" target="-2" id="hfw-v1-XQB"/>
+ <binding destination="-2" name="editable" keyPath="self.picture.heightEditable" id="Je1-xf-WNB"/>
+ <binding destination="-2" name="value" keyPath="self.picture.height" id="T7h-fp-Qs6">
+ <dictionary key="options">
+ <integer key="NSNullPlaceholder" value="0"/>
+ <bool key="NSValidatesImmediately" value="YES"/>
+ </dictionary>
+ </binding>
</connections>
</textField>
<button id="45">
@@ -295,7 +348,8 @@
<font key="font" metaFont="smallSystem"/>
</buttonCell>
<connections>
- <action selector="settingsChanged:" target="-2" id="urF-IM-OfA"/>
+ <binding destination="-2" name="value" keyPath="self.picture.keepDisplayAspect" id="8uc-2H-rkz"/>
+ <binding destination="-2" name="enabled" keyPath="self.picture.keepDisplayAspectEditable" id="DSI-Ra-G0d"/>
</connections>
</button>
</subviews>
@@ -317,7 +371,13 @@
<font key="font" metaFont="smallSystem"/>
</stepperCell>
<connections>
- <action selector="settingsChanged:" target="-2" id="gih-EE-fLI"/>
+ <binding destination="-2" name="maxValue" keyPath="self.picture.maxVerticalCrop" id="9ff-Ns-69S"/>
+ <binding destination="-2" name="enabled" keyPath="self.picture.autocrop" id="Vp0-sU-c5s">
+ <dictionary key="options">
+ <string key="NSValueTransformerName">NSNegateBoolean</string>
+ </dictionary>
+ </binding>
+ <binding destination="-2" name="value" keyPath="self.picture.cropTop" previousBinding="9ff-Ns-69S" id="4Cj-4f-6FM"/>
</connections>
</stepper>
<stepper horizontalHuggingPriority="750" verticalHuggingPriority="750" id="15">
@@ -325,10 +385,16 @@
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<stepperCell key="cell" controlSize="small" continuous="YES" alignment="left" increment="2" maxValue="59" id="155">
<font key="font" metaFont="smallSystem"/>
- <connections>
- <action selector="settingsChanged:" target="-2" id="pwP-2b-uZ1"/>
- </connections>
</stepperCell>
+ <connections>
+ <binding destination="-2" name="maxValue" keyPath="self.picture.maxHorizontalCrop" id="39d-dv-rDM"/>
+ <binding destination="-2" name="enabled" keyPath="self.picture.autocrop" id="5QD-Dh-bzl">
+ <dictionary key="options">
+ <string key="NSValueTransformerName">NSNegateBoolean</string>
+ </dictionary>
+ </binding>
+ <binding destination="-2" name="value" keyPath="self.picture.cropRight" previousBinding="39d-dv-rDM" id="OUg-17-HR9"/>
+ </connections>
</stepper>
<matrix verticalHuggingPriority="750" allowsEmptySelection="NO" autosizesCells="NO" id="16">
<rect key="frame" x="64" y="92" width="90" height="31"/>
@@ -353,7 +419,11 @@
</column>
</cells>
<connections>
- <action selector="settingsChanged:" target="-2" id="dUb-Ct-S9f"/>
+ <binding destination="-2" name="selectedIndex" keyPath="self.picture.autocrop" id="9wD-y3-pVM">
+ <dictionary key="options">
+ <string key="NSValueTransformerName">NSNegateBoolean</string>
+ </dictionary>
+ </binding>
</connections>
</matrix>
<textField verticalHuggingPriority="750" id="13">
@@ -365,7 +435,17 @@
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
- <action selector="settingsChanged:" target="-2" id="LEd-0c-EqV"/>
+ <binding destination="-2" name="enabled" keyPath="self.picture.autocrop" id="DlH-KY-uVi">
+ <dictionary key="options">
+ <string key="NSValueTransformerName">NSNegateBoolean</string>
+ </dictionary>
+ </binding>
+ <binding destination="-2" name="value" keyPath="self.picture.cropTop" id="ABP-Q9-NDw">
+ <dictionary key="options">
+ <string key="NSNullPlaceholder">0</string>
+ <bool key="NSValidatesImmediately" value="YES"/>
+ </dictionary>
+ </binding>
</connections>
</textField>
<textField verticalHuggingPriority="750" id="10">
@@ -377,7 +457,17 @@
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
- <action selector="settingsChanged:" target="-2" id="txb-hc-ans"/>
+ <binding destination="-2" name="enabled" keyPath="self.picture.autocrop" id="Hai-0I-6yj">
+ <dictionary key="options">
+ <string key="NSValueTransformerName">NSNegateBoolean</string>
+ </dictionary>
+ </binding>
+ <binding destination="-2" name="value" keyPath="self.picture.cropBottom" id="nVf-lw-Tr1">
+ <dictionary key="options">
+ <string key="NSNullPlaceholder">0</string>
+ <bool key="NSValidatesImmediately" value="YES"/>
+ </dictionary>
+ </binding>
</connections>
</textField>
<stepper horizontalHuggingPriority="750" verticalHuggingPriority="750" id="19">
@@ -385,10 +475,16 @@
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<stepperCell key="cell" controlSize="small" continuous="YES" alignment="left" increment="2" maxValue="59" id="156">
<font key="font" metaFont="smallSystem"/>
- <connections>
- <action selector="settingsChanged:" target="-2" id="Ds0-vg-mpO"/>
- </connections>
</stepperCell>
+ <connections>
+ <binding destination="-2" name="maxValue" keyPath="self.picture.maxHorizontalCrop" id="2Rh-om-NkW"/>
+ <binding destination="-2" name="enabled" keyPath="self.picture.autocrop" id="WmV-2A-EDo">
+ <dictionary key="options">
+ <string key="NSValueTransformerName">NSNegateBoolean</string>
+ </dictionary>
+ </binding>
+ <binding destination="-2" name="value" keyPath="self.picture.cropLeft" previousBinding="2Rh-om-NkW" id="hk3-CS-WKR"/>
+ </connections>
</stepper>
<textField verticalHuggingPriority="750" id="9">
<rect key="frame" x="194" y="56" width="36" height="16"/>
@@ -399,7 +495,17 @@
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
- <action selector="settingsChanged:" target="-2" id="FQT-HE-w3X"/>
+ <binding destination="-2" name="enabled" keyPath="self.picture.autocrop" id="yw7-7Q-sse">
+ <dictionary key="options">
+ <string key="NSValueTransformerName">NSNegateBoolean</string>
+ </dictionary>
+ </binding>
+ <binding destination="-2" name="value" keyPath="self.picture.cropRight" id="lou-1C-A2w">
+ <dictionary key="options">
+ <string key="NSNullPlaceholder">0</string>
+ <bool key="NSValidatesImmediately" value="YES"/>
+ </dictionary>
+ </binding>
</connections>
</textField>
<textField verticalHuggingPriority="750" id="11">
@@ -411,7 +517,17 @@
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
- <action selector="settingsChanged:" target="-2" id="JTs-h7-4xm"/>
+ <binding destination="-2" name="enabled" keyPath="self.picture.autocrop" id="egn-yP-dYe">
+ <dictionary key="options">
+ <string key="NSValueTransformerName">NSNegateBoolean</string>
+ </dictionary>
+ </binding>
+ <binding destination="-2" name="value" keyPath="self.picture.cropLeft" id="ste-Ks-OLX">
+ <dictionary key="options">
+ <string key="NSNullPlaceholder">0</string>
+ <bool key="NSValidatesImmediately" value="YES"/>
+ </dictionary>
+ </binding>
</connections>
</textField>
<stepper horizontalHuggingPriority="750" verticalHuggingPriority="750" id="14">
@@ -419,10 +535,16 @@
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<stepperCell key="cell" controlSize="small" continuous="YES" alignment="left" increment="2" maxValue="59" id="154">
<font key="font" metaFont="smallSystem"/>
- <connections>
- <action selector="settingsChanged:" target="-2" id="e3a-Lo-Umb"/>
- </connections>
</stepperCell>
+ <connections>
+ <binding destination="-2" name="maxValue" keyPath="self.picture.maxVerticalCrop" id="jS8-Tg-h3O"/>
+ <binding destination="-2" name="enabled" keyPath="self.picture.autocrop" id="soK-UE-pde">
+ <dictionary key="options">
+ <string key="NSValueTransformerName">NSNegateBoolean</string>
+ </dictionary>
+ </binding>
+ <binding destination="-2" name="value" keyPath="self.picture.cropBottom" previousBinding="jS8-Tg-h3O" id="k6f-Bd-Crr"/>
+ </connections>
</stepper>
<textField verticalHuggingPriority="750" id="382">
<rect key="frame" x="3" y="107" width="59" height="17"/>
@@ -896,7 +1018,8 @@
<connections>
<outlet property="delegate" destination="-2" id="hby-dR-NFK"/>
</connections>
- <point key="canvasLocation" x="182.5" y="419"/>
+ <point key="canvasLocation" x="-1.5" y="238"/>
</window>
+ <userDefaultsController representsSharedInstance="YES" id="vUw-ux-GVV"/>
</objects>
</document>
diff --git a/macosx/HBPreviewController.h b/macosx/HBPreviewController.h
index ed7fd19ab..36a71faed 100644
--- a/macosx/HBPreviewController.h
+++ b/macosx/HBPreviewController.h
@@ -5,19 +5,22 @@
It may be used under the terms of the GNU General Public License. */
#import <Cocoa/Cocoa.h>
-#include "hb.h"
@class HBController;
-@interface HBPreviewController : NSWindowController <NSWindowDelegate>
+@class HBCore;
+@class HBJob;
-@property (nonatomic) BOOL deinterlacePreview;
-@property (nonatomic, readonly) NSString *pictureSizeInfoString;
+@interface HBPreviewController : NSWindowController <NSWindowDelegate>
@property (nonatomic, assign) HBController *delegate;
-@property (nonatomic, assign) hb_handle_t *handle;
-@property (nonatomic, assign) hb_title_t *title;
-
-- (void) reload;
+@property (nonatomic, assign) HBCore *core;
+@property (nonatomic, assign) HBJob *job;
+
+/**
+ * Reloads the preview images.
+ * Usually called after a picture setting changes.
+ */
+- (void)reloadPreviews;
@end
diff --git a/macosx/HBPreviewController.m b/macosx/HBPreviewController.m
index 2d4174ef7..21cc58f33 100644
--- a/macosx/HBPreviewController.m
+++ b/macosx/HBPreviewController.m
@@ -10,6 +10,9 @@
#import "Controller.h"
#import <QTKit/QTKit.h>
+#import "HBPicture.h"
+#import "HBJob.h"
+
@implementation QTMovieView (HBQTMovieViewExtensions)
- (void) mouseMoved: (NSEvent *) theEvent
@@ -228,18 +231,18 @@ typedef enum ViewMode : NSUInteger {
self.backingScaleFactor = 1.0;
}
-- (void) setTitle: (hb_title_t *) title
+- (void) setJob:(HBJob *)job
{
- _title = title;
+ _job = job;
self.generator.delegate = nil;
[self.generator cancel];
self.generator = nil;
- if (_title)
+ if (job)
{
/* alloc and init a generator for the current title */
- self.generator = [[[HBPreviewGenerator alloc] initWithHandle:self.handle andTitle:self.title] autorelease];
+ self.generator = [[[HBPreviewGenerator alloc] initWithCore:self.core job:self.job] autorelease];
/* adjust the preview slider length */
[fPictureSlider setMaxValue: self.generator.imagesCount - 1.0];
@@ -250,9 +253,9 @@ typedef enum ViewMode : NSUInteger {
}
}
-- (void) reload
+- (void) reloadPreviews
{
- if (self.title)
+ if (self.job)
{
// Purge the existing picture previews so they get recreated the next time
// they are needed.
@@ -264,12 +267,16 @@ typedef enum ViewMode : NSUInteger {
- (void) showWindow: (id) sender
{
+ [super showWindow:sender];
+
if (self.currentViewMode == ViewModeMoviePreview)
{
[self startMovieTimer];
}
-
- [super showWindow:sender];
+ else
+ {
+ [self reloadPreviews];
+ }
}
- (void) windowWillClose: (NSNotification *) aNotification
@@ -302,8 +309,8 @@ typedef enum ViewMode : NSUInteger {
// Scale factor changed, update the preview window
// to the new situation
self.backingScaleFactor = newBackingScaleFactor;
- if (self.title)
- [self reload];
+ if (self.job)
+ [self reloadPreviews];
}
}
@@ -546,7 +553,7 @@ typedef enum ViewMode : NSUInteger {
NSPoint mouseLoc = [theEvent locationInWindow];
/* Test for mouse location to show/hide hud controls */
- if (self.currentViewMode != ViewModeEncoding && self.title)
+ if (self.currentViewMode != ViewModeEncoding && self.job)
{
/* Since we are not encoding, verify which control hud to show
* or hide based on aMovie ( aMovie indicates we need movie controls )
@@ -665,46 +672,18 @@ typedef enum ViewMode : NSUInteger {
*/
- (void) displayPreview
{
- hb_title_t *title = self.title;
-
- NSImage *fPreviewImage = [self.generator imageAtIndex:self.pictureIndex shouldCache:YES];
- NSSize imageScaledSize = [fPreviewImage size];
- [self.pictureLayer setContents:fPreviewImage];
+ if (self.window.isVisible)
+ {
+ NSImage *fPreviewImage = [self.generator imageAtIndex:self.pictureIndex shouldCache:YES];
+ [self.pictureLayer setContents:fPreviewImage];
+ }
- NSSize displaySize = NSMakeSize( ( CGFloat )title->geometry.width, ( CGFloat )title->geometry.height );
- NSString *sizeInfoString;
+ HBPicture *pict = self.job.picture;
/* Set the picture size display fields below the Preview Picture*/
- int display_width;
- display_width = title->job->width * title->job->par.num / title->job->par.den;
- if (title->job->anamorphic.mode == HB_ANAMORPHIC_STRICT) // Original PAR Implementation
- {
- sizeInfoString = [NSString stringWithFormat:
- @"Source: %dx%d, Output: %dx%d, Anamorphic: %dx%d Strict",
- title->geometry.width, title->geometry.height, title->job->width, title->job->height, display_width, title->job->height];
- }
- else if (title->job->anamorphic.mode == HB_ANAMORPHIC_LOOSE) // Loose Anamorphic
- {
- sizeInfoString = [NSString stringWithFormat:
- @"Source: %dx%d, Output: %dx%d, Anamorphic: %dx%d Loose",
- title->geometry.width, title->geometry.height, title->job->width, title->job->height, display_width, title->job->height];
- }
- else if (title->job->anamorphic.mode == HB_ANAMORPHIC_CUSTOM) // Custom Anamorphic
- {
- sizeInfoString = [NSString stringWithFormat:
- @"Source: %dx%d, Output: %dx%d, Anamorphic: %dx%d Custom",
- title->geometry.width, title->geometry.height, title->job->width, title->job->height, display_width, title->job->height];
- }
- else // No Anamorphic
- {
- sizeInfoString = [NSString stringWithFormat:
- @"Source: %dx%d, Output: %dx%d",
- title->geometry.width, title->geometry.height, title->job->width, title->job->height];
- }
- displaySize.width = display_width;
- displaySize.height = title->job->height;
- imageScaledSize.width = display_width;
- imageScaledSize.height = title->job->height;
+ int display_width = pict.width * pict.parWidth / pict.parHeight;
+ NSSize imageScaledSize = NSMakeSize(display_width, pict.height);
+ NSSize displaySize = NSMakeSize(display_width, pict.height);
if (self.backingScaleFactor != 1.0)
{
@@ -793,13 +772,13 @@ typedef enum ViewMode : NSUInteger {
/* Set the info fields in the hud controller */
[fInfoField setStringValue: [NSString stringWithFormat:
- @"%@", sizeInfoString]];
+ @"%@", self.job.picture.info]];
[fscaleInfoField setStringValue: [NSString stringWithFormat:
@"%@", scaleString]];
/* Set the info field in the window title bar */
- [[self window] setTitle:[NSString stringWithFormat: @"Preview - %@ %@",sizeInfoString, scaleString]];
+ [[self window] setTitle:[NSString stringWithFormat: @"Preview - %@ %@", self.job.picture.info, scaleString]];
}
- (IBAction) previewDurationPopUpChanged: (id) sender
@@ -807,15 +786,9 @@ typedef enum ViewMode : NSUInteger {
[[NSUserDefaults standardUserDefaults] setObject:[fPreviewMovieLengthPopUp titleOfSelectedItem] forKey:@"PreviewLength"];
}
-- (void) setDeinterlacePreview: (BOOL) deinterlacePreview
-{
- _deinterlacePreview = deinterlacePreview;
- self.generator.deinterlace = deinterlacePreview;
-}
-
- (IBAction) pictureSliderChanged: (id) sender
{
- if ((self.pictureIndex != [fPictureSlider intValue] || !sender) && self.title) {
+ if ((self.pictureIndex != [fPictureSlider intValue] || !sender) && self.job) {
self.pictureIndex = [fPictureSlider intValue];
[self displayPreview];
}
@@ -839,11 +812,6 @@ typedef enum ViewMode : NSUInteger {
}
}
-- (NSString *) pictureSizeInfoString
-{
- return [fInfoField stringValue];
-}
-
- (IBAction) showPictureSettings: (id) sender
{
[self.delegate showPicturePanel:self];
diff --git a/macosx/HBPreviewGenerator.h b/macosx/HBPreviewGenerator.h
index 72e3b5153..c8219bc54 100644
--- a/macosx/HBPreviewGenerator.h
+++ b/macosx/HBPreviewGenerator.h
@@ -5,7 +5,9 @@
It may be used under the terms of the GNU General Public License. */
#import <Cocoa/Cocoa.h>
-#include "hb.h"
+
+@class HBCore;
+@class HBJob;
@protocol HBPreviewGeneratorDelegate <NSObject>
@@ -19,9 +21,8 @@
@interface HBPreviewGenerator : NSObject
@property (nonatomic, assign) id <HBPreviewGeneratorDelegate> delegate;
-@property (nonatomic) BOOL deinterlace;
-- (id) initWithHandle: (hb_handle_t *) handle andTitle: (hb_title_t *) title;
+- (instancetype)initWithCore:(HBCore *)core job:(HBJob *)job;
/* Still image generator */
- (NSImage *) imageAtIndex: (NSUInteger) index shouldCache: (BOOL) cache;
diff --git a/macosx/HBPreviewGenerator.m b/macosx/HBPreviewGenerator.m
index 3e9adbe9b..f089ade22 100644
--- a/macosx/HBPreviewGenerator.m
+++ b/macosx/HBPreviewGenerator.m
@@ -7,9 +7,11 @@
#import "HBPreviewGenerator.h"
#import "HBUtilities.h"
-#import "HBCore.h"
#import "Controller.h"
+#import "HBCore.h"
+#import "HBJob.h"
+
typedef enum EncodeState : NSUInteger {
EncodeStateIdle,
EncodeStateWorking,
@@ -20,8 +22,8 @@ typedef enum EncodeState : NSUInteger {
@property (nonatomic, readonly, retain) NSMutableDictionary *picturePreviews;
@property (nonatomic, readonly) NSUInteger imagesCount;
-@property (nonatomic, readonly) hb_handle_t *handle;
-@property (nonatomic, readonly) hb_title_t *title;
+@property (nonatomic, readonly) HBCore *scanCore;
+@property (nonatomic, readonly) HBJob *job;
@property (nonatomic) HBCore *core;
@property (nonatomic, getter=isCancelled) BOOL cancelled;
@@ -33,13 +35,13 @@ typedef enum EncodeState : NSUInteger {
@implementation HBPreviewGenerator
-- (id) initWithHandle: (hb_handle_t *) handle andTitle: (hb_title_t *) title
+- (instancetype)initWithCore:(HBCore *)core job:(HBJob *)job
{
self = [super init];
if (self)
{
- _handle = handle;
- _title = title;
+ _scanCore = core;
+ _job = job;
_picturePreviews = [[NSMutableDictionary alloc] init];
_imagesCount = [[[NSUserDefaults standardUserDefaults] objectForKey:@"PreviewsNumber"] intValue];
}
@@ -65,10 +67,13 @@ typedef enum EncodeState : NSUInteger {
if (!theImage)
{
+ HBFilters *filters = self.job.filters;
+ BOOL deinterlace = (filters.deinterlace && !filters.useDecomb) || (filters.decomb && filters.useDecomb);
+
theImage = [HBPreviewGenerator makeImageForPicture:index
- libhb:self.handle
- title:self.title
- deinterlace:self.deinterlace];
+ libhb:self.scanCore.hb_handle
+ picture:self.job.picture
+ deinterlace:deinterlace];
if (cache && theImage)
[self.picturePreviews setObject:theImage forKey:@(index)];
}
@@ -99,23 +104,24 @@ typedef enum EncodeState : NSUInteger {
*/
+ (NSImage *) makeImageForPicture: (NSUInteger) pictureIndex
libhb: (hb_handle_t *) handle
- title: (hb_title_t *) title
+ picture: (HBPicture *) picture
deinterlace: (BOOL) deinterlace
{
NSImage *img = nil;
hb_geometry_settings_t geo;
memset(&geo, 0, sizeof(geo));
- geo.geometry.width = title->job->width;
- geo.geometry.height = title->job->height;
+ geo.geometry.width = picture.width;
+ geo.geometry.height = picture.height;
// HBPreviewController will scale the image later,
// ignore the par.
geo.geometry.par.num = 1;
geo.geometry.par.den = 1;
- memcpy(geo.crop, title->job->crop, sizeof(int[4]));
+ int crop[4] = {picture.cropTop, picture.cropBottom, picture.cropLeft, picture.cropRight};
+ memcpy(geo.crop, crop, sizeof(int[4]));
hb_image_t *image;
- image = hb_get_preview2(handle, title->index, (int)pictureIndex, &geo, deinterlace);
+ image = hb_get_preview2(handle, picture.title.hb_title->index, (int)pictureIndex, &geo, deinterlace);
if (image)
{
@@ -196,7 +202,7 @@ typedef enum EncodeState : NSUInteger {
if (self.core || index >= self.imagesCount)
return NO;
- hb_job_t *job = self.title->job;
+ hb_job_t *job = self.job.title.hb_title->job;
/* Generate the file url and directories. */
if (job->mux & HB_MUX_MASK_MP4)
@@ -235,6 +241,7 @@ typedef enum EncodeState : NSUInteger {
int loggingLevel = [[[NSUserDefaults standardUserDefaults] objectForKey:@"LoggingLevel"] intValue];
self.core = [[[HBCore alloc] initWithLoggingLevel:loggingLevel] autorelease];
+ self.core.name = @"PreviewCore";
/*
* If scanning we need to do some extra setup of the job.
diff --git a/macosx/PictureController.h b/macosx/PictureController.h
index 777868efb..c2ea23d5c 100644
--- a/macosx/PictureController.h
+++ b/macosx/PictureController.h
@@ -5,28 +5,23 @@
It may be used under the terms of the GNU General Public License. */
#import <Cocoa/Cocoa.h>
+
#import "HBFilters.h"
-#include "hb.h"
+#import "HBPicture.h"
@protocol HBPictureControllerDelegate <NSObject>
-- (void) pictureSettingsDidChange;
+- (IBAction)showPreviewWindow:(id)sender;
@end
@interface HBPictureController : NSWindowController <NSWindowDelegate>
@property (nonatomic, readwrite, retain) HBFilters *filters;
-@property (nonatomic, readwrite) BOOL autoCrop;
+@property (nonatomic, readwrite, retain) HBPicture *picture;
@property (nonatomic, readwrite, assign) id <HBPictureControllerDelegate> delegate;
-- (void) setHandle:(hb_handle_t *) handle;
-- (void) setTitle:(hb_title_t *) title;
-
-- (IBAction) showPictureWindow: (id)sender;
-- (IBAction) showPreviewWindow: (id)sender;
-
-- (NSString *) pictureSizeInfoString;
+- (void)showPictureWindow;
@end
diff --git a/macosx/PictureController.m b/macosx/PictureController.m
index 779cff60e..c1a813ae5 100644
--- a/macosx/PictureController.m
+++ b/macosx/PictureController.m
@@ -8,6 +8,8 @@
#import "PictureController.h"
#import "HBPreviewController.h"
+#import "HBTitle.h"
+
@interface HBCustomFilterTransformer : NSValueTransformer
@end
@@ -37,44 +39,14 @@ static void *HBPictureControllerContext = &HBPictureControllerContext;
@interface HBPictureController ()
{
- hb_title_t * fTitle;
-
- HBPreviewController * fPreviewController;
-
/* Picture Sizing */
IBOutlet NSTabView * fSizeFilterView;
IBOutlet NSBox * fPictureSizeBox;
IBOutlet NSBox * fPictureCropBox;
- IBOutlet NSTextField * fWidthField;
+ IBOutlet NSPopUpButton * fAnamorphicPopUp;
IBOutlet NSStepper * fWidthStepper;
- IBOutlet NSTextField * fHeightField;
IBOutlet NSStepper * fHeightStepper;
- IBOutlet NSTextField * fRatioLabel;
- IBOutlet NSButton * fRatioCheck;
- IBOutlet NSMatrix * fCropMatrix;
- IBOutlet NSTextField * fCropTopField;
- IBOutlet NSStepper * fCropTopStepper;
- IBOutlet NSTextField * fCropBottomField;
- IBOutlet NSStepper * fCropBottomStepper;
- IBOutlet NSTextField * fCropLeftField;
- IBOutlet NSStepper * fCropLeftStepper;
- IBOutlet NSTextField * fCropRightField;
- IBOutlet NSStepper * fCropRightStepper;
-
- IBOutlet NSTextField * fModulusLabel;
- IBOutlet NSPopUpButton * fModulusPopUp;
-
- IBOutlet NSTextField * fDisplayWidthField;
- IBOutlet NSTextField * fDisplayWidthLabel;
-
- IBOutlet NSTextField * fParWidthField;
- IBOutlet NSTextField * fParHeightField;
- IBOutlet NSTextField * fParWidthLabel;
- IBOutlet NSTextField * fParHeightLabel;
-
- IBOutlet NSPopUpButton * fAnamorphicPopUp;
- IBOutlet NSTextField * fSizeInfoField;
/* Video Filters */
IBOutlet NSBox * fDetelecineBox;
@@ -101,6 +73,7 @@ static void *HBPictureControllerContext = &HBPictureControllerContext;
if (self = [super initWithWindowNibName:@"PictureSettings"])
{
_filters = [[HBFilters alloc] init];
+ _picture = [[HBPicture alloc] init];
// NSWindowController likes to lazily load its window. However since
// this controller tries to set all sorts of outlets before the window
@@ -113,18 +86,15 @@ static void *HBPictureControllerContext = &HBPictureControllerContext;
[self window];
// Add the observers for the filters values
- NSArray *observerdKeyPaths = @[@"filters.detelecine", @"filters.detelecineCustomString",
- @"filters.deinterlace", @"filters.deinterlaceCustomString",
- @"filters.decomb", @"filters.decombCustomString",
- @"filters.denoise", @"filters.denoisePreset",
- @"filters.denoiseTune", @"filters.denoiseCustomString",
- @"filters.deblock", @"filters.grayscale", @"filters.useDecomb"];
+ NSArray *observerdKeyPaths = @[@"self.filters.useDecomb", @"self.filters.deblock",
+ @"self.filters.denoise", @"self.filters.denoisePreset"];
for (NSString *keyPath in observerdKeyPaths)
{
[self addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionInitial context:HBPictureControllerContext];
}
- fPreviewController = [[HBPreviewController alloc] init];
+ [self addObserver:self forKeyPath:@"self.picture.anamorphicMode" options:NSKeyValueObservingOptionInitial context:HBPictureControllerContext];
+ [self addObserver:self forKeyPath:@"self.picture.modulus" options:NSKeyValueObservingOptionInitial context:HBPictureControllerContext];
}
return self;
@@ -132,12 +102,8 @@ static void *HBPictureControllerContext = &HBPictureControllerContext;
- (void) dealloc
{
- NSArray *observerdKeyPaths = @[@"filters.detelecine", @"filters.detelecineCustomString",
- @"filters.deinterlace", @"filters.deinterlaceCustomString",
- @"filters.decomb", @"filters.decombCustomString",
- @"filters.denoise", @"filters.denoisePreset",
- @"filters.denoiseTune", @"filters.denoiseCustomString",
- @"filters.deblock", @"filters.grayscale", @"filters.useDecomb"];
+ NSArray *observerdKeyPaths = @[@"self.filters.useDecomb", @"self.filters.deblock",
+ @"self.filters.denoise", @"self.filters.denoisePreset"];
@try {
for (NSString *keyPath in observerdKeyPaths)
{
@@ -146,8 +112,9 @@ static void *HBPictureControllerContext = &HBPictureControllerContext;
} @catch (NSException * __unused exception) {}
- [_filters release];
- [fPreviewController release];
+ self.filters = nil;
+ self.picture = nil;
+
[super dealloc];
}
@@ -161,157 +128,14 @@ static void *HBPictureControllerContext = &HBPictureControllerContext;
[self.window setAppearance:[NSClassFromString(@"NSAppearance") appearanceNamed:@"NSAppearanceNameAqua"]];
}
- /* Populate the user interface */
- [fWidthStepper setValueWraps: NO];
- [fHeightStepper setValueWraps: NO];
-
- [fCropTopStepper setIncrement: 2];
- [fCropTopStepper setMinValue: 0];
- [fCropBottomStepper setIncrement: 2];
- [fCropBottomStepper setMinValue: 0];
- [fCropLeftStepper setIncrement: 2];
- [fCropLeftStepper setMinValue: 0];
- [fCropRightStepper setIncrement: 2];
- [fCropRightStepper setMinValue: 0];
-
/* Populate the Anamorphic NSPopUp button here */
[fAnamorphicPopUp removeAllItems];
[fAnamorphicPopUp addItemsWithTitles:@[@"None", @"Strict", @"Loose", @"Custom"]];
- /* populate the modulus popup here */
- [fModulusPopUp removeAllItems];
- [fModulusPopUp addItemsWithTitles:@[@"16", @"8", @"4", @"2"]];
-
[self resizeInspectorForTab:nil];
[self adjustSizingDisplay:nil];
}
-- (void) setHandle: (hb_handle_t *) handle
-{
- [fPreviewController setHandle: handle];
- [fPreviewController setDelegate:(HBController *)self.delegate];
-}
-
-- (void) setTitle: (hb_title_t *) title
-{
- fTitle = title;
-
- if (!title) {
- [fPreviewController setTitle:NULL];
- return;
- }
-
- hb_job_t * job = title->job;
-
- fTitle = title;
-
- [fAnamorphicPopUp selectItemAtIndex: job->anamorphic.mode];
- if (job->anamorphic.mode == HB_ANAMORPHIC_STRICT)
- {
- [fWidthStepper setEnabled: NO];
- [fHeightStepper setEnabled: NO];
- [fWidthField setEditable:NO];
- [fHeightField setEditable:NO];
- }
- else
- {
- [fWidthStepper setEnabled: YES];
- [fHeightStepper setEnabled: YES];
- [fWidthField setEditable:YES];
- [fHeightField setEditable:YES];
- }
- if (job->anamorphic.mode == HB_ANAMORPHIC_STRICT ||
- job->anamorphic.mode == HB_ANAMORPHIC_LOOSE)
- {
- job->anamorphic.keep_display_aspect = 1;
- [fRatioCheck setState: NSOnState];
- [fRatioCheck setEnabled: NO];
- }
- else
- {
- [fRatioCheck setEnabled: YES];
- [fRatioCheck setState: job->anamorphic.keep_display_aspect ?
- NSOnState : NSOffState];
- }
- [fParWidthField setEnabled: !job->anamorphic.keep_display_aspect];
- [fParHeightField setEnabled: !job->anamorphic.keep_display_aspect];
- [fDisplayWidthField setEnabled: !job->anamorphic.keep_display_aspect];
-
- if (job->modulus)
- {
- [fModulusPopUp selectItemWithTitle: [NSString stringWithFormat:@"%d",job->modulus]];
- [fWidthStepper setIncrement: job->modulus];
- [fHeightStepper setIncrement: job->modulus];
- }
- else
- {
- [fModulusPopUp selectItemAtIndex: 0];
- [fWidthStepper setIncrement: 16];
- [fHeightStepper setIncrement: 16];
- }
-
- if (self.autoCrop)
- {
- [fCropMatrix selectCellAtRow: 0 column:0];
-
- /* If auto, lets set the crop steppers according to
- * current fTitle->crop values */
- memcpy( job->crop, fTitle->crop, 4 * sizeof( int ) );
- [fCropTopStepper setIntValue: fTitle->crop[0]];
- [fCropTopField setIntValue: fTitle->crop[0]];
- [fCropBottomStepper setIntValue: fTitle->crop[1]];
- [fCropBottomField setIntValue: fTitle->crop[1]];
- [fCropLeftStepper setIntValue: fTitle->crop[2]];
- [fCropLeftField setIntValue: fTitle->crop[2]];
- [fCropRightStepper setIntValue: fTitle->crop[3]];
- [fCropRightField setIntValue: fTitle->crop[3]];
- }
- else
- {
- [fCropMatrix selectCellAtRow: 1 column:0];
- [fCropTopStepper setIntValue: job->crop[0]];
- [fCropTopField setIntValue: job->crop[0]];
- [fCropBottomStepper setIntValue: job->crop[1]];
- [fCropBottomField setIntValue: job->crop[1]];
- [fCropLeftStepper setIntValue: job->crop[2]];
- [fCropLeftField setIntValue: job->crop[2]];
- [fCropRightStepper setIntValue: job->crop[3]];
- [fCropRightField setIntValue: job->crop[3]];
- }
-
- [fCropTopStepper setEnabled: !self.autoCrop];
- [fCropBottomStepper setEnabled: !self.autoCrop];
- [fCropLeftStepper setEnabled: !self.autoCrop];
- [fCropRightStepper setEnabled: !self.autoCrop];
-
- [fCropTopField setEditable: !self.autoCrop];
- [fCropBottomField setEditable: !self.autoCrop];
- [fCropLeftField setEditable: !self.autoCrop];
- [fCropRightField setEditable: !self.autoCrop];
-
- [fWidthStepper setMaxValue: title->geometry.width - job->crop[2] - job->crop[3]];
- [fWidthStepper setIntValue: job->width];
- [fWidthField setIntValue: job->width];
- [fHeightStepper setMaxValue: title->geometry.height - job->crop[0] - job->crop[1]];
- [fHeightStepper setIntValue: job->height];
- [fHeightField setIntValue: job->height];
- [fCropTopStepper setMaxValue: title->geometry.height/2-2];
- [fCropBottomStepper setMaxValue: title->geometry.height/2-2];
- [fCropLeftStepper setMaxValue: title->geometry.width/2-2];
- [fCropRightStepper setMaxValue: title->geometry.width/2-2];
-
- [fParWidthField setIntValue: job->par.num];
- [fParHeightField setIntValue: job->par.den];
-
- int display_width;
- display_width = job->width * job->par.num / job->par.den;
- [fDisplayWidthField setIntValue: display_width];
-
- [fPreviewController setTitle:title];
-
- [self settingsChanged:nil];
-}
-
#pragma mark - KVO
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
@@ -320,8 +144,18 @@ static void *HBPictureControllerContext = &HBPictureControllerContext;
{
// We use KVO to update the panel
// and notify the main controller of the changes
- // in the filters settings.
- if ([keyPath isEqualToString:@"filters.useDecomb"])
+ // in the filters and picture settings.
+
+ if ([keyPath isEqualToString:@"self.picture.anamorphicMode"])
+ {
+ [self adjustSizingDisplay:nil];
+ }
+ else if ([keyPath isEqualToString:@"self.picture.modulus"])
+ {
+ [fWidthStepper setIncrement:self.picture.modulus];
+ [fHeightStepper setIncrement:self.picture.modulus];
+ }
+ else if ([keyPath isEqualToString:@"self.filters.useDecomb"])
{
if (self.filters.useDecomb)
{
@@ -334,7 +168,7 @@ static void *HBPictureControllerContext = &HBPictureControllerContext;
[fDeinterlaceBox setHidden:NO];
}
}
- else if ([keyPath isEqualToString:@"filters.deblock"])
+ else if ([keyPath isEqualToString:@"self.filters.deblock"])
{
// The minimum deblock value is 5,
// set it to 0 if the value is
@@ -349,32 +183,10 @@ static void *HBPictureControllerContext = &HBPictureControllerContext;
[fDeblockField setStringValue:[NSString stringWithFormat: @"%.0ld", (long)self.filters.deblock]];
}
}
- else if ([keyPath isEqualToString:@"filters.deinterlace"] || [keyPath isEqualToString:@"filters.decomb"])
- {
- // Might need to update the preview images with
- // the new deinterlace/decomb setting.
- if ((self.filters.deinterlace && !self.filters.useDecomb) ||
- (self.filters.decomb && self.filters.useDecomb))
- {
- fPreviewController.deinterlacePreview = YES;
- }
- else
- {
- fPreviewController.deinterlacePreview = NO;
- }
- [fPreviewController reload];
- }
- else if ([keyPath isEqualToString:@"filters.denoise"] || [keyPath isEqualToString:@"filters.denoisePreset"])
+ else if ([keyPath isEqualToString:@"self.filters.denoise"] || [keyPath isEqualToString:@"self.filters.denoisePreset"])
{
[self validateDenoiseUI];
}
-
- // If one of the filters properties changes
- // update the UI in the main window
- if ([keyPath hasPrefix:@"filters"])
- {
- [self.delegate pictureSettingsDidChange];
- }
}
else
{
@@ -430,6 +242,14 @@ static void *HBPictureControllerContext = &HBPictureControllerContext;
#pragma mark Interface Resize
/**
+ * This method is used to detect clicking on a tab in fSizeFilterView
+ */
+- (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem
+{
+ [self resizeInspectorForTab:nil];
+}
+
+/**
* resizeInspectorForTab is called at launch, and each time either the
* Size or Filters tab is clicked. Size gives a horizontally oriented
* inspector and Filters is a vertically aligned inspector.
@@ -491,26 +311,10 @@ static void *HBPictureControllerContext = &HBPictureControllerContext;
if ([fAnamorphicPopUp indexOfSelectedItem] == HB_ANAMORPHIC_CUSTOM)
{ // custom / power user jamboree
pictureSizingBoxSize.width = 350;
-
- /* Set visibility of capuj widgets */
- [fParWidthField setHidden: NO];
- [fParHeightField setHidden: NO];
- [fParWidthLabel setHidden: NO];
- [fParHeightLabel setHidden: NO];
- [fDisplayWidthField setHidden: NO];
- [fDisplayWidthLabel setHidden: NO];
}
else
{
pictureSizingBoxSize.width = 200;
-
- /* Set visibility of capuj widgets */
- [fParWidthField setHidden: YES];
- [fParHeightField setHidden: YES];
- [fParWidthLabel setHidden: YES];
- [fParHeightLabel setHidden: YES];
- [fDisplayWidthField setHidden: YES];
- [fDisplayWidthLabel setHidden: YES];
}
/* Check to see if we have changed the size from current */
@@ -541,17 +345,12 @@ static void *HBPictureControllerContext = &HBPictureControllerContext;
[self resizeInspectorForTab:nil];
}
-- (NSString *) pictureSizeInfoString
-{
- return [fSizeInfoField stringValue];
-}
-
#pragma mark -
/**
* Displays and brings the picture window to the front
*/
-- (IBAction) showPictureWindow: (id) sender
+- (void)showPictureWindow
{
if ([[self window] isVisible])
{
@@ -559,15 +358,8 @@ static void *HBPictureControllerContext = &HBPictureControllerContext;
}
else
{
- [self showWindow:sender];
+ [self showWindow:self];
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"PictureSizeWindowIsOpen"];
- /* Set the window back to Floating Window mode
- * This will put the window always on top, but
- * since we have Hide on Deactivate set in our
- * xib, if other apps are put in focus we will
- * hide properly to stay out of the way
- */
- [[self window] setLevel:NSFloatingWindowLevel];
}
[self resizeInspectorForTab:nil];
@@ -576,8 +368,7 @@ static void *HBPictureControllerContext = &HBPictureControllerContext;
- (IBAction) showPreviewWindow: (id) sender
{
- [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"PreviewWindowIsOpen"];
- [fPreviewController showWindow:sender];
+ [self.delegate showPreviewWindow:sender];
}
- (void) windowWillClose: (NSNotification *)aNotification
@@ -585,285 +376,4 @@ static void *HBPictureControllerContext = &HBPictureControllerContext;
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"PictureSizeWindowIsOpen"];
}
-/**
- * This method is used to detect clicking on a tab in fSizeFilterView
- */
-- (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem
-{
- [self resizeInspectorForTab:nil];
-}
-
-#pragma mark - Picture Update Logic
-
-- (IBAction) settingsChanged: (id) sender
-{
- if (!fTitle)
- return;
-
- hb_job_t * job = fTitle->job;
- int keep = 0, dar_updated = 0;
-
- if (sender == fAnamorphicPopUp)
- {
- job->anamorphic.mode = (int)[fAnamorphicPopUp indexOfSelectedItem];
- if (job->anamorphic.mode == HB_ANAMORPHIC_STRICT)
- {
- [fModulusLabel setHidden: YES];
- [fModulusPopUp setHidden: YES];
- [fWidthStepper setEnabled: NO];
- [fHeightStepper setEnabled: NO];
- [fWidthField setEditable:NO];
- [fHeightField setEditable:NO];
- }
- else
- {
- [fModulusLabel setHidden: NO];
- [fModulusPopUp setHidden: NO];
- [fWidthStepper setEnabled: YES];
- [fHeightStepper setEnabled: YES];
- [fWidthField setEditable:YES];
- [fHeightField setEditable:YES];
- }
- if (job->anamorphic.mode == HB_ANAMORPHIC_STRICT ||
- job->anamorphic.mode == HB_ANAMORPHIC_LOOSE)
- {
- job->anamorphic.keep_display_aspect = 1;
- [fRatioCheck setState: NSOnState];
- [fRatioCheck setEnabled: NO];
- }
- else
- {
- [fRatioCheck setEnabled: YES];
- [fRatioCheck setState: job->anamorphic.keep_display_aspect ?
- NSOnState : NSOffState];
- }
- }
- else if (sender == fModulusPopUp)
- {
- job->modulus = [[fModulusPopUp titleOfSelectedItem] intValue];
- [fWidthStepper setIncrement: job->modulus];
- [fHeightStepper setIncrement: job->modulus];
- }
-
- if (sender == fRatioCheck)
- {
- job->anamorphic.keep_display_aspect = [fRatioCheck state] == NSOnState;
- [fParWidthField setEnabled: !job->anamorphic.keep_display_aspect];
- [fParHeightField setEnabled: !job->anamorphic.keep_display_aspect];
- [fDisplayWidthField setEnabled: !job->anamorphic.keep_display_aspect];
- }
-
- if (sender == fHeightStepper || sender == fHeightField)
- {
- keep |= HB_KEEP_HEIGHT;
-
- if (sender == fHeightStepper)
- job->height = [fHeightStepper intValue];
- else
- job->height = [fHeightField intValue];
- }
-
- if (sender == fWidthStepper || sender == fWidthField)
- {
- keep |= HB_KEEP_WIDTH;
-
- if (sender == fWidthStepper)
- job->width = [fWidthStepper intValue];
- else
- job->width = [fWidthField intValue];
- }
-
- if (sender == fParWidthField || sender == fParHeightField)
- {
- job->par.num = [fParWidthField intValue];
- job->par.den = [fParHeightField intValue];
- }
-
- if (sender == fDisplayWidthField)
- {
- dar_updated = 1;
- job->par.num = [fDisplayWidthField intValue];
- job->par.den = [fWidthField intValue];
- }
-
- if (sender == fCropMatrix)
- {
- if (self.autoCrop != ( [fCropMatrix selectedRow] == 0 ))
- {
- self.autoCrop = !self.autoCrop;
- if (self.autoCrop)
- {
- /* If auto, lets set the crop steppers according to
- * current fTitle->crop values */
- memcpy( job->crop, fTitle->crop, 4 * sizeof( int ) );
- [fCropTopStepper setIntValue: fTitle->crop[0]];
- [fCropTopField setIntValue: fTitle->crop[0]];
- [fCropBottomStepper setIntValue: fTitle->crop[1]];
- [fCropBottomField setIntValue: fTitle->crop[1]];
- [fCropLeftStepper setIntValue: fTitle->crop[2]];
- [fCropLeftField setIntValue: fTitle->crop[2]];
- [fCropRightStepper setIntValue: fTitle->crop[3]];
- [fCropRightField setIntValue: fTitle->crop[3]];
- }
- [fCropTopStepper setEnabled: !self.autoCrop];
- [fCropBottomStepper setEnabled: !self.autoCrop];
- [fCropLeftStepper setEnabled: !self.autoCrop];
- [fCropRightStepper setEnabled: !self.autoCrop];
-
- [fCropTopField setEditable: !self.autoCrop];
- [fCropBottomField setEditable: !self.autoCrop];
- [fCropLeftField setEditable: !self.autoCrop];
- [fCropRightField setEditable: !self.autoCrop];
- }
- }
- if (sender == fCropTopStepper)
- {
- job->crop[0] = [fCropTopStepper intValue];
- [fCropTopField setIntValue: job->crop[0]];
- [fHeightStepper setMaxValue: fTitle->geometry.height - job->crop[0] - job->crop[1]];
- }
- if (sender == fCropBottomStepper)
- {
- job->crop[1] = [fCropBottomStepper intValue];
- [fCropBottomField setIntValue: job->crop[1]];
- [fHeightStepper setMaxValue: fTitle->geometry.height - job->crop[0] - job->crop[1]];
- }
- if (sender == fCropLeftStepper)
- {
- job->crop[2] = [fCropLeftStepper intValue];
- [fCropLeftField setIntValue: job->crop[2]];
- [fWidthStepper setMaxValue: fTitle->geometry.width - job->crop[2] - job->crop[3]];
- }
- if (sender == fCropRightStepper)
- {
- job->crop[3] = [fCropRightStepper intValue];
- [fCropRightField setIntValue: job->crop[3]];
- [fWidthStepper setMaxValue: fTitle->geometry.width - job->crop[2] - job->crop[3]];
- }
-
- if (sender == fCropTopField)
- {
- int cropValue = [fCropTopField intValue];
- if (cropValue >= 0 && (cropValue <= fTitle->geometry.height/2-2))
- {
- job->crop[0] = cropValue;
- [fCropTopStepper setIntValue:cropValue];
- [fHeightStepper setMaxValue: fTitle->geometry.height - job->crop[0] - job->crop[1]];
- }
- else
- {
- [fCropLeftField setIntValue:job->crop[0]];
- }
- }
- else if (sender == fCropBottomField)
- {
- int cropValue = [fCropBottomField intValue];
- if (cropValue >= 0 && (cropValue <= fTitle->geometry.height/2-2))
- {
- job->crop[1] = cropValue;
- [fCropBottomStepper setIntValue:cropValue];
- [fHeightStepper setMaxValue: fTitle->geometry.height - job->crop[0] - job->crop[1]];
- }
- else
- {
- [fCropLeftField setIntValue:job->crop[1]];
- }
- }
- else if (sender == fCropLeftField)
- {
- int cropValue = [fCropLeftField intValue];
- if (cropValue >= 0 && (cropValue <= fTitle->geometry.width/2-2))
- {
- job->crop[2] = cropValue;
- [fCropLeftStepper setIntValue:cropValue];
- [fWidthStepper setMaxValue: fTitle->geometry.width - job->crop[2] - job->crop[3]];
- }
- else
- {
- [fCropLeftField setIntValue:job->crop[2]];
- }
- }
- else if (sender == fCropRightField)
- {
- int cropValue = [fCropRightField intValue];
- if (cropValue >= 0 && (cropValue <= fTitle->geometry.width/2-2))
- {
- job->crop[3] = cropValue;
- [fCropRightStepper setIntValue:cropValue];
- [fWidthStepper setMaxValue: fTitle->geometry.width - job->crop[2] - job->crop[3]];
- }
- else
- {
- [fCropLeftField setIntValue:job->crop[3]];
- }
- }
-
- keep |= !!job->anamorphic.keep_display_aspect * HB_KEEP_DISPLAY_ASPECT;
-
- hb_geometry_t srcGeo, resultGeo;
- hb_geometry_settings_t uiGeo;
-
- srcGeo.width = fTitle->geometry.width;
- srcGeo.height = fTitle->geometry.height;
- srcGeo.par = fTitle->geometry.par;
-
- uiGeo.mode = job->anamorphic.mode;
- uiGeo.keep = keep;
- uiGeo.itu_par = 0;
- uiGeo.modulus = job->modulus;
- memcpy(uiGeo.crop, job->crop, sizeof(int[4]));
- uiGeo.geometry.width = job->width;
- uiGeo.geometry.height = job->height;
- /* Modulus added to maxWidth/maxHeight to allow a small amount of
- * upscaling to the next mod boundary.
- */
- uiGeo.maxWidth = fTitle->geometry.width - job->crop[2] - job->crop[3] + job->modulus - 1;
- uiGeo.maxHeight = fTitle->geometry.height - job->crop[0] - job->crop[1] + job->modulus - 1;
- uiGeo.geometry.par = job->par;
- if (job->anamorphic.mode == HB_ANAMORPHIC_CUSTOM && dar_updated)
- {
- uiGeo.geometry.par.num = [fDisplayWidthField intValue];
- uiGeo.geometry.par.den = uiGeo.geometry.width;
- }
- hb_set_anamorphic_size2(&srcGeo, &uiGeo, &resultGeo);
-
- job->width = resultGeo.width;
- job->height = resultGeo.height;
- job->par = resultGeo.par;
-
- int display_width;
- display_width = resultGeo.width * resultGeo.par.num / resultGeo.par.den;
-
- [fWidthStepper setIntValue: resultGeo.width];
- [fWidthField setIntValue: resultGeo.width];
- [fHeightStepper setIntValue: resultGeo.height];
- [fHeightField setIntValue: resultGeo.height];
- [fParWidthField setIntValue: resultGeo.par.num];
- [fParHeightField setIntValue: resultGeo.par.den];
- [fDisplayWidthField setIntValue: display_width];
-
- /*
- * Sanity-check here for previews < 16 pixels to avoid crashing
- * hb_get_preview(). In fact, let's get previews at least 64 pixels in both
- * dimensions; no human can see any meaningful detail below that.
- */
- if (job->width >= 64 && job->height >= 64)
- {
- [fPreviewController reload];
- }
-
- /* we get the sizing info to display from fPreviewController */
- [fSizeInfoField setStringValue: [fPreviewController pictureSizeInfoString]];
-
- if (sender != nil)
- {
- [self.delegate pictureSettingsDidChange];
- }
-
- if ([[self window] isVisible])
- {
- [self adjustSizingDisplay:nil];
- }
-}
-
@end