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 + -
显示快捷键?