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

📄 sdl_cgxvideo.c

📁 Simple DirectMedia Layer - Simple DirectMedia Layer 是一个跨平台的多媒体库设计用来提供快速图形framebuffer和音频驱动。应用MPEG为软件
💻 C
📖 第 1 页 / 共 3 页
字号:
/*    SDL - Simple DirectMedia Layer    Copyright (C) 1997, 1998, 1999, 2000  Sam Lantinga    This library is free software; you can redistribute it and/or    modify it under the terms of the GNU Library General Public    License as published by the Free Software Foundation; either    version 2 of the License, or (at your option) any later version.    This library is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU    Library General Public License for more details.    You should have received a copy of the GNU Library General Public    License along with this library; if not, write to the Free    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA    Sam Lantinga    slouken@libsdl.org*/#ifdef SAVE_RCSIDstatic char rcsid = "@(#) $Id: SDL_cgxvideo.c,v 1.6 2002/03/06 11:23:03 slouken Exp $";#endif/* * CGX based SDL video driver implementation by Gabriele Greco * gabriele.greco@aruba.it *//*#include <stdlib.h>#include <stdio.h>#include <unistd.h>#include <string.h>#include <sys/ioctl.h>#ifdef MTRR_SUPPORT#include <asm/mtrr.h>#include <sys/fcntl.h>#endif*/#include "SDL.h"#include "SDL_error.h"#include "SDL_timer.h"#include "SDL_thread.h"#include "SDL_video.h"#include "SDL_mouse.h"#include "SDL_endian.h"#include "SDL_sysvideo.h"#include "SDL_pixels_c.h"#include "SDL_events_c.h"#include "SDL_cgxgl_c.h"#include "SDL_cgxvideo.h"#include "SDL_cgxwm_c.h"#include "SDL_amigamouse_c.h"#include "SDL_amigaevents_c.h"#include "SDL_cgxmodes_c.h"#include "SDL_cgximage_c.h"#include "SDL_cgxyuv_c.h"/* Initialization/Query functions */static int CGX_VideoInit(_THIS, SDL_PixelFormat *vformat);static SDL_Surface *CGX_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags);static int CGX_ToggleFullScreen(_THIS, int on);static void CGX_UpdateMouse(_THIS);static int CGX_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors);static void CGX_VideoQuit(_THIS);/* CGX driver bootstrap functions */struct Library *CyberGfxBase=NULL;struct IntuitionBase *IntuitionBase=NULL;struct GfxBase *GfxBase=NULL;int CGX_SetGamma(_THIS, float red, float green, float blue){    SDL_SetError("Gamma correction not supported");    return -1;}int CGX_GetGamma(_THIS, float red, float green, float blue){    SDL_SetError("Gamma correction not supported");    return -1;}int CGX_SetGammaRamp(_THIS, Uint16 *ramp){#if 0	Int i, ncolors;	XColor xcmap[256];	/* See if actually setting the gamma is supported */	if ( SDL_Visual->class != DirectColor ) {	    SDL_SetError("Gamma correction not supported on this visual");	    return(-1);	}	/* Calculate the appropriate palette for the given gamma ramp */	ncolors = SDL_Visual->map_entries;	for ( i=0; i<ncolors; ++i ) {		Uint8 c = (256 * i / ncolors);		xcmap[i].pixel = SDL_MapRGB(this->screen->format, c, c, c);		xcmap[i].red   = ramp[0*256+c];		xcmap[i].green = ramp[1*256+c];		xcmap[i].blue  = ramp[2*256+c];		xcmap[i].flags = (DoRed|DoGreen|DoBlue);	}	XStoreColors(GFX_Display, SDL_XColorMap, xcmap, ncolors);	XSync(GFX_Display, False);	return(0);#else    SDL_SetError("Gamma correction not supported on this visual");    return(-1);#endif}static void DestroyScreen(_THIS){  	if(currently_fullscreen)	{		if(this->hidden->dbuffer)		{			extern struct MsgPort *safeport,*dispport;			this->hidden->dbuffer=0;			if(safeport)			{				while(GetMsg(safeport)!=NULL);				DeleteMsgPort(safeport);			}			if(dispport)			{				while(GetMsg(dispport)!=NULL);				DeleteMsgPort(dispport);			}			this->hidden->SB[0]->sb_DBufInfo->dbi_SafeMessage.mn_ReplyPort=this->hidden->SB[0]->sb_DBufInfo->dbi_DispMessage.mn_ReplyPort=NULL;			this->hidden->SB[1]->sb_DBufInfo->dbi_SafeMessage.mn_ReplyPort=this->hidden->SB[1]->sb_DBufInfo->dbi_DispMessage.mn_ReplyPort=NULL;			if(this->hidden->SB[1])				FreeScreenBuffer(SDL_Display,this->hidden->SB[1]);			if(this->hidden->SB[0])				FreeScreenBuffer(SDL_Display,this->hidden->SB[0]);			this->hidden->SB[0]=this->hidden->SB[1]=NULL;			if(SDL_RastPort && SDL_RastPort != &SDL_Display->RastPort)				free(SDL_RastPort);			SDL_RastPort=NULL;		}		CloseScreen(GFX_Display);		currently_fullscreen=0;	}	else if(GFX_Display)		UnlockPubScreen(NULL,GFX_Display);	GFX_Display = NULL;}static int CGX_Available(void){	struct Library *l;	l = OpenLibrary("cybergraphics.library",0L);	if ( l != NULL ) {		D(bug("CGX video device AVAILABLE\n"));		CloseLibrary(l);	}	D(else bug("**CGX video device UNAVAILABLE\n"));	return(l != NULL);}static void CGX_DeleteDevice(SDL_VideoDevice *device){	if ( device ) {		if ( device->hidden ) {			free(device->hidden);		}		if ( device->gl_data ) {			free(device->gl_data);		}		free(device);	}}static SDL_VideoDevice *CGX_CreateDevice(int devindex){	SDL_VideoDevice *device;	/* Initialize all variables that we clean on shutdown */	device = (SDL_VideoDevice *)malloc(sizeof(SDL_VideoDevice));	if ( device ) {		memset(device, 0, (sizeof *device));		device->hidden = (struct SDL_PrivateVideoData *)				malloc((sizeof *device->hidden));		device->gl_data = (struct SDL_PrivateGLData *)				malloc((sizeof *device->gl_data));	}	if ( (device == NULL) || (device->hidden == NULL) ||	                         (device->gl_data == NULL) ) {		D(bug("Unable to create video device!\n"));		SDL_OutOfMemory();		CGX_DeleteDevice(device);		return(0);	}	memset(device->hidden, 0, sizeof(*device->hidden));	memset(device->gl_data, 0, sizeof(*device->gl_data));	/* Set the driver flags */	device->handles_any_size = 1;	/* Set the function pointers */	device->VideoInit = CGX_VideoInit;	device->ListModes = CGX_ListModes;	device->SetVideoMode = CGX_SetVideoMode;	device->ToggleFullScreen = CGX_ToggleFullScreen;	device->UpdateMouse = CGX_UpdateMouse;#ifdef XFREE86_XV	device->CreateYUVOverlay = X11_CreateYUVOverlay;#endif	device->SetColors = CGX_SetColors;	device->UpdateRects = NULL;	device->VideoQuit = CGX_VideoQuit;	device->AllocHWSurface = CGX_AllocHWSurface;	device->CheckHWBlit = CGX_CheckHWBlit;	device->FillHWRect = CGX_FillHWRect;	device->SetHWColorKey = CGX_SetHWColorKey;	device->SetHWAlpha = NULL;	device->LockHWSurface = CGX_LockHWSurface;	device->UnlockHWSurface = CGX_UnlockHWSurface;	device->FlipHWSurface = CGX_FlipHWSurface;	device->FreeHWSurface = CGX_FreeHWSurface;	device->SetGamma = CGX_SetGamma;	device->GetGamma = CGX_GetGamma;	device->SetGammaRamp = CGX_SetGammaRamp;	device->GetGammaRamp = NULL;#ifdef HAVE_OPENGL	device->GL_LoadLibrary = CGX_GL_LoadLibrary;	device->GL_GetProcAddress = CGX_GL_GetProcAddress;	device->GL_GetAttribute = CGX_GL_GetAttribute;	device->GL_MakeCurrent = CGX_GL_MakeCurrent;	device->GL_SwapBuffers = CGX_GL_SwapBuffers;#endif	device->SetIcon = CGX_SetIcon;	device->SetCaption = CGX_SetCaption;	device->IconifyWindow = NULL; /* CGX_IconifyWindow; */	device->GrabInput = NULL /* CGX_GrabInput*/;	device->GetWMInfo = CGX_GetWMInfo;	device->FreeWMCursor = amiga_FreeWMCursor;	device->CreateWMCursor = amiga_CreateWMCursor;	device->ShowWMCursor = amiga_ShowWMCursor;	device->WarpWMCursor = amiga_WarpWMCursor;	device->CheckMouseMode = amiga_CheckMouseMode;	device->InitOSKeymap = amiga_InitOSKeymap;	device->PumpEvents = amiga_PumpEvents;	device->free = CGX_DeleteDevice;	return device;}VideoBootStrap CGX_bootstrap = {	"CGX", "AmigaOS CyberGraphics", CGX_Available, CGX_CreateDevice};Uint32 MakeBitMask(_THIS,int type,int format,int *bpp){	D(if(type==0)bug("REAL pixel format: "));	if(this->hidden->depth==*bpp)	{	switch(format)    	{		case PIXFMT_LUT8:			D(if(type==0)bug("LUT8\n"));			return 0;		case PIXFMT_BGR15:		case PIXFMT_RGB15PC:			switch(type)			{				case 0:					D(bug("RGB15PC/BGR15\n"));					return 31;				case 1:					return 992;				case 2:					return 31744;			}		case PIXFMT_RGB15:		case PIXFMT_BGR15PC:			switch(type)			{				case 0:					D(bug("RGB15/BGR15PC\n"));					return 31744;				case 1:					return 992;				case 2:					return 31;			}		case PIXFMT_BGR16PC:		case PIXFMT_RGB16:			switch(type)			{				case 0:					D(bug("RGB16PC\n"));					return 63488;				case 1:					return 2016;				case 2:					return 31;			}		case PIXFMT_BGR16:		case PIXFMT_RGB16PC:			switch(type)			{				case 0:					D(bug("RGB16PC/BGR16\n"));					return 31;				case 1:					return 2016;				case 2:					return 63488;			}		case PIXFMT_RGB24:			switch(type)			{				case 0:					D(bug("RGB24/BGR24\n"));					return 0xff0000;				case 1:					return 0xff00;				case 2:					return 0xff;			}		case PIXFMT_BGR24:			switch(type)			{				case 0:					D(bug("BGR24\n"));					return 0xff;				case 1:					return 0xff00;				case 2:					return 0xff0000;			}		case PIXFMT_ARGB32:			switch(type)			{				case 0:					D(bug("ARGB32\n"));					return 0xff0000;				case 1:					return 0xff00;				case 2:					return 0xff;			}		case PIXFMT_BGRA32:			switch(type)			{				case 0:					D(bug("BGRA32\n"));					return 0xff00;				case 1:					return 0xff0000;				case 2:					return 0xff000000;			}		case PIXFMT_RGBA32:			switch(type)			{				case 0:					D(bug("RGBA32\n"));					return 0xff000000;				case 1:					return 0xff0000;				case 2:					return 0xff00;			}		default:			D(bug("Unknown pixel format! Default to 24bit\n"));			return (Uint32) (255<<(type*8));	}	}	else	{		D(if(type==0)bug("DIFFERENT from screen.\nAllocated screen format: "));		switch(*bpp)		{			case 32:				D(if(type==0) bug("RGBA32\n"));				switch(type)				{					case 0:						return 0xff000000;					case 1:						return 0xff0000;					case 2:						return 0xff00;				}				break;			case 24:use_truecolor:				switch(type)				{					case 0:						D(bug("RGB24\n"));						return 0xff0000;					case 1:						return 0xff00;					case 2:						return 0xff;				}			case 16:			case 15:				D(if(type==0) bug("Not supported, switching to 24bit!\n"));				*bpp=24;				goto use_truecolor;				break;			default:				D(if(type==0)bug("This is a chunky display\n"));// For chunky display mask is always 0;				return 0;		}	}	return 0;}static int CGX_VideoInit(_THIS, SDL_PixelFormat *vformat){	int i;	struct Library *RTGBase;	D(bug("VideoInit... Opening libraries\n"));	if(!IntuitionBase) {		if( !(IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",39L))) {			SDL_SetError("Couldn't open intuition V39+");			return -1;		}	}	if(!GfxBase) {		if( !(GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",39L))) {			SDL_SetError("Couldn't open graphics V39+");			return -1;		}	}	if(!CyberGfxBase) {		if( !(CyberGfxBase=OpenLibrary("cybergraphics.library",40L))) {			SDL_SetError("Couldn't open cybergraphics.");

⌨️ 快捷键说明

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