X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=macosx%2FPictureController.mm;h=149571ad9f151326e46d6fdd98fb849a4176e23e;hb=07cc0ebf6a7141a76fd9b6e2da6cf510def1ebc7;hp=60f1637297eed376de1df1ce92d708b38a2a61ac;hpb=d6f219923cc9d77641b8f58bbf543a8d077c83d2;p=handbrake-jp%2Fhandbrake-jp-git.git diff --git a/macosx/PictureController.mm b/macosx/PictureController.mm index 60f16372..149571ad 100644 --- a/macosx/PictureController.mm +++ b/macosx/PictureController.mm @@ -1,10 +1,10 @@ /* $Id: PictureController.mm,v 1.11 2005/08/01 15:10:44 titer Exp $ This file is part of the HandBrake source code. - Homepage: . + Homepage: . It may be used under the terms of the GNU General Public License. */ -#include "PictureController.h" +#import "PictureController.h" @interface PictureController (Private) @@ -19,10 +19,19 @@ - (id)initWithDelegate:(id)del { - if (self = [super init]) + if (self = [super initWithWindowNibName:@"PictureSettings"]) { + // NSWindowController likes to lazily load its window. However since + // this controller tries to set all sorts of outlets before the window + // is displayed, we need it to load immediately. The correct way to do + // this, according to the documentation, is simply to invoke the window + // getter once. + // + // If/when we switch a lot of this stuff to bindings, this can probably + // go away. + [self window]; + delegate = del; - [self loadMyNibFile]; fPicturePreviews = [[NSMutableDictionary dictionaryWithCapacity: HB_NUM_HBLIB_PICTURES] retain]; } return self; @@ -126,7 +135,6 @@ are maintained across different sources */ [fDeinterlacePopUp addItemWithTitle: @"Fast"]; [fDeinterlacePopUp addItemWithTitle: @"Slow"]; [fDeinterlacePopUp addItemWithTitle: @"Slower"]; - [fDeinterlacePopUp addItemWithTitle: @"Slowest"]; /* Set deinterlaces level according to the integer in the main window */ [fDeinterlacePopUp selectItemAtIndex: fPictureFilterSettings.deinterlace]; @@ -139,6 +147,14 @@ are maintained across different sources */ [fDenoisePopUp addItemWithTitle: @"Strong"]; /* Set denoises level according to the integer in the main window */ [fDenoisePopUp selectItemAtIndex: fPictureFilterSettings.denoise]; + + /* we use a popup to show the decomb settings */ + [fDecombPopUp removeAllItems]; + [fDecombPopUp addItemWithTitle: @"None"]; + [fDecombPopUp addItemWithTitle: @"Default"]; + [fDecombPopUp addItemWithTitle: @"Custom"]; + /* Set denoises level according to the integer in the main window */ + [fDecombPopUp selectItemAtIndex: fPictureFilterSettings.decomb]; } @@ -148,7 +164,7 @@ are maintained across different sources */ { [fPictureView setImage: [self imageForPicture: fPicture]]; - NSSize displaySize = NSMakeSize( (float)fTitle->width, (float)fTitle->height ); + NSSize displaySize = NSMakeSize( ( CGFloat )fTitle->width, ( CGFloat )fTitle->height ); /* Set the picture size display fields below the Preview Picture*/ if( fTitle->job->pixel_ratio == 1 ) // Original PAR Implementation { @@ -158,7 +174,7 @@ are maintained across different sources */ [fInfoField setStringValue:[NSString stringWithFormat: @"Source: %dx%d, Output: %dx%d, Anamorphic: %dx%d", fTitle->width, fTitle->height, output_width, output_height, display_width, output_height]]; - displaySize.width *= ((float)fTitle->job->pixel_aspect_width) / ((float)fTitle->job->pixel_aspect_height); + displaySize.width *= ( ( CGFloat )fTitle->job->pixel_aspect_width ) / ( ( CGFloat )fTitle->job->pixel_aspect_height ); } else if (fTitle->job->pixel_ratio == 2) // Loose Anamorphic { @@ -167,13 +183,10 @@ are maintained across different sources */ @"Source: %dx%d, Output: %dx%d, Anamorphic: %dx%d", fTitle->width, fTitle->height, output_width, output_height, display_width, output_height]]; - /* FIXME: needs to be fixed so that the picture window does not resize itself on the first - anamorphic width drop - */ - if (fTitle->width - 8 < output_width) - { - displaySize.width *= ((float)output_par_width) / ((float)output_par_height); - } + /* FIXME: use the original aspect ratio to calculate the displaySize, + probably the size will not be the right one, + but at least the windows does not resize every time. */ + displaySize.width *= ( ( CGFloat )fTitle->job->pixel_aspect_width) / ( ( CGFloat )fTitle->job->pixel_aspect_height ); } else // No Anamorphic { @@ -181,27 +194,26 @@ are maintained across different sources */ @"Source: %dx%d, Output: %dx%d", fTitle->width, fTitle->height, fTitle->job->width, fTitle->job->height]]; } - + NSSize viewSize = [self optimalViewSizeForImageSize:displaySize]; if( [self viewNeedsToResizeToSize:viewSize] ) { [self resizeSheetForViewSize:viewSize]; [self setViewSize:viewSize]; } - + // Show the scaled text (use the height to check since the width can vary // with anamorphic video). - if( ((int)viewSize.height) != fTitle->height ) + if( ( ( int )viewSize.height ) != fTitle->height ) { - float scale = viewSize.width / ((float)fTitle->width); + CGFloat scale = viewSize.width / ( ( CGFloat ) fTitle->width ); NSString *scaleString = [NSString stringWithFormat: NSLocalizedString( @" (Preview scaled to %.0f%% actual size)", @"String shown when a preview is scaled" ), scale * 100.0]; - [fInfoField setStringValue: - [[fInfoField stringValue] stringByAppendingString:scaleString]]; + [fInfoField setStringValue: [[fInfoField stringValue] stringByAppendingString:scaleString]]; } - + [fPrevButton setEnabled: ( fPicture > 0 )]; [fNextButton setEnabled: ( fPicture < 9 )]; } @@ -210,6 +222,24 @@ are maintained across different sources */ { hb_job_t * job = fTitle->job; + 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 ) ); + } + else + { + job->crop[0] = [fCropTopStepper intValue]; + job->crop[1] = [fCropBottomStepper intValue]; + job->crop[2] = [fCropLeftStepper intValue]; + job->crop[3] = [fCropRightStepper intValue]; + } + if( [fAnamorphicPopUp indexOfSelectedItem] > 0 ) { if ([fAnamorphicPopUp indexOfSelectedItem] == 2) // Loose anamorphic @@ -277,7 +307,6 @@ are maintained across different sources */ } - job->keep_ratio = ( [fRatioCheck state] == NSOnState ); fPictureFilterSettings.deinterlace = [fDeinterlacePopUp indexOfSelectedItem]; @@ -305,26 +334,9 @@ are maintained across different sources */ } fPictureFilterSettings.detelecine = [fDetelecineCheck state]; fPictureFilterSettings.deblock = [fDeblockCheck state]; - //job->pixel_ratio = ( [fPARCheck state] == NSOnState ); - - 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 ) ); - } - else - { - job->crop[0] = [fCropTopStepper intValue]; - job->crop[1] = [fCropBottomStepper intValue]; - job->crop[2] = [fCropLeftStepper intValue]; - job->crop[3] = [fCropRightStepper intValue]; - } + fPictureFilterSettings.decomb = [fDecombPopUp indexOfSelectedItem]; + if( job->keep_ratio ) { if( sender == fWidthStepper || sender == fRatioCheck || @@ -346,8 +358,15 @@ are maintained across different sources */ hb_fix_aspect( job, HB_KEEP_WIDTH ); } } + // hb_get_preview can't handle sizes that are larger than the original title + // 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 ) @@ -400,9 +419,9 @@ are maintained across different sources */ { if ([delegate respondsToSelector:@selector(pictureSettingsDidChange)]) [delegate pictureSettingsDidChange]; - - [NSApp endSheet: fPicturePanel]; - [fPicturePanel orderOut: self]; + + [NSApp endSheet:[self window]]; + [[self window] orderOut:self]; } - (BOOL) autoCrop @@ -452,7 +471,14 @@ are maintained across different sources */ - (void) setDeinterlace: (int) setting { fPictureFilterSettings.deinterlace = setting; } +- (int) decomb +{ + return fPictureFilterSettings.decomb; +} +- (void) setDecomb: (int) setting { + fPictureFilterSettings.decomb = setting; +} - (int) denoise { return fPictureFilterSettings.denoise; @@ -476,8 +502,8 @@ are maintained across different sources */ - (void)showPanelInWindow: (NSWindow *)fWindow forTitle: (hb_title_t *)title { [self SetTitle:title]; - - [NSApp beginSheet:fPicturePanel + + [NSApp beginSheet:[self window] modalForWindow:fWindow modalDelegate:nil didEndSelector:nil @@ -655,17 +681,6 @@ are maintained across different sources */ [fPicturePreviews removeAllObjects]; } -- (BOOL) loadMyNibFile -{ - if(![NSBundle loadNibNamed:@"PictureSettings" owner:self]) - { - NSLog(@"Warning! Could not load myNib file.\n"); - return NO; - } - - return YES; -} - @end @implementation PictureController (Private) @@ -674,22 +689,22 @@ are maintained across different sources */ // -[PictureController(Private) optimalViewSizeForImageSize:] // // Given the size of the preview image to be shown, returns the best possible -// size for the OpenGL view. +// size for the view. // - (NSSize)optimalViewSizeForImageSize: (NSSize)imageSize { // The min size is 320x240 - float minWidth = 320.0; - float minHeight = 240.0; - + CGFloat minWidth = 320.0; + CGFloat minHeight = 240.0; + // The max size of the view is when the sheet is taking up 85% of the screen. NSSize screenSize = [[NSScreen mainScreen] frame].size; - NSSize sheetSize = [fPicturePanel frame].size; + NSSize sheetSize = [[self window] frame].size; NSSize viewAreaSize = [fPictureViewArea frame].size; - float paddingX = sheetSize.width - viewAreaSize.width; - float paddingY = sheetSize.height - viewAreaSize.height; - float maxWidth = (0.85 * screenSize.width) - paddingX; - float maxHeight = (0.85 * screenSize.height) - paddingY; + CGFloat paddingX = sheetSize.width - viewAreaSize.width; + CGFloat paddingY = sheetSize.height - viewAreaSize.height; + CGFloat maxWidth = (0.85 * screenSize.width) - paddingX; + CGFloat maxHeight = (0.85 * screenSize.height) - paddingY; NSSize resultSize = imageSize; @@ -722,19 +737,19 @@ are maintained across different sources */ // // -[PictureController(Private) resizePanelForViewSize:animate:] // -// Resizes the entire sheet to accomodate an OpenGL view of a particular size. +// Resizes the entire sheet to accomodate a view of a particular size. // - (void)resizeSheetForViewSize: (NSSize)viewSize { // Figure out the deltas for the new frame area NSSize currentSize = [fPictureViewArea frame].size; - float deltaX = viewSize.width - currentSize.width; - float deltaY = viewSize.height - currentSize.height; - + CGFloat deltaX = viewSize.width - currentSize.width; + CGFloat deltaY = viewSize.height - currentSize.height; + // Now resize the whole panel by those same deltas, but don't exceed the min - NSRect frame = [fPicturePanel frame]; - NSSize maxSize = [fPicturePanel maxSize]; - NSSize minSize = [fPicturePanel minSize]; + NSRect frame = [[self window] frame]; + NSSize maxSize = [[self window] maxSize]; + NSSize minSize = [[self window] minSize]; frame.size.width += deltaX; frame.size.height += deltaY; if( frame.size.width < minSize.width ) @@ -748,16 +763,19 @@ are maintained across different sources */ // But now the sheet is off-center, so also shift the origin to center it and // keep the top aligned. - frame.origin.x -= (deltaX / 2.0); - frame.origin.y -= deltaY; + if( frame.size.width != [[self window] frame].size.width ) + frame.origin.x -= (deltaX / 2.0); - [fPicturePanel setFrame:frame display:YES animate:YES]; + if( frame.size.height != [[self window] frame].size.height ) + frame.origin.y -= deltaY; + + [[self window] setFrame:frame display:YES animate:YES]; } // // -[PictureController(Private) setViewSize:] // -// Changes the OpenGL view's size and centers it vertially inside of its area. +// Changes the view's size and centers it vertically inside of its area. // Assumes resizeSheetForViewSize: has already been called. // - (void)setViewSize: (NSSize)viewSize @@ -782,5 +800,4 @@ are maintained across different sources */ return (newSize.width != viewSize.width || newSize.height != viewSize.height); } - @end