X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=macosx%2FHBPreviewController.m;h=764da459d7deed8381f2063ab74b7b1a47f70e63;hb=640252b369ae9159ee6c4de63e22e8e6755f2bdc;hp=cc0e7382617939bc76d73279ff77c760c1b4dafd;hpb=1fd0e1d85ccfd10054c3c1ee44abdf9ee160e9ed;p=handbrake-jp%2Fhandbrake-jp-git.git diff --git a/macosx/HBPreviewController.m b/macosx/HBPreviewController.m index cc0e7382..764da459 100644 --- a/macosx/HBPreviewController.m +++ b/macosx/HBPreviewController.m @@ -159,6 +159,8 @@ [fPicturePreviews release]; [fFullScreenWindow release]; + + hb_close(&fPreviewLibhb); [super dealloc]; } @@ -209,7 +211,14 @@ fPicture = 0; MaxOutputWidth = title->width - job->crop[2] - job->crop[3]; MaxOutputHeight = title->height - job->crop[0] - job->crop[1]; + [self SettingsChanged: nil]; + + /* set the top of the hud controller boxes centered vertically with the origin of our window */ + NSPoint hudControlBoxOrigin = [fPictureControlBox frame].origin; + hudControlBoxOrigin.y = ([[self window] frame].size.height / 2) - [fPictureControlBox frame].size.height; + [fPictureControlBox setFrameOrigin:hudControlBoxOrigin]; + [fEncodingControlBox setFrameOrigin:hudControlBoxOrigin]; } @@ -217,7 +226,7 @@ // Adjusts the window to draw the current picture (fPicture) adjusting its size as // necessary to display as much of the picture as possible. -- (void) displayPreview +- (void) displayPreview { hb_job_t * job = fTitle->job; /* lets make sure that the still picture view is not hidden and that @@ -273,7 +282,7 @@ @"Source: %dx%d, Output: %dx%d, Anamorphic: %dx%d Custom", fTitle->width, fTitle->height, output_width, output_height, fTitle->job->anamorphic.dar_width, fTitle->job->anamorphic.dar_height]; - displaySize.width = fTitle->job->anamorphic.dar_width + fTitle->job->crop[2] + fTitle->job->crop[3]; + displaySize.width = fTitle->job->anamorphic.dar_width + fTitle->job->crop[2] + fTitle->job->crop[3] ; displaySize.height = fTitle->job->anamorphic.dar_height + fTitle->job->crop[0] + fTitle->job->crop[1]; imageScaledSize.width = (int)fTitle->job->anamorphic.dar_width; imageScaledSize.height = (int)fTitle->job->height; @@ -283,48 +292,97 @@ sizeInfoString = [NSString stringWithFormat: @"Source: %dx%d, Output: %dx%d", fTitle->width, fTitle->height, fTitle->job->width, fTitle->job->height]; - /* original + displaySize.width = fTitle->width; displaySize.height = fTitle->height; imageScaledSize.width = fTitle->job->width; imageScaledSize.height = fTitle->job->height; - */ - /* Test ... */ - displaySize.width = fTitle->width; - displaySize.height = fTitle->height; - imageScaledSize.width = fTitle->job->width + fTitle->job->crop[2] + fTitle->job->crop[3]; - imageScaledSize.height = fTitle->job->height + fTitle->job->crop[0] - fTitle->job->crop[1]; } + + NSSize viewSize = [self optimalViewSizeForImageSize:displaySize]; + [self resizeSheetForViewSize:viewSize]; + + NSSize windowSize = [[self window] frame].size; - /* we also need to take into account scaling to full screen to activate switching the view size */ - if( [self viewNeedsToResizeToSize:viewSize]) + if (scaleToScreen == YES) { - if (fTitle->job->anamorphic.mode != 2 || (fTitle->job->anamorphic.mode == 2 && fTitle->width == fTitle->job->width)) + /* Note: this should probably become a utility function */ + /* We are in Scale To Screen mode so, we have to get the ratio for height and width against the window + *size so we can scale from there. + */ + CGFloat deltaWidth = imageScaledSize.width / displaySize.width; + CGFloat deltaHeight = imageScaledSize.height /displaySize.height; + NSSize windowSize = [[self window] frame].size; + CGFloat pictureAspectRatio = imageScaledSize.width / imageScaledSize.height; + + /* Set our min size to the storage size */ + NSSize minSize; + minSize.width = fTitle->width; + minSize.height = fTitle->height; + + /* Set delta's based on minimum size */ + if (imageScaledSize.width < minSize.width) { - [self resizeSheetForViewSize:viewSize]; - [self setViewSize:viewSize]; + deltaWidth = imageScaledSize.width / minSize.width; + } + else + { + deltaWidth = 1.0; + } + + if (imageScaledSize.height < minSize.height) + { + deltaHeight = imageScaledSize.height / minSize.height; + } + else + { + deltaHeight = 1.0; + } + + /* Now apply our deltas to the full screen view */ + if (pictureAspectRatio > 1.0) // we are wider than taller, so expand the width to fill the area and scale the height + { + viewSize.width = windowSize.width * deltaWidth; + viewSize.height = viewSize.width / pictureAspectRatio; } - } - - viewSize.width = viewSize.width - (viewSize.width - imageScaledSize.width); - viewSize.height = viewSize.height - (viewSize.height - imageScaledSize.height); - [self setViewSize:viewSize]; - - /* special case for scaleToScreen */ - if (scaleToScreen == YES) + else + { + viewSize.height = windowSize.height * deltaHeight; + viewSize.width = viewSize.height * pictureAspectRatio; + } + + } + else { - [fPreviewImage setSize: viewSize]; - [fPictureView setImage: fPreviewImage]; + viewSize.width = viewSize.width - (viewSize.width - imageScaledSize.width); + viewSize.height = viewSize.height - (viewSize.height - imageScaledSize.height); + + if (fTitle->width > windowSize.width || fTitle->height > windowSize.height) + { + CGFloat viewSizeAspect = viewSize.width / viewSize.height; + if (viewSizeAspect > 1.0) // we are wider than taller, so expand the width to fill the area and scale the height + { + viewSize.width = viewSize.width * (windowSize.width / fTitle->width) ; + viewSize.height = viewSize.width / viewSizeAspect; + } + else + { + viewSize.height = viewSize.height * (windowSize.height / fTitle->height); + viewSize.width = viewSize.height * viewSizeAspect; + } + } + } + [self setViewSize:viewSize]; + NSString *scaleString; CGFloat scale = ( ( CGFloat )[fPictureView frame].size.width) / ( ( CGFloat )imageScaledSize.width); if (scale * 100.0 != 100) { - //CGFloat scale = ( ( CGFloat )[fPictureView frame].size.width) / ( ( CGFloat )imageScaledSize.width); scaleString = [NSString stringWithFormat: NSLocalizedString( @" (%.0f%% actual size)", @"String shown when a preview is scaled" ), scale * 100.0]; @@ -333,6 +391,11 @@ { scaleString = @"(Actual size)"; } + + if (scaleToScreen == YES) + { + scaleString = [scaleString stringByAppendingString:@" Scaled To Screen"]; + } /* Set the info fields in the hud controller */ [fInfoField setStringValue: [NSString stringWithFormat: @"%@", sizeInfoString]]; @@ -493,7 +556,58 @@ } - +- (IBAction)goWindowedScreen:(id)sender +{ + + /* Get the screen info to release the display but don't actually do + * it until the windowed screen is setup. + */ + scaleToScreen = NO; + [self pictureSliderChanged:nil]; + [fScaleToScreenToggleButton setTitle:@"<->"]; + + NSScreen* mainScreen = [NSScreen mainScreen]; + NSDictionary* screenInfo = [mainScreen deviceDescription]; + NSNumber* screenID = [screenInfo objectForKey:@"NSScreenNumber"]; + CGDirectDisplayID displayID = (CGDirectDisplayID)[screenID longValue]; + + [fFullScreenWindow dealloc]; + [fFullScreenWindow release]; + + + [fPreviewWindow setContentView:fPictureViewArea]; + [fPictureViewArea setNeedsDisplay:YES]; + [self setWindow:fPreviewWindow]; + + // Show the window. + [fPreviewWindow makeKeyAndOrderFront:self]; + + /* Set the window back to regular level */ + [fPreviewWindow setLevel:NSNormalWindowLevel]; + + /* Set the isFullScreen flag back to NO */ + //isFullScreen = NO; + scaleToScreen = NO; + /* make sure we are set to a still preview */ + [self pictureSliderChanged:nil]; + [self showPreviewWindow:nil]; + + /* Change the name of fFullScreenToggleButton appropriately */ + //[fFullScreenToggleButton setTitle: @"Full Screen"]; + // [fScaleToScreenToggleButton setHidden:YES]; + /* set the picture settings pallete back to normal level */ + [fHBController picturePanelWindowed]; + + /* Release the display now that the we are back in windowed mode */ + CGDisplayRelease(displayID); + + [fPreviewWindow setAcceptsMouseMovedEvents:YES]; + //[fFullScreenWindow setAcceptsMouseMovedEvents:NO]; + + hudTimerSeconds = 0; + [self startHudTimer]; + +} #pragma mark Still Preview Image Processing @@ -810,8 +924,6 @@ [fMovieCreationProgressIndicator setHidden: YES]; [fEncodingControlBox setHidden: YES]; isEncoding = NO; - /* we make sure the picture slider and preview match */ - [self pictureSliderChanged:nil]; // Show the movie view [self showMoviePreview:fPreviewMoviePath]; @@ -859,66 +971,60 @@ NSSize movieSize= [[aMovie attributeForKey:QTMovieNaturalSizeAttribute] sizeValue]; movieBounds = [fMovieView movieBounds]; movieBounds.size.height = movieSize.height; - + /* We also get our view size to use for scaling fMovieView's size */ + NSSize scaledMovieViewSize = [fPictureView frame].size; if ([fMovieView isControllerVisible]) { CGFloat controllerBarHeight = [fMovieView controllerBarHeight]; if ( controllerBarHeight != 0 ) //Check if QTKit return a real value or not. + { movieBounds.size.height += controllerBarHeight; + scaledMovieViewSize.height += controllerBarHeight; + } else + { movieBounds.size.height += 15; + scaledMovieViewSize.height += 15; + } } movieBounds.size.width = movieSize.width; - /* We need to find out if the preview movie needs to be scaled down so - * that it doesn't overflow our available viewing container (just like for image - * in -displayPreview) for HD sources, etc. [fPictureViewArea frame].size.height*/ - if( (movieBounds.size.height) > [fPictureViewArea frame].size.height || scaleToScreen == YES ) + /* we need to account for an issue where the scaledMovieViewSize > the window size */ + if (scaledMovieViewSize.height > [[self window] frame].size.height) { - /* The preview movie would be larger than the available viewing area - * in the preview movie, so we go ahead and scale it down to the same size - * as the still preview or we readjust our window to allow for the added height if need be + [fHBController writeToActivityLog: "showMoviePreview: Our window is not tall enough to show the controller bar ..."]; + /*we need to scale the movie down vertically by 15 px to allow for the controller bar + * and scale the width accordingly. */ - NSSize displaySize = NSMakeSize( ( CGFloat ) movieBounds.size.width, ( CGFloat ) movieBounds.size.height ); - NSSize viewSize = [self optimalViewSizeForImageSize:displaySize]; - if( [self viewNeedsToResizeToSize:viewSize] ) - { - [self resizeSheetForViewSize:viewSize]; - [self setViewSize:viewSize]; - } - [fMovieView setFrameSize:viewSize]; - } - else - { - /* Since the preview movie is smaller than the available viewing area - * we can go ahead and use the preview movies native size */ - [fMovieView setFrameSize:movieBounds.size]; + + // FIX ME: currently trying to scale everything to show the controller bar does not work right. + // Commented out til fixed, resulting issue when the movie is the full size of the window is no + // controller bar is visible. Live Preview still plays fine though. + /* + CGFloat pictureAspectRatio = scaledMovieViewSize.width / scaledMovieViewSize.height; + scaledMovieViewSize.height = [[self window] frame].size.height - 15; + scaledMovieViewSize.width = scaledMovieViewSize.height * pictureAspectRatio; + NSRect windowFrame = [[self window] frame]; + windowFrame.size.width = scaledMovieViewSize.width; + windowFrame.size.height = scaledMovieViewSize.height + 15; + [[self window] setFrame:windowFrame display:YES animate:YES]; + [fPictureView setFrameSize:scaledMovieViewSize]; + */ } - //lets reposition the movie if need be - NSPoint origin = [fPictureViewArea frame].origin; - origin.x += trunc( ( [fPictureViewArea frame].size.width - + + /* Scale the fMovieView to scaledMovieViewSize */ + [fMovieView setFrameSize:scaledMovieViewSize]; + + /*set our origin try using fPictureViewArea or fPictureView */ + NSPoint origin = [fPictureView frame].origin; + origin.x += trunc( ( [fPictureView frame].size.width - [fMovieView frame].size.width ) / 2.0 ); - /* We need to detect whether or not we are currently less than the available height.*/ - if( movieBounds.size.height < [fPictureView frame].size.height ) - { - /* If we are, we are adding 15 to the height to allow for the controller bar so - * we need to subtract half of that for the origin.y to get the controller bar - * below the movie to it lines up vertically with where our still preview was - */ - origin.y += trunc( ( ( [fPictureViewArea frame].size.height - + origin.y += trunc( ( ( [fPictureView frame].size.height - [fMovieView frame].size.height ) / 2.0 ) - 7.5 ); - } - else - { - /* if we are >= to the height of the picture view area, the controller bar - * gets taken care of with picture resizing, so we do not want to offset the height - */ - origin.y += trunc( ( [fPictureViewArea frame].size.height - - [fMovieView frame].size.height ) / 2.0 ); - } + [fMovieView setFrameOrigin:origin]; [fMovieView setMovie:aMovie]; [fMovieView setHidden:NO]; @@ -941,18 +1047,34 @@ // - (NSSize)optimalViewSizeForImageSize: (NSSize)imageSize { - // The min size is 320x240 + // The min size is 480x360 CGFloat minWidth = 480.0; CGFloat minHeight = 360.0; - NSSize screenSize = [[NSScreen mainScreen] visibleFrame].size; + NSSize screenSize = [[[self window] screen] visibleFrame].size; NSSize sheetSize = [[self window] frame].size; NSSize viewAreaSize = [fPictureViewArea frame].size; - CGFloat paddingX = sheetSize.width - viewAreaSize.width; - CGFloat paddingY = sheetSize.height - viewAreaSize.height; + CGFloat paddingX = 0.00; + CGFloat paddingY = 0.00; + + if (fTitle->width > screenSize.width || fTitle->height > screenSize.height) + { + if (scaleToScreen == YES) + { + paddingX = screenSize.width - imageSize.width; + paddingY = screenSize.height - imageSize.height; + } + + else + { + paddingX = sheetSize.width - viewAreaSize.width; + paddingY = sheetSize.height - viewAreaSize.height; + } + + } + CGFloat maxWidth; CGFloat maxHeight; - maxWidth = screenSize.width - paddingX; maxHeight = screenSize.height - paddingY; @@ -963,7 +1085,7 @@ CGFloat screenAspect = screenSize.width / screenSize.height; // Note, a standard dvd will use 720 x 480 which is a 1.5 CGFloat viewAreaAspect = viewAreaSize.width / viewAreaSize.height; - + if (scaleToScreen == YES) { @@ -1005,8 +1127,8 @@ { resultSize.height = minHeight; } - - return resultSize; + + return resultSize; } @@ -1026,7 +1148,17 @@ // Now resize the whole panel by those same deltas, but don't exceed the min NSRect frame = [[self window] frame]; NSSize maxSize = [[[self window] screen] visibleFrame].size; - NSSize minSize = [[self window] minSize]; + /* if we are not Scale To Screen, put an 85% of visible screen on the window */ + if (scaleToScreen == NO ) + { + maxSize.width = maxSize.width * 0.85; + maxSize.height = maxSize.height * 0.85; + } + + /* Set our min size to the storage size */ + NSSize minSize; + minSize.width = fTitle->width; + minSize.height = fTitle->height; frame.size.width += deltaX; frame.size.height += deltaY; @@ -1040,6 +1172,7 @@ frame.size.height = minSize.height; } /* compare frame to max size of screen */ + if( frame.size.width > maxSize.width ) { frame.size.width = maxSize.width; @@ -1051,6 +1184,7 @@ } + // But now the sheet is off-center, so also shift the origin to center it and @@ -1102,13 +1236,16 @@ // - (void)setViewSize: (NSSize)viewSize { + /* special case for scaleToScreen */ NSSize screenSize = [[[self window] screen] visibleFrame].size; NSSize areaSize = [fPictureViewArea frame].size; - if (scaleToScreen == YES || viewSize.width > areaSize.width || viewSize.height > areaSize.height) + NSSize pictureSize = [fPictureView frame].size; + CGFloat viewSizeAspect = viewSize.width / viewSize.height; + + if (viewSize.width > areaSize.width || viewSize.height > areaSize.height) { - /* for scaleToScreen, we expand the fPictureView to fit the entire screen */ - CGFloat viewSizeAspect = viewSize.width / viewSize.height; + if (viewSizeAspect > 1.0) // we are wider than taller, so expand the width to fill the area and scale the height { viewSize.width = areaSize.width; @@ -1122,9 +1259,10 @@ } - [fPictureView setFrameSize:viewSize]; - + NSSize newAreaSize = [fPictureViewArea frame].size; + + // center it vertically and horizontally NSPoint origin = [fPictureViewArea frame].origin; origin.y += ([fPictureViewArea frame].size.height - @@ -1138,11 +1276,6 @@ [fPictureView setFrameOrigin:origin]; - /* set the top of the hud controller boxes centered vertically with the origin of our window */ - NSPoint hudControlBoxOrigin = [fPictureControlBox frame].origin; - hudControlBoxOrigin.y = ([[self window] frame].size.height / 2) - [fPictureControlBox frame].size.height; - [fPictureControlBox setFrameOrigin:hudControlBoxOrigin]; - [fEncodingControlBox setFrameOrigin:hudControlBoxOrigin]; }