vo_macosx.m
来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· M 代码 · 共 1,027 行 · 第 1/2 页
M
1,027 行
winSizeMult = 2; frame.size.width = d_width*winSizeMult; frame.size.height = (d_width/movie_aspect)*winSizeMult; [window setContentSize: frame.size]; [self reshape]; } if(sender == kFullScreenCmd) { vo_fs = (!(vo_fs)); [self fullscreen:NO]; } if(sender == kKeepAspectCmd) { vo_keepaspect = (!(vo_keepaspect)); if(vo_keepaspect) [kKeepAspectCmd setState:NSOnState]; else [kKeepAspectCmd setState:NSOffState]; [self reshape]; } if(sender == kPanScanCmd) { vo_panscan = (!(vo_panscan)); if(vo_panscan) [kPanScanCmd setState:NSOnState]; else [kPanScanCmd setState:NSOffState]; [self panscan]; } if(sender == kAspectOrgCmd) { movie_aspect = old_movie_aspect; if(isFullscreen) { [self reshape]; } else { frame.size.width = d_width*winSizeMult; frame.size.height = (d_width/movie_aspect)*winSizeMult; [window setContentSize: frame.size]; [self reshape]; } } if(sender == kAspectFullCmd) { movie_aspect = 4.0f/3.0f; if(isFullscreen) { [self reshape]; } else { frame.size.width = d_width*winSizeMult; frame.size.height = (d_width/movie_aspect)*winSizeMult; [window setContentSize: frame.size]; [self reshape]; } } if(sender == kAspectWideCmd) { movie_aspect = 16.0f/9.0f; if(isFullscreen) { [self reshape]; } else { frame.size.width = d_width*winSizeMult; frame.size.height = (d_width/movie_aspect)*winSizeMult; [window setContentSize: frame.size]; [self reshape]; } }}/* Setup OpenGL*/- (void)prepareOpenGL{ glEnable(GL_BLEND); glDisable(GL_DEPTH_TEST); glDepthMask(GL_FALSE); glDisable(GL_CULL_FACE); [self reshape];}/* reshape OpenGL viewport*/ - (void)reshape{ uint32_t d_width; uint32_t d_height; float aspectX; float aspectY; int padding = 0; NSRect frame = [self frame]; glViewport(0, 0, frame.size.width, frame.size.height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, frame.size.width, frame.size.height, 0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); //set texture frame if(vo_keepaspect) { aspect( (int *)&d_width, (int *)&d_height, A_NOZOOM); d_height = ((float)d_width/movie_aspect); aspectX = (float)((float)frame.size.width/(float)d_width); aspectY = (float)((float)(frame.size.height)/(float)d_height); if((d_height*aspectX)>(frame.size.height)) { padding = (frame.size.width - d_width*aspectY)/2; textureFrame = NSMakeRect(padding, 0, d_width*aspectY+padding, d_height*aspectY); } else { padding = ((frame.size.height) - d_height*aspectX)/2; textureFrame = NSMakeRect(0, padding, d_width*aspectX, d_height*aspectX+padding); } } else { textureFrame = frame; }}/* Render frame*/ - (void) render{ int curTime; static int lastTime; glClear(GL_COLOR_BUFFER_BIT); glEnable(CVOpenGLTextureGetTarget(texture)); glBindTexture(CVOpenGLTextureGetTarget(texture), CVOpenGLTextureGetName(texture)); glColor3f(1,1,1); glBegin(GL_QUADS); glTexCoord2f(upperLeft[0], upperLeft[1]); glVertex2i( textureFrame.origin.x-(vo_panscan_x >> 1), textureFrame.origin.y-(vo_panscan_y >> 1)); glTexCoord2f(lowerLeft[0], lowerLeft[1]); glVertex2i( textureFrame.origin.x-(vo_panscan_x >> 1), textureFrame.size.height+(vo_panscan_y >> 1)); glTexCoord2f(lowerRight[0], lowerRight[1]); glVertex2i( textureFrame.size.width+(vo_panscan_x >> 1), textureFrame.size.height+(vo_panscan_y >> 1)); glTexCoord2f(upperRight[0], upperRight[1]); glVertex2i( textureFrame.size.width+(vo_panscan_x >> 1), textureFrame.origin.y-(vo_panscan_y >> 1)); glEnd(); glDisable(CVOpenGLTextureGetTarget(texture)); //render resize box if(!isFullscreen) { NSRect frame = [self frame]; glBegin(GL_LINES); glColor4f(0.2, 0.2, 0.2, 0.5); glVertex2i(frame.size.width-1, frame.size.height-1); glVertex2i(frame.size.width-1, frame.size.height-1); glVertex2i(frame.size.width-1, frame.size.height-5); glVertex2i(frame.size.width-5, frame.size.height-1); glVertex2i(frame.size.width-1, frame.size.height-9); glVertex2i(frame.size.width-9, frame.size.height-1); glColor4f(0.4, 0.4, 0.4, 0.5); glVertex2i(frame.size.width-1, frame.size.height-2); glVertex2i(frame.size.width-2, frame.size.height-1); glVertex2i(frame.size.width-1, frame.size.height-6); glVertex2i(frame.size.width-6, frame.size.height-1); glVertex2i(frame.size.width-1, frame.size.height-10); glVertex2i(frame.size.width-10, frame.size.height-1); glColor4f(0.6, 0.6, 0.6, 0.5); glVertex2i(frame.size.width-1, frame.size.height-3); glVertex2i(frame.size.width-3, frame.size.height-1); glVertex2i(frame.size.width-1, frame.size.height-7); glVertex2i(frame.size.width-7, frame.size.height-1); glVertex2i(frame.size.width-1, frame.size.height-11); glVertex2i(frame.size.width-11, frame.size.height-1); glEnd(); } glFlush(); //auto hide mouse cursor and futur on-screen control? if(isFullscreen && !mouseHide && !isRootwin) { int curTime = TickCount()/60; static int lastTime = 0; if( ((curTime - lastTime) >= 5) || (lastTime == 0) ) { CGDisplayHideCursor(kCGDirectMainDisplay); mouseHide = YES; lastTime = curTime; } } //update activity every 30 seconds to prevent //screensaver from starting up. curTime = TickCount()/60; lastTime = 0; if( ((curTime - lastTime) >= 30) || (lastTime == 0) ) { UpdateSystemActivity(UsrActivity); lastTime = curTime; }}/* Create OpenGL texture from current frame & set texco */ - (void) setCurrentTexture{ CVReturn error = kCVReturnSuccess; error = CVOpenGLTextureCacheCreateTextureFromImage (NULL, textureCache, currentFrameBuffer, 0, &texture); if(error != kCVReturnSuccess) mp_msg(MSGT_VO, MSGL_ERR,"Failed to create OpenGL texture(%d)\n", error); CVOpenGLTextureGetCleanTexCoords(texture, lowerLeft, lowerRight, upperRight, upperLeft);}/* redraw win rect*/ - (void) drawRect: (NSRect *) bounds{ [self render];}/* Toggle Fullscreen*/- (void) fullscreen: (BOOL) animate{ static NSRect old_frame; static NSRect old_view_frame; if(screen_force) screen_frame = [screen_handle frame]; else screen_frame = [[window screen] frame]; panscan_calc(); //go fullscreen if(vo_fs) { if(!isRootwin) { SetSystemUIMode( kUIModeAllHidden, kUIOptionAutoShowMenuBar); CGDisplayHideCursor(kCGDirectMainDisplay); mouseHide = YES; } old_frame = [window frame]; //save main window size & position [window setFrame:screen_frame display:YES animate:animate]; //zoom-in window with nice useless sfx old_view_frame = [self bounds]; //fix origin for multi screen setup screen_frame.origin.x = 0; screen_frame.origin.y = 0; [self setFrame:screen_frame]; [self setNeedsDisplay:YES]; [window setHasShadow:NO]; isFullscreen = 1; } else { SetSystemUIMode( kUIModeNormal, 0); isFullscreen = 0; CGDisplayShowCursor(kCGDirectMainDisplay); mouseHide = NO; //revert window to previous setting [self setFrame:old_view_frame]; [self setNeedsDisplay:YES]; [window setHasShadow:YES]; [window setFrame:old_frame display:YES animate:animate];//zoom-out window with nice useless sfx }}/* Toggle ontop*/- (void) ontop{ if(vo_ontop) { [window setLevel:NSScreenSaverWindowLevel]; isOntop = YES; } else { [window setLevel:NSNormalWindowLevel]; isOntop = NO; }}/* Toggle panscan*/- (void) panscan{ panscan_calc();}/* Toggle rootwin */- (void) rootwin{ if(vo_rootwin) { [window setLevel:CGWindowLevelForKey(kCGDesktopWindowLevelKey)]; [window orderBack:self]; isRootwin = YES; } else { [window setLevel:NSNormalWindowLevel]; isRootwin = NO; }}/* Check event for new event*/ - (void) check_events{ event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate dateWithTimeIntervalSinceNow:0.0001] inMode:NSEventTrackingRunLoopMode dequeue:YES]; [NSApp sendEvent:event];}/* From NSView, respond to key equivalents.*/- (BOOL)performKeyEquivalent:(NSEvent *)theEvent{ switch([theEvent keyCode]) { case 0x21: [window setAlphaValue: winAlpha-=0.05]; return YES; case 0x1e: [window setAlphaValue: winAlpha+=0.05]; return YES; } return NO;}/* Process key event*/- (void) keyDown: (NSEvent *) theEvent{ unsigned int key; switch([theEvent keyCode]) { case 0x34: case 0x24: key = KEY_ENTER; break; case 0x35: key = KEY_ESC; break; case 0x33: key = KEY_BACKSPACE; break; case 0x3A: key = KEY_BACKSPACE; break; case 0x3B: key = KEY_BACKSPACE; break; case 0x38: key = KEY_BACKSPACE; break; case 0x7A: key = KEY_F+1; break; case 0x78: key = KEY_F+2; break; case 0x63: key = KEY_F+3; break; case 0x76: key = KEY_F+4; break; case 0x60: key = KEY_F+5; break; case 0x61: key = KEY_F+6; break; case 0x62: key = KEY_F+7; break; case 0x64: key = KEY_F+8; break; case 0x65: key = KEY_F+9; break; case 0x6D: key = KEY_F+10; break; case 0x67: key = KEY_F+11; break; case 0x6F: key = KEY_F+12; break; case 0x72: key = KEY_INSERT; break; case 0x75: key = KEY_DELETE; break; case 0x73: key = KEY_HOME; break; case 0x77: key = KEY_END; break; case 0x45: key = '+'; break; case 0x4E: key = '-'; break; case 0x30: key = KEY_TAB; break; case 0x74: key = KEY_PAGE_UP; break; case 0x79: key = KEY_PAGE_DOWN; break; case 0x7B: key = KEY_LEFT; break; case 0x7C: key = KEY_RIGHT; break; case 0x7D: key = KEY_DOWN; break; case 0x7E: key = KEY_UP; break; case 0x43: key = '*'; break; case 0x4B: key = '/'; break; case 0x4C: key = KEY_KPENTER; break; case 0x41: key = KEY_KPDEC; break; case 0x52: key = KEY_KP0; break; case 0x53: key = KEY_KP1; break; case 0x54: key = KEY_KP2; break; case 0x55: key = KEY_KP3; break; case 0x56: key = KEY_KP4; break; case 0x57: key = KEY_KP5; break; case 0x58: key = KEY_KP6; break; case 0x59: key = KEY_KP7; break; case 0x5B: key = KEY_KP8; break; case 0x5C: key = KEY_KP9; break; default: key = *[[theEvent characters] UTF8String]; break; } mplayer_put_key(key);}/* Process mouse button event*/- (void) mouseMoved: (NSEvent *) theEvent{ if(isFullscreen && !isRootwin) { CGDisplayShowCursor(kCGDirectMainDisplay); mouseHide = NO; }}- (void) mouseDown: (NSEvent *) theEvent{ [self mouseEvent: theEvent];}- (void) mouseUp: (NSEvent *) theEvent{ [self mouseEvent: theEvent];}- (void) rightMouseDown: (NSEvent *) theEvent{ [self mouseEvent: theEvent];}- (void) rightMouseUp: (NSEvent *) theEvent{ [self mouseEvent: theEvent];}- (void) otherMouseDown: (NSEvent *) theEvent{ [self mouseEvent: theEvent];}- (void) otherMouseUp: (NSEvent *) theEvent{ [self mouseEvent: theEvent];}- (void) scrollWheel: (NSEvent *) theEvent{ if([theEvent deltaY] > 0) mplayer_put_key(MOUSE_BTN3); else mplayer_put_key(MOUSE_BTN4);}- (void) mouseEvent: (NSEvent *) theEvent{ if ( [theEvent buttonNumber] >= 0 && [theEvent buttonNumber] <= 9 ) { switch([theEvent type]) { case NSLeftMouseDown: case NSRightMouseDown: case NSOtherMouseDown: mplayer_put_key((MOUSE_BTN0 + [theEvent buttonNumber]) | MP_KEY_DOWN); break; case NSLeftMouseUp: case NSRightMouseUp: case NSOtherMouseUp: mplayer_put_key(MOUSE_BTN0 + [theEvent buttonNumber]); break; } }}/* NSResponder*/ - (BOOL) acceptsFirstResponder{ return YES;}- (BOOL) becomeFirstResponder{ return YES;}- (BOOL) resignFirstResponder{ return YES;}- (void)windowWillClose:(NSNotification *)aNotification{ mpGLView = NULL; mplayer_put_key(KEY_ESC);}@end
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?