📄 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_RCSID
static char rcsid =
"@(#) $Id: SDL_cgxvideo.c,v 1.4 2002/04/22 21:38:04 wmay 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 + -