SDL-mirror/src/video/cybergfx/SDL_cgxmodes.c
Sam Lantinga 0f030a1802 SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%401938
2006-07-10 21:04:37 +00:00

334 lines
9.1 KiB
C

/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2006 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
/* Utilities for getting and setting the X display mode */
#include "SDL_timer.h"
#include "SDL_events.h"
#include "../../events/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,
SA_ShowTitle, FALSE, TAG_DONE);
}
}
static void
get_real_resolution(_THIS, int *w, int *h)
{
*w = /*SDL_Display->Width */ SDL_Window->Width - SDL_Window->BorderLeft -
SDL_Window->BorderRight;
*h = /*SDL_Display->Height */ SDL_Window->Height -
SDL_Window->BorderBottom - SDL_Window->BorderTop;
}
static void
move_cursor_to(_THIS, int x, int y)
{
/* XWarpPointer(SDL_Display, None, SDL_Root, 0, 0, 0, 0, x, y); */
/* DA FARE! */
}
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 **) SDL_realloc(SDL_modelist,
(nmodes +
1) *
sizeof(SDL_Rect *));
SDL_modelist[nmodes] = NULL;
if (SDL_modelist) {
SDL_modelist[nmodes - 1] = (SDL_Rect *)
SDL_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 **) SDL_malloc((1 + 1) * sizeof(SDL_Rect *));
i = 0;
if (SDL_modelist) {
SDL_modelist[i] = (SDL_Rect *) SDL_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) {
SDL_free(SDL_modelist[i]);
}
SDL_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;
Uint32 saved_flags;
okay = 1;
saved_flags = this->screen->flags;
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);
currently_fullscreen = 1;
this->screen->flags = saved_flags;
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);
}
/* vi: set ts=4 sw=4 expandtab: */