Commit ce3a1900 authored by Sam Lantinga's avatar Sam Lantinga

Added initial support for EPOC/Symbian OS (thanks Hannu!)

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40174
parent bea3cb1d
31.8.2001 HJV
SDL for EPOC/Symbian OS
=======================
This is an Epoc port of SDL (1.2.0). It is not yet complete, but good enough for starting to port all those wonderful SDL based demos, games and other programs to Epoc! I have tested a bunch of demos and test programs in Nokia 9210 Communicator, which is a fancy device with combined PDA/GSM phone features, Symbian OS (Crystal), a full keyboard and a color screen (640x200x12bit).
Btw. Also SDLDoom works over SDL Epoc port now (CDoom)!
How to install to device
========================
Extract binary packets of the demo and test programs and copy the files to N9210.
How to use
==========
Run exe's from the File manager. The Caps lock key enables or disables the virtual cursor.
The Esc key quits demo programs.
Function keys are mapped as follows:
- F1=chr+q, F2=chr+w,..., F8=chr+i,
- F9=chr+a,..., F12=chr+d.
In Crystal, Exe programs do not appear in task list nor in Extras :-(
How to build
============
Building SDL, SDL_IMAGE and tests & demos:
- Build files are in "\sdl\epoc\" and "\sdl_image\epoc\" directories
- Building as usual: "bldmake bldfiles" "abld build wins udeb" "abld build armi urel"
- Test and demos programs are build: "abld test build wins udeb" "abld test build armi urel"
Building and sources
====================
Information about the Epoc implementation:
- Made over SDL 1.2.0
- Ported sources: SDL, SDL_image, xflame, fire, warp, newvox, graywin, testalpha, SDLDoom(CDoom)
- Test programs do not have any major changes: usually only screen size and depth is
changed for 9210, if needed
- Like in all the other platform implementations, the Epoc specific code is in "Epoc" subdirectories. All build files for Epoc are in the directory \sdl\epoc\. Adding a new OS support requires always some changes also in generic files (search for "#ifdef __SYMBIAN32__").
- Currently, two resolutions and bit depths are supported: 320x200 and 640x200 with 8 or 12 bit color.
- I addition, two faked resolutions are supported: 640x400, 640x480. These are implemented by shrinking the screen vertically i.e. only every second scanline is drawn. This can be used for testing and for non-resource intensive programs. Thought, using faked resolutions is a waste of memory and cpu power!
Change history
==============
31.8.2001 Alpha 0.2:
- Now you should build ARMI binaries instead of THUMB. It runs faster.
- sdl_main.cpp: removed check for existing instance of sdlprogram
- sdl_error.h: Added debug macros under conditional compilation in Epoc
- sdl_epocevents.cpp: Added focus lost&gained event handling, added modifier handling, added a lot more key event handling (function keys and others). Function keys are mapped as follows:
F1=chr+q, F2=chr+w,..., F8=chr+i, F9=chr+a,..., F12=chr+d.
- sdl_epocvideo.h: Added EPOC_ScreenOffset variable. Added EPOC_IsWindowFocused variable (but not used for anything yet!). Added RedrawWindowL() function.
- sdl_epocvideo.cpp: Added debugging functions: Debug_AvailMem2() and Debug_AvailMem().
Changed window to have white background. Centralize game screen if it is not full size.
Added RedrawWindowL() function. Force other windows to redraw if SDL window lost focus. This cleans up possible game graphics from screen. Redraw after getting focus again.
Todo
====
This Epoc port is (of course;-) not thoroughly tested. For testing, I have compiled and run a couple of test programs and demos in N9210. Still, e.g. thread related functions have not been tested at all.
Known bugs and unimplemented features:
- No sound
- No console output screen. Printing to stdout do not have any effect.
- Epoc do not allow static/global variables in DLL libraries. So I could only use static linking with SDL.
- Some test programs may take so much cpu in 9210 that e.g. SMS sending and receiving is not possible at a same time. Also screen may look awkward if there appear visible notes, dialogs etc. when an sdl program is active. SDL program runs in the lowest possible priority for minimum interference in the system. Unfortunately, this is always not enough. Perhaps some Delay() commands are needed.
P.s. I have ported also the SDL version of MirrorMagic puzzle game to Epoc. I will put the sources and binaries available as soon as I bother to clean the ported sources a bit...
Open Source & "bazaar" style software development
=================================================
You can take part in this porting project. This is Open Source software and you are very welcome to try it, test it, improve the code and implement the missing pieces. If you have any fix suggestions, improvements, code excerpts etc., contact me by email. Please start the mail subject with a string "EPOC SDL:".
Cheers,
Hannu
Mail:hannu.j.viitala@mbnet.fi
Homepage of SDL for Epoc: www.mbnet.fi/~haviital
...@@ -16,6 +16,8 @@ be found at the <A HREF="http://www.libsdl.org/"> main SDL page</A>. ...@@ -16,6 +16,8 @@ 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.3: Added initial support for EPOC/Symbian OS (thanks Hannu!)
<LI> 1.2.3: Improved MacOS X international keyboard handling
<LI> 1.2.3: Added support for DirectFB video on Linux (thanks Denis!) <LI> 1.2.3: Added support for DirectFB video on Linux (thanks Denis!)
<LI> 1.2.3: Fixed IDE and SCSI CD-ROM detection on BeOS (thanks Caz!) <LI> 1.2.3: Fixed IDE and SCSI CD-ROM detection on BeOS (thanks Caz!)
<LI> 1.2.3: Fixed the system dependent SDL_WINDOWID hack on Windows <LI> 1.2.3: Fixed the system dependent SDL_WINDOWID hack on Windows
......
...@@ -43,6 +43,7 @@ static char rcsid = ...@@ -43,6 +43,7 @@ static char rcsid =
(defined(__alpha__) || defined(__alpha)) || \ (defined(__alpha__) || defined(__alpha)) || \
defined(__arm__) || \ defined(__arm__) || \
(defined(__mips__) && defined(__MIPSEL__)) || \ (defined(__mips__) && defined(__MIPSEL__)) || \
defined(__SYMBIAN32__) || \
defined(__LITTLE_ENDIAN__) defined(__LITTLE_ENDIAN__)
#define SDL_BYTEORDER SDL_LIL_ENDIAN #define SDL_BYTEORDER SDL_LIL_ENDIAN
#else #else
......
...@@ -31,7 +31,7 @@ static char rcsid = ...@@ -31,7 +31,7 @@ static char rcsid =
/* Redefine main() on Win32 and MacOS so that it is called by winmain.c */ /* Redefine main() on Win32 and MacOS so that it is called by winmain.c */
#if defined(WIN32) || (defined(__MWERKS__) && !defined(__BEOS__)) || \ #if defined(WIN32) || (defined(__MWERKS__) && !defined(__BEOS__)) || \
defined(macintosh) || defined(__APPLE__) defined(macintosh) || defined(__APPLE__) || defined(__SYMBIAN32__)
#ifdef __cplusplus #ifdef __cplusplus
#define C_LINKAGE "C" #define C_LINKAGE "C"
......
...@@ -54,6 +54,11 @@ typedef signed int Sint32; ...@@ -54,6 +54,11 @@ typedef signed int Sint32;
#endif #endif
#endif /* !__STRICT_ANSI__ */ #endif /* !__STRICT_ANSI__ */
/* The 64-bit type isn't available on EPOC/Symbian OS */
#ifdef __SYMBIAN32__
#undef SDL_HAS_64BIT_TYPE
#endif
/* The 64-bit datatype isn't supported on all platforms */ /* The 64-bit datatype isn't supported on all platforms */
#ifdef SDL_HAS_64BIT_TYPE #ifdef SDL_HAS_64BIT_TYPE
typedef unsigned SDL_HAS_64BIT_TYPE Uint64; typedef unsigned SDL_HAS_64BIT_TYPE Uint64;
......
...@@ -48,6 +48,12 @@ ...@@ -48,6 +48,12 @@
# endif # endif
#endif #endif
/* Removed DECLSPEC on Symbian OS because SDL cannot be a DLL in EPOC */
#ifdef __SYMBIAN32__
#undef DECLSPEC
#define DECLSPEC
#endif // __SYMBIAN32__
/* Force structure packing at 4 byte alignment. /* Force structure packing at 4 byte alignment.
This is necessary if the header is included in code which has structure This is necessary if the header is included in code which has structure
packing set to an alternate value, say for loading structures from disk. packing set to an alternate value, say for loading structures from disk.
......
...@@ -6,8 +6,12 @@ ...@@ -6,8 +6,12 @@
SUBDIRS = macosx SUBDIRS = macosx
ARCH_SUBDIRS = $(srcdir)/beos $(srcdir)/linux \ ARCH_SUBDIRS = $(srcdir)/beos \
$(srcdir)/macos $(srcdir)/macosx $(srcdir)/win32 $(srcdir)/epoc \
$(srcdir)/linux \
$(srcdir)/macos \
$(srcdir)/macosx \
$(srcdir)/win32
# Build a separate library containing the main() entry point. # Build a separate library containing the main() entry point.
lib_LIBRARIES = libSDLmain.a lib_LIBRARIES = libSDLmain.a
......
/*
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
*/
/*
SDL_main.cpp
The Epoc executable startup functions
Epoc version by Hannu Viitala (hannu.j.viitala@mbnet.fi)
*/
#include <e32std.h>
#include <e32def.h>
#include <e32svr.h>
#include <e32base.h>
#include <estlib.h>
#include <stdlib.h>
#include <stdio.h>
#include <w32std.h>
#include <apgtask.h>
#include "SDL_error.h"
#ifndef EXPORT_C
# ifdef __VC32__
# define IMPORT_C __declspec(dllexport)
# define EXPORT_C __declspec(dllexport)
# endif
# ifdef __GCC32__
# define IMPORT_C
# define EXPORT_C __declspec(dllexport)
# endif
#endif
#if defined(__WINS__)
#include <estw32.h>
IMPORT_C void RegisterWsExe(const TDesC &aName);
#endif
/* The prototype for the application's main() function */
#define main SDL_main
extern "C" int main (int argc, char *argv[], char *envp[]);
extern "C" void exit (int ret);
/* Epoc main function */
GLDEF_C TInt E32Main()
{
/* Get the clean-up stack */
CTrapCleanup* cleanup = CTrapCleanup::New();
#if defined(__WINS__)
/* arrange for access to Win32 stdin/stdout/stderr */
RWin32Stream::StartServer();
#endif
/* Arrange for multi-threaded operation */
SpawnPosixServerThread();
/* Get args and environment */
int argc=0;
char** argv=0;
char** envp=0;
__crt0(argc,argv,envp);
#if defined(__WINS__)
/* Cause the graphical Window Server to come into existence */
RSemaphore sem;
sem.CreateGlobal(_L("WsExeSem"),0);
RegisterWsExe(sem.FullName());
#endif
/* Start the application! */
/* Create stdlib */
_REENT;
/* Set process and thread priority */
RThread currentThread;
currentThread.Rename(_L("SdlProgram"));
currentThread.SetProcessPriority(EPriorityLow);
currentThread.SetPriority(EPriorityMuchLess);
/* Call stdlib main */
int ret = main(argc, argv, envp); /* !! process exits here if there is "exit()" in main! */
/* Call exit */
exit(ret); /* !! process exits here! */
/* Free resources and return */
CloseSTDLIB();
delete cleanup;
return(KErrNone);
}
/* Epoc dll entry point */
#if defined(__WINS__)
GLDEF_C TInt E32Dll(TDllReason)
{
return(KErrNone);
}
EXPORT_C TInt WinsMain(TAny *)
{
E32Main();
return KErrNone;
}
#endif
...@@ -3,8 +3,13 @@ ...@@ -3,8 +3,13 @@
noinst_LTLIBRARIES = libthread.la noinst_LTLIBRARIES = libthread.la
ARCH_SUBDIRS = $(srcdir)/generic $(srcdir)/amigaos $(srcdir)/beos \ ARCH_SUBDIRS = $(srcdir)/generic \
$(srcdir)/irix $(srcdir)/linux $(srcdir)/win32 $(srcdir)/amigaos \
$(srcdir)/beos \
$(srcdir)/epoc \
$(srcdir)/irix \
$(srcdir)/linux \
$(srcdir)/win32
# Older versions of Linux require an asm clone() implementation # Older versions of Linux require an asm clone() implementation
if USE_CLONE if USE_CLONE
......
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997, 1998, 1999, 2000 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
*/
/*
SDL_sysmutex.cpp
Epoc version by Markus Mertama (w@iki.fi)
*/
#ifdef SAVE_RCSID
static char rcsid =
"@(#) $Id$";
#endif
/* Mutex functions using the Win32 API */
//#include <stdio.h>
//#include <stdlib.h>
#include<e32std.h>
#include "SDL_error.h"
#include "SDL_mutex.h"
struct SDL_mutex
{
TInt handle;
};
extern TInt CreateUnique(TInt (*aFunc)(const TDesC& aName, TAny*, TAny*), TAny*, TAny*);
TInt NewMutex(const TDesC& aName, TAny* aPtr1, TAny*)
{
return ((RMutex*)aPtr1)->CreateGlobal(aName);
}
/* Create a mutex */
SDL_mutex *SDL_CreateMutex(void)
{
RMutex rmutex;
TInt status = CreateUnique(NewMutex, &rmutex, NULL);
if(status != KErrNone)
{
SDL_SetError("Couldn't create mutex");
}
SDL_mutex* mutex = new /*(ELeave)*/ SDL_mutex;
mutex->handle = rmutex.Handle();
return(mutex);
}
/* Free the mutex */
void SDL_DestroyMutex(SDL_mutex *mutex)
{
if ( mutex )
{
RMutex rmutex;
rmutex.SetHandle(mutex->handle);
rmutex.Signal();
rmutex.Close();
delete(mutex);
mutex = NULL;
}
}
/* Lock the mutex */
int SDL_mutexP(SDL_mutex *mutex)
{
if ( mutex == NULL ) {
SDL_SetError("Passed a NULL mutex");
return -1;
}
RMutex rmutex;
rmutex.SetHandle(mutex->handle);
rmutex.Wait();
return(0);
}
/* Unlock the mutex */
int SDL_mutexV(SDL_mutex *mutex)
{
if ( mutex == NULL ) {
SDL_SetError("Passed a NULL mutex");
return -1;
}
RMutex rmutex;
rmutex.SetHandle(mutex->handle);
rmutex.Signal();
return(0);
}
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997, 1998, 1999, 2000 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
*/
/*
SDL_syssem.cpp
Epoc version by Markus Mertama (w@iki.fi)
*/
#ifdef SAVE_RCSID
static char rcsid =
"@(#) $Id$";
#endif
/* Semaphore functions using the Win32 API */
//#include <stdio.h>
//#include <stdlib.h>
#include <e32std.h>
#include "SDL_error.h"
#include "SDL_thread.h"
#define SDL_MUTEX_TIMEOUT -2
struct SDL_semaphore
{
TInt handle;
TInt count;
};
extern TInt CreateUnique(TInt (*aFunc)(const TDesC& aName, TAny*, TAny*), TAny*, TAny*);
extern TInt NewThread(const TDesC& aName, TAny* aPtr1, TAny* aPtr2);
TInt NewSema(const TDesC& aName, TAny* aPtr1, TAny* aPtr2)
{
TInt value = *((TInt*) aPtr2);
return ((RSemaphore*)aPtr1)->CreateGlobal(aName, value);
}
/* Create a semaphore */
SDL_sem *SDL_CreateSemaphore(Uint32 initial_value)
{
RSemaphore s;
TInt status = CreateUnique(NewSema, &s, &initial_value);
if(status != KErrNone)
{
SDL_SetError("Couldn't create semaphore");
}
SDL_semaphore* sem = new /*(ELeave)*/ SDL_semaphore;
sem->handle = s.Handle();
sem->count = initial_value;
return(sem);
}
/* Free the semaphore */
void SDL_DestroySemaphore(SDL_sem *sem)
{
if ( sem )
{
RSemaphore sema;
sema.SetHandle(sem->handle);
sema.Signal(sema.Count());
sema.Close();
delete sem;
sem = NULL;
}
}
struct TInfo
{
TInfo(TInt aTime, TInt aHandle) :
iTime(aTime), iHandle(aHandle), iVal(0) {}
TInt iTime;
TInt iHandle;
TInt iVal;
};
TBool ThreadRun(TAny* aInfo)
{
TInfo* info = STATIC_CAST(TInfo*, aInfo);
User::After(info->iTime);
RSemaphore sema;
sema.SetHandle(info->iHandle);
sema.Signal();
info->iVal = SDL_MUTEX_TIMEOUT;
return 0;
}
void _WaitAll(SDL_sem *sem)
{
//since SemTryWait may changed the counter.
//this may not be atomic, but hopes it works.
RSemaphore sema;
sema.SetHandle(sem->handle);
sema.Wait();
while(sem->count < 0)
{
sema.Wait();
}
}
int SDL_SemWaitTimeout(SDL_sem *sem, Uint32 timeout)
{
if ( ! sem ) {
SDL_SetError("Passed a NULL sem");
return -1;
}
if ( timeout == SDL_MUTEX_MAXWAIT )
{
_WaitAll(sem);
return SDL_MUTEX_MAXWAIT;
}
RThread thread;
TInfo* info = new (ELeave)TInfo(timeout, sem->handle);
TInt status = CreateUnique(NewThread, &thread, info);
if(status != KErrNone)
return status;
thread.Resume();
_WaitAll(sem);
if(thread.ExitType() == EExitPending)
{
thread.Kill(SDL_MUTEX_TIMEOUT);
}
thread.Close();
return info->iVal;
}
int SDL_SemTryWait(SDL_sem *sem)
{
if(sem->count > 0)
{
sem->count--;
}
return SDL_MUTEX_TIMEOUT;
}
int SDL_SemWait(SDL_sem *sem)
{
return SDL_SemWaitTimeout(sem, SDL_MUTEX_MAXWAIT);
}
/* Returns the current count of the semaphore */
Uint32 SDL_SemValue(SDL_sem *sem)
{
if ( ! sem ) {
SDL_SetError("Passed a NULL sem");
return 0;
}
return sem->count;
}
int SDL_SemPost(SDL_sem *sem)
{
if ( ! sem ) {
SDL_SetError("Passed a NULL sem");
return -1;
}
sem->count++;
RSemaphore sema;
sema.SetHandle(sem->handle);
sema.Signal();
return 0;
}
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997, 1998, 1999, 2000 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
*/
/*
SDL_systhread.cpp
Epoc thread management routines for SDL
Epoc version by Markus Mertama (w@iki.fi)
*/
//#include <stdlib.h>
//#include <stdio.h>
extern "C" {
#undef NULL
#include "SDL_error.h"
#include "SDL_thread.h"
#include "SDL_systhread.h"
};
#include <e32std.h>
static int object_count;
int RunThread(TAny* data)
{
SDL_RunThread(data);
return(0);
}
TInt NewThread(const TDesC& aName, TAny* aPtr1, TAny* aPtr2)
{
return ((RThread*)(aPtr1))->Create(aName,
RunThread,
KDefaultStackSize,
NULL,
aPtr2);
}
int CreateUnique(TInt (*aFunc)(const TDesC& aName, TAny*, TAny*), TAny* aPtr1, TAny* aPtr2)
{
TBuf<16> name;
TInt status = KErrNone;
do
{
object_count++;
name.Format(_L("SDL_%x"), object_count);
status = aFunc(name, aPtr1, aPtr2);
}
while(status == KErrAlreadyExists);
return status;
}
int SDL_SYS_CreateThread(SDL_Thread *thread, void *args)
{
RThread rthread;
TInt status = CreateUnique(NewThread, &rthread, args);
if (status != KErrNone)
{
delete(((RThread*)(thread->handle)));
thread->handle = NULL;
SDL_SetError("Not enough resources to create thread");
return(-1);
}
rthread.Resume();
thread->handle = rthread.Handle();
return(0);
}
void SDL_SYS_SetupThread(void)
{
return;
}
Uint32 SDL_ThreadID(void)
{
RThread current;
TThreadId id = current.Id();
return id;
}
void SDL_SYS_WaitThread(SDL_Thread *thread)
{
RUndertaker taker;
taker.Create();
TRequestStatus status;
taker.Logon(status, thread->handle);
User::WaitForRequest(status);
taker.Close();
}
/* WARNING: This function is really a last resort.
* Threads should be signaled and then exit by themselves.
* TerminateThread() doesn't perform stack and DLL cleanup.
*/
void SDL_SYS_KillThread(SDL_Thread *thread)
{
RThread rthread;
rthread.SetHandle(thread->handle);
rthread.Kill(0);
rthread.Close();
}
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997, 1998, 1999, 2000 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
*/
/*
SDL_systhread_c.h
Epoc version by Markus Mertama (w@iki.fi)
*/
typedef int SYS_ThreadHandle;
...@@ -3,8 +3,12 @@ ...@@ -3,8 +3,12 @@
noinst_LTLIBRARIES = libtimer.la noinst_LTLIBRARIES = libtimer.la
ARCH_SUBDIRS = $(srcdir)/amigaos $(srcdir)/beos $(srcdir)/linux \ ARCH_SUBDIRS = $(srcdir)/amigaos \
$(srcdir)/macos $(srcdir)/win32 $(srcdir)/beos \
$(srcdir)/epoc \
$(srcdir)/linux \
$(srcdir)/macos \
$(srcdir)/win32
# Include the architecture-independent sources # Include the architecture-independent sources
COMMON_SRCS = SDL_timer.c SDL_timer_c.h SDL_systimer.h COMMON_SRCS = SDL_timer.c SDL_timer_c.h SDL_systimer.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
*/
/*
SDL_systimer.cpp
Epoc version by Hannu Viitala (hannu.j.viitala@mbnet.fi)
*/
#include <e32std.h>
#include <e32hal.h>
extern "C" {
#include "SDL_error.h"
#include "SDL_thread.h"
#include "SDL_timer.h"
#include "SDL_timer_c.h"
static TUint start = 0;
static TInt tickPeriodMilliSeconds;
void SDL_StartTicks(void)
{
/* Set first ticks value */
start = User::TickCount();
TTimeIntervalMicroSeconds32 period;
TInt tmp = UserHal::TickPeriod(period);
tickPeriodMilliSeconds = period.Int() / 1000;
}
Uint32 SDL_GetTicks(void)
{
TUint deltaTics = User::TickCount() - start;
return(deltaTics * tickPeriodMilliSeconds);
}
void SDL_Delay(Uint32 ms)
{
User::After(TTimeIntervalMicroSeconds32(ms*1000));
}
/* Data to handle a single periodic alarm */
static int timer_alive = 0;
static SDL_Thread *timer = NULL;
static int RunTimer(void *unused)
{
Uint32 ms;
while ( timer_alive ) {
if ( SDL_timer_running ) {
SDL_ThreadedTimerCheck();
}
SDL_Delay(10);
}
return(0);
}
/* This is only called if the event thread is not running */
int SDL_SYS_TimerInit(void)
{
timer_alive = 1;
timer = SDL_CreateThread(RunTimer, NULL);
if ( timer == NULL )
return(-1);
return(SDL_SetTimerThreaded(1));
}
void SDL_SYS_TimerQuit(void)
{
timer_alive = 0;
if ( timer ) {
SDL_WaitThread(timer, NULL);
timer = NULL;
}
}
int SDL_SYS_StartTimer(void)
{
SDL_SetError("Internal logic error: Epoc uses threaded timer");
return(-1);
}
void SDL_SYS_StopTimer(void)
{
return;
}
}; // extern "C"
...@@ -8,7 +8,7 @@ SUBDIRS = @VIDEO_SUBDIRS@ ...@@ -8,7 +8,7 @@ SUBDIRS = @VIDEO_SUBDIRS@
DIST_SUBDIRS = dummy x11 dga nanox fbcon directfb vgl svga ggi aalib \ DIST_SUBDIRS = dummy x11 dga nanox fbcon directfb vgl svga ggi aalib \
wincommon windib windx5 \ wincommon windib windx5 \
maccommon macdsp macrom quartz \ maccommon macdsp macrom quartz \
bwindow ps2gs photon cybergfx bwindow ps2gs photon cybergfx epoc
DRIVERS = @VIDEO_DRIVERS@ DRIVERS = @VIDEO_DRIVERS@
......
...@@ -364,12 +364,6 @@ extern VideoBootStrap DIRECTX_bootstrap; ...@@ -364,12 +364,6 @@ 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
#ifdef ENABLE_PHOTON
extern VideoBootStrap ph_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
...@@ -389,6 +383,15 @@ extern VideoBootStrap QZ_bootstrap; ...@@ -389,6 +383,15 @@ extern VideoBootStrap QZ_bootstrap;
#ifdef ENABLE_CYBERGRAPHICS #ifdef ENABLE_CYBERGRAPHICS
extern VideoBootStrap CGX_bootstrap; extern VideoBootStrap CGX_bootstrap;
#endif #endif
#ifdef ENABLE_PHOTON
extern VideoBootStrap ph_bootstrap;
#endif
#ifdef ENABLE_EPOC
extern VideoBootStrap EPOC_bootstrap;
#endif
#ifdef ENABLE_DUMMYVIDEO
extern VideoBootStrap DUMMY_bootstrap;
#endif
/* This is the current video device */ /* This is the current video device */
extern SDL_VideoDevice *current_video; extern SDL_VideoDevice *current_video;
......
...@@ -96,14 +96,18 @@ static VideoBootStrap *bootstrap[] = { ...@@ -96,14 +96,18 @@ static VideoBootStrap *bootstrap[] = {
#ifdef ENABLE_CYBERGRAPHICS #ifdef ENABLE_CYBERGRAPHICS
&CGX_bootstrap, &CGX_bootstrap,
#endif #endif
#ifdef ENABLE_DUMMYVIDEO
&DUMMY_bootstrap,
#endif
#ifdef ENABLE_PHOTON #ifdef ENABLE_PHOTON
&ph_bootstrap, &ph_bootstrap,
#endif
#ifdef ENABLE_EPOC
&EPOC_bootstrap,
#endif
#ifdef ENABLE_DUMMYVIDEO
&DUMMY_bootstrap,
#endif #endif
NULL NULL
}; };
SDL_VideoDevice *current_video = NULL; SDL_VideoDevice *current_video = NULL;
/* Various local functions */ /* Various local functions */
......
This diff is collapsed.
/*
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
*/
/*
SDL_epocevents_c.h
Handle the event stream, converting Epoc events into SDL events
Epoc version by Hannu Viitala (hannu.j.viitala@mbnet.fi)
*/
#ifdef SAVE_RCSID
static char rcsid =
"@(#) $Id$";
#endif
extern "C" {
#include "SDL_sysvideo.h"
};
#define MAX_SCANCODE 255
/* Variables and functions exported by SDL_sysevents.c to other parts
of the native video subsystem (SDL_sysvideo.c)
*/
extern "C" {
extern void EPOC_InitOSKeymap(_THIS);
extern void EPOC_PumpEvents(_THIS);
};
This diff is collapsed.
/*
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
*/
/*
SDL_epocvideo.h
Epoc based SDL video driver implementation
Epoc version by Hannu Viitala (hannu.j.viitala@mbnet.fi)
*/
#ifndef _SDL_epocvideo_h
#define _SDL_epocvideo_h
extern "C" {
#include "SDL_mouse.h"
#include "SDL_sysvideo.h"
};
#include <e32std.h>
#include <bitdev.h>
#include <w32std.h>
/* Hidden "this" pointer for the video functions */
#define _THIS SDL_VideoDevice *_this
#define Private _this->hidden
#define SDL_NUMMODES 4
/* Private display data */
struct SDL_PrivateVideoData {
SDL_Rect *SDL_modelist[SDL_NUMMODES+1];
/* Epoc window server info */
RWsSession EPOC_WsSession;
RWindowGroup EPOC_WsWindowGroup;
TInt EPOC_WsWindowGroupID;
RWindow EPOC_WsWindow;
CWsScreenDevice* EPOC_WsScreen;
CWindowGc* EPOC_WindowGc;
TRequestStatus EPOC_WsEventStatus;
TRequestStatus EPOC_RedrawEventStatus;
TWsEvent EPOC_WsEvent;
TWsRedrawEvent EPOC_RedrawEvent;
#ifdef __WINS__
CWsBitmap* EPOC_Bitmap;
#endif
TBool EPOC_IsWindowFocused; //!!Not used for anything yet!
/* Screen hardware frame buffer info */
TBool EPOC_HasFrameBuffer;
TInt EPOC_BytesPerPixel;
TInt EPOC_BytesPerScanLine;
TDisplayMode EPOC_DisplayMode;
TSize EPOC_ScreenSize;
TUint8* EPOC_FrameBuffer; /* if NULL in HW we can't do direct screen access */
TInt EPOC_ScreenOffset;
/* Simulate double screen height */
TBool EPOC_ShrinkedHeight;
};
extern "C" {
extern void RedrawWindowL(_THIS);
};
#endif /* _SDL_epocvideo_h */
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