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