diff src/video/cybergfx/SDL_cgxmodes.c @ 0:74212992fb08

Initial revision
author Sam Lantinga <slouken@lokigames.com>
date Thu, 26 Apr 2001 16:45:43 +0000
parents
children 75a95f82bc1f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/cybergfx/SDL_cgxmodes.c	Thu Apr 26 16:45:43 2001 +0000
@@ -0,0 +1,331 @@
+/*
+    SDL - Simple DirectMedia Layer
+    Copyright (C) 1997, 1998, 1999, 2000, 2001  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@devolution.com
+*/
+
+#ifdef SAVE_RCSID
+static char rcsid =
+ "@(#) $Id$";
+#endif
+
+/* Utilities for getting and setting the X display mode */
+
+/*
+#include <stdlib.h>
+#include <string.h>
+*/
+
+#include "SDL_timer.h"
+#include "SDL_error.h"
+#include "SDL_events.h"
+#include "SDL_events_c.h"
+#include "SDL_cgxvideo.h"
+#include "SDL_cgxwm_c.h"
+#include "SDL_cgxmodes_c.h"
+
+#define CGX_DEBUG
+
+static void set_best_resolution(_THIS, int width, int height)
+{
+	Uint32 idok;
+	int depth=8;
+
+	if(SDL_Display)
+		depth=GetCyberMapAttr(SDL_Display->RastPort.BitMap,CYBRMATTR_DEPTH);
+
+	idok=BestCModeIDTags(CYBRBIDTG_NominalWidth,width,
+				CYBRBIDTG_NominalHeight,height,
+				CYBRBIDTG_Depth,depth,
+				TAG_DONE);
+
+	if(idok!=INVALID_ID)
+	{
+		if(SDL_Display)
+		{
+			if(currently_fullscreen)
+				CloseScreen(SDL_Display);
+			else
+				UnlockPubScreen(NULL,SDL_Display);
+		}
+		SDL_Display=GFX_Display=OpenScreenTags(NULL,SA_Width,width,SA_Height,height,
+											SA_Depth,depth,SA_DisplayID,idok,
+											TAG_DONE);
+	}
+}
+
+static void get_real_resolution(_THIS, int* w, int* h)
+{
+    *w = SDL_Display->Width;
+    *h = SDL_Display->Height;
+}
+
+static void add_visual(_THIS, int depth, int class)
+{
+	Uint32 tID;
+
+	tID=BestCModeIDTags(CYBRBIDTG_Depth,depth,
+						CYBRBIDTG_NominalWidth,640,
+						CYBRBIDTG_NominalHeight,480,
+						TAG_DONE);
+
+	if(tID!=INVALID_ID)
+	{
+		int n = this->hidden->nvisuals;
+
+		this->hidden->visuals[n].depth = depth;
+		this->hidden->visuals[n].visual = tID;
+		this->hidden->visuals[n].bpp = GetCyberIDAttr(CYBRIDATTR_BPPIX,tID);
+		this->hidden->nvisuals++;
+	}
+}
+
+#define TrueColor 1
+#define PseudoColor 2
+
+int CGX_GetVideoModes(_THIS)
+{
+    int i;
+	ULONG nextid;
+	int nmodes=0;
+
+	SDL_modelist=NULL;
+
+	nextid=NextDisplayInfo(INVALID_ID);
+
+	while(nextid!=INVALID_ID)
+	{
+		if(IsCyberModeID(nextid))
+		{
+			DisplayInfoHandle h;
+
+			if(h=FindDisplayInfo(nextid))
+			{
+				struct DimensionInfo info;
+
+				if(GetDisplayInfoData(h,(char *)&info,sizeof(struct DimensionInfo),DTAG_DIMS,NULL))
+				{
+					int ok=0;
+
+					for(i=0;i<nmodes;i++)
+					{
+						if(	SDL_modelist[i]->w == (info.Nominal.MaxX+1) &&
+							SDL_modelist[i]->h == (info.Nominal.MaxY+1) )
+							ok=1;
+					}
+
+					if(!ok)
+					{
+						nmodes++;
+
+						SDL_modelist = (SDL_Rect **)realloc(SDL_modelist,(nmodes+1)*sizeof(SDL_Rect *));
+						SDL_modelist[nmodes]=NULL;
+
+						if ( SDL_modelist ) 
+						{
+							SDL_modelist[nmodes-1] = (SDL_Rect *)malloc(sizeof(SDL_Rect));
+
+							if ( SDL_modelist[nmodes-1] == NULL ) 
+								break;
+
+							SDL_modelist[nmodes-1]->x = 0;
+							SDL_modelist[nmodes-1]->y = 0;
+							SDL_modelist[nmodes-1]->w = info.Nominal.MaxX+1;
+							SDL_modelist[nmodes-1]->h = info.Nominal.MaxY+1;
+						}
+					}																	
+				}
+			}
+		}
+		nextid=NextDisplayInfo(nextid);
+	}
+
+
+	this->hidden->nvisuals = 0;
+	/* Search for the visuals in deepest-first order, so that the first
+	   will be the richest one */
+	add_visual(this, 32, TrueColor);
+	add_visual(this, 24, TrueColor);
+	add_visual(this, 16, TrueColor);
+	add_visual(this, 15, TrueColor);
+	add_visual(this, 8, PseudoColor);
+
+	if(this->hidden->nvisuals == 0) {
+	    SDL_SetError("Found no sufficiently capable CGX visuals");
+		    return -1;
+	}
+
+    if ( SDL_modelist == NULL ) {
+        SDL_modelist = (SDL_Rect **)malloc((1+1)*sizeof(SDL_Rect *));
+        i = 0;
+        if ( SDL_modelist ) {
+            SDL_modelist[i] = (SDL_Rect *)malloc(sizeof(SDL_Rect));
+            if ( SDL_modelist[i] ) {
+                SDL_modelist[i]->x = 0;
+                SDL_modelist[i]->y = 0;
+                SDL_modelist[i]->w = SDL_Display->Width;
+                SDL_modelist[i]->h = SDL_Display->Height;
+                ++i;
+            }
+            SDL_modelist[i] = NULL;
+        }
+    }
+
+    D( if ( SDL_modelist ) {
+        bug("CGX video mode list: (%ld)\n",nmodes);
+        for ( i=0; SDL_modelist[i]; ++i ) {
+            bug( "\t%ld x %ld\n",
+                SDL_modelist[i]->w, SDL_modelist[i]->h);
+        }
+    	}
+    );
+
+    D(  { bug("CGX visuals list: (%ld)\n",this->hidden->nvisuals);
+
+	for(i=0;i<this->hidden->nvisuals;i++)
+		bug("\t%lx - depth: %ld bpp: %ld\n",this->hidden->visuals[i].visual,this->hidden->visuals[i].depth,this->hidden->visuals[i].bpp);
+	}
+    );
+    return 0;
+}
+
+int CGX_SupportedVisual(_THIS, SDL_PixelFormat *format)
+{
+    int i;
+    for(i = 0; i < this->hidden->nvisuals; i++)
+	{
+		if(this->hidden->visuals[i].depth == format->BitsPerPixel) // Era bpp
+		    return 1;
+	}
+    return 0;
+}
+
+SDL_Rect **CGX_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags)
+{
+    if ( CGX_SupportedVisual(this, format) ) {
+        if ( flags & SDL_FULLSCREEN ) {
+            return(SDL_modelist);
+        } else {
+            return((SDL_Rect **)-1);
+        }
+    } else {
+        return((SDL_Rect **)0);
+    }
+}
+
+void CGX_FreeVideoModes(_THIS)
+{
+    int i;
+
+    if ( SDL_modelist ) {
+        for ( i=0; SDL_modelist[i]; ++i ) {
+            free(SDL_modelist[i]);
+        }
+        free(SDL_modelist);
+        SDL_modelist = NULL;
+    }
+}
+
+int CGX_ResizeFullScreen(_THIS)
+{
+    int x, y;
+    int real_w, real_h;
+
+    if ( currently_fullscreen ) {
+/* Per ora non faccio nulla qui */
+    }
+    return(1);
+}
+
+void _QueueEnterFullScreen(_THIS)
+{
+}
+
+int CGX_EnterFullScreen(_THIS)
+{
+    int okay;
+
+    okay = 1;
+    if ( ! currently_fullscreen ) 
+	{
+        int real_w, real_h;
+
+        /* Map the fullscreen window to blank the screen */
+        get_real_resolution(this, &real_w, &real_h);
+		
+		CGX_DestroyWindow(this,this->screen);
+		set_best_resolution(this, real_w,real_h);
+
+        /* Grab the mouse on the fullscreen window
+           The event handling will know when we become active, and then
+           enter fullscreen mode if we can't grab the mouse this time.
+         */
+#if 0
+        if ( (XGrabPointer(SDL_Display, FSwindow, True, 0,
+                          GrabModeAsync, GrabModeAsync,
+                          FSwindow, None, CurrentTime) != GrabSuccess) ||
+             (XGrabKeyboard(SDL_Display, WMwindow, True,
+                          GrabModeAsync, GrabModeAsync, CurrentTime) != 0) ) {
+            XUnmapWindow(SDL_Display, FSwindow);
+            X11_WaitUnmapped(this, FSwindow);
+            X11_QueueEnterFullScreen(this);
+            return(0);
+        }
+#endif
+
+        currently_fullscreen = 1;
+
+		CGX_CreateWindow(this,this->screen,real_w,real_h,GetCyberMapAttr(SDL_Display->RastPort.BitMap,CYBRMATTR_DEPTH),this->screen->flags);
+
+        /* Set the new resolution */
+        okay = CGX_ResizeFullScreen(this);
+        if ( ! okay ) {
+            CGX_LeaveFullScreen(this);
+        }
+	/* Set the colormap */
+/*
+		if ( SDL_XColorMap ) {
+			XInstallColormap(SDL_Display, SDL_XColorMap);
+		}
+*/
+    }    
+//    CGX_GrabInputNoLock(this, this->input_grab | SDL_GRAB_FULLSCREEN);
+    return(okay);
+}
+
+int CGX_LeaveFullScreen(_THIS)
+{
+    if ( currently_fullscreen ) {
+		int width,height;
+		if ( SDL_Window ) {
+			CloseWindow(SDL_Window);
+			SDL_Window=NULL;
+		}
+		CloseScreen(SDL_Display);
+
+		GFX_Display=SDL_Display=LockPubScreen(NULL);
+
+	        currently_fullscreen = 0;
+
+		CGX_CreateWindow(this,this->screen,this->screen->w,this->screen->h,GetCyberMapAttr(SDL_Display->RastPort.BitMap,CYBRMATTR_DEPTH),this->screen->flags);
+		CGX_ResizeImage(this,this->screen,0L);
+    }
+
+    return(0);
+}