diff src/video/ggi/SDL_ggivideo.c @ 1662:782fd950bd46 SDL-1.3

Revamp of the video system in progress - adding support for multiple displays, multiple windows, and a full video mode selection API. WARNING: None of the video drivers have been updated for the new API yet! The API is still under design and very fluid. The code is now run through a consistent indent format: indent -i4 -nut -nsc -br -ce The headers are being converted to automatically generate doxygen documentation.
author Sam Lantinga <slouken@libsdl.org>
date Sun, 28 May 2006 13:04:16 +0000
parents 8d9bb0cf2c2a
children 4da1ee79c9af
line wrap: on
line diff
--- a/src/video/ggi/SDL_ggivideo.c	Sun May 21 17:27:13 2006 +0000
+++ b/src/video/ggi/SDL_ggivideo.c	Sun May 28 13:04:16 2006 +0000
@@ -43,336 +43,358 @@
 
 struct private_hwdata
 {
-	ggi_visual_t vis;
+    ggi_visual_t vis;
 };
 
 ggi_visual_t VIS;
 
 /* Initialization/Query functions */
-static int GGI_VideoInit(_THIS, SDL_PixelFormat *vformat);
-static SDL_Rect **GGI_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags);
-static SDL_Surface *GGI_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags);
-static int GGI_SetColors(_THIS, int firstcolor, int ncolors,
-			 SDL_Color *colors);
-static void GGI_VideoQuit(_THIS);
+static int GGI_VideoInit (_THIS, SDL_PixelFormat * vformat);
+static SDL_Rect **GGI_ListModes (_THIS, SDL_PixelFormat * format,
+                                 Uint32 flags);
+static SDL_Surface *GGI_SetVideoMode (_THIS, SDL_Surface * current, int width,
+                                      int height, int bpp, Uint32 flags);
+static int GGI_SetColors (_THIS, int firstcolor, int ncolors,
+                          SDL_Color * colors);
+static void GGI_VideoQuit (_THIS);
 
 /* Hardware surface functions */
-static int GGI_AllocHWSurface(_THIS, SDL_Surface *surface);
-static int GGI_LockHWSurface(_THIS, SDL_Surface *surface);
-static void GGI_UnlockHWSurface(_THIS, SDL_Surface *surface);
-static void GGI_FreeHWSurface(_THIS, SDL_Surface *surface);
+static int GGI_AllocHWSurface (_THIS, SDL_Surface * surface);
+static int GGI_LockHWSurface (_THIS, SDL_Surface * surface);
+static void GGI_UnlockHWSurface (_THIS, SDL_Surface * surface);
+static void GGI_FreeHWSurface (_THIS, SDL_Surface * surface);
 
 /* GGI driver bootstrap functions */
 
-static int GGI_Available(void)
+static int
+GGI_Available (void)
 {
-	ggi_visual_t *vis;
+    ggi_visual_t *vis;
 
-	vis = NULL;
-	if (ggiInit() == 0) {
-		vis = ggiOpen(NULL);
-		if (vis != NULL) {
-			ggiClose(vis);
-		}
-	}
-	return (vis != NULL);
+    vis = NULL;
+    if (ggiInit () == 0) {
+        vis = ggiOpen (NULL);
+        if (vis != NULL) {
+            ggiClose (vis);
+        }
+    }
+    return (vis != NULL);
 }
 
-static void GGI_DeleteDevice(SDL_VideoDevice *device)
+static void
+GGI_DeleteDevice (SDL_VideoDevice * device)
 {
-	SDL_free(device->hidden);
-	SDL_free(device);
+    SDL_free (device->hidden);
+    SDL_free (device);
 }
 
