summaryrefslogtreecommitdiffstats
path: root/nebu/video/video_system.c
diff options
context:
space:
mode:
Diffstat (limited to 'nebu/video/video_system.c')
-rw-r--r--nebu/video/video_system.c112
1 files changed, 112 insertions, 0 deletions
diff --git a/nebu/video/video_system.c b/nebu/video/video_system.c
new file mode 100644
index 0000000..fdfcc56
--- /dev/null
+++ b/nebu/video/video_system.c
@@ -0,0 +1,112 @@
+#include "Nebu_video.h"
+
+#include "SDL.h"
+#include "SDL_opengl.h"
+
+static SDL_Surface *screen;
+static int width, height;
+static int flags;
+static int fullscreen;
+extern int video_initialized;
+
+void SystemSwapBuffers() {
+ SDL_GL_SwapBuffers();
+}
+
+void SystemInitWindow(int x, int y, int w, int h) {
+ width = w;
+ height = h;
+}
+
+void SystemInitDisplayMode(int f, unsigned char full) {
+ int bitdepth, zdepth;
+
+ flags = f;
+ fullscreen = full;
+ if(!video_initialized) {
+ if(SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) {
+ fprintf(stderr, "[system] can't initialize Video: %s\n", SDL_GetError());
+ exit(1); /* OK: critical, no visual */
+ }
+ }
+ if(flags & SYSTEM_DOUBLE)
+ SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1);
+
+ if(flags & SYSTEM_32_BIT) {
+ zdepth = 24;
+ bitdepth = 32;
+ } else {
+ zdepth = 16;
+ bitdepth = 16;
+ }
+ if(flags & SYSTEM_DEPTH)
+ SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, zdepth);
+ if(flags & SYSTEM_STENCIL)
+ SDL_GL_SetAttribute( SDL_GL_STENCIL_SIZE, 8);
+ else
+ SDL_GL_SetAttribute( SDL_GL_STENCIL_SIZE, 0);
+ video_initialized = 1;
+ /* FIXME: bitdepth value unused */
+}
+
+void SystemSetGamma(float red, float green, float blue) {
+ SDL_SetGamma(red, green, blue);
+}
+
+int SystemCreateWindow(char *name) {
+ int f = SDL_OPENGL;
+ if(fullscreen & SYSTEM_FULLSCREEN)
+ f |= SDL_FULLSCREEN;
+ if( (screen = SDL_SetVideoMode( width, height, 0, f )) == NULL ) {
+ fprintf(stderr, "[system] Couldn't set GL mode: %s\n", SDL_GetError());
+ exit(1); /* OK: critical, no visual */
+ }
+ SDL_WM_SetCaption("GLtron", "");
+ glClearColor(0,0,0,0);
+ glClear(GL_COLOR_BUFFER_BIT);
+ SDL_GL_SwapBuffers();
+ return 1;
+}
+
+void SystemDestroyWindow(int id) {
+ /* quit the video subsytem
+ * otherwise SDL can't create a new context on win32, if the stencil
+ * bits change
+ */
+ /* there used to be some problems (memory leaks, unprober driver unloading)
+ * caused by this, but I can't remember what they where
+ */
+
+ SDL_QuitSubSystem(SDL_INIT_VIDEO);
+ video_initialized = 0;
+}
+
+void SystemReshapeFunc(void(*reshape)(int, int)) {
+}
+
+int SystemWriteBMP(char *filename, int x, int y, unsigned char *pixels) {
+ /* this code is shamelessly stolen from Ray Kelm, but I believe he
+ put it in the public domain */
+ SDL_Surface *temp;
+ int i;
+
+ temp = SDL_CreateRGBSurface(SDL_SWSURFACE, x, y, 24,
+#if SDL_BYTEORDER == SDL_LIL_ENDIAN
+ 0x000000FF, 0x0000FF00, 0x00FF0000, 0
+#else
+ 0x00FF0000, 0x0000FF00, 0x000000FF, 0
+#endif
+ );
+
+ if (temp == NULL)
+ return -1;
+
+ for (i = 0; i < y; i++)
+ memcpy(((char *) temp->pixels) + temp->pitch * i,
+ pixels + 3 * x * (y - i - 1), x * 3);
+
+ SDL_SaveBMP(temp, filename);
+ SDL_FreeSurface(temp);
+ return 0;
+}
+