aboutsummaryrefslogtreecommitdiff
path: root/modules/mod_video/mod_video.c
diff options
context:
space:
mode:
Diffstat (limited to 'modules/mod_video/mod_video.c')
-rw-r--r--modules/mod_video/mod_video.c186
1 files changed, 186 insertions, 0 deletions
diff --git a/modules/mod_video/mod_video.c b/modules/mod_video/mod_video.c
new file mode 100644
index 0000000..4f90459
--- /dev/null
+++ b/modules/mod_video/mod_video.c
@@ -0,0 +1,186 @@
+/*
+ * Copyright © 2006-2016 SplinterGU (Fenix/Bennugd)
+ * Copyright © 2002-2006 Fenix Team (Fenix)
+ * Copyright © 1999-2002 José Luis Cebrián Pagüe (Fenix)
+ *
+ * This file is part of Bennu - Game Development
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ *
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ *
+ * 3. This notice may not be removed or altered from any source
+ * distribution.
+ *
+ */
+
+/* --------------------------------------------------------------------------- */
+
+#include <SDL.h>
+
+#include <stdlib.h>
+
+#include "bgdrtm.h"
+
+#include "libgrbase.h"
+#include "libvideo.h"
+#include "librender.h"
+
+#include "bgddl.h"
+#include "dlvaracc.h"
+
+/* --------------------------------------------------------------------------- */
+
+enum {
+ GRAPH_MODE = 0
+};
+
+/* --------------------------------------------------------------------------- */
+
+DLVARFIXUP __bgdexport( mod_video, globals_fixup )[] =
+{
+ /* Nombre de variable global, puntero al dato, tamaño del elemento, cantidad de elementos */
+ { "graph_mode" , NULL, -1, -1 },
+ { NULL , NULL, -1, -1 }
+};
+
+/* --------------------------------------------------------------------------- */
+
+/* Funciones de inicialización y carga */
+
+static int modvideo_set_mode( INSTANCE * my, int * params )
+{
+ return gr_set_mode( params[0] / 10000, params[0] % 10000, 0 ) ;
+}
+
+/* --------------------------------------------------------------------------- */
+
+static int modvideo_set_mode_2( INSTANCE * my, int * params )
+{
+ return gr_set_mode( params[0], params[1], 0 ) ;
+}
+
+/* --------------------------------------------------------------------------- */
+
+static int modvideo_set_mode_3( INSTANCE * my, int * params )
+{
+ GLODWORD( mod_video, GRAPH_MODE ) = (( GLODWORD( mod_video, GRAPH_MODE ) & 0xFF00 ) | params[2] );
+ return gr_set_mode( params[0], params[1], 0 ) ;
+}
+
+/* --------------------------------------------------------------------------- */
+
+static int modvideo_set_mode_4( INSTANCE * my, int * params )
+{
+ GLODWORD( mod_video, GRAPH_MODE ) = ( params[2] | params[3] );
+ return gr_set_mode( params[0], params[1], 0 ) ;
+}
+
+/* --------------------------------------------------------------------------- */
+
+static int modvideo_set_fps( INSTANCE * my, int * params )
+{
+ gr_set_fps( params[0], params[1] ) ;
+ return params[0];
+}
+
+/* --------------------------------------------------------------------------- */
+
+static int get_sdl_flags( int flags )
+{
+ int sdl_flags = SDL_HWPALETTE;
+
+ sdl_flags |= ( flags & MODE_FULLSCREEN ) ? SDL_FULLSCREEN : 0 ;
+ sdl_flags |= ( flags & MODE_DOUBLEBUFFER ) ? SDL_DOUBLEBUF : 0 ;
+ sdl_flags |= ( flags & MODE_HARDWARE ) ? SDL_HWSURFACE : SDL_SWSURFACE ;
+ sdl_flags |= ( flags & MODE_FRAMELESS ) ? SDL_NOFRAME : 0 ;
+
+ return sdl_flags;
+}
+
+/* --------------------------------------------------------------------------- */
+/*
+Return a pointer to an array of available screen dimensions for the given format and video flags,
+sorted largest to smallest.
+
+Returns NULL if there are no dimensions available for a particular format,
+or -1 if any dimension is okay for the given format.
+*/
+
+static int modvideo_list_modes( INSTANCE * my, int * params )
+{
+ SDL_Rect **modes;
+ SDL_PixelFormat vfmt;
+ int sdl_flags = get_sdl_flags( params[1] );
+ int depth = params[0];
+ int i, n;
+ static int * available_modes = NULL ;
+
+ if ( !depth ) depth = ( params[1] & MODE_32BITS ) ? 32 : (( params[1] & MODE_16BITS ) ? 16 : 8 );
+
+ vfmt.BitsPerPixel = depth ;
+
+ /* Get available fullscreen/hardware modes */
+ modes = SDL_ListModes( params[0] ? &vfmt : NULL, sdl_flags );
+
+ if ( modes == ( SDL_Rect ** )0 ) return 0; /* No video modes available for this criteria */
+ if ( modes == ( SDL_Rect ** ) - 1 ) return -1; /* Any video mode for this criteria */
+
+ n = 0;
+ for ( i = 0; modes[i]; ++i ) ++n ;
+
+ available_modes = realloc( available_modes, ( 1 + n ) * sizeof( int ) * 2 );
+ if ( !available_modes ) return -2;
+
+ for ( i = 0; modes[i]; ++i )
+ {
+ available_modes[i*2 ] = modes[i]->w;
+ available_modes[i*2+1] = modes[i]->h;
+ }
+ available_modes[i*2 ] = 0;
+ available_modes[i*2+1] = 0;
+
+ return ( int )available_modes;
+}
+
+/* --------------------------------------------------------------------------- */
+
+/*
+ returns 0 if the requested mode is not supported under any bit depth,
+ or returns the bits-per-pixel of the closest available
+ mode with the given width, height and requested flags
+
+ params:
+ height,width,depth,flags
+
+*/
+
+static int modvideo_mode_is_ok( INSTANCE * my, int * params )
+{
+ int sdl_flags = get_sdl_flags( params[3] );
+ int depth = params[2];
+
+ if ( !depth ) depth = ( params[3] & MODE_32BITS ) ? 32 : (( params[3] & MODE_16BITS ) ? 16 : 8 );
+
+ return ( SDL_VideoModeOK( params[0], params[1], depth, sdl_flags ) );
+}
+
+/* --------------------------------------------------------------------------- */
+/* exports */
+/* --------------------------------------------------------------------------- */
+
+#include "mod_video_exports.h"
+
+/* --------------------------------------------------------------------------- */