-static SDL_VideoDevice *GGI_CreateDevice(int devindex)
+static SDL_VideoDevice *
+GGI_CreateDevice (int devindex)
 {
-	SDL_VideoDevice *device;
+    SDL_VideoDevice *device;
 
-	/* Initialize all variables that we clean on shutdown */
-	device = (SDL_VideoDevice *)SDL_malloc(sizeof(SDL_VideoDevice));
-	if ( device ) {
-		SDL_memset(device, 0, (sizeof *device));
-		device->hidden = (struct SDL_PrivateVideoData *)
-				SDL_malloc((sizeof *device->hidden));
-	}
-	if ( (device == NULL) || (device->hidden == NULL) ) {
-		SDL_OutOfMemory();
-		if ( device ) {
-			SDL_free(device);
-		}
-		return(0);
-	}
-	SDL_memset(device->hidden, 0, (sizeof *device->hidden));
+    /* Initialize all variables that we clean on shutdown */
+    device = (SDL_VideoDevice *) SDL_malloc (sizeof (SDL_VideoDevice));
+    if (device) {
+        SDL_memset (device, 0, (sizeof *device));
+        device->hidden = (struct SDL_PrivateVideoData *)
+            SDL_malloc ((sizeof *device->hidden));
+    }
+    if ((device == NULL) || (device->hidden == NULL)) {
+        SDL_OutOfMemory ();
+        if (device) {
+            SDL_free (device);
+        }
+        return (0);
+    }
+    SDL_memset (device->hidden, 0, (sizeof *device->hidden));
 
-	/* Set the function pointers */
-	device->VideoInit = GGI_VideoInit;
-	device->ListModes = GGI_ListModes;
-	device->SetVideoMode = GGI_SetVideoMode;
-	device->SetColors = GGI_SetColors;
-	device->UpdateRects = NULL;
-	device->VideoQuit = GGI_VideoQuit;
-	device->AllocHWSurface = GGI_AllocHWSurface;
-	device->CheckHWBlit = NULL;
-	device->FillHWRect = NULL;
-	device->SetHWColorKey = NULL;
-	device->SetHWAlpha = NULL;
-	device->LockHWSurface = GGI_LockHWSurface;
-	device->UnlockHWSurface = GGI_UnlockHWSurface;
-	device->FlipHWSurface = NULL;
-	device->FreeHWSurface = GGI_FreeHWSurface;
-	device->SetCaption = NULL;
-	device->SetIcon = NULL;
-	device->IconifyWindow = NULL;
-	device->GrabInput = NULL;
-	device->GetWMInfo = NULL;
-	device->InitOSKeymap = GGI_InitOSKeymap;
-	device->PumpEvents = GGI_PumpEvents;
+    /* Set the function pointers */
+    device->VideoInit = GGI_VideoInit;
+    device->ListModes = GGI_ListModes;
+    device->SetVideoMode = GGI_SetVideoMode;
+    device->SetColors = GGI_SetColors;
+    device->UpdateRects = NULL;
+    device->VideoQuit = GGI_VideoQuit;
+    device->AllocHWSurface = GGI_AllocHWSurface;
+    device->CheckHWBlit = NULL;
+    device->FillHWRect = NULL;
+    device->SetHWColorKey = NULL;
+    device->SetHWAlpha = NULL;
+    device->LockHWSurface = GGI_LockHWSurface;
+    device->UnlockHWSurface = GGI_UnlockHWSurface;
+    device->FlipHWSurface = NULL;
+    device->FreeHWSurface = GGI_FreeHWSurface;
+    device->SetCaption = NULL;
+    device->SetIcon = NULL;
+    device->IconifyWindow = NULL;
+    device->GrabInput = NULL;
+    device->GetWMInfo = NULL;
+    device->InitOSKeymap = GGI_InitOSKeymap;
+    device->PumpEvents = GGI_PumpEvents;
 
-	device->free = GGI_DeleteDevice;
+    device->free = GGI_DeleteDevice;
 
-	return device;
+    return device;
 }
 
 VideoBootStrap GGI_bootstrap = {
-	"ggi", "General Graphics Interface (GGI)",
-	GGI_Available, GGI_CreateDevice
+    "ggi", "General Graphics Interface (GGI)",
+    GGI_Available, GGI_CreateDevice
 };
 
 
 static SDL_Rect video_mode;
 static SDL_Rect *SDL_modelist[4] = { NULL, NULL, NULL, NULL };
 
