[vlc-devel] commit: macosx: Fix aspect ratio. (Pierre d'Herbemont )

git version control git at videolan.org
Sun Jul 13 18:32:12 CEST 2008


vlc | branch: master | Pierre d'Herbemont <pdherbemont at videolan.org> | Sun Jul 13 18:34:30 2008 +0200| [c1a89c642e30963c3c2d8f58b6f93bcc8bd94fc8]

macosx: Fix aspect ratio.

This might requires some other adjustements.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=c1a89c642e30963c3c2d8f58b6f93bcc8bd94fc8
---

 modules/gui/macosx/embeddedwindow.h |    4 +++
 modules/gui/macosx/embeddedwindow.m |   22 +++++++++++++++
 modules/gui/macosx/vout.m           |   51 ++++++++++++++++++++---------------
 3 files changed, 55 insertions(+), 22 deletions(-)

diff --git a/modules/gui/macosx/embeddedwindow.h b/modules/gui/macosx/embeddedwindow.h
index e8e408d..c31aa48 100644
--- a/modules/gui/macosx/embeddedwindow.h
+++ b/modules/gui/macosx/embeddedwindow.h
@@ -51,6 +51,8 @@
     NSRecursiveLock * o_animation_lock;
 
     BOOL              b_window_is_invisible;
+
+    NSSize videoRatio;
 }
 
 - (void)controlTintChanged;
@@ -59,6 +61,8 @@
 - (void)playStatusUpdated: (int)i_status;
 - (void)setSeekable: (BOOL)b_seekable;
 
+- (void)setVideoRatio:(NSSize)ratio;
+
 - (NSView *)mainView;
 
 - (BOOL)isFullscreen;
diff --git a/modules/gui/macosx/embeddedwindow.m b/modules/gui/macosx/embeddedwindow.m
index 774e18d..3277971 100644
--- a/modules/gui/macosx/embeddedwindow.m
+++ b/modules/gui/macosx/embeddedwindow.m
@@ -70,9 +70,12 @@
     [o_btn_fullscreen setState: NO];
     b_fullscreen = NO;
 
+    [self setDelegate:self];
+
     /* Make sure setVisible: returns NO */
     [self orderOut:self];
     b_window_is_invisible = YES;
+    videoRatio = NSMakeSize( 0., 0. );
 }
 
 - (void)controlTintChanged
@@ -167,6 +170,25 @@
         return o_view;
 }
 
+- (void)setVideoRatio:(NSSize)ratio
+{
+    videoRatio = ratio;
+}
+
+- (NSSize)windowWillResize:(NSWindow *)window toSize:(NSSize)proposedFrameSize
+{
+    if( videoRatio.height == 0. || videoRatio.width == 0. )
+        return proposedFrameSize;
+
+    NSRect viewRect = [o_view convertRect:[o_view bounds] toView: nil];
+    NSRect contentRect = [self contentRectForFrameRect:[self frame]];
+    float marginy = viewRect.origin.y + [self frame].size.height - contentRect.size.height;
+    float marginx = contentRect.size.width - viewRect.size.width;
+    proposedFrameSize.height = (proposedFrameSize.width - marginx) * videoRatio.height / videoRatio.width + marginy;
+
+    return proposedFrameSize;
+}
+
 /*****************************************************************************
  * Fullscreen support
  */
diff --git a/modules/gui/macosx/vout.m b/modules/gui/macosx/vout.m
index dd0d9ea..868eb2d 100644
--- a/modules/gui/macosx/vout.m
+++ b/modules/gui/macosx/vout.m
@@ -343,36 +343,44 @@ int DeviceCallback( vlc_object_t *p_this, const char *psz_variable,
     }
 }
 
-- (void)scaleWindowWithFactor: (float)factor animate: (BOOL)animate
+- (NSSize)voutSizeForFactor: (float)factor
 {
-    NSSize newsize;
     int i_corrected_height, i_corrected_width;
-    NSPoint topleftbase;
-    NSPoint topleftscreen;
+    NSSize newsize;
+
+    if( p_vout->render.i_height * p_vout->render.i_aspect >
+                    p_vout->render.i_width * VOUT_ASPECT_FACTOR )
+    {
+        i_corrected_width = p_vout->render.i_height * p_vout->render.i_aspect /
+                                        VOUT_ASPECT_FACTOR;
+        newsize.width = (int) ( i_corrected_width * factor );
+        newsize.height = (int) ( p_vout->render.i_height * factor );
+    }
+    else
+    {
+        i_corrected_height = p_vout->render.i_width * VOUT_ASPECT_FACTOR /
+                                        p_vout->render.i_aspect;
+        newsize.width = (int) ( p_vout->render.i_width * factor );
+        newsize.height = (int) ( i_corrected_height * factor );
+    }
 
+    return newsize;
+}
+
+- (void)scaleWindowWithFactor: (float)factor animate: (BOOL)animate
+{
     if ( !p_vout->b_fullscreen )
     {
+        NSSize newsize;
+        NSPoint topleftbase;
+        NSPoint topleftscreen;
         NSView *mainView;
         NSRect new_frame;
         topleftbase.x = 0;
         topleftbase.y = [o_window frame].size.height;
         topleftscreen = [o_window convertBaseToScreen: topleftbase];
 
-        if( p_vout->render.i_height * p_vout->render.i_aspect >
-                        p_vout->render.i_width * VOUT_ASPECT_FACTOR )
-        {
-            i_corrected_width = p_vout->render.i_height * p_vout->render.i_aspect /
-                                            VOUT_ASPECT_FACTOR;
-            newsize.width = (int) ( i_corrected_width * factor );
-            newsize.height = (int) ( p_vout->render.i_height * factor );
-        }
-        else
-        {
-            i_corrected_height = p_vout->render.i_width * VOUT_ASPECT_FACTOR /
-                                            p_vout->render.i_aspect;
-            newsize.width = (int) ( p_vout->render.i_width * factor );
-            newsize.height = (int) ( i_corrected_height * factor );
-        }
+        newsize = [self voutSizeForFactor:factor];
 
         /* In fullscreen mode we need to use a view that is different from
          * ourselves, with the VLCEmbeddedWindow */
@@ -390,8 +398,7 @@ int DeviceCallback( vlc_object_t *p_this, const char *psz_variable,
         new_frame.origin.x = topleftscreen.x;
         new_frame.origin.y = topleftscreen.y - new_frame.size.height;
 
-        [o_window setFrame: new_frame display: animate animate: animate];
-
+        [o_window setFrame:new_frame display:animate animate:animate];
         p_vout->i_changes |= VOUT_SIZE_CHANGE;
     }
 }
@@ -958,7 +965,7 @@ int DeviceCallback( vlc_object_t *p_this, const char *psz_variable,
 
         [self scaleWindowWithFactor: 1.0 animate: [o_window isVisible] && (![o_window isFullscreen])];
 
-        [o_window setAspectRatio:NSMakeSize([o_window frame].size.width, [o_window frame].size.height)];
+        [o_embeddedwindow setVideoRatio:[self voutSizeForFactor:1.0]];
 
         /* Make sure our window is visible, if we are not in fullscreen */
         if (![o_window isFullscreen])




More information about the vlc-devel mailing list