Mercurial > mplayer.hg
changeset 27986:9e17ab676ab9
Replace QuickDraw calls in vo_quartz.c to fix warnings when compiling with current SDK versions.
Patch by Gregor Riepl %onitake A gmail P com%
Original thread:
Date: Wed, Oct 29, 2008 at 7:26 PM
Subject: Re: [MPlayer-dev-eng] [PATCH] Replaced deprecated QuickDraw calls in vo_quartz
author | gpoirier |
---|---|
date | Mon, 24 Nov 2008 10:01:03 +0000 |
parents | 1c77b86d355d |
children | 292b260ac2df |
files | libvo/vo_quartz.c |
diffstat | 1 files changed, 96 insertions(+), 69 deletions(-) [+] |
line wrap: on
line diff
--- a/libvo/vo_quartz.c Mon Nov 24 09:46:23 2008 +0000 +++ b/libvo/vo_quartz.c Mon Nov 24 10:01:03 2008 +0000 @@ -86,33 +86,34 @@ static float winAlpha = 1; static int mouseHide = FALSE; -static int device_width; -static int device_height; -static int device_id; +static int device_id = 0; static short fs_res_x=0; static short fs_res_y=0; static WindowRef theWindow = NULL; static WindowGroupRef winGroup = NULL; -static CGContextRef context; static CGRect bounds; -static GDHandle deviceHdl; +static CGDirectDisplayID displayId = 0; +static CFDictionaryRef originalMode = NULL; -static CGDataProviderRef dataProviderRef; -static CGImageRef image; +static CGDataProviderRef dataProviderRef = NULL; +static CGImageRef image = NULL; static Rect imgRect; // size of the original image (unscaled) static Rect dstRect; // size of the displayed image (after scaling) static Rect winRect; // size of the window containg the displayed image (include padding) static Rect oldWinRect; // size of the window containg the displayed image (include padding) when NOT in FS mode -static Rect deviceRect; // size of the display device +static CGRect displayRect; // size of the display device static Rect oldWinBounds; static MenuRef windMenu; static MenuRef movMenu; static MenuRef aspectMenu; +static int lastScreensaverUpdate = 0; +static int lastMouseHide = 0; + enum { kQuitCmd = 1, @@ -282,7 +283,7 @@ { if(vo_quartz_fs) { - CGDisplayShowCursor(kCGDirectMainDisplay); + CGDisplayShowCursor(displayId); mouseHide = FALSE; } } @@ -342,7 +343,8 @@ { if(!vo_quartz_fs) { - GrowWindow(theWindow, mousePos, NULL); + Rect newSize; + ResizeWindow(theWindow, mousePos, NULL, &newSize); } } else if(part == inMenuBar) @@ -486,13 +488,13 @@ else if(class == kEventClassWindow) { WindowRef window; - Rect rectPort = {0,0,0,0}; + Rect rectWindow = {0,0,0,0}; GetEventParameter(event, kEventParamDirectObject, typeWindowRef, NULL, sizeof(WindowRef), NULL, &window); if(window) { - GetPortBounds(GetWindowPort(window), &rectPort); + GetWindowBounds(window, kWindowGlobalPortRgn, &rectWindow); } switch (kind) @@ -622,32 +624,29 @@ { WindowAttributes windowAttrs; OSErr qterr; - int i; CGRect tmpBounds; + CGDisplayCount displayCount; + CGDirectDisplayID *displays; //Get Main device info/////////////////////////////////////////////////// - - deviceHdl = GetMainDevice(); - - for(i=0; i<device_id; i++) - { - deviceHdl = GetNextDevice(deviceHdl); - - if(deviceHdl == NULL) - { + //Display IDs might not be consecutive, get the list of all devices up to # device_id + displayCount = device_id + 1; + displays = malloc(sizeof(CGDirectDisplayID) * displayCount); + if (kCGErrorSuccess != CGGetActiveDisplayList(displayCount, displays, &displayCount) || displayCount < device_id + 1) { mp_msg(MSGT_VO, MSGL_FATAL, "Quartz error: Device ID %d do not exist, falling back to main device.\n", device_id); - deviceHdl = GetMainDevice(); + displayId = kCGDirectMainDisplay; device_id = 0; - break; } + else + { + displayId = displays[device_id]; } + free(displays); - deviceRect = (*deviceHdl)->gdRect; - device_width = deviceRect.right-deviceRect.left; - device_height = deviceRect.bottom-deviceRect.top; + displayRect = CGDisplayBounds(displayId); - monitor_aspect = (float)device_width/(float)device_height; + monitor_aspect = (float)displayRect.size.width/(float)displayRect.size.height; //misc mplayer setup///////////////////////////////////////////////////// SetRect(&imgRect, 0, 0, width, height); @@ -672,7 +671,7 @@ panscan_init(); aspect_save_orig(width,height); aspect_save_prescale(d_width,d_height); - aspect_save_screenres(device_width, device_height); + aspect_save_screenres(displayRect.size.width, displayRect.size.height); aspect(&d_width,&d_height,A_NOZOOM); @@ -693,6 +692,8 @@ if (theWindow == NULL) { + CGContextRef context; + quartz_CreateWindow(d_width, d_height, windowAttrs); if (theWindow == NULL) @@ -701,8 +702,9 @@ return -1; } tmpBounds = CGRectMake( 0, 0, winRect.right, winRect.bottom); - CreateCGContextForPort(GetWindowPort(theWindow),&context); + QDBeginCGContext(GetWindowPort(theWindow),&context); CGContextFillRect(context, tmpBounds); + QDEndCGContext(GetWindowPort(theWindow),&context); } else { @@ -717,7 +719,9 @@ { case IMGFMT_RGB32: { - CreateCGContextForPort (GetWindowPort (theWindow), &context); + CGContextRef context; + + QDBeginCGContext(GetWindowPort(theWindow),&context); dataProviderRef = CGDataProviderCreateWithData (0, image_data, imgRect.right * imgRect.bottom * 4, 0); @@ -729,6 +733,8 @@ CGColorSpaceCreateDeviceRGB(), kCGImageAlphaNoneSkipFirst, dataProviderRef, 0, 1, kCGRenderingIntentDefault); + + QDEndCGContext(GetWindowPort(theWindow),&context); break; } @@ -921,7 +927,6 @@ static void flip_page(void) { int curTime; - static int lastTime = 0; if(theWindow == NULL) return; @@ -930,7 +935,10 @@ { case IMGFMT_RGB32: { + CGContextRef context; + QDBeginCGContext(GetWindowPort(theWindow),&context); CGContextDrawImage (context, bounds, image); + QDEndCGContext(GetWindowPort(theWindow),&context); } break; @@ -960,6 +968,9 @@ if(!vo_quartz_fs) { + CGContextRef context; + + QDBeginCGContext(GetWindowPort(theWindow),&context); //render resize box CGContextBeginPath(context); CGContextSetAllowsAntialiasing(context, false); @@ -988,30 +999,28 @@ //CGContextRestoreGState( context ); CGContextFlush (context); + QDEndCGContext(GetWindowPort(theWindow),&context); } - //auto hide mouse cursor and futur on-screen control? + curTime = TickCount()/60; + + //auto hide mouse cursor (and future on-screen control?) if(vo_quartz_fs && !mouseHide) { - int curTime = TickCount()/60; - static int lastTime = 0; - - if( ((curTime - lastTime) >= 5) || (lastTime == 0) ) + if( ((curTime - lastMouseHide) >= 5) || (lastMouseHide == 0) ) { - CGDisplayHideCursor(kCGDirectMainDisplay); + CGDisplayHideCursor(displayId); mouseHide = TRUE; - lastTime = curTime; + lastMouseHide = curTime; } } //update activity every 30 seconds to prevent //screensaver from starting up. - curTime = TickCount()/60; - - if( ((curTime - lastTime) >= 30) || (lastTime == 0) ) + if( ((curTime - lastScreensaverUpdate) >= 30) || (lastScreensaverUpdate == 0) ) { UpdateSystemActivity(UsrActivity); - lastTime = curTime; + lastScreensaverUpdate = curTime; } } @@ -1143,9 +1152,9 @@ #if !defined (CONFIG_MACOSX_FINDER) || !defined (CONFIG_SDL) //this chunk of code is heavily based off SDL_macosx.m from SDL - //it uses an Apple private function to request foreground operation + //the CPSEnableForegroundOperation that was here before is private and shouldn't be used + //replaced by a call to the 10.3+ TransformProcessType { - void CPSEnableForegroundOperation(ProcessSerialNumber* psn); ProcessSerialNumber myProc, frProc; Boolean sameProc; @@ -1155,7 +1164,7 @@ { if (SameProcess(&frProc, &myProc, &sameProc) == noErr && !sameProc) { - CPSEnableForegroundOperation(&myProc); + TransformProcessType(&myProc, kProcessTransformToForegroundApplication); } SetFrontProcess(&myProc); } @@ -1286,7 +1295,9 @@ CGRect tmpBounds; - GetPortBounds( GetWindowPort(theWindow), &winRect ); + CGContextRef context; + + GetWindowPortBounds(theWindow, &winRect ); if(vo_keepaspect) { @@ -1317,7 +1328,6 @@ case IMGFMT_RGB32: { bounds = CGRectMake(dstRect.left, dstRect.top, dstRect.right-dstRect.left, dstRect.bottom-dstRect.top); - CreateCGContextForPort (GetWindowPort (theWindow), &context); break; } case IMGFMT_YV12: @@ -1349,8 +1359,9 @@ //Clear Background tmpBounds = CGRectMake( 0, 0, winRect.right, winRect.bottom); - CreateCGContextForPort(GetWindowPort(theWindow),&context); + QDBeginCGContext(GetWindowPort(theWindow),&context); CGContextFillRect(context, tmpBounds); + QDEndCGContext(GetWindowPort(theWindow),&context); } void window_ontop() @@ -1367,29 +1378,46 @@ void window_fullscreen() { - static Ptr restoreState = NULL; - //go fullscreen if(vo_fs) { if(winLevel != 0) { - if(device_id == 0) + if(displayId == kCGDirectMainDisplay) { SetSystemUIMode( kUIModeAllHidden, kUIOptionAutoShowMenuBar); - CGDisplayHideCursor(kCGDirectMainDisplay); + CGDisplayHideCursor(displayId); mouseHide = TRUE; } if(fs_res_x != 0 || fs_res_y != 0) { - BeginFullScreen( &restoreState, deviceHdl, &fs_res_x, &fs_res_y, NULL, NULL, 0); + CFDictionaryRef mode; + size_t desiredBitDepth = 32; + boolean_t exactMatch; + originalMode = CGDisplayCurrentMode(displayId); + + mode = CGDisplayBestModeForParameters(displayId, desiredBitDepth, fs_res_x, fs_res_y, &exactMatch); + + if (mode != NULL) + { + if (!exactMatch) + { + //Warn if the mode doesn't match exactly + mp_msg(MSGT_VO, MSGL_WARN, "Quartz warning: did not get exact mode match (got %dx%d) \n", (int) CFDictionaryGetValue(mode, kCGDisplayWidth), (int) CFDictionaryGetValue(mode, kCGDisplayHeight)); + } + + CGDisplayCapture(displayId); + CGDisplaySwitchToMode(displayId, mode); + } + else + { + mp_msg(MSGT_VO, MSGL_ERR, "Quartz error: can't switch to fullscreen \n"); + } + //Get Main device info/////////////////////////////////////////////////// - deviceRect = (*deviceHdl)->gdRect; - - device_width = deviceRect.right; - device_height = deviceRect.bottom; + displayRect = CGDisplayBounds(displayId); } } @@ -1403,29 +1431,28 @@ //go fullscreen panscan_calc(); ChangeWindowAttributes(theWindow, kWindowNoShadowAttribute, 0); - MoveWindow(theWindow, deviceRect.left-(vo_panscan_x >> 1), deviceRect.top-(vo_panscan_y >> 1), 1); - SizeWindow(theWindow, device_width+vo_panscan_x, device_height+vo_panscan_y,1); + MoveWindow(theWindow, displayRect.origin.x-(vo_panscan_x >> 1), displayRect.origin.y-(vo_panscan_y >> 1), 1); + SizeWindow(theWindow, displayRect.size.width+vo_panscan_x, displayRect.size.height+vo_panscan_y,1); vo_quartz_fs = 1; } else //go back to windowed mode { vo_quartz_fs = 0; - if(restoreState != NULL) + if(originalMode != NULL) { - EndFullScreen(restoreState, 0); + CGDisplaySwitchToMode(displayId, originalMode); + CGDisplayRelease(displayId); //Get Main device info/////////////////////////////////////////////////// - deviceRect = (*deviceHdl)->gdRect; + displayRect = CGDisplayBounds(displayId); - device_width = deviceRect.right; - device_height = deviceRect.bottom; - restoreState = NULL; + originalMode = NULL; } SetSystemUIMode( kUIModeNormal, 0); //show mouse cursor - CGDisplayShowCursor(kCGDirectMainDisplay); + CGDisplayShowCursor(displayId); mouseHide = FALSE; //revert window to previous setting @@ -1447,7 +1474,7 @@ if(vo_quartz_fs) { - MoveWindow(theWindow, deviceRect.left-(vo_panscan_x >> 1), deviceRect.top-(vo_panscan_y >> 1), 1); - SizeWindow(theWindow, device_width+vo_panscan_x, device_height+vo_panscan_y,1); + MoveWindow(theWindow, displayRect.origin.x-(vo_panscan_x >> 1), displayRect.origin.y-(vo_panscan_y >> 1), 1); + SizeWindow(theWindow, displayRect.size.width+vo_panscan_x, displayRect.size.height+vo_panscan_y,1); } }