-int GGI_VideoInit(_THIS, SDL_PixelFormat *vformat)
+int
+GGI_VideoInit (_THIS, SDL_PixelFormat * vformat)
 {
-	ggi_mode mode =
-	{
-		1,
-		{ GGI_AUTO, GGI_AUTO },
-		{ GGI_AUTO, GGI_AUTO },
-		{ 0, 0 },
-		GT_AUTO,
-		{ GGI_AUTO, GGI_AUTO }
-	};	
-	struct private_hwdata *priv;
-	ggi_color pal[256], map[256];
-	const ggi_directbuffer *db;
-	int err, num_bufs;
-	ggi_pixel white, black;
-	
-	priv = SDL_malloc(sizeof(struct private_hwdata));
-	if (priv == NULL)
-	{
-		SDL_SetError("Unhandled GGI mode type!\n");
-		GGI_VideoQuit(NULL);
-	}
-	
-	if (ggiInit() != 0)
-	{
-		SDL_SetError("Unable to initialize GGI!\n");
-		GGI_VideoQuit(NULL);
-	}
-	
-	VIS = ggiOpen(NULL);
-	if (VIS == NULL)
-	{
-		SDL_SetError("Unable to open default GGI visual!\n");
-		ggiExit();
-		GGI_VideoQuit(NULL);
-	}
-	
-	ggiSetFlags(VIS, GGIFLAG_ASYNC);
-	
-	/* Validate mode, autodetecting any GGI_AUTO or GT_AUTO fields */
-	ggiCheckMode(VIS, &mode);
-	
-	/* At this point we should have a valid mode - try to set it */
-	err = ggiSetMode(VIS, &mode);
-	
-	/* If we couldn't set _any_ modes, something is very wrong */
-	if (err)
-	{
-		SDL_SetError("Can't set a mode!\n");
-		ggiClose(VIS);
-		ggiExit();
-		GGI_VideoQuit(NULL);
-	}
+    ggi_mode mode = {
+        1,
+        {GGI_AUTO, GGI_AUTO},
+        {GGI_AUTO, GGI_AUTO},
+        {0, 0},
+        GT_AUTO,
+        {GGI_AUTO, GGI_AUTO}
+    };
+    struct private_hwdata *priv;
+    ggi_color pal[256], map[256];
+    const ggi_directbuffer *db;
+    int err, num_bufs;
+    ggi_pixel white, black;
+
+    priv = SDL_malloc (sizeof (struct private_hwdata));
+    if (priv == NULL) {
+        SDL_SetError ("Unhandled GGI mode type!\n");
+        GGI_VideoQuit (NULL);
+    }
+
+    if (ggiInit () != 0) {
+        SDL_SetError ("Unable to initialize GGI!\n");
+        GGI_VideoQuit (NULL);
+    }
+
+    VIS = ggiOpen (NULL);
+    if (VIS == NULL) {
+        SDL_SetError ("Unable to open default GGI visual!\n");
+        ggiExit ();
+        GGI_VideoQuit (NULL);
+    }
+
+    ggiSetFlags (VIS, GGIFLAG_ASYNC);
+
+    /* Validate mode, autodetecting any GGI_AUTO or GT_AUTO fields */
+    ggiCheckMode (VIS, &mode);
+
+    /* At this point we should have a valid mode - try to set it */
+    err = ggiSetMode (VIS, &mode);
 
-	/* Determine the current screen size */
-	this->info.current_w = mode.virt.x;
-	this->info.current_h = mode.virt.y;
+    /* If we couldn't set _any_ modes, something is very wrong */
+    if (err) {
+        SDL_SetError ("Can't set a mode!\n");
+        ggiClose (VIS);
+        ggiExit ();
+        GGI_VideoQuit (NULL);
+    }
 
-	/* Set a palette for palletized modes */
-	if (GT_SCHEME(mode.graphtype) == GT_PALETTE)
-	{
-		ggiSetColorfulPalette(VIS);
-		ggiGetPalette(VIS, 0, 1 << vformat->BitsPerPixel, pal);
-	}
-	
-	/* Now we try to get the DirectBuffer info, which determines whether
-	 * SDL can access hardware surfaces directly. */
-	
-	num_bufs = ggiDBGetNumBuffers(VIS);
+    /* Determine the current screen size */
+    this->info.current_w = mode.virt.x;
+    this->info.current_h = mode.virt.y;
+
+    /* Set a palette for palletized modes */
+    if (GT_SCHEME (mode.graphtype) == GT_PALETTE) {
+        ggiSetColorfulPalette (VIS);
+        ggiGetPalette (VIS, 0, 1 << vformat->BitsPerPixel, pal);
+    }
+
+    /* Now we try to get the DirectBuffer info, which determines whether
+     * SDL can access hardware surfaces directly. */
+
+    num_bufs = ggiDBGetNumBuffers (VIS);
 
-	if (num_bufs > 0)
-	{
-		db = ggiDBGetBuffer(VIS, 0); /* Only handle one DB for now */
-		
-		vformat->BitsPerPixel = db->buffer.plb.pixelformat->depth;
-		
-		vformat->Rmask = db->buffer.plb.pixelformat->red_mask;
-		vformat->Gmask = db->buffer.plb.pixelformat->green_mask;
-		vformat->Bmask = db->buffer.plb.pixelformat->blue_mask;
-		
-		/* Fill in our hardware acceleration capabilities */
-	
-		this->info.wm_available = 0;
-		this->info.hw_available = 1;
-		this->info.video_mem = db->buffer.plb.stride * mode.virt.y;
-	}
+    if (num_bufs > 0) {
+        db = ggiDBGetBuffer (VIS, 0);   /* Only handle one DB for now */
+
+        vformat->BitsPerPixel = db->buffer.plb.pixelformat->depth;
+
+        vformat->Rmask = db->buffer.plb.pixelformat->red_mask;
+        vformat->Gmask = db->buffer.plb.pixelformat->green_mask;
+        vformat->Bmask = db->buffer.plb.pixelformat->blue_mask;
+
+        /* Fill in our hardware acceleration capabilities */
 
-	video_mode.x = 0;
-	video_mode.y = 0;
-	video_mode.w = mode.virt.x;
-	video_mode.h = mode.virt.y;
-	SDL_modelist[((vformat->BitsPerPixel + 7) / 8) - 1] = &video_mode;
+        this->info.wm_available = 0;
+        this->info.hw_available = 1;
+        this->info.video_mem = db->buffer.plb.stride * mode.virt.y;
+    }
 
-	/* We're done! */
-	return(0);
+    video_mode.x = 0;
+    video_mode.y = 0;
+    video_mode.w = mode.virt.x;
+    video_mode.h = mode.virt.y;
+    SDL_modelist[((vformat->BitsPerPixel + 7) / 8) - 1] = &video_mode;
+
+    /* We're done! */
+    return (0);
 }
 
-static SDL_Rect **GGI_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags)
+static SDL_Rect **
+GGI_ListModes (_THIS, SDL_PixelFormat * format, Uint32 flags)
 {
-	return(&SDL_modelist[((format->BitsPerPixel + 7) / 8) - 1]);
+    return (&SDL_modelist[((format->BitsPerPixel + 7) / 8) - 1]);
 }
 
 /* Various screen update functions available */
-static void GGI_DirectUpdate(_THIS, int numrects, SDL_Rect *rects);
+static void GGI_DirectUpdate (_THIS, int numrects, SDL_Rect * rects);
 
-SDL_Surface *GGI_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags)
+SDL_Surface *
+GGI_SetVideoMode (_THIS, SDL_Surface * current, int width, int height,
+                  int bpp, Uint32 flags)
 {
-	ggi_mode mode =
-	{
-		1,
-		{ GGI_AUTO, GGI_AUTO },
-		{ GGI_AUTO, GGI_AUTO },
-		{ 0, 0 },
-		GT_AUTO,
-		{ GGI_AUTO, GGI_AUTO }
-	};
-        const ggi_directbuffer *db;
-	ggi_color pal[256];
-	int err;
+    ggi_mode mode = {
+        1,
+        {GGI_AUTO, GGI_AUTO},
+        {GGI_AUTO, GGI_AUTO},
+        {0, 0},
+        GT_AUTO,
+        {GGI_AUTO, GGI_AUTO}
+    };
+    const ggi_directbuffer *db;
+    ggi_color pal[256];
+    int err;
+
+    fprintf (stderr, "GGI_SetVideoMode()\n");
+
+    mode.visible.x = mode.virt.x = width;
+    mode.visible.y = mode.virt.y = height;
 
-	fprintf(stderr, "GGI_SetVideoMode()\n");
-	
-	mode.visible.x = mode.virt.x = width;
-	mode.visible.y = mode.virt.y = height;
-	
-	/* Translate requested SDL bit depth into a GGI mode */	
-	switch (bpp)
-	{
-		case 1:  mode.graphtype = GT_1BIT;  break;
-		case 2:  mode.graphtype = GT_2BIT;  break;
-		case 4:  mode.graphtype = GT_4BIT;  break;
-		case 8:  mode.graphtype = GT_8BIT;  break;
-		case 15: mode.graphtype = GT_15BIT; break;
-		case 16: mode.graphtype = GT_16BIT; break;
-		case 24: mode.graphtype = GT_24BIT; break;
-		case 32: mode.graphtype = GT_32BIT; break;
-		default:
-		SDL_SetError("Unknown SDL bit depth, using GT_AUTO....\n");
-		mode.graphtype = GT_AUTO;
-	}
-	
-	/* Validate mode, autodetecting any GGI_AUTO or GT_AUTO fields */
-	ggiCheckMode(VIS, &mode);
-	
-	/* At this point we should have a valid mode - try to set it */
-	err = ggiSetMode(VIS, &mode);
+    /* Translate requested SDL bit depth into a GGI mode */
+    switch (bpp) {
+    case 1:
+        mode.graphtype = GT_1BIT;
+        break;
+    case 2:
+        mode.graphtype = GT_2BIT;
+        break;
+    case 4:
+        mode.graphtype = GT_4BIT;
+        break;
+    case 8:
+        mode.graphtype = GT_8BIT;
+        break;
+    case 15:
+        mode.graphtype = GT_15BIT;
+        break;
+    case 16:
+        mode.graphtype = GT_16BIT;
+        break;
+    case 24:
+        mode.graphtype = GT_24BIT;
+        break;
+    case 32:
+        mode.graphtype = GT_32BIT;
+        break;
+    default:
+        SDL_SetError ("Unknown SDL bit depth, using GT_AUTO....\n");
+        mode.graphtype = GT_AUTO;
+    }
 
-	/* If we couldn't set _any_ modes, something is very wrong */
-	if (err)
-	{
-		SDL_SetError("Can't set a mode!\n");
-		ggiClose(VIS);
-		ggiExit();
-		GGI_VideoQuit(NULL);
-	}
-	
-	/* Set a palette for palletized modes */
-	if (GT_SCHEME(mode.graphtype) == GT_PALETTE)
-	{
-		ggiSetColorfulPalette(VIS);
-		ggiGetPalette(VIS, 0, 1 << bpp, pal);
-	}
-	
-	db = ggiDBGetBuffer(VIS, 0);
-	
-	/* Set up the new mode framebuffer */
-	current->flags = (SDL_FULLSCREEN | SDL_HWSURFACE);
-	current->w = mode.virt.x;
-	current->h = mode.virt.y;
-	current->pitch = db->buffer.plb.stride;
-	current->pixels = db->read;
+    /* Validate mode, autodetecting any GGI_AUTO or GT_AUTO fields */
+    ggiCheckMode (VIS, &mode);
+
+    /* At this point we should have a valid mode - try to set it */
+    err = ggiSetMode (VIS, &mode);
+
+    /* If we couldn't set _any_ modes, something is very wrong */
+    if (err) {
+        SDL_SetError ("Can't set a mode!\n");
+        ggiClose (VIS);
+        ggiExit ();
+        GGI_VideoQuit (NULL);
+    }
 
-	/* Set the blit function */
-	this->UpdateRects = GGI_DirectUpdate;
+    /* Set a palette for palletized modes */
+    if (GT_SCHEME (mode.graphtype) == GT_PALETTE) {
+        ggiSetColorfulPalette (VIS);
+        ggiGetPalette (VIS, 0, 1 << bpp, pal);
+    }
+
+    db = ggiDBGetBuffer (VIS, 0);
 
-	/* We're done */
-	return(current);
+    /* Set up the new mode framebuffer */
+    current->flags = (SDL_FULLSCREEN | SDL_HWSURFACE);
+    current->w = mode.virt.x;
+    current->h = mode.virt.y;
+    current->pitch = db->buffer.plb.stride;
+    current->pixels = db->read;
+
+    /* Set the blit function */
+    this->UpdateRects = GGI_DirectUpdate;
+
+    /* We're done */
+    return (current);
 }
 
-static int GGI_AllocHWSurface(_THIS, SDL_Surface *surface)
+static int
+GGI_AllocHWSurface (_THIS, SDL_Surface * surface)
 {
-	return(-1);
+    return (-1);
 }
-static void GGI_FreeHWSurface(_THIS, SDL_Surface *surface)
+static void
+GGI_FreeHWSurface (_THIS, SDL_Surface * surface)
 {
-	return;
+    return;
 }
-static int GGI_LockHWSurface(_THIS, SDL_Surface *surface)
+static int
+GGI_LockHWSurface (_THIS, SDL_Surface * surface)
 {
-	return(0);
+    return (0);
 }
-static void GGI_UnlockHWSurface(_THIS, SDL_Surface *surface)
+static void
+GGI_UnlockHWSurface (_THIS, SDL_Surface * surface)
 {
-	return;
+    return;
 }
 
-static void GGI_DirectUpdate(_THIS, int numrects, SDL_Rect *rects)
+static void
+GGI_DirectUpdate (_THIS, int numrects, SDL_Rect * rects)
 {
-	int i;
-	
+    int i;
+
 /*	ggiFlush(VIS); */
-	
-	for (i = 0; i < numrects; i++)
-	{
-		ggiFlushRegion(VIS, rects[i].x, rects[i].y, rects[i].w, rects[i].h);
-	}
-	return;
+
+    for (i = 0; i < numrects; i++) {
+        ggiFlushRegion (VIS, rects[i].x, rects[i].y, rects[i].w, rects[i].h);
+    }
+    return;
 }
 
