⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdl_cgxvideo.c

📁 网络MPEG4IP流媒体开发源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
			return(-1);		}	}	if(RTGBase=OpenLibrary("libs:picasso96/rtg.library",0L)) {		extern int use_picasso96;		CloseLibrary(RTGBase);		use_picasso96=1;	}	D(bug("Library intialized, locking screen...\n"));	SDL_Display = LockPubScreen(NULL);	if ( SDL_Display == NULL ) {		D(bug("Cannot lock display...\n"));		SDL_SetError("Couldn't lock the display");		return(-1);	}	D(bug("Checking if we are using a CGX native display...\n"));	if(!IsCyberModeID(GetVPModeID(&SDL_Display->ViewPort)))	{		Uint32 okid=BestCModeIDTags(CYBRBIDTG_NominalWidth,SDL_Display->Width,				CYBRBIDTG_NominalHeight,SDL_Display->Height,				CYBRBIDTG_Depth,8,				TAG_DONE);		D(bug("Default visual is not CGX native!\n"));		UnlockPubScreen(NULL,SDL_Display);		GFX_Display=NULL;		if(okid!=INVALID_ID)		{			GFX_Display=OpenScreenTags(NULL,									SA_Width,SDL_Display->Width,									SA_Height,SDL_Display->Height,									SA_Depth,8,SA_Quiet,TRUE,									SA_ShowTitle,FALSE,									SA_DisplayID,okid,									TAG_DONE);		}		if(!GFX_Display)		{			SDL_SetError("Unable to open a suited CGX display");			return -1;		}		else SDL_Display=GFX_Display;	}	else GFX_Display = SDL_Display;	/* See whether or not we need to swap pixels */	swap_pixels = 0;// Non e' detto che sia cosi' pero', alcune schede potrebbero gestire i modi in modo differente	if ( SDL_BYTEORDER == SDL_LIL_ENDIAN ) {		swap_pixels = 1;	}	D(bug("Before GetVideoModes....\n"));	/* Get the available video modes */	if(CGX_GetVideoModes(this) < 0)	    return -1;	/* Determine the default screen depth:	   Use the default visual (or at least one with the same depth) */	for(i = 0; i < this->hidden->nvisuals; i++)	    if(this->hidden->visuals[i].depth == GetCyberMapAttr(SDL_Display->RastPort.BitMap,CYBRMATTR_DEPTH))					break;	if(i == this->hidden->nvisuals) {	    /* default visual was useless, take the deepest one instead */	    i = 0;	}	SDL_Visual = this->hidden->visuals[i].visual;//	SDL_XColorMap = SDL_DisplayColormap;	this->hidden->depth = this->hidden->visuals[i].depth;	D(bug("Init: Setting screen depth to: %ld\n",this->hidden->depth));	vformat->BitsPerPixel = this->hidden->visuals[i].depth; /* this->hidden->visuals[i].bpp; */	{		int form;		APTR handle;		struct DisplayInfo info;		if(!(handle=FindDisplayInfo(this->hidden->visuals[i].visual)))		{			D(bug("Unable to get visual info...\n"));			return -1;		}		if(!GetDisplayInfoData(handle,(char *)&info,sizeof(struct DisplayInfo),DTAG_DISP,NULL)) {			D(bug("Unable to get visual info data...\n"));			return -1;		}		form=GetCyberIDAttr(CYBRIDATTR_PIXFMT,SDL_Visual);// In this case I use makebitmask in a way that I'm sure I'll get PIXFMT pixel mask		if ( vformat->BitsPerPixel > 8 )		{			vformat->Rmask = MakeBitMask(this,0,form,&this->hidden->depth);	  		vformat->Gmask = MakeBitMask(this,1,form,&this->hidden->depth);		  	vformat->Bmask = MakeBitMask(this,2,form,&this->hidden->depth);		}	}	/* See if we have been passed a window to use *//*	SDL_windowid = getenv("SDL_WINDOWID"); */	SDL_windowid=NULL;	/* Create the blank cursor */	SDL_BlankCursor = AllocMem(16,MEMF_CHIP|MEMF_CLEAR);	/* Fill in some window manager capabilities */	this->info.wm_available = 1;	this->info.blit_hw = 1;	this->info.blit_hw_CC = 1;	this->info.blit_sw = 1;	this->info.blit_fill = 1;	this->info.video_mem=2000000; // Not always true but almost any Amiga card has this memory!	this->hidden->same_format=0;	SDL_RastPort=&SDL_Display->RastPort;	/* We're done! */	D(bug("End of CGX_VideoInit\n"));	return(0);}void CGX_DestroyWindow(_THIS, SDL_Surface *screen){	D(bug("Destroy Window...\n"));	if ( ! SDL_windowid ) {		/* Hide the managed window */		int was_fullscreen=0;		/* Clean up OpenGL */		if ( screen ) {		screen->flags &= ~(SDL_OPENGL|SDL_OPENGLBLIT);		}		if ( screen && (screen->flags & SDL_FULLSCREEN) ) {			was_fullscreen=1;			screen->flags &= ~SDL_FULLSCREEN;//			CGX_LeaveFullScreen(this); tolto x crash		}		/* Destroy the output window */		if ( SDL_Window ) {			CloseWindow(SDL_Window);			SDL_Window=NULL;		}		/* Free the colormap entries */		if ( SDL_XPixels ) {			int numcolors;			unsigned long pixel;			if(this->screen->format&&this->hidden->depth==8&&!was_fullscreen)			{				numcolors = 1<<this->screen->format->BitsPerPixel;				if(numcolors>256)					numcolors=256;				if(!was_fullscreen&&this->hidden->depth==8)				{					for ( pixel=0; pixel<numcolors; pixel++ )					{						if(SDL_XPixels[pixel]>=0)							ReleasePen(GFX_Display->ViewPort.ColorMap,SDL_XPixels[pixel]);					}				}			}			free(SDL_XPixels);			SDL_XPixels = NULL;		}	}}static void CGX_SetSizeHints(_THIS, int w, int h, Uint32 flags){	if ( flags & SDL_RESIZABLE ) {		WindowLimits(SDL_Window, 32, 32,4096,4096);	} else {		WindowLimits(SDL_Window, w,h,w,h);	}	if ( flags & SDL_FULLSCREEN ) {		flags&=~SDL_RESIZABLE;	} else if ( getenv("SDL_VIDEO_CENTERED") ) {		int display_w, display_h;		display_w = SDL_Display->Width;		display_h = SDL_Display->Height;		ChangeWindowBox(SDL_Window,(display_w - w - SDL_Window->BorderLeft-SDL_Window->BorderRight)/2,					(display_h - h - SDL_Window->BorderTop-SDL_Window->BorderBottom)/2,					w+SDL_Window->BorderLeft+SDL_Window->BorderRight,					h+SDL_Window->BorderTop+SDL_Window->BorderBottom);	}}int CGX_CreateWindow(_THIS, SDL_Surface *screen,			    int w, int h, int bpp, Uint32 flags){#if 0	int i, depth;	Uint32 vis;#endif	D(bug("CGX_CreateWindow\n"));	/* If a window is already present, destroy it and start fresh */	if ( SDL_Window ) {		CGX_DestroyWindow(this, screen);	}	/* See if we have been given a window id */	if ( SDL_windowid ) {		SDL_Window = (struct Window *)atol(SDL_windowid);	} else {		SDL_Window = 0;	}	/* find out which visual we are going to use */#if 0/* questo l'ho spostato nell'apertura dello schermo, in quanto su Amiga le finestre   hanno il pixel mode degli schermi. */	/*if ( flags & SDL_OPENGL ) {		SDL_SetError("OpenGL not supported by the Amiga SDL!");		return -1;	}	else {*/		for ( i = 0; i < this->hidden->nvisuals; i++ ) {			if ( this->hidden->visuals[i].depth == bpp ) /* era .depth */				break;		}		if ( i == this->hidden->nvisuals ) {			SDL_SetError("No matching visual for requested depth");			return -1;	/* should never happen */		}		vis = this->hidden->visuals[i].visual;		depth = this->hidden->visuals[i].depth;//	}	SDL_Visual = vis;	this->hidden->depth = depth;	D(bug("Setting screen depth to: %ld\n",this->hidden->depth));#endif	/* Allocate the new pixel format for this video mode */	{		Uint32 form;		APTR handle;		struct DisplayInfo info;		if(!(handle=FindDisplayInfo(SDL_Visual)))			return -1;		if(!GetDisplayInfoData(handle,(char *)&info,sizeof(struct DisplayInfo),DTAG_DISP,NULL))			return -1;		form=GetCyberIDAttr(CYBRIDATTR_PIXFMT,SDL_Visual);		if(flags&SDL_HWSURFACE)		{			if(bpp!=this->hidden->depth)			{				bpp=this->hidden->depth;				D(bug("Accel forces bpp to be equal (%ld)\n",bpp));			}		}		D(bug("BEFORE screen allocation: bpp:%ld (real:%ld)\n",bpp,this->hidden->depth));/* With this call if needed I'll revert the wanted bpp to a bpp best suited for the display, actually occurs   only with requested format 15/16bit and display format != 15/16bit */		if ( ! SDL_ReallocFormat(screen, bpp,				MakeBitMask(this,0,form,&bpp), MakeBitMask(this,1,form,&bpp), MakeBitMask(this,2,form,&bpp), 0) )			return -1;		D(bug("AFTER screen allocation: bpp:%ld (real:%ld)\n",bpp,this->hidden->depth));	}	/* Create the appropriate colormap *//*	if ( SDL_XColorMap != SDL_DisplayColormap ) {		XFreeColormap(SDL_Display, SDL_XColorMap);	}*/	if ( GetCyberMapAttr(SDL_Display->RastPort.BitMap,CYBRMATTR_PIXFMT)==PIXFMT_LUT8 || bpp==8 ) {	    int ncolors,i;	    D(bug("XPixels palette allocation...\n"));	    /* Allocate the pixel flags */	    if(bpp==8)		ncolors=256;	    else		ncolors = 1 << screen->format->BitsPerPixel;	    SDL_XPixels = (Sint32 *)malloc(ncolors * sizeof(Sint32));	    if(SDL_XPixels == NULL) {		SDL_OutOfMemory();		return -1;	    }	    for(i=0;i<ncolors;i++)		    SDL_XPixels[i]=-1;	    /* always allocate a private colormap on non-default visuals */	    if(bpp==8)		flags |= SDL_HWPALETTE;	    if ( flags & SDL_HWPALETTE )			screen->flags |= SDL_HWPALETTE;	} 	/* resize the (possibly new) window manager window */	/* Create (or use) the X11 display window */	if ( !SDL_windowid ) {			if( flags & SDL_FULLSCREEN )			{				SDL_Window = OpenWindowTags(NULL,WA_Width,w,WA_Height,h,											WA_Flags,WFLG_ACTIVATE|WFLG_RMBTRAP|WFLG_BORDERLESS|WFLG_BACKDROP|WFLG_REPORTMOUSE,											WA_IDCMP,IDCMP_RAWKEY|IDCMP_MOUSEBUTTONS|IDCMP_MOUSEMOVE,											WA_CustomScreen,(ULONG)SDL_Display,											TAG_DONE);				D(bug("Opening backdrop window %ldx%ld on display %lx!\n",w,h,SDL_Display));			}			else			{				/* Create GimmeZeroZero window when OpenGL is used */				unsigned long gzz = FALSE;				if( flags & SDL_OPENGL ) {					gzz = TRUE;				}				SDL_Window = OpenWindowTags(NULL,WA_InnerWidth,w,WA_InnerHeight,h,											WA_Flags,WFLG_REPORTMOUSE|WFLG_ACTIVATE|WFLG_RMBTRAP | ((flags&SDL_NOFRAME) ? 0 : (WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_DRAGBAR | ((flags&SDL_RESIZABLE) ? WFLG_SIZEGADGET|WFLG_SIZEBBOTTOM : 0))),											WA_IDCMP,IDCMP_RAWKEY|IDCMP_CLOSEWINDOW|IDCMP_MOUSEBUTTONS|IDCMP_NEWSIZE|IDCMP_MOUSEMOVE,											WA_PubScreen,(ULONG)SDL_Display,											WA_GimmeZeroZero, gzz,														TAG_DONE);				D(bug("Opening WB window of size: %ldx%ld!\n",w,h));			}		if(!SDL_Window)			return -1;	}	this->hidden->BytesPerPixel=GetCyberMapAttr(SDL_Window->RPort->BitMap,CYBRMATTR_BPPIX);	if(screen->flags & SDL_DOUBLEBUF)	{		if(SDL_RastPort=malloc(sizeof(struct RastPort)))		{			InitRastPort(SDL_RastPort);			SDL_RastPort->BitMap=this->hidden->SB[1]->sb_BitMap;		}		else			return -1;	}	else SDL_RastPort=SDL_Window->RPort;	if(flags&SDL_HWSURFACE)		screen->flags|=SDL_HWSURFACE;	if( !SDL_windowid ) {	    CGX_SetSizeHints(this, w, h, flags);		current_w = w;		current_h = h;	}	/* Set our colormaps when not setting a GL mode *//*	if ( ! (flags & SDL_OPENGL) ) {		XSetWindowColormap(SDL_Display, SDL_Window, SDL_XColorMap);	}*/	/* Map them both and go fullscreen, if requested */	if ( ! SDL_windowid ) {		if ( flags & SDL_FULLSCREEN ) {			screen->flags |= SDL_FULLSCREEN;			currently_fullscreen=1;//			CGX_EnterFullScreen(this); Ci siamo gia'!		} else {			screen->flags &= ~SDL_FULLSCREEN;		}	}	screen->w = w;	screen->h = h;	screen->pitch = SDL_CalculatePitch(screen);	CGX_ResizeImage(this, screen, flags);	/* Make OpenGL Context if needed*/	if(flags & SDL_OPENGL) {		if(this->gl_data->gl_active == 0) {			if(CGX_GL_Init(this) < 0)				return -1;			else				screen->flags |= SDL_OPENGL;		}		else {			if(CGX_GL_Update(this) < 0)				return -1;			else				screen->flags |= SDL_OPENGL;		}	}}int CGX_ResizeWindow(_THIS,			SDL_Surface *screen, int w, int h, Uint32 flags){	D(bug("CGX_ResizeWindow\n"));	if ( ! SDL_windowid ) {		/* Resize the window manager window */		CGX_SetSizeHints(this, w, h, flags);		current_w = w;		current_h = h;		ChangeWindowBox(SDL_Window,SDL_Window->LeftEdge,SDL_Window->TopEdge, w+SDL_Window->BorderLeft+SDL_Window->BorderRight,					h+SDL_Window->BorderTop+SDL_Window->BorderBottom);		screen->w = w;		screen->h = h;		screen->pitch = SDL_CalculatePitch(screen);		CGX_ResizeImage(this, screen, flags);	}	return(0);}static SDL_Surface *CGX_SetVideoMode(_THIS, SDL_Surface *current,				int width, int height, int bpp, Uint32 flags){	Uint32 saved_flags;	int needcreate=0;	D(bug("CGX_SetVideoMode current:%lx\n",current));	/* Lock the event thread, in multi-threading environments */	SDL_Lock_EventThread();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -