📄 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 + -