X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=macosx%2FPictureController.mm;h=38e312ee4010afcb84cfd75e9811a90cdaa5634c;hb=44946a6f8be82a70e65ca534541183a26fdb804b;hp=702816c8f9d5ce87dc66b04e3e80879ce7769a0f;hpb=b0668ec537baff4beb4923f8ae150391b3697c6c;p=handbrake-jp%2Fhandbrake-jp-git.git diff --git a/macosx/PictureController.mm b/macosx/PictureController.mm index 702816c8..38e312ee 100644 --- a/macosx/PictureController.mm +++ b/macosx/PictureController.mm @@ -36,23 +36,27 @@ //------------------------------------------------------------------------------------ - (IBAction) showPictureWindow: (id)sender { - if ([[self window] isVisible]) + if ([fPreviewController fullScreen] == YES) { - [[self window] close]; + [self showWindow:sender]; + [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"PictureSizeWindowIsOpen"]; + [self setToFullScreenMode]; } else { - [self showWindow:sender]; - [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"PictureSizeWindowIsOpen"]; - if ([fPreviewController fullScreen] == YES) + if ([[self window] isVisible]) { - [self setToFullScreenMode]; + [[self window] close]; } else { + [self showWindow:sender]; + [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"PictureSizeWindowIsOpen"]; [self setToWindowedMode]; } } + [self adjustFilterDisplay:nil]; + [self adjustSizingDisplay:nil]; } - (BOOL) previewFullScreenMode @@ -60,6 +64,342 @@ return [fPreviewController fullScreen]; } +/* this method is used to detect clicking on a tab in fSizeFilterView */ +- (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem +{ + +[self resizeInspectorForTab:nil]; + +} + +#pragma mark - + +/* 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. + */ +- (IBAction) resizeInspectorForTab: (id)sender +{ + NSRect frame = [[self window] frame]; + NSPoint windowOrigin = [[self window] frame].origin; + NSSize screenSize = [[[self window] screen] frame].size; + NSPoint screenOrigin = [[[self window] screen] frame].origin; + + /* We base our inspector size/layout on which tab is active for fSizeFilterView */ + /* we are 1 which is Filters*/ + if ([fSizeFilterView indexOfTabViewItem: [fSizeFilterView selectedTabViewItem]] == 1) + { + frame.size.width = 314; + /* we glean the height from the size of the boxes plus the extra window space + * needed for non boxed display + */ + frame.size.height = 110.0 + [fDetelecineBox frame].size.height + [fDecombDeinterlaceBox frame].size.height + [fDenoiseBox frame].size.height + [fDeblockBox frame].size.height; + /* Hide the size readout at the bottom as the vertical inspector is not wide enough */ + [fSizeInfoField setHidden:YES]; + } + else // we are Tab index 0 which is size + { + frame.size.width = 50.0 + [fPictureSizeBox frame].size.width + [fPictureCropBox frame].size.width; + frame.size.height = [fPictureSizeBox frame].size.height + 85; + /* hide the size summary field at the bottom */ + [fSizeInfoField setHidden:NO]; + } + /* get delta's for the change in window size */ + CGFloat deltaX = frame.size.width - [[self window] frame].size.width; + CGFloat deltaY = frame.size.height - [[self window] frame].size.height; + + /* Check to see if we have changed the height from current */ + //if (frame.size.height != [[self window] frame].size.height) + //{ + /* change the inspector origin via the deltaY */ + frame.origin.y -= deltaY; + /* keep the inspector centered so the tabs stay in place */ + frame.origin.x -= deltaX / 2.0; + //} + + /* we make sure we are not horizontally off of our screen. + * this would be the case if we are on the vertical filter tab + * and we hit the size tab and the inspector grows horizontally + * off the screen to the right + */ + if ((frame.origin.x + frame.size.width) > (screenOrigin.x + screenSize.width)) + { + /* the right side of the preview is off the screen, so shift to the left */ + frame.origin.x = (screenOrigin.x + screenSize.width) - frame.size.width; + } + + [[self window] setFrame:frame display:YES animate:YES]; +} + +- (IBAction) adjustSizingDisplay: (id) sender +{ + NSSize pictureSizingBoxSize = [fPictureSizeBox frame].size; + + NSPoint fPictureSizeBoxOrigin = [fPictureSizeBox frame].origin; + NSSize pictureCropBoxSize = [fPictureCropBox frame].size; + NSPoint fPictureCropBoxOrigin = [fPictureCropBox frame].origin; + + if ([fAnamorphicPopUp indexOfSelectedItem] == 3) // custom / power user jamboree + { + pictureSizingBoxSize.width = 530; + + /* Set visibility of capuj widgets */ + [fParWidthField setHidden: NO]; + [fParHeightField setHidden: NO]; + [fParWidthLabel setHidden: NO]; + [fParHeightLabel setHidden: NO]; + [fDisplayWidthField setHidden: NO]; + [fDisplayWidthLabel setHidden: NO]; + [fModulusLabel setHidden: NO]; + [fModulusPopUp setHidden: NO]; + /* adjust/move keep ar checkbox */ + [fRatioLabel setHidden: YES]; + [fRatioLabel2 setHidden: NO]; + + /* Optionally swith the Storage and Display width positions*/ + /* + NSPoint fWidthLabelOrigin = [fWidthLabel frame].origin; + NSPoint fWidthFieldOrigin = [fWidthField frame].origin; + NSPoint fWidthStepperOrigin = [fWidthStepper frame].origin; + fWidthFieldOrigin.x = [fRatioLabel2 frame].origin.x + [fRatioLabel2 frame].size.width + 4; + [fWidthField setFrameOrigin:fWidthFieldOrigin]; + + fWidthStepperOrigin.x = [fWidthField frame].origin.x + [fWidthField frame].size.width + 4; + [fWidthStepper setFrameOrigin:fWidthStepperOrigin]; + + fWidthLabelOrigin.x = [fWidthField frame].origin.x - [fWidthLabel frame].size.width - 4; + [fWidthLabel setFrameOrigin:fWidthLabelOrigin]; + [fWidthLabel setStringValue:@"Storage Width:"]; + */ + + /* set the origin for fRatioCheck so origin.y == fRatioLabel2 + * and origin.x == fDisplayWidthField + */ + NSPoint fRatioCheckOrigin = [fRatioCheck frame].origin; + fRatioCheckOrigin.y = [fRatioLabel2 frame].origin.y - 2; + fRatioCheckOrigin.x = [fRatioLabel2 frame].origin.x + [fRatioLabel2 frame].size.width + 4; + [fRatioCheck setFrameOrigin:fRatioCheckOrigin]; + + } + 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]; + [fModulusLabel setHidden: YES]; + [fModulusPopUp setHidden: YES]; + /* adjust/move keep ar checkbox */ + [fRatioLabel setHidden: NO]; + [fRatioLabel2 setHidden: YES]; + + /* Optionally swith the Storage and Display width positions*/ + + /* + NSPoint fWidthLabelOrigin = [fWidthLabel frame].origin; + NSPoint fWidthFieldOrigin = [fWidthField frame].origin; + NSPoint fWidthStepperOrigin = [fWidthStepper frame].origin; + + fWidthFieldOrigin.x = [fHeightField frame].origin.x; + [fWidthField setFrameOrigin:fWidthFieldOrigin]; + + fWidthStepperOrigin.x = [fHeightStepper frame].origin.x; + [fWidthStepper setFrameOrigin:fWidthStepperOrigin]; + + fWidthLabelOrigin.x = [fWidthField frame].origin.x - [fWidthLabel frame].size.width -4; + [fWidthLabel setFrameOrigin:fWidthLabelOrigin]; + [fWidthLabel setStringValue:@"Width:"]; + */ + + + /* set the origin for fRatioCheck so origin.y == fRatioLabel + * and origin.x == fWidthStepper + */ + NSPoint fRatioCheckOrigin = [fRatioCheck frame].origin; + fRatioCheckOrigin.y = [fRatioLabel frame].origin.y - 2; + fRatioCheckOrigin.x = [fWidthStepper frame].origin.x - 2; + [fRatioCheck setFrameOrigin:fRatioCheckOrigin]; + + } + + /* Check to see if we have changed the size from current */ + if (pictureSizingBoxSize.height != [fPictureSizeBox frame].size.height || pictureSizingBoxSize.width != [fPictureSizeBox frame].size.width) + { + /* Get our delta for the change in picture size box height */ + CGFloat deltaYSizeBoxShift = pictureSizingBoxSize.height - [fPictureSizeBox frame].size.height; + fPictureSizeBoxOrigin.y -= deltaYSizeBoxShift; + /* Get our delta for the change in picture size box width */ + CGFloat deltaXSizeBoxShift = pictureSizingBoxSize.width - [fPictureSizeBox frame].size.width; + //fPictureSizeBoxOrigin.x += deltaXSizeBoxShift; + /* set our new Picture size box size */ + [fPictureSizeBox setFrameSize:pictureSizingBoxSize]; + [fPictureSizeBox setFrameOrigin:fPictureSizeBoxOrigin]; + + pictureCropBoxSize.height += deltaYSizeBoxShift; + fPictureCropBoxOrigin.y -= deltaYSizeBoxShift; + fPictureCropBoxOrigin.x += deltaXSizeBoxShift; + + [fPictureCropBox setFrameSize:pictureCropBoxSize]; + [[fPictureCropBox animator] setFrameOrigin:fPictureCropBoxOrigin]; + } + + + /* now we call to resize the entire inspector window */ + [self resizeInspectorForTab:nil]; +} + +- (IBAction) adjustFilterDisplay: (id) sender +{ + + NSBox * filterBox = nil; + NSTextField * filterField; + if (sender == fDetelecinePopUp) + { + filterBox = fDetelecineBox; + filterField = fDetelecineField; + } + + if (sender == fDecombDeinterlaceSlider) + { + if ([fDecombDeinterlaceSlider floatValue] == 0.0) + { + filterBox = fDecombBox; + filterField = fDecombField; + } + else + { + filterBox = fDeinterlaceBox; + filterField = fDeinterlaceField; + } + } + + if (sender == fDecombPopUp) + { + filterBox = fDecombBox; + filterField = fDecombField; + } + if (sender == fDeinterlacePopUp) + { + filterBox = fDeinterlaceBox; + filterField = fDeinterlaceField; + } + + if (sender == fDenoisePopUp) + { + filterBox = fDenoiseBox; + filterField = fDenoiseField; + } + + NSSize currentSize = [filterBox frame].size; + NSRect boxFrame = [filterBox frame]; + + if ([sender titleOfSelectedItem] == @"Custom") + { + + currentSize.height = 60; + + } + else + { + currentSize.height = 30; + + } + /* Check to see if we have changed the size from current */ + if (currentSize.height != [filterBox frame].size.height) + { + /* We are changing the size of the box, so recalc the origin */ + NSPoint boxOrigin = [filterBox frame].origin; + /* We get the deltaY here for how much we are expanding/contracting the box vertically */ + CGFloat deltaYBoxShift = currentSize.height - [filterBox frame].size.height; + boxOrigin.y -= deltaYBoxShift; + + boxFrame.size.height = currentSize.height; + boxFrame.origin.y = boxOrigin.y; + [filterBox setFrame:boxFrame]; + + /* go ahead and resize the box */ + //[[filterBox animator] setFrameSize:currentSize]; + //[[filterBox animator] setFrameOrigin:origin]; + + + if (filterBox == fDecombBox || filterBox == fDeinterlaceBox) + { + /* fDecombDeinterlaceBox*/ + NSSize decombDeinterlaceBoxSize = [fDecombDeinterlaceBox frame].size; + NSPoint decombDeinterlaceBoxOrigin = [fDecombDeinterlaceBox frame].origin; + + //decombDeinterlaceBoxSize.height = [filterBox frame].size.height + 50; + if (sender == fDecombDeinterlaceSlider) + { + [fHBController writeToActivityLog: "Sender is deinterlace decomb slider"]; + } + + if ([fDeinterlaceBox isHidden] == YES) + { + decombDeinterlaceBoxSize.height = [fDecombBox frame].size.height + 50; + [fHBController writeToActivityLog: "Resize by Decomb box"]; + } + else + { + decombDeinterlaceBoxSize.height = [fDeinterlaceBox frame].size.height + 50; + [fHBController writeToActivityLog: "Resize by Deinterlace box"]; + } + /* get delta's for the change in window size */ + + CGFloat deltaYdecombDeinterlace = decombDeinterlaceBoxSize.height - [fDecombDeinterlaceBox frame].size.height; + + deltaYBoxShift = deltaYdecombDeinterlace; + + decombDeinterlaceBoxOrigin.y -= deltaYdecombDeinterlace; + + [fDecombDeinterlaceBox setFrameSize:decombDeinterlaceBoxSize]; + [fDecombDeinterlaceBox setFrameOrigin:decombDeinterlaceBoxOrigin]; + } + + /* now we must reset the origin of each box below the adjusted box*/ + NSPoint decombDeintOrigin = [fDecombDeinterlaceBox frame].origin; + NSPoint denoiseOrigin = [fDenoiseBox frame].origin; + NSPoint deblockOrigin = [fDeblockBox frame].origin; + if (sender == fDetelecinePopUp) + { + decombDeintOrigin.y -= deltaYBoxShift; + [fDecombDeinterlaceBox setFrameOrigin:decombDeintOrigin]; + + denoiseOrigin.y -= deltaYBoxShift; + [fDenoiseBox setFrameOrigin:denoiseOrigin]; + + deblockOrigin.y -= deltaYBoxShift; + [fDeblockBox setFrameOrigin:deblockOrigin]; + } + if (sender == fDecombPopUp || sender == fDeinterlacePopUp) + { + denoiseOrigin.y -= deltaYBoxShift; + [fDenoiseBox setFrameOrigin:denoiseOrigin]; + + deblockOrigin.y -= deltaYBoxShift; + [fDeblockBox setFrameOrigin:deblockOrigin]; + } + + if (sender == fDenoisePopUp) + { + deblockOrigin.y -= deltaYBoxShift; + [fDeblockBox setFrameOrigin:deblockOrigin]; + } + + /* now we call to resize the entire inspector window */ + [self resizeInspectorForTab:nil]; + } + +} + + +#pragma mark - + - (IBAction) previewGoWindowed: (id)sender { [fPreviewController goWindowedScreen:self]; @@ -67,6 +407,7 @@ - (IBAction) showPreviewWindow: (id)sender { + [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"PreviewWindowIsOpen"]; [fPreviewController showWindow:sender]; } @@ -84,8 +425,13 @@ - (void) setToWindowedMode { - /* Set the window back to regular level */ - [[self window] setLevel:NSNormalWindowLevel]; + /* 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]; } - (void)setHBController: (HBController *)controller @@ -107,6 +453,9 @@ /* Setup our layers for core animation */ [fSizeFilterView setWantsLayer:YES]; + [fPictureSizeBox setWantsLayer:YES]; + [fPictureCropBox setWantsLayer:YES]; + } @@ -130,6 +479,15 @@ { fHandle = handle; + [fPreviewController SetHandle: fHandle]; +} + +- (void) SetTitle: (hb_title_t *) title +{ + hb_job_t * job = title->job; + + fTitle = title; + [fWidthStepper setValueWraps: NO]; [fWidthStepper setIncrement: 16]; [fWidthStepper setMinValue: 64]; @@ -146,17 +504,6 @@ [fCropRightStepper setIncrement: 2]; [fCropRightStepper setMinValue: 0]; - [fPreviewController SetHandle: fHandle]; -} - -- (void) SetTitle: (hb_title_t *) title -{ - hb_job_t * job = title->job; - - fTitle = title; - - - [fWidthStepper setMaxValue: title->width]; [fWidthStepper setIntValue: job->width]; [fWidthField setIntValue: job->width]; @@ -177,8 +524,26 @@ { [fAnamorphicPopUp addItemWithTitle: @"Loose"]; } + [fAnamorphicPopUp addItemWithTitle: @"Custom"]; [fAnamorphicPopUp selectItemAtIndex: job->anamorphic.mode]; + //[self adjustSizingDisplay:nil]; + + /* populate the modulus popup here */ + [fModulusPopUp removeAllItems]; + [fModulusPopUp addItemWithTitle: @"16"]; + [fModulusPopUp addItemWithTitle: @"8"]; + [fModulusPopUp addItemWithTitle: @"4"]; + [fModulusPopUp addItemWithTitle: @"2"]; + if (job->anamorphic.mode == 3) + { + [fModulusPopUp selectItemWithTitle: [NSString stringWithFormat:@"%d",job->anamorphic.modulus]]; + } + else + { + [fModulusPopUp selectItemWithTitle: @"16"]; + } + /* We initially set the previous state of keep ar to on */ keepAspectRatioPreviousState = 1; if (!autoCrop) @@ -213,21 +578,93 @@ MaxOutputWidth = title->width - job->crop[2] - job->crop[3]; MaxOutputHeight = title->height - job->crop[0] - job->crop[1]; + titleDarWidth = job->anamorphic.dar_width; + titleDarHeight = job->anamorphic.dar_height; + + titleParWidth = job->anamorphic.par_width; + titleParHeight = job->anamorphic.par_height; + [self SettingsChanged: nil]; } +- (IBAction) storageLinkChanged: (id) sender +{ + /* since we have a tickless slider, make sure we are at 0.0 or 1.0 */ + if ([fStorageLinkSlider floatValue] < 0.50) + { + [fStorageLinkSlider setFloatValue:0.0]; + /* set slider labels to reflect choice */ + [fStorageLinkParLabel setEnabled:YES]; + [fStorageLinkDisplayLabel setEnabled:NO]; + + } + else + { + [fStorageLinkSlider setFloatValue:1.0]; + /* set slider labels to reflect choice */ + [fStorageLinkParLabel setEnabled:NO]; + [fStorageLinkDisplayLabel setEnabled:YES]; + } + +} + +- (IBAction) parLinkChanged: (id) sender +{ + /* since we have a tickless slider, make sure we are at 0.0 or 1.0 */ + if ([fParLinkSlider floatValue] < 0.50) + { + [fParLinkSlider setFloatValue:0.0]; + /* set slider labels to reflect choice */ + [fParLinkStorageLabel setEnabled:YES]; + [fParLinkDisplayLabel setEnabled:NO]; + } + else + { + [fParLinkSlider setFloatValue:1.0]; + /* set slider labels to reflect choice */ + [fParLinkStorageLabel setEnabled:NO]; + [fParLinkDisplayLabel setEnabled:YES]; + } + +} + +- (IBAction) displayLinkChanged: (id) sender +{ + /* since we have a tickless slider, make sure we are at 0.0 or 1.0 */ + if ([fDisplayLinkSlider floatValue] < 0.50) + { + [fDisplayLinkSlider setFloatValue:0.0]; + /* set slider labels to reflect choice */ + [fDisplayLinkStorageLabel setEnabled:YES]; + [fDisplayLinkParLabel setEnabled:NO]; + } + else + { + [fDisplayLinkSlider setFloatValue:1.0]; + /* set slider labels to reflect choice */ + [fDisplayLinkStorageLabel setEnabled:NO]; + [fDisplayLinkParLabel setEnabled:YES]; + } +} - (IBAction) SettingsChanged: (id) sender { hb_job_t * job = fTitle->job; + [fModulusPopUp setEnabled:NO]; + job->anamorphic.modulus = 16; + + /* Since custom anamorphic allows for a height setting > fTitle->height + * check to make sure it is returned to fTitle->height for all other modes + */ + [fHeightStepper setMaxValue: fTitle->height]; autoCrop = ( [fCropMatrix selectedRow] == 0 ); [fCropTopStepper setEnabled: !autoCrop]; [fCropBottomStepper setEnabled: !autoCrop]; [fCropLeftStepper setEnabled: !autoCrop]; [fCropRightStepper setEnabled: !autoCrop]; - + if( autoCrop ) { memcpy( job->crop, fTitle->crop, 4 * sizeof( int ) ); @@ -240,13 +677,58 @@ job->crop[3] = [fCropRightStepper intValue]; } + [fRatioCheck setEnabled: YES]; + + + [fParWidthField setEnabled: NO]; + [fParHeightField setEnabled: NO]; + [fDisplayWidthField setEnabled: NO]; + + /* If we are not custom anamorphic, make sure we retain the orginal par */ + if( [fAnamorphicPopUp indexOfSelectedItem] != 3 ) + { + job->anamorphic.par_width = titleParWidth; + job->anamorphic.par_height = titleParHeight; + [fRatioLabel setHidden: NO]; + + [fWidthStepper setIncrement: 16]; + [fHeightStepper setIncrement: 16]; + } + else + { + [fWidthStepper setIncrement: [[fModulusPopUp titleOfSelectedItem] intValue]]; + [fHeightStepper setIncrement: [[fModulusPopUp titleOfSelectedItem] intValue]]; + } + if( [fAnamorphicPopUp indexOfSelectedItem] > 0 ) { - if ([fAnamorphicPopUp indexOfSelectedItem] == 2) // Loose anamorphic + if ([fAnamorphicPopUp indexOfSelectedItem] == 1) // strict + { + [fWidthStepper setIntValue: fTitle->width-fTitle->job->crop[2]-fTitle->job->crop[3]]; + [fWidthField setIntValue: fTitle->width-fTitle->job->crop[2]-fTitle->job->crop[3]]; + + /* This will show correct anamorphic height values, but + show distorted preview picture ratio */ + [fHeightStepper setIntValue: fTitle->height-fTitle->job->crop[0]-fTitle->job->crop[1]]; + [fHeightField setIntValue: fTitle->height-fTitle->job->crop[0]-fTitle->job->crop[1]]; + job->width = [fWidthStepper intValue]; + job->height = [fHeightStepper intValue]; + + job->anamorphic.mode = 1; + [fWidthStepper setEnabled: NO]; + [fWidthField setEnabled: NO]; + [fHeightStepper setEnabled: NO]; + [fHeightField setEnabled: NO]; + [fRatioCheck setEnabled: NO]; + } + else if ([fAnamorphicPopUp indexOfSelectedItem] == 2) // Loose anamorphic { job->anamorphic.mode = 2; [fWidthStepper setEnabled: YES]; [fWidthField setEnabled: YES]; + [fRatioCheck setEnabled: NO]; + [fHeightStepper setEnabled: NO]; + [fHeightField setEnabled: NO]; /* We set job->width and call hb_set_anamorphic_size in libhb to do a "dry run" to get * the values to be used by libhb for loose anamorphic */ @@ -265,21 +747,202 @@ job->height = [fHeightStepper intValue]; } - else // must be "1" or strict anamorphic + else if ([fAnamorphicPopUp indexOfSelectedItem] == 3) // custom / power user jamboree { - [fWidthStepper setIntValue: fTitle->width-fTitle->job->crop[2]-fTitle->job->crop[3]]; - [fWidthField setIntValue: fTitle->width-fTitle->job->crop[2]-fTitle->job->crop[3]]; + +#pragma mark - STARTCapuj + + job->anamorphic.mode = 3; - /* This will show correct anamorphic height values, but - show distorted preview picture ratio */ - [fHeightStepper setIntValue: fTitle->height-fTitle->job->crop[0]-fTitle->job->crop[1]]; - [fHeightField setIntValue: fTitle->height-fTitle->job->crop[0]-fTitle->job->crop[1]]; - job->width = [fWidthStepper intValue]; - job->height = [fHeightStepper intValue]; + /* Set the status of our custom ana only widgets accordingly */ + /* for mod 3 we can use modulus other than 16 */ + [fModulusPopUp setEnabled:YES]; + job->anamorphic.modulus = [[fModulusPopUp titleOfSelectedItem] intValue]; - job->anamorphic.mode = 1; - [fWidthStepper setEnabled: NO]; - [fWidthField setEnabled: NO]; + [fWidthStepper setEnabled: YES]; + [fWidthField setEnabled: YES]; + + [fHeightStepper setEnabled: YES]; + /* for capuj the storage field is immaterial */ + [fHeightField setEnabled: YES]; + + [fRatioCheck setEnabled: YES]; + if (sender == fRatioCheck) + { + if ([fRatioCheck state] == NSOnState) + { + [fParWidthField setEnabled: NO]; + [fParHeightField setEnabled: NO]; + } + else + { + [fParWidthField setEnabled: YES]; + [fParHeightField setEnabled: YES]; + } + } + + [fParWidthField setEnabled: YES]; + [fParHeightField setEnabled: YES]; + + [fDisplayWidthField setEnabled: YES]; + + + /* If we are coming into custom anamorphic we reset the par to original + * which gives us a way back if things get hosed up. + */ + + if (sender == fAnamorphicPopUp) + { + /* When entering custom anamorphic, we start with keep ar on */ + [fRatioCheck setState: NSOnState]; + /* + KEEPING ASPECT RATIO + Disable editing: PIXEL WIDTH, PIXEL HEIGHT + */ + [fParWidthField setEnabled: NO]; + [fParHeightField setEnabled: NO]; + + job->width = [fWidthStepper intValue]; + job->height = [fHeightStepper intValue]; + + /* make sure our par is set back to original */ + job->anamorphic.par_width = titleParWidth; + job->anamorphic.par_height = titleParHeight; + + [fParWidthField setIntValue: titleParWidth]; + [fParHeightField setIntValue: titleParHeight]; + + /* modify our par dims from our storage dims */ + hb_set_anamorphic_size(job, &output_width, &output_height, &output_par_width, &output_par_height); + float par_display_width = (float)output_width * (float)output_par_width / (float)output_par_height; + + /* go ahead and mod the display dims */ + [fDisplayWidthField setStringValue: [NSString stringWithFormat:@"%.2f", par_display_width]]; + + job->anamorphic.dar_width = [fDisplayWidthField floatValue]; + job->anamorphic.dar_height = (float)[fHeightStepper intValue]; + + /* Set our dar here assuming we are just coming into capuj mode */ + dar = [fDisplayWidthField floatValue] / (float)[fHeightField intValue]; + + } + + /* For capuj we disable these fields if we are keeping the dispay aspect */ + if ([fRatioCheck state] == NSOnState) + { + /* + KEEPING ASPECT RATIO + DAR = DISPLAY WIDTH / DISPLAY HEIGHT (cache after every modification) */ + /*Disable editing: PIXEL WIDTH, PIXEL HEIGHT */ + + [fParWidthField setEnabled: NO]; + [fParHeightField setEnabled: NO]; + + /* Changing DISPLAY WIDTH: */ + if (sender == fDisplayWidthField) + { + job->anamorphic.dar_width = [fDisplayWidthField floatValue]; + /* Changes HEIGHT to keep DAR */ + /* calculate the height to retain the dar */ + int raw_calulated_height = (int)((int)[fDisplayWidthField floatValue] / dar); + /* now use the modulus to go lower if there is a remainder */ + /* Note to me, raw_calulated_height % [[fModulusPopUp titleOfSelectedItem] intValue] + * gives me the remainder we are not mod (whatever our modulus is) subtract that from + * the actual calculated value derived from the dar to round down to the nearest mod value. + * This should be desireable over rounding up to the next mod value + */ + int modulus_height = raw_calulated_height - (raw_calulated_height % [[fModulusPopUp titleOfSelectedItem] intValue]); + if (modulus_height > fTitle->height) + { + [fHeightStepper setMaxValue: modulus_height]; + } + [fHeightStepper setIntValue: modulus_height]; + job->anamorphic.dar_height = (float)[fHeightStepper intValue]; + job->height = [fHeightStepper intValue]; + + /* Changes PIXEL WIDTH to new DISPLAY WIDTH */ + [fParWidthField setIntValue: [fDisplayWidthField intValue]]; + job->anamorphic.par_width = [fParWidthField intValue]; + /* Changes PIXEL HEIGHT to STORAGE WIDTH */ + [fParHeightField setIntValue: [fWidthField intValue]]; + job->anamorphic.par_height = [fParHeightField intValue]; + + } + /* Changing HEIGHT: */ + if (sender == fHeightStepper) + { + job->anamorphic.dar_height = (float)[fHeightStepper intValue]; + job->height = [fHeightStepper intValue]; + + /* Changes DISPLAY WIDTH to keep DAR*/ + [fDisplayWidthField setStringValue: [NSString stringWithFormat: @"%.2f",[fHeightStepper intValue] * dar]]; + job->anamorphic.dar_width = [fDisplayWidthField floatValue]; + /* Changes PIXEL WIDTH to new DISPLAY WIDTH */ + [fParWidthField setIntValue: [fDisplayWidthField intValue]]; + job->anamorphic.par_width = [fParWidthField intValue]; + /* Changes PIXEL HEIGHT to STORAGE WIDTH */ + [fParHeightField setIntValue: [fWidthField intValue]]; + job->anamorphic.par_height = [fParHeightField intValue]; + } + /* Changing STORAGE_WIDTH: */ + if (sender == fWidthStepper) + { + job->width = [fWidthStepper intValue]; + + job->anamorphic.dar_width = [fDisplayWidthField floatValue]; + job->anamorphic.dar_height = [fHeightStepper floatValue]; + + /* Changes PIXEL WIDTH to DISPLAY WIDTH */ + [fParWidthField setIntValue: [fDisplayWidthField intValue]]; + job->anamorphic.par_width = [fParWidthField intValue]; + /* Changes PIXEL HEIGHT to new STORAGE WIDTH */ + [fParHeightField setIntValue: [fWidthStepper intValue]]; + job->anamorphic.par_height = [fParHeightField intValue]; + } + } + else if ([fRatioCheck state] == NSOffState) + { + /* Changing STORAGE_WIDTH: */ + if (sender == fWidthStepper) + { + job->width = [fWidthStepper intValue]; + /* changes DISPLAY WIDTH to STORAGE WIDTH * PIXEL WIDTH / PIXEL HEIGHT */ + [fDisplayWidthField setStringValue: [NSString stringWithFormat: @"%.2f",(float)[fWidthStepper intValue] * [fParWidthField intValue] / [fParHeightField intValue]]]; + job->anamorphic.dar_width = [fDisplayWidthField floatValue]; + } + /* Changing PIXEL dimensions */ + if (sender == fParWidthField || sender == fParHeightField) + { + job->anamorphic.par_width = [fParWidthField intValue]; + job->anamorphic.par_height = [fParHeightField intValue]; + /* changes DISPLAY WIDTH to STORAGE WIDTH * PIXEL WIDTH / PIXEL HEIGHT */ + [fDisplayWidthField setStringValue: [NSString stringWithFormat: @"%.2f",(float)[fWidthStepper intValue] * [fParWidthField intValue] / [fParHeightField intValue]]]; + job->anamorphic.dar_width = [fDisplayWidthField floatValue]; + } + /* Changing DISPLAY WIDTH: */ + if (sender == fDisplayWidthField) + { + job->anamorphic.dar_width = [fDisplayWidthField floatValue]; + job->anamorphic.dar_height = (float)[fHeightStepper intValue]; + /* changes PIXEL WIDTH to DISPLAY WIDTH and PIXEL HEIGHT to STORAGE WIDTH */ + [fParWidthField setIntValue: [fDisplayWidthField intValue]]; + job->anamorphic.par_width = [fParWidthField intValue]; + + [fParHeightField setIntValue: [fWidthField intValue]]; + job->anamorphic.par_height = [fParHeightField intValue]; + hb_set_anamorphic_size(job, &output_width, &output_height, &output_par_width, &output_par_height); + } + /* Changing HEIGHT: */ + if (sender == fHeightStepper) + { + /* just....changes the height.*/ + job->anamorphic.dar_height = [fHeightStepper intValue]; + job->height = [fHeightStepper intValue]; + } + + } + +#pragma mark - END Capuj } /* if the sender is the Anamorphic checkbox, record the state @@ -288,12 +951,10 @@ { keepAspectRatioPreviousState = [fRatioCheck state]; } - [fRatioCheck setState:NSOffState]; - [fRatioCheck setEnabled: NO]; - - - [fHeightStepper setEnabled: NO]; - [fHeightField setEnabled: NO]; + if ([fAnamorphicPopUp indexOfSelectedItem] != 3) + { + [fRatioCheck setState:NSOffState]; + } } else @@ -315,45 +976,59 @@ } - job->keep_ratio = ( [fRatioCheck state] == NSOnState ); - - if( job->keep_ratio ) + //job->keep_ratio = ( [fRatioCheck state] == NSOnState ); + + if ([fAnamorphicPopUp indexOfSelectedItem] != 3) { - if( sender == fWidthStepper || sender == fRatioCheck || - sender == fCropTopStepper || sender == fCropBottomStepper ) + job->keep_ratio = ( [fRatioCheck state] == NSOnState ); + if( job->keep_ratio ) { - hb_fix_aspect( job, HB_KEEP_WIDTH ); - if( job->height > fTitle->height ) + if( sender == fWidthStepper || sender == fRatioCheck || + sender == fCropTopStepper || sender == fCropBottomStepper ) { - job->height = fTitle->height; - hb_fix_aspect( job, HB_KEEP_HEIGHT ); + hb_fix_aspect( job, HB_KEEP_WIDTH ); + if( job->height > fTitle->height ) + { + job->height = fTitle->height; + hb_fix_aspect( job, HB_KEEP_HEIGHT ); + } } - } - else - { - hb_fix_aspect( job, HB_KEEP_HEIGHT ); - if( job->width > fTitle->width ) + else { - job->width = fTitle->width; - hb_fix_aspect( job, HB_KEEP_WIDTH ); + hb_fix_aspect( job, HB_KEEP_HEIGHT ); + if( job->width > fTitle->width ) + { + job->width = fTitle->width; + hb_fix_aspect( job, HB_KEEP_WIDTH ); + } } + } - // hb_get_preview can't handle sizes that are larger than the original title + } + + // hb_get_preview can't handle sizes that are larger than the original title + if ([fAnamorphicPopUp indexOfSelectedItem] != 3) + { // dimensions if( job->width > fTitle->width ) + { job->width = fTitle->width; - + } + if( job->height > fTitle->height ) + { job->height = fTitle->height; + } } - + [fWidthStepper setIntValue: job->width]; [fWidthField setIntValue: job->width]; - if( [fAnamorphicPopUp indexOfSelectedItem] < 2 ) - { + if( [fAnamorphicPopUp indexOfSelectedItem] != 2) // if we are not loose or custom + { [fHeightStepper setIntValue: job->height]; [fHeightField setIntValue: job->height]; } + [fCropTopStepper setIntValue: job->crop[0]]; [fCropTopField setIntValue: job->crop[0]]; [fCropBottomStepper setIntValue: job->crop[1]]; @@ -363,33 +1038,30 @@ [fCropRightStepper setIntValue: job->crop[3]]; [fCropRightField setIntValue: job->crop[3]]; - [fPreviewController SetTitle:fTitle]; + //[fPreviewController SetTitle:fTitle]; + /* Sanity Check Here for < 16 px preview to avoid crashing hb_get_preview. In fact, just for kicks lets getting previews at a min limit of 32, since no human can see any meaningful detail below that */ if (job->width >= 64 && job->height >= 64) { - - // Purge the existing picture previews so they get recreated the next time - // they are needed. - [fPreviewController purgeImageCache]; - /* We actually call displayPreview now from pictureSliderChanged which keeps - * our picture preview slider in sync with the previews being shown - */ - - //[fPreviewController pictureSliderChanged:nil]; - [self reloadStillPreview]; + [self reloadStillPreview]; } - + /* we get the sizing info to display from fPreviewController */ [fSizeInfoField setStringValue: [fPreviewController pictureSizeInfoString]]; - + if (sender != nil) { [fHBController pictureSettingsDidChange]; } + if ([[self window] isVisible]) + { + [self adjustSizingDisplay:nil]; + } + } - (NSString*) getPictureSizeInfoString @@ -411,12 +1083,12 @@ // Purge the existing picture previews so they get recreated the next time // they are needed. - [fPreviewController purgeImageCache]; + // [fPreviewController purgeImageCache]; /* We actually call displayPreview now from pictureSliderChanged which keeps * our picture preview slider in sync with the previews being shown */ - [fPreviewController pictureSliderChanged:nil]; + //[fPreviewController pictureSliderChanged:nil]; } } @@ -445,8 +1117,10 @@ - (IBAction)showPreviewPanel: (id)sender forTitle: (hb_title_t *)title { - [self SetTitle:title]; + //[self SetTitle:title]; [self showWindow:sender]; + //[self adjustSizingDisplay:nil]; + //[self adjustFilterDisplay:nil]; } @@ -500,33 +1174,45 @@ are maintained across different sources */ - (IBAction) modeDecombDeinterlaceSliderChanged: (id) sender { + + /* since its a tickless slider, we have to make sure we are on or off */ + if ([fDecombDeinterlaceSlider floatValue] < 0.50) + { + [fDecombDeinterlaceSlider setFloatValue:0.0]; + } + else + { + [fDecombDeinterlaceSlider setFloatValue:1.0]; + } + + /* Decomb selected*/ if ([fDecombDeinterlaceSlider floatValue] == 0.0) { - [fDecombBox setHidden:NO]; - [fDeinterlaceBox setHidden:YES]; - fPictureFilterSettings.decomb = [fDecombPopUp indexOfSelectedItem]; - fPictureFilterSettings.usedecomb = 1; - fPictureFilterSettings.deinterlace = 0; - [self adjustFilterDisplay:fDecombPopUp]; - [fDecombPopUp selectItemAtIndex:fPictureFilterSettings.decomb]; + [fDecombBox setHidden:NO]; + [fDeinterlaceBox setHidden:YES]; + fPictureFilterSettings.decomb = [fDecombPopUp indexOfSelectedItem]; + fPictureFilterSettings.usedecomb = 1; + fPictureFilterSettings.deinterlace = 0; + [fDecombPopUp selectItemAtIndex:fPictureFilterSettings.decomb]; + [self adjustFilterDisplay:fDecombPopUp]; } else { - [fDecombBox setHidden:YES]; - [fDeinterlaceBox setHidden:NO]; - fPictureFilterSettings.usedecomb = 0; - fPictureFilterSettings.decomb = 0; - [self adjustFilterDisplay:fDeinterlacePopUp]; - [fDeinterlacePopUp selectItemAtIndex: fPictureFilterSettings.deinterlace]; + [fDecombBox setHidden:YES]; + [fDeinterlaceBox setHidden:NO]; + fPictureFilterSettings.usedecomb = 0; + fPictureFilterSettings.decomb = 0; + [fDeinterlacePopUp selectItemAtIndex: fPictureFilterSettings.deinterlace]; + [self adjustFilterDisplay:fDeinterlacePopUp]; } - [self FilterSettingsChanged: sender]; + [self FilterSettingsChanged: fDecombDeinterlaceSlider]; } - (IBAction) FilterSettingsChanged: (id) sender { - + fPictureFilterSettings.detelecine = [fDetelecinePopUp indexOfSelectedItem]; [self adjustFilterDisplay:fDetelecinePopUp]; @@ -558,62 +1244,6 @@ are maintained across different sources */ } -- (void) adjustFilterDisplay: (id) sender -{ - - NSBox * filterBox = nil; - NSTextField * filterField; - if (sender == fDetelecinePopUp) - { - filterBox = fDetelecineBox; - filterField = fDetelecineField; - } - if (sender == fDecombPopUp) - { - filterBox = fDecombBox; - filterField = fDecombField; - } - if (sender == fDeinterlacePopUp) - { - filterBox = fDeinterlaceBox; - filterField = fDeinterlaceField; - } - - if (sender == fDenoisePopUp) - { - filterBox = fDenoiseBox; - filterField = fDenoiseField; - } - - NSSize currentSize = [filterBox frame].size; - if ([sender titleOfSelectedItem] == @"Custom") - { - currentSize.height = 60; - } - else - { - currentSize.height = 30; - } - /* Check to see if we have changed the size from current */ - if (currentSize.height != [filterBox frame].size.height) - { - /* We are changing the size of the box, so recalc the origin */ - NSPoint origin = [filterBox frame].origin; - /* See if we are expanding the box downwards */ - if (currentSize.height > [filterBox frame].size.height) - { - origin.y = origin.y - currentSize.height / 2; - } - else - { - origin.y = origin.y + currentSize.height; - } - /* go ahead and resize the box */ - [filterBox setFrameSize:currentSize]; - [filterBox setFrameOrigin:origin]; - } - -} #pragma mark -