Mercurial > sdl-ios-xcode
diff src/video/cybergfx/SDL_cgxvideo.c @ 255:dcb5e869f8b5
Updated Amiga port by Gabriele Greco
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sun, 16 Dec 2001 20:00:27 +0000 |
parents | e8157fcb3114 |
children | c9b51268668f |
line wrap: on
line diff
--- a/src/video/cybergfx/SDL_cgxvideo.c Fri Dec 14 13:13:20 2001 +0000 +++ b/src/video/cybergfx/SDL_cgxvideo.c Sun Dec 16 20:00:27 2001 +0000 @@ -1,6 +1,6 @@ /* SDL - Simple DirectMedia Layer - Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga + 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 @@ -25,8 +25,10 @@ "@(#) $Id$"; #endif -/* CGX based SDL video driver implementation. -*/ +/* + * CGX based SDL video driver implementation by Gabriele Greco + * gabriele.greco@aruba.it + */ /* #include <stdlib.h> @@ -50,6 +52,7 @@ #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" @@ -57,7 +60,6 @@ #include "SDL_cgxmodes_c.h" #include "SDL_cgximage_c.h" #include "SDL_cgxyuv_c.h" -#include "SDL_cgxgl_c.h" /* Initialization/Query functions */ static int CGX_VideoInit(_THIS, SDL_PixelFormat *vformat); @@ -73,6 +75,52 @@ 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) @@ -98,20 +146,22 @@ 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[0]); + FreeScreenBuffer(SDL_Display,this->hidden->SB[1]); if(this->hidden->SB[0]) - FreeScreenBuffer(SDL_Display,this->hidden->SB[1]); + FreeScreenBuffer(SDL_Display,this->hidden->SB[0]); this->hidden->SB[0]=this->hidden->SB[1]=NULL; - free(SDL_RastPort); + + if(SDL_RastPort && SDL_RastPort != &SDL_Display->RastPort) + free(SDL_RastPort); + SDL_RastPort=NULL; - this->hidden->dbuffer=0; } CloseScreen(GFX_Display); currently_fullscreen=0; } - else + else if(GFX_Display) UnlockPubScreen(NULL,GFX_Display); GFX_Display = NULL; @@ -121,11 +171,14 @@ { struct Library *l; - l = OpenLibrary("cybergraphics.library",NULL); + 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); } @@ -157,12 +210,13 @@ } 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)); + 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; @@ -188,17 +242,21 @@ 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 = X11_GL_LoadLibrary; - device->GL_GetProcAddress = X11_GL_GetProcAddress; - device->GL_GetAttribute = X11_GL_GetAttribute; - device->GL_MakeCurrent = X11_GL_MakeCurrent; - device->GL_SwapBuffers = X11_GL_SwapBuffers; + 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->GrabInput = NULL /* CGX_GrabInput*/; device->GetWMInfo = CGX_GetWMInfo; device->FreeWMCursor = amiga_FreeWMCursor; device->CreateWMCursor = amiga_CreateWMCursor; @@ -217,119 +275,13 @@ "CGX", "AmigaOS CyberGraphics", CGX_Available, CGX_CreateDevice }; -#if 0 - -/* Create auxiliary (toplevel) windows with the current visual */ -static void create_aux_windows(_THIS) -{ - XSetWindowAttributes xattr; - XWMHints *hints; - XTextProperty titleprop, iconprop; - int def_vis = (SDL_Visual == DefaultVisual(SDL_Display, SDL_Screen)); - - /* Don't create any extra windows if we are being managed */ - if ( SDL_windowid ) { - FSwindow = 0; - WMwindow = strtol(SDL_windowid, NULL, 0); - return; - } - - if(FSwindow) - XDestroyWindow(SDL_Display, FSwindow); - - xattr.override_redirect = True; - xattr.background_pixel = def_vis ? BlackPixel(SDL_Display, SDL_Screen) : 0; - xattr.border_pixel = 0; - xattr.colormap = SDL_XColorMap; - - FSwindow = XCreateWindow(SDL_Display, SDL_Root, 0, 0, 32, 32, 0, - this->hidden->depth, InputOutput, SDL_Visual, - CWOverrideRedirect | CWBackPixel | CWBorderPixel - | CWColormap, - &xattr); - - XSelectInput(SDL_Display, FSwindow, StructureNotifyMask); - - /* Tell KDE to keep the fullscreen window on top */ - { - XEvent ev; - long mask; - - memset(&ev, 0, sizeof(ev)); - ev.xclient.type = ClientMessage; - ev.xclient.window = SDL_Root; - ev.xclient.message_type = XInternAtom(SDL_Display, - "KWM_KEEP_ON_TOP", False); - ev.xclient.format = 32; - ev.xclient.data.l[0] = FSwindow; - ev.xclient.data.l[1] = CurrentTime; - mask = SubstructureRedirectMask; - XSendEvent(SDL_Display, SDL_Root, False, mask, &ev); - } - - hints = NULL; - titleprop.value = iconprop.value = NULL; - if(WMwindow) { - /* All window attributes must survive the recreation */ - hints = XGetWMHints(SDL_Display, WMwindow); - XGetWMName(SDL_Display, WMwindow, &titleprop); - XGetWMIconName(SDL_Display, WMwindow, &iconprop); - XDestroyWindow(SDL_Display, WMwindow); - } - - /* Create the window for windowed management */ - /* (reusing the xattr structure above) */ - WMwindow = XCreateWindow(SDL_Display, SDL_Root, 0, 0, 32, 32, 0, - this->hidden->depth, InputOutput, SDL_Visual, - CWBackPixel | CWBorderPixel | CWColormap, - &xattr); - - /* Set the input hints so we get keyboard input */ - if(!hints) { - hints = XAllocWMHints(); - hints->input = True; - hints->flags = InputHint; - } - XSetWMHints(SDL_Display, WMwindow, hints); - XFree(hints); - if(titleprop.value) { - XSetWMName(SDL_Display, WMwindow, &titleprop); - XFree(titleprop.value); - } - if(iconprop.value) { - XSetWMIconName(SDL_Display, WMwindow, &iconprop); - XFree(iconprop.value); - } - - XSelectInput(SDL_Display, WMwindow, - FocusChangeMask | KeyPressMask | KeyReleaseMask - | PropertyChangeMask | StructureNotifyMask); - - /* Set the class hints so we can get an icon (AfterStep) */ - { - XClassHint *classhints; - classhints = XAllocClassHint(); - if(classhints != NULL) { - classhints->res_name = "SDL_App"; - classhints->res_class = "SDL_App"; - XSetClassHint(SDL_Display, WMwindow, classhints); - XFree(classhints); - } - } - - /* Allow the window to be deleted by the window manager */ - WM_DELETE_WINDOW = XInternAtom(SDL_Display, "WM_DELETE_WINDOW", False); - XSetWMProtocols(SDL_Display, WMwindow, &WM_DELETE_WINDOW, 1); -} -#endif - 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: @@ -447,7 +399,7 @@ else { D(if(type==0)bug("DIFFERENT from screen.\nAllocated screen format: ")); - + switch(*bpp) { case 32: @@ -479,43 +431,63 @@ D(if(type==0) bug("Not supported, switching to 24bit!\n")); *bpp=24; goto use_truecolor; - break; + 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; - if(!(IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",39L))) - { - SDL_SetError("Couldn't open intuition V39+"); - return -1; + 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(!(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."); + return(-1); + } } - if(!(CyberGfxBase=OpenLibrary("cybergraphics.library",40L))) - { - SDL_SetError("Couldn't open cybergraphics."); - 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, @@ -523,6 +495,8 @@ CYBRBIDTG_Depth,8, TAG_DONE); + D(bug("Default visual is not CGX native!\n")); + UnlockPubScreen(NULL,SDL_Display); GFX_Display=NULL; @@ -556,9 +530,11 @@ // 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; + swap_pixels = 1; } + D(bug("Before GetVideoModes....\n")); + /* Get the available video modes */ if(CGX_GetVideoModes(this) < 0) return -1; @@ -578,7 +554,7 @@ // SDL_XColorMap = SDL_DisplayColormap; this->hidden->depth = this->hidden->visuals[i].depth; - D(bug("Setto la profiondita' dello schermo a: %ld\n",this->hidden->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; */ { @@ -587,16 +563,21 @@ 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)) + 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 ) + if ( vformat->BitsPerPixel > 8 ) { vformat->Rmask = MakeBitMask(this,0,form,&this->hidden->depth); vformat->Gmask = MakeBitMask(this,1,form,&this->hidden->depth); @@ -608,9 +589,6 @@ /* SDL_windowid = getenv("SDL_WINDOWID"); */ SDL_windowid=NULL; - /* Create the fullscreen and managed windows */ -// create_aux_windows(this); - /* Create the blank cursor */ SDL_BlankCursor = AllocMem(16,MEMF_CHIP|MEMF_CLEAR); @@ -625,16 +603,25 @@ 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; - if ( screen && (screen->flags & SDL_FULLSCREEN) ) { + /* 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 @@ -660,7 +647,7 @@ if(!was_fullscreen&&this->hidden->depth==8) { - for ( pixel=0; pixel<numcolors; pixel++ ) + for ( pixel=0; pixel<numcolors; pixel++ ) { if(SDL_XPixels[pixel]>=0) ReleasePen(GFX_Display->ViewPort.ColorMap,SDL_XPixels[pixel]); @@ -669,7 +656,7 @@ } free(SDL_XPixels); SDL_XPixels = NULL; - } + } } } @@ -701,6 +688,8 @@ 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); @@ -718,11 +707,11 @@ /* questo l'ho spostato nell'apertura dello schermo, in quanto su Amiga le finestre hanno il pixel mode degli schermi. */ - if ( flags & SDL_OPENGL ) { + /*if ( flags & SDL_OPENGL ) { SDL_SetError("OpenGL not supported by the Amiga SDL!"); return -1; - } - else { + } + else {*/ for ( i = 0; i < this->hidden->nvisuals; i++ ) { if ( this->hidden->visuals[i].depth == bpp ) /* era .depth */ break; @@ -733,10 +722,10 @@ } vis = this->hidden->visuals[i].visual; depth = this->hidden->visuals[i].depth; - } +// } SDL_Visual = vis; this->hidden->depth = depth; - D(bug("Setto la profiondita' dello schermo a: %ld\n",this->hidden->depth)); + D(bug("Setting screen depth to: %ld\n",this->hidden->depth)); #endif /* Allocate the new pixel format for this video mode */ @@ -766,7 +755,7 @@ /* 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) ) @@ -783,8 +772,8 @@ } */ if ( GetCyberMapAttr(SDL_Display->RastPort.BitMap,CYBRMATTR_PIXFMT)==PIXFMT_LUT8 || bpp==8 ) { - int ncolors; - D(bug("Alloco XPixels x la palette...\n")); + int ncolors,i; + D(bug("XPixels palette allocation...\n")); /* Allocate the pixel flags */ @@ -794,52 +783,30 @@ ncolors = 1 << screen->format->BitsPerPixel; SDL_XPixels = (Sint32 *)malloc(ncolors * sizeof(Sint32)); - + if(SDL_XPixels == NULL) { SDL_OutOfMemory(); return -1; } - memset(SDL_XPixels, -1, ncolors * sizeof(Sint32)); + + 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 ) { + if ( flags & SDL_HWPALETTE ) screen->flags |= SDL_HWPALETTE; -/* - SDL_XColorMap = XCreateColormap(SDL_Display, SDL_Root, - SDL_Visual, AllocAll); -*/ - } else { -/* - SDL_XColorMap = SDL_DisplayColormap; -*/ - } - } else { -/* - SDL_XColorMap = XCreateColormap(SDL_Display, SDL_Root, - SDL_Visual, AllocNone); -*/ - } - - /* Recreate the auxiliary windows, if needed (required for GL) */ -/* - if ( vis_change ) - create_aux_windows(this); -*/ + } /* resize the (possibly new) window manager window */ /* Create (or use) the X11 display window */ + if ( !SDL_windowid ) { - if ( flags & SDL_OPENGL ) { - return(-1); - } - else - { - if(flags & SDL_FULLSCREEN) + 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, @@ -847,27 +814,25 @@ WA_CustomScreen,(ULONG)SDL_Display, TAG_DONE); - D(bug("Apro finestra backdrop %ldx%ld su %lx!\n",w,h,SDL_Display)); + 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("Apro finestra %ldx%ld sul wb!\n",w,h)); + D(bug("Opening WB window of size: %ldx%ld!\n",w,h)); } - } - /* Only manage our input if we own the window */ -/* - XSelectInput(SDL_Display, SDL_Window, - ( EnterWindowMask | LeaveWindowMask - | ButtonPressMask | ButtonReleaseMask - | PointerMotionMask | ExposureMask )); -*/ - if(!SDL_Window) return -1; } @@ -885,17 +850,6 @@ return -1; } else SDL_RastPort=SDL_Window->RPort; -#if 0 - - if(screen->flags & SDL_HWPALETTE) { - /* Since the full-screen window might have got a nonzero background - colour (0 is white on some displays), we should reset the - background to 0 here since that is what the user expects - with a private colormap */ - SetAPen(SDL_Window->RPort,0); - RectFill(SDL_Window->RPort,SDL_Window->BorderLeft,SDL_Window->BorderTop,w+SDL_Window->BorderLeft,h+SDL_Window->BorderTop); - } -#endif if(flags&SDL_HWSURFACE) screen->flags|=SDL_HWSURFACE; @@ -928,12 +882,28 @@ screen->pitch = SDL_CalculatePitch(screen); CGX_ResizeImage(this, screen, flags); - return(0); + /* 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); @@ -943,22 +913,6 @@ ChangeWindowBox(SDL_Window,SDL_Window->LeftEdge,SDL_Window->TopEdge, w+SDL_Window->BorderLeft+SDL_Window->BorderRight, h+SDL_Window->BorderTop+SDL_Window->BorderBottom); - /* Resize the fullscreen and display windows */ -/* - if ( flags & SDL_FULLSCREEN ) { - if ( screen->flags & SDL_FULLSCREEN ) { - CGX_ResizeFullScreen(this); - } else { - screen->flags |= SDL_FULLSCREEN; - CGX_EnterFullScreen(this); - } - } else { - if ( screen->flags & SDL_FULLSCREEN ) { - screen->flags &= ~SDL_FULLSCREEN; - CGX_LeaveFullScreen(this); - } - } -*/ screen->w = w; screen->h = h; screen->pitch = SDL_CalculatePitch(screen); @@ -973,23 +927,25 @@ 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(); // Check if the window needs to be closed or can be resized - if( (flags&SDL_FULLSCREEN) || (current->flags&SDL_FULLSCREEN && !(flags&SDL_FULLSCREEN))) + if( (flags&SDL_FULLSCREEN) || (current && current->flags&SDL_FULLSCREEN && !(flags&SDL_FULLSCREEN))) needcreate=1; -// Check if we need to close an already existing videomode... +// Check if we need to close an already existing videomode... - if(current->flags&SDL_FULLSCREEN && !(flags&SDL_FULLSCREEN)) - { + if(current && current->flags&SDL_FULLSCREEN && !(flags&SDL_FULLSCREEN)) { unsigned long i; + D(bug("Destroying image, window & screen!\n")); + CGX_DestroyImage(this,current); CGX_DestroyWindow(this,current); DestroyScreen(this); - D(bug("Distrutte immagine, finestra e schermo!\n")); GFX_Display=SDL_Display=LockPubScreen(NULL); bpp=this->hidden->depth=GetCyberMapAttr(SDL_Display->RastPort.BitMap,CYBRMATTR_DEPTH); @@ -1004,23 +960,23 @@ } SDL_Visual = this->hidden->visuals[i].visual; - D(bug("Setto la profiondita' dello schermo a: %ld\n",this->hidden->depth)); - + D(bug("Setting screen depth to: %ld\n",this->hidden->depth)); + } /* Check the combination of flags we were passed */ if ( flags & SDL_FULLSCREEN ) { int i; - + /* Clear fullscreen flag if not supported */ if ( SDL_windowid ) { flags &= ~SDL_FULLSCREEN; } - else if(current->flags&SDL_FULLSCREEN ) - { + else if(current && current->flags&SDL_FULLSCREEN ) { if(current->w!=width || current->h!=height || - this->hidden->depth!=bpp) + (this->hidden && this->hidden->depth!=bpp)) { + D(bug("Deleting previous window...\n")); CGX_DestroyImage(this,current); CGX_DestroyWindow(this,current); DestroyScreen(this); @@ -1037,8 +993,9 @@ GFX_Display=NULL; + D(bug("Opening screen...\n")); + if(okid!=INVALID_ID) - { GFX_Display=OpenScreenTags(NULL, SA_Width,width, SA_Height,height, @@ -1046,58 +1003,50 @@ SA_Depth,bpp, SA_DisplayID,okid, TAG_DONE); - } - - if(!GFX_Display) - { + if(!GFX_Display) { GFX_Display=SDL_Display; flags &= ~SDL_FULLSCREEN; flags &= ~SDL_DOUBLEBUF; } - else - { + else { UnlockPubScreen(NULL,SDL_Display); SDL_Display=GFX_Display; - - if(flags&SDL_DOUBLEBUF) - { - int ok=0; + + D(bug("Screen opened.\n")); - if(this->hidden->SB[0]=AllocScreenBuffer(SDL_Display,NULL,SB_SCREEN_BITMAP)) - { - if(this->hidden->SB[1]=AllocScreenBuffer(SDL_Display,NULL,0L)) - { + if(flags&SDL_DOUBLEBUF) { + int ok=0; + D(bug("Start of DBuffering allocations...\n")); + + if(this->hidden->SB[0]=AllocScreenBuffer(SDL_Display,NULL,SB_SCREEN_BITMAP)) { + + if(this->hidden->SB[1]=AllocScreenBuffer(SDL_Display,NULL,0L)) { extern struct MsgPort *safeport,*dispport; safeport=CreateMsgPort(); dispport=CreateMsgPort(); - if(!safeport || !dispport) - { - if(safeport) - { + if(!safeport || !dispport) { + if(safeport) { DeleteMsgPort(safeport); safeport=NULL; } - if(dispport) - { + if(dispport) { DeleteMsgPort(dispport); dispport=NULL; } FreeScreenBuffer(SDL_Display,this->hidden->SB[0]); FreeScreenBuffer(SDL_Display,this->hidden->SB[1]); } - else - { + else { extern ULONG safe_sigbit,disp_sigbit; int i; safe_sigbit=1L<< safeport->mp_SigBit; disp_sigbit=1L<< dispport->mp_SigBit; - - for(i=0;i<2;i++) - { + + for(i=0;i<2;i++) { this->hidden->SB[i]->sb_DBufInfo->dbi_SafeMessage.mn_ReplyPort=safeport; this->hidden->SB[i]->sb_DBufInfo->dbi_DispMessage.mn_ReplyPort=dispport; } @@ -1108,31 +1057,28 @@ current->flags|=SDL_DOUBLEBUF; } } - else - { + else { FreeScreenBuffer(SDL_Display,this->hidden->SB[1]); this->hidden->SB[0]=NULL; } } if(!ok) - { flags&=~SDL_DOUBLEBUF; - } } } if(GetCyberMapAttr(SDL_Display->RastPort.BitMap,CYBRMATTR_DEPTH)==bpp) - this->hidden->same_format=1; + this->hidden->same_format=1; } bpp=this->hidden->depth=GetCyberMapAttr(SDL_Display->RastPort.BitMap,CYBRMATTR_DEPTH); - D(bug("Setto la profiondita' dello schermo a: %ld\n",this->hidden->depth)); + D(bug("Setting screen depth to: %ld\n",this->hidden->depth)); - for ( i = 0; i < this->hidden->nvisuals; i++ ) { + 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 NULL; /* should never happen */ @@ -1202,11 +1148,14 @@ this->screen->flags &= ~SDL_FULLSCREEN; CGX_LeaveFullScreen(this); } + CGX_RefreshDisplay(this); if ( event_thread ) { SDL_Unlock_EventThread(); } + SDL_ResetKeyboard(); + return(1); } @@ -1274,7 +1223,7 @@ break; default: - D(bug("Errore, SetSingleColor con PIXFMT %ld!\n",fmt)); + D(bug("Error, SetSingleColor with PIXFMT %ld!\n",fmt)); } } @@ -1292,11 +1241,11 @@ else { if( SDL_Display->MouseX>=(SDL_Window->LeftEdge+SDL_Window->BorderLeft) && SDL_Display->MouseX<(SDL_Window->LeftEdge+SDL_Window->Width-SDL_Window->BorderRight) && - SDL_Display->MouseY>=(SDL_Window->TopEdge+SDL_Window->BorderLeft) && SDL_Display->MouseY<(SDL_Window->TopEdge+SDL_Window->Height-SDL_Window->BorderBottom) + SDL_Display->MouseY>=(SDL_Window->TopEdge+SDL_Window->BorderLeft) && SDL_Display->MouseY<(SDL_Window->TopEdge+SDL_Window->Height-SDL_Window->BorderBottom) ) { SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS); - SDL_PrivateMouseMotion(0, 0, SDL_Display->MouseX-SDL_Window->LeftEdge-SDL_Window->BorderLeft, + SDL_PrivateMouseMotion(0, 0, SDL_Display->MouseX-SDL_Window->LeftEdge-SDL_Window->BorderLeft, SDL_Display->MouseY-SDL_Window->TopEdge-SDL_Window->BorderTop); } else @@ -1314,7 +1263,7 @@ /* Check to make sure we have a colormap allocated */ /* It's easy if we have a hidden colormap */ - if ( (this->screen->flags & SDL_HWPALETTE) && currently_fullscreen ) + if ( (this->screen->flags & SDL_HWPALETTE) && currently_fullscreen ) { ULONG xcmap[256*3+2]; @@ -1343,7 +1292,7 @@ { // In this case I have to unalloc and realloc the full palette D(bug("Obtaining %ld colors on the screen\n",ncolors)); - + /* Free existing allocated colors */ for ( pixel=0; pixel<this->screen->format->palette->ncolors; ++pixel ) { if(SDL_XPixels[pixel]>=0) @@ -1356,7 +1305,7 @@ } } else - { + { #ifndef USE_CGX_WRITELUTPIXEL Uint32 fmt; D(bug("Preparing a conversion pixel table...\n")); @@ -1368,7 +1317,7 @@ SetSingleColor(fmt,colors[firstcolor+i].r,colors[firstcolor+i].g,colors[firstcolor+i].b,(unsigned char *)&SDL_XPixels[firstcolor+i]); } #else -// D(bug("Eseguo remap degli XPixel(%lx): (da %ld, %ld colori) primo: r%ld g%ld b%ld\n",SDL_XPixels,firstcolor,ncolors,colors[firstcolor].r,colors[firstcolor].g,colors[firstcolor].b)); +// D(bug("Executing XPixel(%lx) remapping: (from %ld, %ld colors) first: r%ld g%ld b%ld\n",SDL_XPixels,firstcolor,ncolors,colors[firstcolor].r,colors[firstcolor].g,colors[firstcolor].b)); for(i=0;i<ncolors;i++) SDL_XPixels[i+firstcolor]=(colors[firstcolor+i].r<<16)+(colors[firstcolor+i].g<<8)+colors[firstcolor+i].b; #endif @@ -1387,32 +1336,23 @@ { /* Shutdown everything that's still up */ /* The event thread should be done, so we can touch SDL_Display */ + D(bug("CGX_VideoQuit\n")); + if ( SDL_Display != NULL ) { /* Clean up OpenGL */ - + if(this->gl_data->gl_active == 1) { + CGX_GL_Quit(this); + } /* Start shutting down the windows */ + D(bug("Destroying image...\n")); CGX_DestroyImage(this, this->screen); + D(bug("Destroying window...\n")); CGX_DestroyWindow(this, this->screen); // Otherwise SDL_VideoQuit will try to free it! SDL_VideoSurface=NULL; + CGX_FreeVideoModes(this); -/* - if ( SDL_iconcolors ) { - unsigned long pixel; - int numcolors = - ((this->screen->format)->palette)->ncolors; - for ( pixel=0; pixel<numcolors; ++pixel ) { - while ( SDL_iconcolors[pixel] > 0 ) { - XFreeColors(SDL_Display, - SDL_DisplayColormap,&pixel,1,0); - --SDL_iconcolors[pixel]; - } - } - free(SDL_iconcolors); - SDL_iconcolors = NULL; - } -*/ /* Free that blank cursor */ if ( SDL_BlankCursor != NULL ) { FreeMem(SDL_BlankCursor,16); @@ -1422,6 +1362,8 @@ /* Close the X11 graphics connection */ this->hidden->same_format=0; + D(bug("Destroying screen...\n")); + if ( GFX_Display != NULL ) DestroyScreen(this); @@ -1431,19 +1373,18 @@ /* Unload GL library after X11 shuts down */ } - if( CyberGfxBase) - { + D(bug("Closing libraries...\n")); + + if( CyberGfxBase) { CloseLibrary(CyberGfxBase); CyberGfxBase=NULL; } - if (IntuitionBase) - { + if (IntuitionBase) { CloseLibrary((struct Library *)IntuitionBase); IntuitionBase=NULL; } - if (GfxBase) - { + if (GfxBase) { CloseLibrary((struct Library *)GfxBase); GfxBase=NULL; } @@ -1452,5 +1393,7 @@ /* Direct screen access, no memory buffer */ this->screen->pixels = NULL; } + D(bug("End of CGX_VideoQuit.\n")); + }