Commit 9b6cc5a9 authored by Sam Lantinga's avatar Sam Lantinga

Changes since SDL 1.2.0 release

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%402
parent 2f110628
...@@ -434,7 +434,8 @@ ac_prog=ld ...@@ -434,7 +434,8 @@ ac_prog=ld
if test "$ac_cv_prog_gcc" = yes; then if test "$ac_cv_prog_gcc" = yes; then
# Check if gcc -print-prog-name=ld gives a path. # Check if gcc -print-prog-name=ld gives a path.
AC_MSG_CHECKING([for ld used by GCC]) AC_MSG_CHECKING([for ld used by GCC])
ac_prog=`($CC -print-prog-name=ld | tr -d '\r') 2>&5` DELCR='tr -d \015'
ac_prog=`($CC -print-prog-name=ld | $DELCR) 2>&5`
case "$ac_prog" in case "$ac_prog" in
# Accept absolute paths. # Accept absolute paths.
changequote(,)dnl changequote(,)dnl
......
...@@ -14,9 +14,9 @@ dnl Set various version strings - taken gratefully from the GTk sources ...@@ -14,9 +14,9 @@ dnl Set various version strings - taken gratefully from the GTk sources
# #
SDL_MAJOR_VERSION=1 SDL_MAJOR_VERSION=1
SDL_MINOR_VERSION=2 SDL_MINOR_VERSION=2
SDL_MICRO_VERSION=0 SDL_MICRO_VERSION=1
SDL_INTERFACE_AGE=0 SDL_INTERFACE_AGE=1
SDL_BINARY_AGE=0 SDL_BINARY_AGE=1
SDL_VERSION=$SDL_MAJOR_VERSION.$SDL_MINOR_VERSION.$SDL_MICRO_VERSION SDL_VERSION=$SDL_MAJOR_VERSION.$SDL_MINOR_VERSION.$SDL_MICRO_VERSION
AC_SUBST(SDL_MAJOR_VERSION) AC_SUBST(SDL_MAJOR_VERSION)
...@@ -251,6 +251,9 @@ CheckOSS() ...@@ -251,6 +251,9 @@ CheckOSS()
#ifdef __bsdi__ #ifdef __bsdi__
#include <sys/soundcard.h> #include <sys/soundcard.h>
#endif #endif
#ifdef __OpenBSD__
#include <soundcard.h>
#endif
#ifdef __USLC__ #ifdef __USLC__
#include <sys/soundcard.h> #include <sys/soundcard.h>
#endif #endif
...@@ -680,6 +683,19 @@ CheckAAlib() ...@@ -680,6 +683,19 @@ CheckAAlib()
fi fi
} }
dnl rcg04172001 Set up the Null video driver.
CheckDummyVideo()
{
AC_ARG_ENABLE(video-dummy,
[ --enable-video-dummy use dummy video driver [default=no]],
, enable_video_dummy=no)
if test x$enable_video_dummy = xyes; then
CFLAGS="$CFLAGS -DENABLE_DUMMYVIDEO"
VIDEO_SUBDIRS="$VIDEO_SUBDIRS dummy"
VIDEO_DRIVERS="$VIDEO_DRIVERS dummy/libvideo_null.la"
fi
}
dnl Check to see if OpenGL support is desired dnl Check to see if OpenGL support is desired
AC_ARG_ENABLE(video-opengl, AC_ARG_ENABLE(video-opengl,
[ --enable-video-opengl include OpenGL context creation [default=yes]], [ --enable-video-opengl include OpenGL context creation [default=yes]],
...@@ -1012,6 +1028,7 @@ CheckKSTAT() ...@@ -1012,6 +1028,7 @@ CheckKSTAT()
case "$target" in case "$target" in
*-*-linux*) *-*-linux*)
ARCH=linux ARCH=linux
CheckDummyVideo
CheckNASM CheckNASM
CheckOSS CheckOSS
CheckALSA CheckALSA
...@@ -1076,6 +1093,7 @@ case "$target" in ...@@ -1076,6 +1093,7 @@ case "$target" in
;; ;;
*-*-bsdi*) *-*-bsdi*)
ARCH=bsdi ARCH=bsdi
CheckDummyVideo
CheckNASM CheckNASM
CheckOSS CheckOSS
CheckNAS CheckNAS
...@@ -1116,6 +1134,7 @@ case "$target" in ...@@ -1116,6 +1134,7 @@ case "$target" in
;; ;;
*-*-freebsd*) *-*-freebsd*)
ARCH=freebsd ARCH=freebsd
CheckDummyVideo
CheckNASM CheckNASM
CheckOSS CheckOSS
CheckARTSC CheckARTSC
...@@ -1167,6 +1186,7 @@ case "$target" in ...@@ -1167,6 +1186,7 @@ case "$target" in
;; ;;
*-*-netbsd*) *-*-netbsd*)
ARCH=netbsd ARCH=netbsd
CheckDummyVideo
CheckNASM CheckNASM
CheckOSS CheckOSS
CheckARTSC CheckARTSC
...@@ -1199,7 +1219,11 @@ case "$target" in ...@@ -1199,7 +1219,11 @@ case "$target" in
COPY_ARCH_SRC(src/thread, linux, SDL_systhread_c.h) COPY_ARCH_SRC(src/thread, linux, SDL_systhread_c.h)
COPY_ARCH_SRC(src/thread, linux, SDL_sysmutex.c) COPY_ARCH_SRC(src/thread, linux, SDL_sysmutex.c)
COPY_ARCH_SRC(src/thread, linux, SDL_sysmutex_c.h) COPY_ARCH_SRC(src/thread, linux, SDL_sysmutex_c.h)
COPY_ARCH_SRC(src/thread, linux, SDL_syssem.c) if test x$use_pthreads = xyes -a x$enable_pthread_sem != xyes; then
COPY_ARCH_SRC(src/thread, generic, SDL_syssem.c)
else
COPY_ARCH_SRC(src/thread, linux, SDL_syssem.c)
fi
COPY_ARCH_SRC(src/thread, generic, SDL_syssem_c.h) COPY_ARCH_SRC(src/thread, generic, SDL_syssem_c.h)
COPY_ARCH_SRC(src/thread, linux, SDL_syscond.c) COPY_ARCH_SRC(src/thread, linux, SDL_syscond.c)
COPY_ARCH_SRC(src/thread, generic, SDL_syscond_c.h) COPY_ARCH_SRC(src/thread, generic, SDL_syscond_c.h)
...@@ -1213,6 +1237,8 @@ case "$target" in ...@@ -1213,6 +1237,8 @@ case "$target" in
;; ;;
*-*-openbsd*) *-*-openbsd*)
ARCH=openbsd ARCH=openbsd
CFLAGS="$CFLAGS -Dunix"
CheckDummyVideo
CheckNASM CheckNASM
CheckOSS CheckOSS
CheckARTSC CheckARTSC
...@@ -1261,6 +1287,7 @@ case "$target" in ...@@ -1261,6 +1287,7 @@ case "$target" in
;; ;;
*-*-sysv5*) *-*-sysv5*)
ARCH=sysv5 ARCH=sysv5
CheckDummyVideo
CheckNASM CheckNASM
CheckOSS CheckOSS
CheckARTSC CheckARTSC
...@@ -1306,6 +1333,8 @@ case "$target" in ...@@ -1306,6 +1333,8 @@ case "$target" in
;; ;;
*-*-solaris*) *-*-solaris*)
ARCH=solaris ARCH=solaris
CFLAGS="$CFLAGS -D__ELF__" # Fix for nasm on Solaris x86
CheckDummyVideo
CheckNASM CheckNASM
CheckARTSC CheckARTSC
CheckESD CheckESD
...@@ -1350,6 +1379,7 @@ case "$target" in ...@@ -1350,6 +1379,7 @@ case "$target" in
;; ;;
*-*-irix*) *-*-irix*)
ARCH=irix ARCH=irix
CheckDummyVideo
CheckNAS CheckNAS
CheckX11 CheckX11
CheckAAlib CheckAAlib
...@@ -1407,6 +1437,7 @@ case "$target" in ...@@ -1407,6 +1437,7 @@ case "$target" in
;; ;;
*-*-hpux*) *-*-hpux*)
ARCH=hpux ARCH=hpux
CheckDummyVideo
CheckNAS CheckNAS
CheckX11 CheckX11
CheckGGI CheckGGI
...@@ -1449,6 +1480,7 @@ case "$target" in ...@@ -1449,6 +1480,7 @@ case "$target" in
;; ;;
*-*-aix*) *-*-aix*)
ARCH=aix ARCH=aix
CheckDummyVideo
CheckNAS CheckNAS
CheckX11 CheckX11
CheckGGI CheckGGI
...@@ -1490,6 +1522,7 @@ case "$target" in ...@@ -1490,6 +1522,7 @@ case "$target" in
;; ;;
*-*-osf*) *-*-osf*)
ARCH=osf ARCH=osf
CheckDummyVideo
CheckNAS CheckNAS
CheckX11 CheckX11
CheckGGI CheckGGI
...@@ -1532,6 +1565,7 @@ case "$target" in ...@@ -1532,6 +1565,7 @@ case "$target" in
;; ;;
*-*-qnx*) *-*-qnx*)
ARCH=qnx ARCH=qnx
CheckDummyVideo
CheckNAS CheckNAS
CheckPHOTON CheckPHOTON
CheckX11 CheckX11
...@@ -1581,8 +1615,11 @@ case "$target" in ...@@ -1581,8 +1615,11 @@ case "$target" in
ac_default_prefix=/usr/local/cross-tools/i386-mingw32msvc ac_default_prefix=/usr/local/cross-tools/i386-mingw32msvc
else else
# Look for the location of the tools and install there # Look for the location of the tools and install there
ac_default_prefix=$BUILD_PREFIX if [ "$BUILD_PREFIX" != "" ]; then
ac_default_prefix=$BUILD_PREFIX
fi
fi fi
CheckDummyVideo
CheckWIN32 CheckWIN32
CheckDIRECTX CheckDIRECTX
CheckNASM CheckNASM
...@@ -1623,11 +1660,22 @@ case "$target" in ...@@ -1623,11 +1660,22 @@ case "$target" in
fi fi
# The Win32 platform requires special setup # The Win32 platform requires special setup
SDL_CFLAGS="$SDL_CFLAGS -Dmain=SDL_main" SDL_CFLAGS="$SDL_CFLAGS -Dmain=SDL_main"
SDL_LIBS="-lmingw32 -lSDLmain $SDL_LIBS -mwindows" case "$target" in
*-*-cygwin*)
CFLAGS="$CFLAGS -I/usr/include/mingw -DWIN32 -Uunix"
SDL_CFLAGS="$SDL_CFLAGS -I/usr/include/mingw -DWIN32 -Uunix"
LIBS="$LIBS -mno-cygwin"
SDL_LIBS="-lmingw32 -lSDLmain $SDL_LIBS -mwindows -mno-cygwin"
;;
*-*-mingw32*)
SDL_LIBS="-lmingw32 -lSDLmain $SDL_LIBS -mwindows"
;;
esac
;; ;;
*-*-beos*) *-*-beos*)
ARCH=beos ARCH=beos
ac_default_prefix=/boot/develop/tools/gnupro ac_default_prefix=/boot/develop/tools/gnupro
CheckDummyVideo
CheckNASM CheckNASM
CheckBWINDOW CheckBWINDOW
CheckBeGL CheckBeGL
...@@ -1672,6 +1720,7 @@ case "$target" in ...@@ -1672,6 +1720,7 @@ case "$target" in
# use it at present, but Apple is working on a X-to-9 compiler # use it at present, but Apple is working on a X-to-9 compiler
# for which this case would be handy. # for which this case would be handy.
ARCH=macos ARCH=macos
CheckDummyVideo
CheckTOOLBOX CheckTOOLBOX
CheckMacGL CheckMacGL
# Set up files for the main() stub # Set up files for the main() stub
...@@ -1714,6 +1763,7 @@ case "$target" in ...@@ -1714,6 +1763,7 @@ case "$target" in
# just the OS X kernel sans upper layers like Carbon. But # just the OS X kernel sans upper layers like Carbon. But
# config.guess comes back with "darwin", so go with the flow. # config.guess comes back with "darwin", so go with the flow.
ARCH=macos ARCH=macos
CheckDummyVideo
CheckCARBON CheckCARBON
CheckMacGL CheckMacGL
CheckPTHREAD CheckPTHREAD
...@@ -1790,6 +1840,10 @@ if test $ARCH = solaris; then ...@@ -1790,6 +1840,10 @@ if test $ARCH = solaris; then
SDL_RLD_FLAGS="-R\${exec_prefix}/lib" SDL_RLD_FLAGS="-R\${exec_prefix}/lib"
fi fi
if test $ARCH = openbsd; then
SDL_RLD_FLAGS="-Wl,-R\${exec_prefix}/lib -Wl,-R\${X11BASE}/lib"
fi
dnl Output the video drivers we use dnl Output the video drivers we use
if test x$enable_video = xtrue; then if test x$enable_video = xtrue; then
if test "$VIDEO_SUBDIRS" = ""; then if test "$VIDEO_SUBDIRS" = ""; then
...@@ -1873,6 +1927,7 @@ src/video/windib/Makefile ...@@ -1873,6 +1927,7 @@ src/video/windib/Makefile
src/video/windx5/Makefile src/video/windx5/Makefile
src/video/bwindow/Makefile src/video/bwindow/Makefile
src/video/photon/Makefile src/video/photon/Makefile
src/video/dummy/Makefile
src/events/Makefile src/events/Makefile
src/joystick/Makefile src/joystick/Makefile
src/joystick/beos/Makefile src/joystick/beos/Makefile
......
...@@ -16,6 +16,9 @@ be found at the <A HREF="http://www.libsdl.org/"> main SDL page</A>. ...@@ -16,6 +16,9 @@ be found at the <A HREF="http://www.libsdl.org/"> main SDL page</A>.
Major changes since SDL 1.0.0: Major changes since SDL 1.0.0:
</H2> </H2>
<UL> <UL>
<LI> 1.2.1: Added support for building under Cygwin on Windows
<LI> 1.2.1: Added a dummy video driver for benchmarking (thanks Ryan!)
<LI> 1.2.1: Fixed fullscreen cursor offset bug on BeOS
<LI> 1.2.0: Added initial support for HP-UX (thanks Stephanie) <LI> 1.2.0: Added initial support for HP-UX (thanks Stephanie)
<LI> 1.2.0: Added initial support for BSDI (thanks Kurt) <LI> 1.2.0: Added initial support for BSDI (thanks Kurt)
<LI> 1.2.0: Fixed blitting 32-bit ARGB images to SDL_OPENGLBLIT screens <LI> 1.2.0: Fixed blitting 32-bit ARGB images to SDL_OPENGLBLIT screens
......
...@@ -234,7 +234,7 @@ extern DECLSPEC int SDL_ConvertAudio(SDL_AudioCVT *cvt); ...@@ -234,7 +234,7 @@ extern DECLSPEC int SDL_ConvertAudio(SDL_AudioCVT *cvt);
* This is provided for convenience -- you can mix your own audio data. * This is provided for convenience -- you can mix your own audio data.
*/ */
#define SDL_MIX_MAXVOLUME 128 #define SDL_MIX_MAXVOLUME 128
extern DECLSPEC void SDL_MixAudio(Uint8 *dst, Uint8 *src, Uint32 len, int volume); extern DECLSPEC void SDL_MixAudio(Uint8 *dst, const Uint8 *src, Uint32 len, int volume);
/* /*
* The lock manipulated by these functions protects the callback function. * The lock manipulated by these functions protects the callback function.
......
...@@ -42,7 +42,8 @@ static char rcsid = ...@@ -42,7 +42,8 @@ static char rcsid =
#if defined(__i386__) || defined(WIN32) || \ #if defined(__i386__) || defined(WIN32) || \
(defined(__alpha__) || defined(__alpha)) || \ (defined(__alpha__) || defined(__alpha)) || \
defined(__arm__) || \ defined(__arm__) || \
(defined(__mips__) && defined(__MIPSEL__)) (defined(__mips__) && defined(__MIPSEL__)) || \
defined(__LITTLE_ENDIAN__)
#define SDL_BYTEORDER SDL_LIL_ENDIAN #define SDL_BYTEORDER SDL_LIL_ENDIAN
#else #else
#define SDL_BYTEORDER SDL_BIG_ENDIAN #define SDL_BYTEORDER SDL_BIG_ENDIAN
......
...@@ -42,7 +42,7 @@ extern "C" { ...@@ -42,7 +42,7 @@ extern "C" {
*/ */
#define SDL_MAJOR_VERSION 1 #define SDL_MAJOR_VERSION 1
#define SDL_MINOR_VERSION 2 #define SDL_MINOR_VERSION 2
#define SDL_PATCHLEVEL 0 #define SDL_PATCHLEVEL 1
typedef struct { typedef struct {
Uint8 major; Uint8 major;
......
...@@ -1105,6 +1105,9 @@ cygwin* | mingw*) ...@@ -1105,6 +1105,9 @@ cygwin* | mingw*)
with_gnu_ld=no with_gnu_ld=no
fi fi
;; ;;
openbsd*)
with_gnu_ld=no
;;
esac esac
...@@ -1155,6 +1158,12 @@ EOF ...@@ -1155,6 +1158,12 @@ EOF
;; ;;
cygwin* | mingw*) cygwin* | mingw*)
# Special flag that tells Cygwin to use the native MSVC runtime
case "$host_os" in
cygwin*)
cygwin_use_msvcrt=true
;;
esac
# hardcode_libdir_flag_spec is actually meaningless, as there is # hardcode_libdir_flag_spec is actually meaningless, as there is
# no search path for DLLs. # no search path for DLLs.
hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_flag_spec='-L$libdir'
...@@ -1165,13 +1174,40 @@ EOF ...@@ -1165,13 +1174,40 @@ EOF
# then regenerate the def file from the symbol export list, so that # then regenerate the def file from the symbol export list, so that
# the compiled dll only exports the symbol export list. # the compiled dll only exports the symbol export list.
# Be careful not to strip the DATA tag left by newer dlltools. # Be careful not to strip the DATA tag left by newer dlltools.
export_symbols_cmds='test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~ if [ "$cygwin_use_msvcrt" = "true" ]; then
export_symbols_cmds='test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~
test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -U__CYGWIN__ -U__CYGWIN32__ -c $soname-ltdll.c)~
$DLLTOOL --exclude-symbols _DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --output-def $objdir/$soname-def $objdir/$soname-ltdll.$objext $libobjs $convenience~
sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]*//" -e "s/ *;.*$//" < $objdir/$soname-def > $export_symbols'
else
export_symbols_cmds='test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~
test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~ test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~
$DLLTOOL --exclude-symbols _DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --output-def $objdir/$soname-def $objdir/$soname-ltdll.$objext $libobjs $convenience~ $DLLTOOL --exclude-symbols _DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --output-def $objdir/$soname-def $objdir/$soname-ltdll.$objext $libobjs $convenience~
sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]*//" -e "s/ *;.*$//" < $objdir/$soname-def > $export_symbols' sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]*//" -e "s/ *;.*$//" < $objdir/$soname-def > $export_symbols'
fi
# If DATA tags from a recent dlltool are present, honour them! # If DATA tags from a recent dlltool are present, honour them!
archive_expsym_cmds='echo EXPORTS > $objdir/$soname-def~ if [ "$cygwin_use_msvcrt" = "true" ]; then
archive_expsym_cmds='echo EXPORTS > $objdir/$soname-def~
_lt_hint=1;
cat $export_symbols | while read symbol; do
set dummy \$symbol;
case \$# in
2) echo " \$2 @ \$_lt_hint ; " >> $objdir/$soname-def;;
*) echo " \$2 @ \$_lt_hint \$3 ; " >> $objdir/$soname-def;;
esac;
_lt_hint=`expr 1 + \$_lt_hint`;
done~
test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~
test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -U__CYGWIN__ -U__CYGWIN32__ -c $soname-ltdll.c)~
$CC -Wl,--base-file,$objdir/$soname-base -Wl,--dll -nostartfiles -Wl,-e,_DllMain@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts -L/usr/lib/mingw -mno-cygwin~
$DLLTOOL --as=$AS --dllname $soname --exclude-symbols _DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~
$CC -Wl,--base-file,$objdir/$soname-base $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,_DllMain@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts -L/usr/lib/mingw -mno-cygwin~
$DLLTOOL --as=$AS --dllname $soname --exclude-symbols _DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~
$CC $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,_DllMain@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts -L/usr/lib/mingw -mno-cygwin~
: strip_is_broken_with_dlls_on_win95B - strip $lib'
else
archive_expsym_cmds='echo EXPORTS > $objdir/$soname-def~
_lt_hint=1; _lt_hint=1;
cat $export_symbols | while read symbol; do cat $export_symbols | while read symbol; do
set dummy \$symbol; set dummy \$symbol;
...@@ -1189,8 +1225,8 @@ EOF ...@@ -1189,8 +1225,8 @@ EOF
$DLLTOOL --as=$AS --dllname $soname --exclude-symbols _DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~ $DLLTOOL --as=$AS --dllname $soname --exclude-symbols _DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~
$CC $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,_DllMain@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~ $CC $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,_DllMain@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~
: strip_is_broken_with_dlls_on_win95B - strip $lib' : strip_is_broken_with_dlls_on_win95B - strip $lib'
fi
old_archive_from_new_cmds='$DLLTOOL --as=$AS --dllname $soname --def $objdir/$soname-def --output-lib $objdir/$libname.a' old_archive_from_new_cmds='$DLLTOOL --as=$AS --dllname $soname --def $objdir/$soname-def --output-lib $objdir/$libname.a'
;; ;;
netbsd*) netbsd*)
...@@ -1403,10 +1439,21 @@ else ...@@ -1403,10 +1439,21 @@ else
;; ;;
openbsd*) openbsd*)
archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts'
hardcode_libdir_flag_spec='-R$libdir'
hardcode_direct=yes hardcode_direct=yes
hardcode_shlibpath_var=no hardcode_shlibpath_var=no
case "$host_os" in
openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts'
hardcode_libdir_flag_spec='-R$libdir'
;;
*)
archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linkopts'
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
if [ "`/usr/bin/file /usr/lib/libc.so.* | grep ELF`" != "" ]; then
export_dynamic_flag_spec='${wl}-E'
fi
;;
esac
;; ;;
os2*) os2*)
...@@ -1883,7 +1930,7 @@ cygwin* | mingw*) ...@@ -1883,7 +1930,7 @@ cygwin* | mingw*)
# See where the system libraries really are - /usr/lib won't cut it # See where the system libraries really are - /usr/lib won't cut it
libuser32=`$CC --print-file-name=libuser32.a` libuser32=`$CC --print-file-name=libuser32.a`
win32libs=`expr $libuser32 : '\(.*\)/.*'` win32libs=`expr $libuser32 : '\(.*\)/.*'`
sys_lib_search_path_spec="$sys_lib_search_path $win32libs" sys_lib_search_path_spec="$sys_lib_search_path_spec $win32libs"
fi fi
lt_cv_dlopen="LoadLibrary" lt_cv_dlopen="LoadLibrary"
lt_cv_dlopen_libs= lt_cv_dlopen_libs=
...@@ -2030,13 +2077,10 @@ netbsd*) ...@@ -2030,13 +2077,10 @@ netbsd*)
openbsd*) openbsd*)
version_type=sunos version_type=sunos
if test "$with_gnu_ld" = yes; then
need_lib_prefix=no
need_version=no
fi
library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
shlibpath_var=LD_LIBRARY_PATH shlibpath_var=LD_LIBRARY_PATH
deplibs_check_method='pass_all'
;; ;;
os2*) os2*)
......
...@@ -1079,7 +1079,18 @@ compiler." ...@@ -1079,7 +1079,18 @@ compiler."
# These systems don't actually have c library (as such) # These systems don't actually have c library (as such)
continue continue
;; ;;
*-*-openbsd*)
# Do not include libc due to us having libc/libc_r.
continue
;;
esac esac
elif test "$arg" = "-lc_r"; then
case "$host" in
*-*-openbsd*)
# Do not include libc_r directly, use -pthread flag.
continue
;;
esac
elif test "$arg" = "-lm"; then elif test "$arg" = "-lm"; then
case "$host" in case "$host" in
*-*-cygwin* | *-*-beos*) *-*-cygwin* | *-*-beos*)
...@@ -1091,6 +1102,10 @@ compiler." ...@@ -1091,6 +1102,10 @@ compiler."
deplibs="$deplibs $arg" deplibs="$deplibs $arg"
;; ;;
-?thread)
deplibs="$deplibs $arg"
;;
-module) -module)
module=yes module=yes
continue continue
...@@ -1799,6 +1814,9 @@ compiler." ...@@ -1799,6 +1814,9 @@ compiler."
# rhapsody is a little odd... # rhapsody is a little odd...
deplibs="$deplibs -framework System" deplibs="$deplibs -framework System"
;; ;;
*-*-openbsd*)
# do not include libc due to us having libc/libc_r.
;;
*) *)
# Add libc to deplibs on all other systems. # Add libc to deplibs on all other systems.
deplibs="$deplibs -lc" deplibs="$deplibs -lc"
......
...@@ -140,6 +140,11 @@ int main (int argc, char *argv[]) ...@@ -140,6 +140,11 @@ int main (int argc, char *argv[])
AC_TRY_LINK([ AC_TRY_LINK([
#include <stdio.h> #include <stdio.h>
#include "SDL.h" #include "SDL.h"
int main(int argc, char *argv[])
{ return 0; }
#undef main
#define main K_and_R_C_main
], [ return 0; ], ], [ return 0; ],
[ echo "*** The test program compiled, but did not run. This usually means" [ echo "*** The test program compiled, but did not run. This usually means"
echo "*** that the run-time linker is not finding SDL or finding the wrong" echo "*** that the run-time linker is not finding SDL or finding the wrong"
......
...@@ -47,6 +47,10 @@ static SDL_error SDL_global_error; ...@@ -47,6 +47,10 @@ static SDL_error SDL_global_error;
#define SDL_GetErrBuf() (&SDL_global_error) #define SDL_GetErrBuf() (&SDL_global_error)
#endif /* DISABLE_THREADS */ #endif /* DISABLE_THREADS */
#ifdef __CYGWIN__
#define DISABLE_STDIO
#endif
#define SDL_ERRBUFIZE 1024 #define SDL_ERRBUFIZE 1024
/* Private functions */ /* Private functions */
...@@ -120,6 +124,7 @@ void SDL_SetError (const char *fmt, ...) ...@@ -120,6 +124,7 @@ void SDL_SetError (const char *fmt, ...)
} }
va_end(ap); va_end(ap);
#ifndef DISABLE_STDIO
/* If we are in debug mode, print out an error message */ /* If we are in debug mode, print out an error message */
#ifdef DEBUG_ERROR #ifdef DEBUG_ERROR
fprintf(stderr, "SDL_SetError: %s\n", SDL_GetError()); fprintf(stderr, "SDL_SetError: %s\n", SDL_GetError());
...@@ -128,6 +133,7 @@ void SDL_SetError (const char *fmt, ...) ...@@ -128,6 +133,7 @@ void SDL_SetError (const char *fmt, ...)
fprintf(stderr, "SDL_SetError: %s\n", SDL_GetError()); fprintf(stderr, "SDL_SetError: %s\n", SDL_GetError());
} }
#endif #endif
#endif /* !DISABLE_STDIO */
} }
/* Print out an integer value to a UNICODE buffer */ /* Print out an integer value to a UNICODE buffer */
......
...@@ -51,46 +51,59 @@ void SDL_UninstallParachute(void) ...@@ -51,46 +51,59 @@ void SDL_UninstallParachute(void)
#include "SDL.h" #include "SDL.h"
#include "SDL_fatal.h" #include "SDL_fatal.h"
#ifdef __CYGWIN__
#define DISABLE_STDIO
#endif
/* This installs some signal handlers for the more common fatal signals, /* This installs some signal handlers for the more common fatal signals,
so that if the programmer is lazy, the app doesn't die so horribly if so that if the programmer is lazy, the app doesn't die so horribly if
the program crashes. the program crashes.
*/ */
static void print_msg(const char *text)
{
#ifndef DISABLE_STDIO
fprintf(stderr, "%s", text);
#endif
}
static void SDL_Parachute(int sig) static void SDL_Parachute(int sig)
{ {
signal(sig, SIG_DFL); signal(sig, SIG_DFL);
fprintf(stderr, "Fatal signal: "); print_msg("Fatal signal: ");
switch (sig) { switch (sig) {
case SIGSEGV: case SIGSEGV:
fprintf(stderr, "Segmentation Fault"); print_msg("Segmentation Fault");
break; break;
#ifdef SIGBUS #ifdef SIGBUS
#if SIGBUS != SIGSEGV #if SIGBUS != SIGSEGV
case SIGBUS: case SIGBUS:
fprintf(stderr, "Bus Error"); print_msg("Bus Error");
break; break;
#endif #endif
#endif /* SIGBUS */ #endif /* SIGBUS */
#ifdef SIGFPE #ifdef SIGFPE
case SIGFPE: case SIGFPE:
fprintf(stderr, "Floating Point Exception"); print_msg("Floating Point Exception");
break; break;
#endif /* SIGFPE */ #endif /* SIGFPE */
#ifdef SIGQUIT #ifdef SIGQUIT
case SIGQUIT: case SIGQUIT:
fprintf(stderr, "Keyboard Quit"); print_msg("Keyboard Quit");
break; break;
#endif /* SIGQUIT */ #endif /* SIGQUIT */
#ifdef SIGPIPE #ifdef SIGPIPE
case SIGPIPE: case SIGPIPE:
fprintf(stderr, "Broken Pipe"); print_msg("Broken Pipe");
break; break;
#endif /* SIGPIPE */ #endif /* SIGPIPE */
default: default:
#ifndef DISABLE_STDIO
fprintf(stderr, "# %d", sig); fprintf(stderr, "# %d", sig);
#endif
break; break;
} }
fprintf(stderr, " (SDL Parachute Deployed)\n"); print_msg(" (SDL Parachute Deployed)\n");
SDL_Quit(); SDL_Quit();
exit(-sig); exit(-sig);
} }
......
...@@ -29,13 +29,12 @@ static char rcsid = ...@@ -29,13 +29,12 @@ static char rcsid =
(necessary because SDL audio emulates threads with fork() (necessary because SDL audio emulates threads with fork()
*/ */
#include <stdlib.h>
#ifdef FORK_HACK #ifdef FORK_HACK
#include <sys/types.h> #include <sys/types.h>
#include <sys/ipc.h> #include <sys/ipc.h>
#include <sys/shm.h> #include <sys/shm.h>
#include <stddef.h> #include <stddef.h>
#else
#include <stdlib.h>
#endif #endif
#include "SDL_audiomem.h" #include "SDL_audiomem.h"
......
...@@ -96,7 +96,7 @@ static const Uint8 mix8[] = ...@@ -96,7 +96,7 @@ static const Uint8 mix8[] =
#define ADJUST_VOLUME(s, v) (s = (s*v)/SDL_MIX_MAXVOLUME) #define ADJUST_VOLUME(s, v) (s = (s*v)/SDL_MIX_MAXVOLUME)
#define ADJUST_VOLUME_U8(s, v) (s = (((s-128)*v)/SDL_MIX_MAXVOLUME)+128) #define ADJUST_VOLUME_U8(s, v) (s = (((s-128)*v)/SDL_MIX_MAXVOLUME)+128)
void SDL_MixAudio (Uint8 *dst, Uint8 *src, Uint32 len, int volume) void SDL_MixAudio (Uint8 *dst, const Uint8 *src, Uint32 len, int volume)
{ {
Uint16 format; Uint16 format;
......
...@@ -48,6 +48,9 @@ static char rcsid = ...@@ -48,6 +48,9 @@ static char rcsid =
#ifdef __FreeBSD__ #ifdef __FreeBSD__
#include <machine/soundcard.h> #include <machine/soundcard.h>
#endif #endif
#ifdef __OpenBSD__
#include <soundcard.h>
#endif
#ifdef __USLC__ #ifdef __USLC__
#include <sys/soundcard.h> #include <sys/soundcard.h>
#endif #endif
......
...@@ -46,6 +46,9 @@ static char rcsid = ...@@ -46,6 +46,9 @@ static char rcsid =
#ifdef __FreeBSD__ #ifdef __FreeBSD__
#include <machine/soundcard.h> #include <machine/soundcard.h>
#endif #endif
#ifdef __OpenBSD__
#include <soundcard.h>
#endif
#ifdef __USLC__ #ifdef __USLC__
#include <sys/soundcard.h> #include <sys/soundcard.h>
#endif #endif
......
...@@ -36,6 +36,7 @@ static char rcsid = ...@@ -36,6 +36,7 @@ static char rcsid =
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include <unistd.h> #include <unistd.h>
#include <sys/ioctl.h>
#include <sys/cdio.h> #include <sys/cdio.h>
#include "SDL_error.h" #include "SDL_error.h"
...@@ -64,7 +65,8 @@ static void SDL_SYS_CDClose(SDL_CD *cdrom); ...@@ -64,7 +65,8 @@ static void SDL_SYS_CDClose(SDL_CD *cdrom);
/* Some ioctl() errno values which occur when the tray is empty */ /* Some ioctl() errno values which occur when the tray is empty */
#define ERRNO_TRAYEMPTY(errno) \ #define ERRNO_TRAYEMPTY(errno) \
((errno == EIO) || (errno == ENOENT) || (errno == EINVAL)) ((errno == EIO) || (errno == ENOENT) || (errno == EINVAL) || \
(errno == ENODEV))
/* Check a drive to see if it is a CD-ROM */ /* Check a drive to see if it is a CD-ROM */
static int CheckDrive(char *drive, struct stat *stbuf) static int CheckDrive(char *drive, struct stat *stbuf)
...@@ -96,6 +98,8 @@ static int CheckDrive(char *drive, struct stat *stbuf) ...@@ -96,6 +98,8 @@ static int CheckDrive(char *drive, struct stat *stbuf)
} }
close(cdfd); close(cdfd);
} }
else if (ERRNO_TRAYEMPTY(errno))
is_cd = 1;
} }
return(is_cd); return(is_cd);
} }
...@@ -137,7 +141,11 @@ static void AddDrive(char *drive, struct stat *stbuf) ...@@ -137,7 +141,11 @@ static void AddDrive(char *drive, struct stat *stbuf)
int SDL_SYS_CDInit(void) int SDL_SYS_CDInit(void)
{ {
static char *checklist[] = { static char *checklist[] = {
#ifdef __OpenBSD__
"?0 cd?a", "cdrom", NULL
#else
"?0 cd?c", "?0 acd?c", "cdrom", NULL "?0 cd?c", "?0 acd?c", "cdrom", NULL
#endif
}; };
char *SDLcdrom; char *SDLcdrom;
int i, j, exists; int i, j, exists;
......
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997, 1998 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Sam Lantinga
5635-34 Springhouse Dr.
Pleasanton, CA 94588 (USA)
slouken@devolution.com
*/
#ifdef SAVE_RCSID
static char rcsid =
"@(#) $Id$";
#endif
#include <stdlib.h>
#include <stdio.h> /* For the definition of NULL */
#include "SDL_error.h"
#include "SDL_timer.h"
#include "SDL_timer_c.h"
#include "SDL_mutex.h"
#include "SDL_systimer.h"
/* #define DEBUG_TIMERS */
int SDL_timer_started = 0;
int SDL_timer_running = 0;
/* Data to handle a single periodic alarm */
Uint32 SDL_alarm_interval = 0;
SDL_TimerCallback SDL_alarm_callback;
static SDL_bool list_changed = SDL_FALSE;
/* Data used for a thread-based timer */
static int SDL_timer_threaded = 0;
struct _SDL_TimerID {
Uint32 interval;
SDL_NewTimerCallback cb;
void *param;
Uint32 last_alarm;
struct _SDL_TimerID *next;
};
static SDL_TimerID SDL_timers = NULL;
static Uint32 num_timers = 0;
static SDL_mutex *SDL_timer_mutex;
/* Set whether or not the timer should use a thread.
This should not be called while the timer subsystem is running.
*/
int SDL_SetTimerThreaded(int value)
{
int retval;
if ( SDL_timer_started ) {
SDL_SetError("Timer already initialized");
retval = -1;
} else {
retval = 0;
SDL_timer_threaded = value;
}
return retval;
}
int SDL_TimerInit(void)
{
int retval;
SDL_timer_running = 0;
SDL_SetTimer(0, NULL);
retval = 0;
if ( ! SDL_timer_threaded ) {
retval = SDL_SYS_TimerInit();
}
if ( SDL_timer_threaded ) {
SDL_timer_mutex = SDL_CreateMutex();
}
SDL_timer_started = 1;
return(retval);
}
void SDL_TimerQuit(void)
{
SDL_SetTimer(0, NULL);
if ( SDL_timer_threaded < 2 ) {
SDL_SYS_TimerQuit();
}
if ( SDL_timer_threaded ) {
SDL_DestroyMutex(SDL_timer_mutex);
}
SDL_timer_started = 0;
SDL_timer_threaded = 0;
}
void SDL_ThreadedTimerCheck(void)
{
Uint32 now, ms;
SDL_TimerID t, prev, next;
int removed;
now = SDL_GetTicks();
SDL_mutexP(SDL_timer_mutex);
for ( prev = NULL, t = SDL_timers; t; t = next ) {
removed = 0;
ms = t->interval - SDL_TIMESLICE;
next = t->next;
if ( (t->last_alarm < now) && ((now - t->last_alarm) > ms) ) {
if ( (now - t->last_alarm) < t->interval ) {
t->last_alarm += t->interval;
} else {
t->last_alarm = now;
}
list_changed = SDL_FALSE;
#ifdef DEBUG_TIMERS
printf("Executing timer %p (thread = %d)\n",
t, SDL_ThreadID());
#endif
SDL_mutexV(SDL_timer_mutex);
ms = t->cb(t->interval, t->param);
SDL_mutexP(SDL_timer_mutex);
if ( list_changed ) {
/* Abort, list of timers has been modified */
break;
}
if ( ms != t->interval ) {
if ( ms ) {
t->interval = ROUND_RESOLUTION(ms);
} else { /* Remove the timer from the linked list */
#ifdef DEBUG_TIMERS
printf("SDL: Removing timer %p\n", t);
#endif
if ( prev ) {
prev->next = next;
} else {
SDL_timers = next;
}
free(t);
-- num_timers;
removed = 1;
}
}
}
/* Don't update prev if the timer has disappeared */
if ( ! removed ) {
prev = t;
}
}
SDL_mutexV(SDL_timer_mutex);
}
SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_NewTimerCallback callback, void *param)
{
SDL_TimerID t;
if ( ! SDL_timer_mutex ) {
if ( SDL_timer_started ) {
SDL_SetError("This platform doesn't support multiple timers");
} else {
SDL_SetError("You must call SDL_Init(SDL_INIT_TIMER) first");
}
return NULL;
}
if ( ! SDL_timer_threaded ) {
SDL_SetError("Multiple timers require threaded events!");
return NULL;
}
SDL_mutexP(SDL_timer_mutex);
t = (SDL_TimerID) malloc(sizeof(struct _SDL_TimerID));
if ( t ) {
t->interval = ROUND_RESOLUTION(interval);
t->cb = callback;
t->param = param;
t->last_alarm = SDL_GetTicks();
t->next = SDL_timers;
SDL_timers = t;
++ num_timers;
list_changed = SDL_TRUE;
SDL_timer_running = 1;
}
#ifdef DEBUG_TIMERS
printf("SDL_AddTimer(%d) = %08x num_timers = %d\n", interval, (Uint32)t, num_timers);
#endif
SDL_mutexV(SDL_timer_mutex);
return t;
}
SDL_bool SDL_RemoveTimer(SDL_TimerID id)
{
SDL_TimerID t, prev = NULL;
SDL_bool removed;
removed = SDL_FALSE;
SDL_mutexP(SDL_timer_mutex);
/* Look for id in the linked list of timers */
for (t = SDL_timers; t; prev=t, t = t->next ) {
if ( t == id ) {
if(prev) {
prev->next = t->next;
} else {
SDL_timers = t->next;
}
free(t);
-- num_timers;
removed = SDL_TRUE;
list_changed = SDL_TRUE;
break;
}
}
#ifdef DEBUG_TIMERS
printf("SDL_RemoveTimer(%08x) = %d num_timers = %d thread = %d\n", (Uint32)id, removed, num_timers, SDL_ThreadID());
#endif
SDL_mutexV(SDL_timer_mutex);
return removed;
}
static void SDL_RemoveAllTimers(SDL_TimerID t)
{
SDL_TimerID freeme;
/* Changed to non-recursive implementation.
The recursive implementation is elegant, but subject to
stack overflow if there are lots and lots of timers.
*/
while ( t ) {
freeme = t;
t = t->next;
free(freeme);
}
}
/* Old style callback functions are wrapped through this */
static Uint32 callback_wrapper(Uint32 ms, void *param)
{
SDL_TimerCallback func = (SDL_TimerCallback) param;
return (*func)(ms);
}
int SDL_SetTimer(Uint32 ms, SDL_TimerCallback callback)
{
int retval;
#ifdef DEBUG_TIMERS
printf("SDL_SetTimer(%d)\n", ms);
#endif
retval = 0;
if ( SDL_timer_running ) { /* Stop any currently running timer */
SDL_timer_running = 0;
if ( SDL_timer_threaded ) {
SDL_mutexP(SDL_timer_mutex);
SDL_RemoveAllTimers(SDL_timers);
SDL_timers = NULL;
SDL_mutexV(SDL_timer_mutex);
} else {
SDL_SYS_StopTimer();
}
}
if ( ms ) {
if ( SDL_timer_threaded ) {
retval = (SDL_AddTimer(ms, callback_wrapper,
(void *)callback) != NULL);
} else {
SDL_timer_running = 1;
SDL_alarm_interval = ms;
SDL_alarm_callback = callback;
retval = SDL_SYS_StartTimer();
}
}
return retval;
}
...@@ -36,6 +36,10 @@ static char rcsid = ...@@ -36,6 +36,10 @@ static char rcsid =
#include "SDL_timer.h" #include "SDL_timer.h"
#include "SDL_timer_c.h" #include "SDL_timer_c.h"
#if _POSIX_THREAD_SYSCALL_SOFT
#include <pthread.h>
#endif
#if defined(DISABLE_THREADS) || defined(FORK_HACK) #if defined(DISABLE_THREADS) || defined(FORK_HACK)
#define USE_ITIMER #define USE_ITIMER
#endif #endif
...@@ -96,6 +100,9 @@ void SDL_Delay (Uint32 ms) ...@@ -96,6 +100,9 @@ void SDL_Delay (Uint32 ms)
do { do {
errno = 0; errno = 0;
#if _POSIX_THREAD_SYSCALL_SOFT
pthread_yield_np();
#endif
#ifdef USE_NANOSLEEP #ifdef USE_NANOSLEEP
tv.tv_sec = elapsed.tv_sec; tv.tv_sec = elapsed.tv_sec;
tv.tv_nsec = elapsed.tv_nsec; tv.tv_nsec = elapsed.tv_nsec;
......
...@@ -5,7 +5,7 @@ noinst_LTLIBRARIES = libvideo.la ...@@ -5,7 +5,7 @@ noinst_LTLIBRARIES = libvideo.la
# Define which subdirectories need to be built # Define which subdirectories need to be built
SUBDIRS = @VIDEO_SUBDIRS@ SUBDIRS = @VIDEO_SUBDIRS@
DIST_SUBDIRS = x11 dga fbcon svga ggi aalib \ DIST_SUBDIRS = dummy x11 dga fbcon svga ggi aalib \
wincommon windib windx5 \ wincommon windib windx5 \
maccommon macdsp macrom bwindow photon cybergfx maccommon macdsp macrom bwindow photon cybergfx
......
...@@ -109,12 +109,21 @@ static char rcsid = ...@@ -109,12 +109,21 @@ static char rcsid =
#define MIN(a, b) ((a) < (b) ? (a) : (b)) #define MIN(a, b) ((a) < (b) ? (a) : (b))
#endif #endif
#define PIXEL_COPY(to, from, len, bpp) \
do { \
if(bpp == 4) { \
SDL_memcpy4(to, from, (unsigned)(len)); \
} else { \
SDL_memcpy(to, from, (unsigned)(len) * (bpp)); \
} \
} while(0)
/* /*
* Various colorkey blit methods, for opaque and per-surface alpha * Various colorkey blit methods, for opaque and per-surface alpha
*/ */
#define OPAQUE_BLIT(to, from, length, bpp, alpha) \ #define OPAQUE_BLIT(to, from, length, bpp, alpha) \
SDL_memcpy(to, from, (unsigned)(length * bpp)) PIXEL_COPY(to, from, length, bpp)
/* /*
* For 32bpp pixels on the form 0x00rrggbb: * For 32bpp pixels on the form 0x00rrggbb:
...@@ -657,9 +666,9 @@ static void RLEAlphaClipBlit(int w, Uint8 *srcbuf, SDL_Surface *dst, ...@@ -657,9 +666,9 @@ static void RLEAlphaClipBlit(int w, Uint8 *srcbuf, SDL_Surface *dst,
if(crun > right - cofs) \ if(crun > right - cofs) \
crun = right - cofs; \ crun = right - cofs; \
if(crun > 0) \ if(crun > 0) \
SDL_memcpy(dstbuf + cofs * sizeof(Ptype), \ PIXEL_COPY(dstbuf + cofs * sizeof(Ptype), \
srcbuf + (cofs - ofs) * sizeof(Ptype), \ srcbuf + (cofs - ofs) * sizeof(Ptype), \
(unsigned)crun * sizeof(Ptype)); \ (unsigned)crun, sizeof(Ptype)); \
srcbuf += run * sizeof(Ptype); \ srcbuf += run * sizeof(Ptype); \
ofs += run; \ ofs += run; \
} else if(!ofs) \ } else if(!ofs) \
...@@ -816,8 +825,8 @@ int SDL_RLEAlphaBlit(SDL_Surface *src, SDL_Rect *srcrect, ...@@ -816,8 +825,8 @@ int SDL_RLEAlphaBlit(SDL_Surface *src, SDL_Rect *srcrect,
run = ((Ctype *)srcbuf)[1]; \ run = ((Ctype *)srcbuf)[1]; \
srcbuf += 2 * sizeof(Ctype); \ srcbuf += 2 * sizeof(Ctype); \
if(run) { \ if(run) { \
SDL_memcpy(dstbuf + ofs * sizeof(Ptype), srcbuf, \ PIXEL_COPY(dstbuf + ofs * sizeof(Ptype), srcbuf, \
run * sizeof(Ptype)); \ run, sizeof(Ptype)); \
srcbuf += run * sizeof(Ptype); \ srcbuf += run * sizeof(Ptype); \
ofs += run; \ ofs += run; \
} else if(!ofs) \ } else if(!ofs) \
......
...@@ -195,8 +195,8 @@ static void BlitNto1SurfaceAlphaKey(SDL_BlitInfo *info) ...@@ -195,8 +195,8 @@ static void BlitNto1SurfaceAlphaKey(SDL_BlitInfo *info)
} }
} }
/* fast RGB888->(A)RGB888 blending with surface alpha */ /* fast RGB888->(A)RGB888 blending with surface alpha=128 special case */
static void BlitRGBtoRGBSurfaceAlpha(SDL_BlitInfo *info) static void BlitRGBtoRGBSurfaceAlpha128(SDL_BlitInfo *info)
{ {
int width = info->d_width; int width = info->d_width;
int height = info->d_height; int height = info->d_height;
...@@ -204,32 +204,58 @@ static void BlitRGBtoRGBSurfaceAlpha(SDL_BlitInfo *info) ...@@ -204,32 +204,58 @@ static void BlitRGBtoRGBSurfaceAlpha(SDL_BlitInfo *info)
int srcskip = info->s_skip >> 2; int srcskip = info->s_skip >> 2;
Uint32 *dstp = (Uint32 *)info->d_pixels; Uint32 *dstp = (Uint32 *)info->d_pixels;
int dstskip = info->d_skip >> 2; int dstskip = info->d_skip >> 2;
SDL_PixelFormat *srcfmt = info->src;
unsigned alpha = srcfmt->alpha;
while(height--) { while(height--) {
DUFFS_LOOP4({ DUFFS_LOOP4({
Uint32 s; Uint32 s = *srcp++;
Uint32 d; Uint32 d = *dstp;
Uint32 s1; *dstp++ = ((((s & 0x00fefefe) + (d & 0x00fefefe)) >> 1)
Uint32 d1; + (s & d & 0x00010101)) | 0xff000000;
s = *srcp;
d = *dstp;
s1 = s & 0xff00ff;
d1 = d & 0xff00ff;
d1 = (d1 + ((s1 - d1) * alpha >> 8)) & 0xff00ff;
s &= 0xff00;
d &= 0xff00;
d = (d + ((s - d) * alpha >> 8)) & 0xff00;
*dstp = d1 | d | 0xff000000;
++srcp;
++dstp;
}, width); }, width);
srcp += srcskip; srcp += srcskip;
dstp += dstskip; dstp += dstskip;
} }
} }
/* fast RGB888->(A)RGB888 blending with surface alpha */
static void BlitRGBtoRGBSurfaceAlpha(SDL_BlitInfo *info)
{
unsigned alpha = info->src->alpha;
if(alpha == 128) {
BlitRGBtoRGBSurfaceAlpha128(info);
} else {
int width = info->d_width;
int height = info->d_height;
Uint32 *srcp = (Uint32 *)info->s_pixels;
int srcskip = info->s_skip >> 2;
Uint32 *dstp = (Uint32 *)info->d_pixels;
int dstskip = info->d_skip >> 2;
while(height--) {
DUFFS_LOOP4({
Uint32 s;
Uint32 d;
Uint32 s1;
Uint32 d1;
s = *srcp;
d = *dstp;
s1 = s & 0xff00ff;
d1 = d & 0xff00ff;
d1 = (d1 + ((s1 - d1) * alpha >> 8))
& 0xff00ff;
s &= 0xff00;
d &= 0xff00;
d = (d + ((s - d) * alpha >> 8)) & 0xff00;
*dstp = d1 | d | 0xff000000;
++srcp;
++dstp;
}, width);
srcp += srcskip;
dstp += dstskip;
}
}
}
/* fast ARGB888->(A)RGB888 blending with pixel alpha */ /* fast ARGB888->(A)RGB888 blending with pixel alpha */
static void BlitRGBtoRGBPixelAlpha(SDL_BlitInfo *info) static void BlitRGBtoRGBPixelAlpha(SDL_BlitInfo *info)
{ {
...@@ -277,8 +303,18 @@ static void BlitRGBtoRGBPixelAlpha(SDL_BlitInfo *info) ...@@ -277,8 +303,18 @@ static void BlitRGBtoRGBPixelAlpha(SDL_BlitInfo *info)
} }
} }
/* fast RGB565->RGB565 blending with surface alpha */ /* 16bpp special case for per-surface alpha=50%: blend 2 pixels in parallel */
static void Blit565to565SurfaceAlpha(SDL_BlitInfo *info)
/* blend a single 16 bit pixel at 50% */
#define BLEND16_50(d, s, mask) \
((((s & mask) + (d & mask)) >> 1) + (s & d & (~mask & 0xffff)))
/* blend two 16 bit pixels at 50% */
#define BLEND2x16_50(d, s, mask) \
(((s & (mask | mask << 16)) >> 1) + ((d & (mask | mask << 16)) >> 1) \
+ (s & d & (~(mask | mask << 16))))
static void Blit16to16SurfaceAlpha128(SDL_BlitInfo *info, Uint16 mask)
{ {
int width = info->d_width; int width = info->d_width;
int height = info->d_height; int height = info->d_height;
...@@ -286,56 +322,163 @@ static void Blit565to565SurfaceAlpha(SDL_BlitInfo *info) ...@@ -286,56 +322,163 @@ static void Blit565to565SurfaceAlpha(SDL_BlitInfo *info)
int srcskip = info->s_skip >> 1; int srcskip = info->s_skip >> 1;
Uint16 *dstp = (Uint16 *)info->d_pixels; Uint16 *dstp = (Uint16 *)info->d_pixels;
int dstskip = info->d_skip >> 1; int dstskip = info->d_skip >> 1;
unsigned alpha = info->src->alpha >> 3; /* downscale alpha to 5 bits */
while(height--) { while(height--) {
DUFFS_LOOP4({ if(((unsigned long)srcp ^ (unsigned long)dstp) & 2) {
Uint32 s = *srcp++; /*
Uint32 d = *dstp; * Source and destination not aligned, pipeline it.
/* * This is mostly a win for big blits but no loss for
* shift out the middle component (green) to the high 16 * small ones
* bits, and process all three RGB components at the same */
* time. Uint32 prev_sw;
*/ int w = width;
s = (s | s << 16) & 0x07e0f81f;
d = (d | d << 16) & 0x07e0f81f; /* handle odd destination */
d += (s - d) * alpha >> 5; if((unsigned long)dstp & 2) {
d &= 0x07e0f81f; Uint16 d = *dstp, s = *srcp;
*dstp++ = d | d >> 16; *dstp = BLEND16_50(d, s, mask);
}, width); dstp++;
srcp += srcskip; srcp++;
dstp += dstskip; w--;
}
srcp++; /* srcp is now 32-bit aligned */
/* bootstrap pipeline with first halfword */
prev_sw = ((Uint32 *)srcp)[-1];
while(w > 1) {
Uint32 sw, dw, s;
sw = *(Uint32 *)srcp;
dw = *(Uint32 *)dstp;
if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
s = (prev_sw << 16) + (sw >> 16);
else
s = (prev_sw >> 16) + (sw << 16);
prev_sw = sw;
*(Uint32 *)dstp = BLEND2x16_50(dw, s, mask);
dstp += 2;
srcp += 2;
w -= 2;
}
/* final pixel if any */
if(w) {
Uint16 d = *dstp, s;
if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
s = prev_sw;
else
s = prev_sw >> 16;
*dstp = BLEND16_50(d, s, mask);
srcp++;
dstp++;
}
srcp += srcskip - 1;
dstp += dstskip;
} else {
/* source and destination are aligned */
int w = width;
/* first odd pixel? */
if((unsigned long)srcp & 2) {
Uint16 d = *dstp, s = *srcp;
*dstp = BLEND16_50(d, s, mask);
srcp++;
dstp++;
w--;
}
/* srcp and dstp are now 32-bit aligned */
while(w > 1) {
Uint32 sw = *(Uint32 *)srcp;
Uint32 dw = *(Uint32 *)dstp;
*(Uint32 *)dstp = BLEND2x16_50(dw, sw, mask);
srcp += 2;
dstp += 2;
w -= 2;
}
/* last odd pixel? */
if(w) {
Uint16 d = *dstp, s = *srcp;
*dstp = BLEND16_50(d, s, mask);
srcp++;
dstp++;
}
srcp += srcskip;
dstp += dstskip;
}
}
}
/* fast RGB565->RGB565 blending with surface alpha */
static void Blit565to565SurfaceAlpha(SDL_BlitInfo *info)
{
unsigned alpha = info->src->alpha;
if(alpha == 128) {
Blit16to16SurfaceAlpha128(info, 0xf7de);
} else {
int width = info->d_width;
int height = info->d_height;
Uint16 *srcp = (Uint16 *)info->s_pixels;
int srcskip = info->s_skip >> 1;
Uint16 *dstp = (Uint16 *)info->d_pixels;
int dstskip = info->d_skip >> 1;
alpha >>= 3; /* downscale alpha to 5 bits */
while(height--) {
DUFFS_LOOP4({
Uint32 s = *srcp++;
Uint32 d = *dstp;
/*
* shift out the middle component (green) to
* the high 16 bits, and process all three RGB
* components at the same time.
*/
s = (s | s << 16) & 0x07e0f81f;
d = (d | d << 16) & 0x07e0f81f;
d += (s - d) * alpha >> 5;
d &= 0x07e0f81f;
*dstp++ = d | d >> 16;
}, width);
srcp += srcskip;
dstp += dstskip;
}
} }
} }
/* fast RGB555->RGB555 blending with surface alpha */ /* fast RGB555->RGB555 blending with surface alpha */
static void Blit555to555SurfaceAlpha(SDL_BlitInfo *info) static void Blit555to555SurfaceAlpha(SDL_BlitInfo *info)
{ {
int width = info->d_width; unsigned alpha = info->src->alpha; /* downscale alpha to 5 bits */
int height = info->d_height; if(alpha == 128) {
Uint16 *srcp = (Uint16 *)info->s_pixels; Blit16to16SurfaceAlpha128(info, 0xfbde);
int srcskip = info->s_skip >> 1; } else {
Uint16 *dstp = (Uint16 *)info->d_pixels; int width = info->d_width;
int dstskip = info->d_skip >> 1; int height = info->d_height;
unsigned alpha = info->src->alpha >> 3; /* downscale alpha to 5 bits */ Uint16 *srcp = (Uint16 *)info->s_pixels;
int srcskip = info->s_skip >> 1;
while(height--) { Uint16 *dstp = (Uint16 *)info->d_pixels;
DUFFS_LOOP4({ int dstskip = info->d_skip >> 1;
Uint32 s = *srcp++; alpha >>= 3; /* downscale alpha to 5 bits */
Uint32 d = *dstp;
/* while(height--) {
* shift out the middle component (green) to the high 16 DUFFS_LOOP4({
* bits, and process all three RGB components at the same Uint32 s = *srcp++;
* time. Uint32 d = *dstp;
*/ /*
s = (s | s << 16) & 0x03e07c1f; * shift out the middle component (green) to
d = (d | d << 16) & 0x03e07c1f; * the high 16 bits, and process all three RGB
d += (s - d) * alpha >> 5; * components at the same time.
d &= 0x03e07c1f; */
*dstp++ = d | d >> 16; s = (s | s << 16) & 0x03e07c1f;
}, width); d = (d | d << 16) & 0x03e07c1f;
srcp += srcskip; d += (s - d) * alpha >> 5;
dstp += dstskip; d &= 0x03e07c1f;
*dstp++ = d | d >> 16;
}, width);
srcp += srcskip;
dstp += dstskip;
}
} }
} }
......
...@@ -723,7 +723,9 @@ void SDL_EraseCursor(SDL_Surface *screen) ...@@ -723,7 +723,9 @@ void SDL_EraseCursor(SDL_Surface *screen)
SDL_Rect area; SDL_Rect area;
SDL_MouseRect(&area); SDL_MouseRect(&area);
video->UpdateRects(this, 1, &area); if ( video->UpdateRects ) {
video->UpdateRects(this, 1, &area);
}
} }
} }
......
...@@ -53,6 +53,17 @@ do { \ ...@@ -53,6 +53,17 @@ do { \
: "memory" ); \ : "memory" ); \
} while(0) } while(0)
#define SDL_memcpy4(dst, src, len) \
do { \
int ecx, edi, esi; \
__asm__ __volatile__ ( \
"cld\n\t" \
"rep ; movsl" \
: "=&c" (ecx), "=&D" (edi), "=&S" (esi) \
: "0" ((unsigned)(len)), "1" (dst), "2" (src) \
: "memory" ); \
} while(0)
#define SDL_revcpy(dst, src, len) \ #define SDL_revcpy(dst, src, len) \
do { \ do { \
int u0, u1, u2; \ int u0, u1, u2; \
...@@ -104,9 +115,15 @@ do { \ ...@@ -104,9 +115,15 @@ do { \
#ifndef SDL_memcpy #ifndef SDL_memcpy
#define SDL_memcpy(dst, src, len) memcpy(dst, src, len) #define SDL_memcpy(dst, src, len) memcpy(dst, src, len)
#endif #endif
#ifndef SDL_memcpy4
#define SDL_memcpy4(dst, src, len) memcpy(dst, src, (len) << 2)
#endif
#ifndef SDL_revcpy #ifndef SDL_revcpy
#define SDL_revcpy(dst, src, len) memmove(dst, src, len) #define SDL_revcpy(dst, src, len) memmove(dst, src, len)
#endif #endif
#ifndef SDL_memset4 #ifndef SDL_memset4
#define SDL_memset4(dst, val, len) \ #define SDL_memset4(dst, val, len) \
do { \ do { \
......
...@@ -355,6 +355,9 @@ extern VideoBootStrap DIRECTX_bootstrap; ...@@ -355,6 +355,9 @@ extern VideoBootStrap DIRECTX_bootstrap;
#ifdef ENABLE_BWINDOW #ifdef ENABLE_BWINDOW
extern VideoBootStrap BWINDOW_bootstrap; extern VideoBootStrap BWINDOW_bootstrap;
#endif #endif
#ifdef ENABLE_DUMMYVIDEO
extern VideoBootStrap DUMMY_bootstrap;
#endif
/* MacOS X gets the proper defines from configure */ /* MacOS X gets the proper defines from configure */
#if defined(macintosh) && !defined(MACOSX) #if defined(macintosh) && !defined(MACOSX)
#define ENABLE_TOOLBOX #define ENABLE_TOOLBOX
......
...@@ -83,6 +83,9 @@ static VideoBootStrap *bootstrap[] = { ...@@ -83,6 +83,9 @@ static VideoBootStrap *bootstrap[] = {
#endif #endif
#ifdef ENABLE_CYBERGRAPHICS #ifdef ENABLE_CYBERGRAPHICS
&CGX_bootstrap, &CGX_bootstrap,
#endif
#ifdef ENABLE_DUMMYVIDEO
&DUMMY_bootstrap,
#endif #endif
NULL NULL
}; };
......
...@@ -50,6 +50,10 @@ public: ...@@ -50,6 +50,10 @@ public:
xoff = x; xoff = x;
yoff = y; yoff = y;
} }
virtual void GetXYOffset(int &x, int &y) {
x = xoff;
y = yoff;
}
/* The view changed size. If it means we're in fullscreen, we /* The view changed size. If it means we're in fullscreen, we
* draw a nice black box in the entire view to get black borders. * draw a nice black box in the entire view to get black borders.
*/ */
......
...@@ -156,6 +156,16 @@ public: ...@@ -156,6 +156,16 @@ public:
#endif #endif
SDL_View->SetXYOffset(x, y); SDL_View->SetXYOffset(x, y);
} }
virtual void GetXYOffset(int &x, int &y) {
#ifdef HAVE_OPENGL
if ( the_view == SDL_GLView ) {
x = 0;
y = 0;
return;
}
#endif
SDL_View->GetXYOffset(x, y);
}
virtual bool BeginDraw(void) { virtual bool BeginDraw(void) {
return(Lock()); return(Lock());
} }
......
...@@ -262,7 +262,12 @@ void BE_PumpEvents(_THIS) ...@@ -262,7 +262,12 @@ void BE_PumpEvents(_THIS)
/* Check for mouse motion */ /* Check for mouse motion */
if ( point != last_point ) { if ( point != last_point ) {
SDL_PrivateMouseMotion(0, 0, (int)point.x, (int)point.y); int x, y;
SDL_Win->GetXYOffset(x, y);
x = (int)point.x - x;
y = (int)point.y - y;
SDL_PrivateMouseMotion(0, 0, x, y);
} }
last_point = point; last_point = point;
......
## Makefile.am for SDL using the null video driver
noinst_LTLIBRARIES = libvideo_null.la
libvideo_null_la_SOURCES = $(NULL_SRCS)
# The SDL null video driver sources
NULL_SRCS = \
SDL_nullvideo.h \
SDL_nullevents.c \
SDL_nullevents_c.h \
SDL_nullmouse.c \
SDL_nullmouse_c.h \
SDL_nullvideo.c
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Sam Lantinga
slouken@devolution.com
*/
#ifdef SAVE_RCSID
static char rcsid =
"@(#) $Id$";
#endif
/* Being a null driver, there's no event stream. We just define stubs for
most of the API. */
#include "SDL.h"
#include "SDL_sysevents.h"
#include "SDL_events_c.h"
#include "SDL_nullvideo.h"
#include "SDL_nullevents_c.h"
void DUMMY_PumpEvents(_THIS)
{
/* do nothing. */
}
void DUMMY_InitOSKeymap(_THIS)
{
/* do nothing. */
}
/* end of SDL_nullevents.c ... */
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Sam Lantinga
slouken@devolution.com
*/
#ifdef SAVE_RCSID
static char rcsid =
"@(#) $Id$";
#endif
#include "SDL_nullvideo.h"
/* Variables and functions exported by SDL_sysevents.c to other parts
of the native video subsystem (SDL_sysvideo.c)
*/
extern void DUMMY_InitOSKeymap(_THIS);
extern void DUMMY_PumpEvents(_THIS);
/* end of SDL_nullevents_c.h ... */
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Sam Lantinga
slouken@devolution.com
*/
#ifdef SAVE_RCSID
static char rcsid =
"@(#) $Id$";
#endif
#include <stdio.h>
#include "SDL_error.h"
#include "SDL_mouse.h"
#include "SDL_events_c.h"
#include "SDL_nullmouse_c.h"
/* The implementation dependent data for the window manager cursor */
struct WMcursor {
int unused;
};
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Sam Lantinga
slouken@devolution.com
*/
#ifdef SAVE_RCSID
static char rcsid =
"@(#) $Id$";
#endif
#include "SDL_nullvideo.h"
/* Functions to be exported */
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Sam Lantinga
slouken@devolution.com
*/
#ifdef SAVE_RCSID
static char rcsid =
"@(#) $Id$";
#endif
/* Dummy SDL video driver implementation; this is just enough to make an
* SDL-based application THINK it's got a working video driver, for
* applications that call SDL_Init(SDL_INIT_VIDEO) when they don't need it,
* and also for use as a collection of stubs when porting SDL to a new
* platform for which you haven't yet written a valid video driver.
*
* This is also a great way to determine bottlenecks: if you think that SDL
* is a performance problem for a given platform, enable this driver, and
* then see if your application runs faster without video overhead.
*
* Initial work by Ryan C. Gordon (icculus@linuxgames.com). A good portion
* of this was cut-and-pasted from Stephane Peter's work in the AAlib
* SDL video driver. Renamed to "DUMMY" by Sam Lantinga.
*/
#include <stdio.h>
#include <stdlib.h>
#include "SDL.h"
#include "SDL_error.h"
#include "SDL_video.h"
#include "SDL_mouse.h"
#include "SDL_sysvideo.h"
#include "SDL_pixels_c.h"
#include "SDL_events_c.h"
#include "SDL_nullvideo.h"
#include "SDL_nullevents_c.h"
#include "SDL_nullmouse_c.h"
/* Initialization/Query functions */
static int DUMMY_VideoInit(_THIS, SDL_PixelFormat *vformat);
static SDL_Rect **DUMMY_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags);
static SDL_Surface *DUMMY_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags);
static int DUMMY_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors);
static void DUMMY_VideoQuit(_THIS);
/* Hardware surface functions */
static int DUMMY_AllocHWSurface(_THIS, SDL_Surface *surface);
static int DUMMY_LockHWSurface(_THIS, SDL_Surface *surface);
static int DUMMY_FlipHWSurface(_THIS, SDL_Surface *surface);
static void DUMMY_UnlockHWSurface(_THIS, SDL_Surface *surface);
static void DUMMY_FreeHWSurface(_THIS, SDL_Surface *surface);
/* etc. */
static void DUMMY_UpdateRects(_THIS, int numrects, SDL_Rect *rects);
/* DUMMY driver bootstrap functions */
static int DUMMY_Available(void)
{
return 1; /* Always available ! */
}
static void DUMMY_DeleteDevice(SDL_VideoDevice *device)
{
free(device->hidden);
free(device);
}
static SDL_VideoDevice *DUMMY_CreateDevice(int devindex)
{
SDL_VideoDevice *device;
/* Initialize all variables that we clean on shutdown */
device = (SDL_VideoDevice *)malloc(sizeof(SDL_VideoDevice));
if ( device ) {
memset(device, 0, (sizeof *device));
device->hidden = (struct SDL_PrivateVideoData *)
malloc((sizeof *device->hidden));
}
if ( (device == NULL) || (device->hidden == NULL) ) {
SDL_OutOfMemory();
if ( device ) {
free(device);
}
return(0);
}
memset(device->hidden, 0, (sizeof *device->hidden));
/* Set the function pointers */
device->VideoInit = DUMMY_VideoInit;
device->ListModes = DUMMY_ListModes;
device->SetVideoMode = DUMMY_SetVideoMode;
device->CreateYUVOverlay = NULL;
device->SetColors = DUMMY_SetColors;
device->UpdateRects = DUMMY_UpdateRects;
device->VideoQuit = DUMMY_VideoQuit;
device->AllocHWSurface = DUMMY_AllocHWSurface;
device->CheckHWBlit = NULL;
device->FillHWRect = NULL;
device->SetHWColorKey = NULL;
device->SetHWAlpha = NULL;
device->LockHWSurface = DUMMY_LockHWSurface;
device->UnlockHWSurface = DUMMY_UnlockHWSurface;
device->FlipHWSurface = NULL;
device->FreeHWSurface = DUMMY_FreeHWSurface;
device->SetCaption = NULL;
device->SetIcon = NULL;
device->IconifyWindow = NULL;
device->GrabInput = NULL;
device->GetWMInfo = NULL;
device->InitOSKeymap = DUMMY_InitOSKeymap;
device->PumpEvents = DUMMY_PumpEvents;
device->free = DUMMY_DeleteDevice;
return device;
}
VideoBootStrap DUMMY_bootstrap = {
"dummy", "SDL dummy video driver",
DUMMY_Available, DUMMY_CreateDevice
};
int DUMMY_VideoInit(_THIS, SDL_PixelFormat *vformat)
{
fprintf(stderr, "WARNING: You are using the SDL dummy video driver!\n");
/* Determine the screen depth (use default 8-bit depth) */
/* we change this during the SDL_SetVideoMode implementation... */
vformat->BitsPerPixel = 8;
vformat->BytesPerPixel = 1;
/* We're done! */
return(0);
}
SDL_Rect **DUMMY_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags)
{
return (SDL_Rect **) -1;
}
SDL_Surface *DUMMY_SetVideoMode(_THIS, SDL_Surface *current,
int width, int height, int bpp, Uint32 flags)
{
if ( this->hidden->buffer ) {
free( this->hidden->buffer );
}
this->hidden->buffer = malloc(width * height * (bpp / 8));
if ( ! this->hidden->buffer ) {
SDL_SetError("Couldn't allocate buffer for requested mode");
return(NULL);
}
/* printf("Setting mode %dx%d\n", width, height); */
memset(this->hidden->buffer, 0, width * height * (bpp / 8));
/* Allocate the new pixel format for the screen */
if ( ! SDL_ReallocFormat(current, bpp, 0, 0, 0, 0) ) {
free(this->hidden->buffer);
this->hidden->buffer = NULL;
SDL_SetError("Couldn't allocate new pixel format for requested mode");
return(NULL);
}
/* Set up the new mode framebuffer */
current->flags = flags & SDL_FULLSCREEN;
this->hidden->w = current->w = width;
this->hidden->h = current->h = height;
current->pitch = current->w * (bpp / 8);
current->pixels = this->hidden->buffer;
/* We're done */
return(current);
}
/* We don't actually allow hardware surfaces other than the main one */
static int DUMMY_AllocHWSurface(_THIS, SDL_Surface *surface)
{
return(-1);
}
static void DUMMY_FreeHWSurface(_THIS, SDL_Surface *surface)
{
return;
}
/* We need to wait for vertical retrace on page flipped displays */
static int DUMMY_LockHWSurface(_THIS, SDL_Surface *surface)
{
return(0);
}
static void DUMMY_UnlockHWSurface(_THIS, SDL_Surface *surface)
{
return;
}
static int DUMMY_FlipHWSurface(_THIS, SDL_Surface *surface)
{
return(0);
}
static void DUMMY_UpdateRects(_THIS, int numrects, SDL_Rect *rects)
{
/* do nothing. */
}
int DUMMY_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors)
{
/* do nothing of note. */
return(1);
}
/* Note: If we are terminated, this could be called in the middle of
another SDL video routine -- notably UpdateRects.
*/
void DUMMY_VideoQuit(_THIS)
{
if (this->screen->pixels != NULL)
{
free(this->screen->pixels);
this->screen->pixels = NULL;
}
}
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Sam Lantinga
slouken@devolution.com
*/
#ifdef SAVE_RCSID
static char rcsid =
"@(#) $Id$";
#endif
#ifndef _SDL_nullvideo_h
#define _SDL_nullvideo_h
#include "SDL_mouse.h"
#include "SDL_sysvideo.h"
#include "SDL_mutex.h"
/* Hidden "this" pointer for the video functions */
#define _THIS SDL_VideoDevice *this
/* Private display data */
struct SDL_PrivateVideoData {
int w, h;
void *buffer;
};
#endif /* _SDL_nullvideo_h */
...@@ -370,6 +370,10 @@ SDL_Surface *SVGA_SetVideoMode(_THIS, SDL_Surface *current, ...@@ -370,6 +370,10 @@ SDL_Surface *SVGA_SetVideoMode(_THIS, SDL_Surface *current,
/* Set up the new mode framebuffer */ /* Set up the new mode framebuffer */
current->flags = (SDL_FULLSCREEN|SDL_HWSURFACE); current->flags = (SDL_FULLSCREEN|SDL_HWSURFACE);
if ( bpp == 8 ) {
/* FIXME: What about DirectColor? */
current->flags |= SDL_HWPALETTE;
}
current->w = width; current->w = width;
current->h = height; current->h = height;
current->pitch = modeinfo->linewidth; current->pitch = modeinfo->linewidth;
......
...@@ -134,10 +134,10 @@ static void WIN_GetKeyboardState(void) ...@@ -134,10 +134,10 @@ static void WIN_GetKeyboardState(void)
if ( keyboard[VK_RMENU] & 0x80) { if ( keyboard[VK_RMENU] & 0x80) {
state |= KMOD_RALT; state |= KMOD_RALT;
} }
if ( keyboard[VK_NUMLOCK] & 0x80) { if ( keyboard[VK_NUMLOCK] & 0x01) {
state |= KMOD_NUM; state |= KMOD_NUM;
} }
if ( keyboard[VK_CAPITAL] & 0x80) { if ( keyboard[VK_CAPITAL] & 0x01) {
state |= KMOD_CAPS; state |= KMOD_CAPS;
} }
} }
......
...@@ -1684,6 +1684,7 @@ static int DX5_AllocHWSurface(_THIS, SDL_Surface *surface) ...@@ -1684,6 +1684,7 @@ static int DX5_AllocHWSurface(_THIS, SDL_Surface *surface)
return(DX5_AllocDDSurface(this, surface, NULL, SDL_HWSURFACE)); return(DX5_AllocDDSurface(this, surface, NULL, SDL_HWSURFACE));
} }
#ifdef DDRAW_DEBUG
void PrintSurface(char *title, LPDIRECTDRAWSURFACE3 surface, Uint32 flags) void PrintSurface(char *title, LPDIRECTDRAWSURFACE3 surface, Uint32 flags)
{ {
DDSURFACEDESC ddsd; DDSURFACEDESC ddsd;
...@@ -1717,6 +1718,7 @@ void PrintSurface(char *title, LPDIRECTDRAWSURFACE3 surface, Uint32 flags) ...@@ -1717,6 +1718,7 @@ void PrintSurface(char *title, LPDIRECTDRAWSURFACE3 surface, Uint32 flags)
ddsd.ddpfPixelFormat.dwBBitMask); ddsd.ddpfPixelFormat.dwBBitMask);
#endif #endif
} }
#endif /* DDRAW_DEBUG */
static int DX5_HWAccelBlit(SDL_Surface *src, SDL_Rect *srcrect, static int DX5_HWAccelBlit(SDL_Surface *src, SDL_Rect *srcrect,
SDL_Surface *dst, SDL_Rect *dstrect) SDL_Surface *dst, SDL_Rect *dstrect)
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
# libtool assumes that the compiler can handle the -fPIC flag # libtool assumes that the compiler can handle the -fPIC flag
# This isn't always true (for example, nasm can't handle it) # This isn't always true (for example, nasm can't handle it)
command="" command=""
while [ $1 ]; do while [ $# -gt 0 ]; do
if [ "$1" != "-fPIC" ]; then if [ "$1" != "-fPIC" ]; then
if [ "$1" != "-DPIC" ]; then if [ "$1" != "-DPIC" ]; then
command="$command $1" command="$command $1"
......
...@@ -140,6 +140,11 @@ int main (int argc, char *argv[]) ...@@ -140,6 +140,11 @@ int main (int argc, char *argv[])
AC_TRY_LINK([ AC_TRY_LINK([
#include <stdio.h> #include <stdio.h>
#include "SDL.h" #include "SDL.h"
int main(int argc, char *argv[])
{ return 0; }
#undef main
#define main K_and_R_C_main
], [ return 0; ], ], [ return 0; ],
[ echo "*** The test program compiled, but did not run. This usually means" [ echo "*** The test program compiled, but did not run. This usually means"
echo "*** that the run-time linker is not finding SDL or finding the wrong" echo "*** that the run-time linker is not finding SDL or finding the wrong"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment