📄 sdl_cgxvideo.c
字号:
/* 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 + -