diff options
author | Andre Pang <athp@users.sourceforge.net> | 2004-07-05 01:20:01 +0000 |
---|---|---|
committer | Andre Pang <athp@users.sourceforge.net> | 2004-07-05 01:20:01 +0000 |
commit | 0a560b285ff7d692d6c01f9ef4d89bb16665ccfd (patch) | |
tree | f11c4afd4dc9567412bb3c9e0eff667e89329c31 /src/video_out/macosx | |
parent | 60dbade90322843bc74f85596f6071cc5c2f6646 (diff) | |
download | xine-lib-0a560b285ff7d692d6c01f9ef4d89bb16665ccfd.tar.gz xine-lib-0a560b285ff7d692d6c01f9ef4d89bb16665ccfd.tar.bz2 |
Mac OS X:
Added keepsVideoAspectRatio and resizeViewToVideoSizeOnLoad attributes to
XineOpenGLView class
More accurate OpenGL mutex locking (we need to serialise any accesses to the
OpenGL context): this fixed a few more kernel panics for me
Changed any human-readable strings of "MacOSX" to "Mac OS X" (so maybe Apple
can award xine a Design Award next year with less qualms ;)
CVS patchset: 6770
CVS date: 2004/07/05 01:20:01
Diffstat (limited to 'src/video_out/macosx')
-rw-r--r-- | src/video_out/macosx/video_window.h | 6 | ||||
-rw-r--r-- | src/video_out/macosx/video_window.m | 60 |
2 files changed, 55 insertions, 11 deletions
diff --git a/src/video_out/macosx/video_window.h b/src/video_out/macosx/video_window.h index f9217f56e..e0f199305 100644 --- a/src/video_out/macosx/video_window.h +++ b/src/video_out/macosx/video_window.h @@ -40,6 +40,8 @@ typedef enum { NSOpenGLContext *fullScreenContext; NSOpenGLContext *currentContext; NSLock *mutex; + BOOL keepsVideoAspectRatio; + BOOL resizeViewToVideoSizeOnLoad; } - (void) displayTexture; @@ -58,6 +60,10 @@ typedef enum { - (void) setHalfSize; - (void) setDoubleSize; - (NSSize) videoSize; +- (void) setKeepsVideoAspectRatio:(BOOL)flag; +- (BOOL) keepsVideoAspectRatio; +- (void) setResizeViewToVideoSizeOnLoad:(BOOL)flag; +- (BOOL) resizeViewToVideoSizeOnLoad; /* Delegate methods */ - (id) delegate; diff --git a/src/video_out/macosx/video_window.m b/src/video_out/macosx/video_window.m index d3b3aec83..20d311337 100644 --- a/src/video_out/macosx/video_window.m +++ b/src/video_out/macosx/video_window.m @@ -78,6 +78,7 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; screen: aScreen]; xineView = [[XineOpenGLView alloc] initWithFrame:rect]; + [xineView setResizeViewToVideoSizeOnLoad:YES]; /* receive notifications about window resizing from the xine view */ [xineView setDelegate:self]; @@ -146,6 +147,26 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; @implementation XineOpenGLView +- (void) setKeepsVideoAspectRatio:(BOOL)flag +{ + keepsVideoAspectRatio = flag; +} + +- (BOOL) keepsVideoAspectRatio +{ + return keepsVideoAspectRatio; +} + +- (void) setResizeViewToVideoSizeOnLoad:(BOOL)flag +{ + resizeViewToVideoSizeOnLoad = flag; +} + +- (BOOL) resizeViewToVideoSizeOnLoad +{ + return resizeViewToVideoSizeOnLoad; +} + - (BOOL)mouseDownCanMoveWindow { return YES; } @@ -187,11 +208,10 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; currentContext = [self openGLContext]; [currentContext makeCurrentContext]; + [mutex lock]; [currentContext update]; + [mutex unlock]; - /* Black background */ - glClearColor (0.0, 0.0, 0.0, 0.0); - i_texture = 0; initDone = NO; isFullScreen = NO; @@ -202,6 +222,9 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; [self initTextures]; + /* Black background */ + glClearColor (0.0, 0.0, 0.0, 0.0); + return self; } @@ -210,11 +233,20 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; [super initWithCoder:coder]; self = [self initWithFrame:[self frame]]; + + keepsVideoAspectRatio = [coder decodeBoolForKey:@"keepsVideoAspectRatio"]; + resizeViewToVideoSizeOnLoad = [coder decodeBoolForKey: + @"resizeViewToVideoSizeOnLoad"]; + return self; } - (void) encodeWithCoder:(NSCoder *)coder { + [coder encodeBool:keepsVideoAspectRatio forKey:@"keepsVideoAspectRatio"]; + [coder encodeBool:resizeViewToVideoSizeOnLoad + forKey:@"resizeViewToVideoSizeOnLoad"]; + [super encodeWithCoder:coder]; } @@ -224,16 +256,20 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; if (fullScreenContext) { [NSOpenGLContext clearCurrentContext]; + [mutex lock]; [fullScreenContext clearDrawable]; [fullScreenContext release]; + [mutex unlock]; if (currentContext == fullScreenContext) currentContext = nil; fullScreenContext = nil; } if (currentContext) { [NSOpenGLContext clearCurrentContext]; + [mutex lock]; [currentContext clearDrawable]; [currentContext release]; + [mutex unlock]; currentContext = nil; } @@ -358,13 +394,12 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; } - (void) reloadTexture { - [mutex lock]; - if (!initDone) { - [mutex unlock]; return; } + [mutex lock]; + [currentContext makeCurrentContext]; glBindTexture (GL_TEXTURE_RECTANGLE_EXT, i_texture); @@ -420,7 +455,9 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; printf ("MacOSX fullscreen mode: %dx%d => %dx%d @ %d,%d\n", video_width, video_height, w, h, x, y); + [mutex lock]; glViewport (x, y, w, h); + [mutex unlock]; } - (void) goFullScreen: (XineVideoWindowFullScreenMode) mode { @@ -483,7 +520,9 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; /* Free current OpenGL context */ [NSOpenGLContext clearCurrentContext]; + [mutex lock]; [fullScreenContext clearDrawable]; + [mutex unlock]; [fullScreenContext release]; fullScreenContext = nil; CGReleaseAllDisplays(); @@ -520,11 +559,12 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; - (void) drawRect: (NSRect) rect { [currentContext makeCurrentContext]; - if (!initDone || ![mutex tryLock]) { - [currentContext flushBuffer]; + if (!initDone) { return; } + [mutex lock]; + /* Swap buffers only during the vertical retrace of the monitor. http://developer.apple.com/documentation/GraphicsImaging/Conceptual/OpenGL/chap5/chapter_5_section_44.html */ @@ -565,11 +605,9 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; NSValue *sizeWrapper = [NSValue valueWithBytes:&size objCType:@encode(NSSize)]; - [mutex lock]; [self performSelectorOnMainThread:@selector(setViewSize:) withObject:sizeWrapper waitUntilDone:NO]; - [mutex unlock]; [pool release]; } @@ -609,7 +647,7 @@ NSString *XineViewDidResizeNotification = @"XineViewDidResizeNotification"; if (isFullScreen) [self calcFullScreenAspect]; - [self initTextures]; + [self initTextures]; } - (BOOL) isFullScreen { |