-int GGI_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors)
+int
+GGI_SetColors (_THIS, int firstcolor, int ncolors, SDL_Color * colors)
 {
-	int i;
-	ggi_color pal[256];
+    int i;
+    ggi_color pal[256];
 
-	/* Set up the colormap */
-	for (i = 0; i < ncolors; i++)
-	{
-		pal[i].r = (colors[i].r << 8) | colors[i].r;
-		pal[i].g = (colors[i].g << 8) | colors[i].g;
-		pal[i].b = (colors[i].b << 8) | colors[i].b;
-	}
-	
-	ggiSetPalette(VIS, firstcolor, ncolors, pal);
-	
-	return 1;
+    /* Set up the colormap */
+    for (i = 0; i < ncolors; i++) {
+        pal[i].r = (colors[i].r << 8) | colors[i].r;
+        pal[i].g = (colors[i].g << 8) | colors[i].g;
+        pal[i].b = (colors[i].b << 8) | colors[i].b;
+    }
+
+    ggiSetPalette (VIS, firstcolor, ncolors, pal);
+
+    return 1;
 }
-	
-void GGI_VideoQuit(_THIS)
+
+void
+GGI_VideoQuit (_THIS)
 {
 }
-void GGI_FinalQuit(void) 
+void
+GGI_FinalQuit (void)
 {
 }
+
+/* vi: set ts=4 sw=4 expandtab: */