src/video/cybergfx/SDL_cgxmodes.c
author Sam Lantinga <slouken@libsdl.org>
Tue, 21 Feb 2006 08:46:50 +0000
changeset 1402 d910939febfa
parent 1361 19418e4422cb
child 1662 782fd950bd46
child 1895 c121d94672cb
permissions -rw-r--r--
Use consistent identifiers for the various platforms we support.
Make sure every source file includes SDL_config.h, so the proper system
headers are chosen.
     1 /*
     2     SDL - Simple DirectMedia Layer
     3     Copyright (C) 1997-2006 Sam Lantinga
     4 
     5     This library is free software; you can redistribute it and/or
     6     modify it under the terms of the GNU Lesser General Public
     7     License as published by the Free Software Foundation; either
     8     version 2.1 of the License, or (at your option) any later version.
     9 
    10     This library is distributed in the hope that it will be useful,
    11     but WITHOUT ANY WARRANTY; without even the implied warranty of
    12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    13     Lesser General Public License for more details.
    14 
    15     You should have received a copy of the GNU Lesser General Public
    16     License along with this library; if not, write to the Free Software
    17     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
    18 
    19     Sam Lantinga
    20     slouken@libsdl.org
    21 */
    22 #include "SDL_config.h"
    23 
    24 /* Utilities for getting and setting the X display mode */
    25 
    26 #include "SDL_timer.h"
    27 #include "SDL_events.h"
    28 #include "../../events/SDL_events_c.h"
    29 #include "SDL_cgxvideo.h"
    30 #include "SDL_cgxwm_c.h"
    31 #include "SDL_cgxmodes_c.h"
    32 
    33 #define CGX_DEBUG
    34 
    35 static void set_best_resolution(_THIS, int width, int height)
    36 {
    37 	Uint32 idok;
    38 	int depth=8;
    39 
    40 	if(SDL_Display)
    41 		depth=GetCyberMapAttr(SDL_Display->RastPort.BitMap,CYBRMATTR_DEPTH);
    42 
    43 	idok=BestCModeIDTags(CYBRBIDTG_NominalWidth,width,
    44 				CYBRBIDTG_NominalHeight,height,
    45 				CYBRBIDTG_Depth,depth,
    46 				TAG_DONE);
    47 
    48 	if(idok!=INVALID_ID)
    49 	{
    50 		if(SDL_Display)
    51 		{
    52 			if(currently_fullscreen)
    53 				CloseScreen(SDL_Display);
    54 			else
    55 				UnlockPubScreen(NULL,SDL_Display);
    56 		}
    57 		SDL_Display=GFX_Display=OpenScreenTags(NULL,SA_Width,width,SA_Height,height,
    58 											SA_Depth,depth,SA_DisplayID,idok,
    59 											SA_ShowTitle,FALSE,
    60 											TAG_DONE);
    61 	}
    62 }
    63 
    64 static void get_real_resolution(_THIS, int* w, int* h)
    65 {
    66     *w = /*SDL_Display->Width*/ SDL_Window->Width-SDL_Window->BorderLeft-SDL_Window->BorderRight;
    67     *h = /*SDL_Display->Height*/ SDL_Window->Height-SDL_Window->BorderBottom-SDL_Window->BorderTop;
    68 }
    69 
    70 static void move_cursor_to(_THIS, int x, int y)
    71 {
    72 /*    XWarpPointer(SDL_Display, None, SDL_Root, 0, 0, 0, 0, x, y); */
    73 
    74 /* DA FARE! */
    75 }
    76 
    77 static void add_visual(_THIS, int depth, int class)
    78 {
    79 	Uint32 tID;
    80 
    81 	tID=BestCModeIDTags(CYBRBIDTG_Depth,depth,
    82 						CYBRBIDTG_NominalWidth,640,
    83 						CYBRBIDTG_NominalHeight,480,
    84 						TAG_DONE);
    85 
    86 	if(tID!=INVALID_ID)
    87 	{
    88 		int n = this->hidden->nvisuals;
    89 
    90 		this->hidden->visuals[n].depth = depth;
    91 		this->hidden->visuals[n].visual = tID;
    92 		this->hidden->visuals[n].bpp = GetCyberIDAttr(CYBRIDATTR_BPPIX,tID);
    93 		this->hidden->nvisuals++;
    94 	}
    95 }
    96 
    97 #define TrueColor 1
    98 #define PseudoColor 2
    99 
   100 int CGX_GetVideoModes(_THIS)
   101 {
   102     int i;
   103 	ULONG nextid;
   104 	int nmodes=0;
   105 
   106 	SDL_modelist=NULL;
   107 
   108 	nextid=NextDisplayInfo(INVALID_ID);
   109 
   110 	while(nextid!=INVALID_ID)
   111 	{
   112 		if(IsCyberModeID(nextid))
   113 		{
   114 			DisplayInfoHandle h;
   115 
   116 			if(h=FindDisplayInfo(nextid))
   117 			{
   118 				struct DimensionInfo info;
   119 
   120 				if(GetDisplayInfoData(h,(char *)&info,sizeof(struct DimensionInfo),DTAG_DIMS,NULL))
   121 				{
   122 					int ok=0;
   123 
   124 					for(i=0;i<nmodes;i++)
   125 					{
   126 						if(	SDL_modelist[i]->w == (info.Nominal.MaxX+1) &&
   127 							SDL_modelist[i]->h == (info.Nominal.MaxY+1) )
   128 							ok=1;
   129 					}
   130 
   131 					if(!ok)
   132 					{
   133 						nmodes++;
   134 
   135 						SDL_modelist = (SDL_Rect **)SDL_realloc(SDL_modelist,(nmodes+1)*sizeof(SDL_Rect *));
   136 						SDL_modelist[nmodes]=NULL;
   137 
   138 						if ( SDL_modelist )
   139 						{
   140 							SDL_modelist[nmodes-1] = (SDL_Rect *)SDL_malloc(sizeof(SDL_Rect));
   141 
   142 							if ( SDL_modelist[nmodes-1] == NULL )
   143 								break;
   144 
   145 							SDL_modelist[nmodes-1]->x = 0;
   146 							SDL_modelist[nmodes-1]->y = 0;
   147 							SDL_modelist[nmodes-1]->w = info.Nominal.MaxX+1;
   148 							SDL_modelist[nmodes-1]->h = info.Nominal.MaxY+1;
   149 						}
   150 					}
   151 				}
   152 			}
   153 		}
   154 		nextid=NextDisplayInfo(nextid);
   155 	}
   156 
   157 
   158 	this->hidden->nvisuals = 0;
   159 	/* Search for the visuals in deepest-first order, so that the first
   160 	   will be the richest one */
   161 	add_visual(this, 32, TrueColor);
   162 	add_visual(this, 24, TrueColor);
   163 	add_visual(this, 16, TrueColor);
   164 	add_visual(this, 15, TrueColor);
   165 	add_visual(this, 8, PseudoColor);
   166 
   167 	if(this->hidden->nvisuals == 0) {
   168 	    SDL_SetError("Found no sufficiently capable CGX visuals");
   169 		    return -1;
   170 	}
   171 
   172     if ( SDL_modelist == NULL ) {
   173         SDL_modelist = (SDL_Rect **)SDL_malloc((1+1)*sizeof(SDL_Rect *));
   174         i = 0;
   175         if ( SDL_modelist ) {
   176             SDL_modelist[i] = (SDL_Rect *)SDL_malloc(sizeof(SDL_Rect));
   177             if ( SDL_modelist[i] ) {
   178                 SDL_modelist[i]->x = 0;
   179                 SDL_modelist[i]->y = 0;
   180                 SDL_modelist[i]->w = SDL_Display->Width;
   181                 SDL_modelist[i]->h = SDL_Display->Height;
   182                 ++i;
   183             }
   184             SDL_modelist[i] = NULL;
   185         }
   186     }
   187 
   188     D( if ( SDL_modelist ) {
   189         bug("CGX video mode list: (%ld)\n",nmodes);
   190         for ( i=0; SDL_modelist[i]; ++i ) {
   191             bug( "\t%ld x %ld\n",
   192                 SDL_modelist[i]->w, SDL_modelist[i]->h);
   193         }
   194     	}
   195     );
   196 
   197     D(  { bug("CGX visuals list: (%ld)\n",this->hidden->nvisuals);
   198 
   199 	for(i=0;i<this->hidden->nvisuals;i++)
   200 		bug("\t%lx - depth: %ld bpp: %ld\n",this->hidden->visuals[i].visual,this->hidden->visuals[i].depth,this->hidden->visuals[i].bpp);
   201 	}
   202     );
   203     return 0;
   204 }
   205 
   206 int CGX_SupportedVisual(_THIS, SDL_PixelFormat *format)
   207 {
   208     int i;
   209     for(i = 0; i < this->hidden->nvisuals; i++)
   210 	{
   211 		if(this->hidden->visuals[i].depth == format->BitsPerPixel) // Era bpp
   212 		    return 1;
   213 	}
   214     return 0;
   215 }
   216 
   217 SDL_Rect **CGX_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags)
   218 {
   219     if ( CGX_SupportedVisual(this, format) ) {
   220         if ( flags & SDL_FULLSCREEN ) {
   221             return(SDL_modelist);
   222         } else {
   223             return((SDL_Rect **)-1);
   224         }
   225     } else {
   226         return((SDL_Rect **)0);
   227     }
   228 }
   229 
   230 void CGX_FreeVideoModes(_THIS)
   231 {
   232     int i;
   233 
   234     if ( SDL_modelist ) {
   235         for ( i=0; SDL_modelist[i]; ++i ) {
   236             SDL_free(SDL_modelist[i]);
   237         }
   238         SDL_free(SDL_modelist);
   239         SDL_modelist = NULL;
   240     }
   241 }
   242 
   243 int CGX_ResizeFullScreen(_THIS)
   244 {
   245     int x, y;
   246     int real_w, real_h;
   247 
   248     if ( currently_fullscreen ) {
   249 /* Per ora non faccio nulla qui */
   250     }
   251     return(1);
   252 }
   253 
   254 void _QueueEnterFullScreen(_THIS)
   255 {
   256 }
   257 
   258 int CGX_EnterFullScreen(_THIS)
   259 {
   260     int okay;
   261 	 Uint32 saved_flags;
   262 
   263     okay = 1;
   264     saved_flags = this->screen->flags;
   265 
   266     if ( ! currently_fullscreen )
   267 	{
   268         int real_w, real_h;
   269 
   270         /* Map the fullscreen window to blank the screen */
   271         get_real_resolution(this, &real_w, &real_h);
   272 
   273 		CGX_DestroyWindow(this,this->screen);
   274 		set_best_resolution(this, real_w,real_h);
   275 
   276         currently_fullscreen = 1;
   277 		  this->screen->flags = saved_flags;
   278 
   279 		  CGX_CreateWindow(this,this->screen,real_w,real_h,GetCyberMapAttr(SDL_Display->RastPort.BitMap,CYBRMATTR_DEPTH),this->screen->flags);
   280 
   281         /* Set the new resolution */
   282         okay = CGX_ResizeFullScreen(this);
   283         if ( ! okay ) {
   284             CGX_LeaveFullScreen(this);
   285         }
   286 	/* Set the colormap */
   287 /*
   288 		if ( SDL_XColorMap ) {
   289 			XInstallColormap(SDL_Display, SDL_XColorMap);
   290 		}
   291 */
   292     }
   293 //    CGX_GrabInputNoLock(this, this->input_grab | SDL_GRAB_FULLSCREEN);
   294     return(okay);
   295 }
   296 
   297 int CGX_LeaveFullScreen(_THIS)
   298 {
   299     if ( currently_fullscreen ) {
   300 		int width,height;
   301 		if ( SDL_Window ) {
   302 			CloseWindow(SDL_Window);
   303 			SDL_Window=NULL;
   304 		}
   305 		CloseScreen(SDL_Display);
   306 
   307 		GFX_Display=SDL_Display=LockPubScreen(NULL);
   308 
   309 	        currently_fullscreen = 0;
   310 
   311 		CGX_CreateWindow(this,this->screen,this->screen->w,this->screen->h,GetCyberMapAttr(SDL_Display->RastPort.BitMap,CYBRMATTR_DEPTH),this->screen->flags);
   312 		CGX_ResizeImage(this,this->screen,0L);
   313     }
   314 
   315     return(0);
   316 }