diff options
author | Stefano Pigozzi <stefano.pigozzi@gmail.com> | 2012-08-07 10:31:39 +0200 |
---|---|---|
committer | Stefano Pigozzi <stefano.pigozzi@gmail.com> | 2012-08-16 22:41:09 +0200 |
commit | e70b5ee2fde62da0e3cf969486e33c7ea37ae2b5 (patch) | |
tree | 9058b647f4cfb0dd95dd6c668848db91e3f3b4c4 | |
parent | c15270d3b971fd90058bc1de43b8f170f7a15aef (diff) | |
download | mpv-e70b5ee2fde62da0e3cf969486e33c7ea37ae2b5.tar.bz2 mpv-e70b5ee2fde62da0e3cf969486e33c7ea37ae2b5.tar.xz |
cocoa_common: add HiDPI/retina support
With a HiDPI screen, for performance and backwards compatibility
reasons, AppKit requests an OpenGL surface with a pixel number that
equals the user points number. After the image is rendered to this
smaller surface, it is upscaled so that its dimensions are comparable
across screens of different DPIs. The applied scaling is not that good
and makes the video/subtitles blurry; this is not acceptable for a
video player.
Request AppKit to use a high resolution OpenGL surface to back the
mplayer2 OpenGL view. Also set the window pixel size information
correctly in the VO object by converting user points to actual pixels.
All the system version checks are done at runtime so that the feature
is available on OSX 10.7 even with a binary compiled with older SDKs.
Also replace is_lion_or_better() with is_osx_version_at_least(10, 7, 0)
which is defined in osx_common.
-rw-r--r-- | libvo/cocoa_common.m | 49 | ||||
-rw-r--r-- | libvo/osx_common.c | 30 | ||||
-rw-r--r-- | libvo/osx_common.h | 1 |
3 files changed, 63 insertions, 17 deletions
diff --git a/libvo/cocoa_common.m b/libvo/cocoa_common.m index ac66f330dc..84db6995ed 100644 --- a/libvo/cocoa_common.m +++ b/libvo/cocoa_common.m @@ -20,7 +20,7 @@ #import <Cocoa/Cocoa.h> #import <OpenGL/OpenGL.h> #import <QuartzCore/QuartzCore.h> -#import <CoreServices/CoreServices.h> // for CGDisplayHideCursor and Gestalt +#import <CoreServices/CoreServices.h> // for CGDisplayHideCursor #include <dlfcn.h> #include "cocoa_common.h" @@ -54,6 +54,14 @@ #define NSLeftAlternateKeyMask (0x000020 | NSAlternateKeyMask) #define NSRightAlternateKeyMask (0x000040 | NSAlternateKeyMask) +// add methods not available on OSX versions prior to 10.7 +#ifndef MAC_OS_X_VERSION_10_7 +@interface NSView (IntroducedInLion) +- (NSRect)convertRectToBacking:(NSRect)aRect; +- (void)setWantsBestResolutionOpenGLSurface:(BOOL)aBool; +@end +#endif + @interface GLMPlayerWindow : NSWindow <NSWindowDelegate> - (BOOL) canBecomeKeyWindow; - (BOOL) canBecomeMainWindow; @@ -111,8 +119,6 @@ void resize_window(struct vo *vo); void vo_cocoa_display_cursor(int requested_state); void create_menu(void); -bool is_lion_or_better(void); - struct vo_cocoa_state *vo_cocoa_init_state(void) { struct vo_cocoa_state *s = talloc_ptrtype(NULL, s); @@ -130,6 +136,13 @@ struct vo_cocoa_state *vo_cocoa_init_state(void) return s; } +static bool supports_hidpi(NSView *view) +{ + SEL hdpi_selector = @selector(setWantsBestResolutionOpenGLSurface:); + return is_osx_version_at_least(10, 7, 0) && view && + [view respondsToSelector:hdpi_selector]; +} + bool vo_cocoa_gui_running(void) { return !!s; @@ -207,8 +220,17 @@ int vo_cocoa_change_attributes(struct vo *vo) void resize_window(struct vo *vo) { - vo->dwidth = [[s->window contentView] frame].size.width; - vo->dheight = [[s->window contentView] frame].size.height; + NSView *view = [s->window contentView]; + NSRect frame; + + if (supports_hidpi(view)) { + frame = [view convertRectToBacking: [view frame]]; + } else { + frame = [view frame]; + } + + vo->dwidth = frame.size.width; + vo->dheight = frame.size.height; [s->glContext update]; } @@ -247,9 +269,13 @@ int vo_cocoa_create_window(struct vo *vo, uint32_t d_width, GLMPlayerOpenGLView *glView = [[GLMPlayerOpenGLView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)]; + // check for HiDPI support and enable it (available on 10.7 +) + if (supports_hidpi(glView)) + [glView setWantsBestResolutionOpenGLSurface:YES]; + int i = 0; NSOpenGLPixelFormatAttribute attr[32]; - if (is_lion_or_better()) { + if (is_osx_version_at_least(10, 7, 0)) { attr[i++] = NSOpenGLPFAOpenGLProfile; attr[i++] = (gl3profile ? NSOpenGLProfileVersion3_2Core : NSOpenGLProfileVersionLegacy); } else if(gl3profile) { @@ -472,17 +498,6 @@ void create_menu() [pool release]; } -bool is_lion_or_better(void) -{ - SInt32 major, minor; - Gestalt(gestaltSystemVersionMajor, &major); - Gestalt(gestaltSystemVersionMinor, &minor); - if(major >= 10 && minor >= 7) - return YES; - else - return NO; -} - @implementation GLMPlayerWindow - (void) windowDidResize:(NSNotification *) notification diff --git a/libvo/osx_common.c b/libvo/osx_common.c index 428a492b7f..2aa0a28126 100644 --- a/libvo/osx_common.c +++ b/libvo/osx_common.c @@ -19,11 +19,13 @@ // only to get keycode definitions from HIToolbox/Events.h #include <Carbon/Carbon.h> +#include <CoreServices/CoreServices.h> #include "config.h" #include "osx_common.h" #include "video_out.h" #include "input/keycodes.h" #include "input/input.h" +#include "mp_msg.h" /* * Define keycodes only found in OSX >= 10.5 for older versions @@ -113,3 +115,31 @@ int convert_key(unsigned key, unsigned charcode) return mpkey; return charcode; } + +/** + * Checks at runtime that OSX version is the same or newer than the one + * provided as input. + */ +int is_osx_version_at_least(int majorv, int minorv, int bugfixv) +{ + OSErr err; + SInt32 major, minor, bugfix; + if ((err = Gestalt(gestaltSystemVersionMajor, &major)) != noErr) + goto fail; + if ((err = Gestalt(gestaltSystemVersionMinor, &minor)) != noErr) + goto fail; + if ((err = Gestalt(gestaltSystemVersionBugFix, &bugfix)) != noErr) + goto fail; + + if(major > majorv || + (major == majorv && (minor > minorv || + (minor == minorv && bugfix >= bugfixv)))) + return 1; + else + return 0; +fail: + // There's no reason the Gestalt system call should fail on OSX. + mp_msg(MSGT_VO, MSGL_FATAL, "[osx] Failed to get system version number. " + "Please contact the developers. Error code: %ld\n", (long)err); + return 0; +} diff --git a/libvo/osx_common.h b/libvo/osx_common.h index c5e127345f..ae31a6353d 100644 --- a/libvo/osx_common.h +++ b/libvo/osx_common.h @@ -22,5 +22,6 @@ struct vo; int convert_key(unsigned key, unsigned charcode); +int is_osx_version_at_least(int majorv, int minorv, int bugfixv); #endif /* MPLAYER_OSX_COMMON_H */ |