Updated WinCE support by Dmitry (with some tweaks)
Converted the disk audio driver to SDL_RWops for portability --HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%401469
This commit is contained in:
parent
2180b13d61
commit
7d970e27e2
19 changed files with 377 additions and 180 deletions
BIN
VisualC.zip
BIN
VisualC.zip
Binary file not shown.
BIN
VisualCE.zip
BIN
VisualCE.zip
Binary file not shown.
|
@ -26,18 +26,34 @@
|
|||
/* This is a set of defines to configure the SDL features */
|
||||
|
||||
#ifdef _MSC_VER
|
||||
typedef __int8 int8_t;
|
||||
typedef signed __int8 int8_t;
|
||||
typedef unsigned __int8 uint8_t;
|
||||
typedef __int16 int16_t;
|
||||
typedef signed __int16 int16_t;
|
||||
typedef unsigned __int16 uint16_t;
|
||||
typedef __int32 int32_t;
|
||||
typedef signed __int32 int32_t;
|
||||
typedef unsigned __int32 uint32_t;
|
||||
typedef __int64 int64_t;
|
||||
typedef signed __int64 int64_t;
|
||||
typedef unsigned __int64 uint64_t;
|
||||
#if _MSC_VER <= 1200
|
||||
#ifndef _UINTPTR_T_DEFINED
|
||||
#ifdef _WIN64
|
||||
typedef unsigned __int64 uintptr_t;
|
||||
#else
|
||||
typedef unsigned int uintptr_t;
|
||||
#endif
|
||||
#define _UINTPTR_T_DEFINED
|
||||
#endif
|
||||
#else
|
||||
typedef signed char int8_t;
|
||||
typedef unsigned char uint8_t;
|
||||
typedef signed short int16_t;
|
||||
typedef unsigned short uint16_t;
|
||||
typedef signed int int32_t;
|
||||
typedef unsigned int uint32_t;
|
||||
typedef signed long long int64_t;
|
||||
typedef unsigned long long uint64_t;
|
||||
typedef unsigned int size_t;
|
||||
typedef unsigned long uintptr_t;
|
||||
#endif
|
||||
#endif
|
||||
#endif /* _MSC_VER */
|
||||
#define SDL_HAS_64BIT_TYPE 1
|
||||
|
||||
/* Useful headers */
|
||||
|
@ -79,8 +95,10 @@ typedef unsigned long uintptr_t;
|
|||
#define SDL_VIDEO_DRIVER_WINDIB 1
|
||||
|
||||
/* Enable OpenGL support */
|
||||
#ifndef _WIN32_WCE
|
||||
#define SDL_VIDEO_OPENGL 1
|
||||
#define SDL_VIDEO_OPENGL_WGL 1
|
||||
#endif
|
||||
|
||||
/* Enable assembly routines */
|
||||
#define SDL_ASSEMBLY_ROUTINES 1
|
||||
|
|
|
@ -59,7 +59,9 @@ typedef struct SDL_Thread SDL_Thread;
|
|||
So, in short:
|
||||
Always use the _beginthread() and _endthread() of the calling runtime library!
|
||||
*/
|
||||
#ifndef _WIN32_WCE
|
||||
#include <process.h> // This has _beginthread() and _endthread() defined!
|
||||
#endif
|
||||
#ifdef __EMX__
|
||||
#include <stdlib.h> // This has _beginthread() and _endthread() defined, if -Zmt flag is used!
|
||||
#endif
|
||||
|
@ -68,9 +70,6 @@ typedef struct SDL_Thread SDL_Thread;
|
|||
typedef int (*pfnSDL_CurrentBeginThread)(void (*func)(void *), void *, unsigned, void *arg);
|
||||
typedef void (*pfnSDL_CurrentEndThread)(void);
|
||||
#else
|
||||
#ifdef __GNUC__
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
typedef uintptr_t (__cdecl *pfnSDL_CurrentBeginThread) (void *, unsigned,
|
||||
unsigned (__stdcall *func)(void *), void *arg,
|
||||
unsigned, unsigned *threadID);
|
||||
|
|
|
@ -325,8 +325,8 @@ unsigned _System LibMain(unsigned hmod, unsigned termination)
|
|||
|
||||
#elif defined(__WIN32__)
|
||||
|
||||
#if !defined(HAVE_LIBC) || defined(_WIN32_WCE) || (defined(__WATCOMC__) && defined(BUILD_DLL))
|
||||
/* Need to include DllMain() on Windows CE and Watcom C for some reason.. */
|
||||
#if !defined(HAVE_LIBC) || (defined(__WATCOMC__) && defined(BUILD_DLL))
|
||||
/* Need to include DllMain() on Watcom C for some reason.. */
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
|
||||
|
@ -343,6 +343,6 @@ BOOL APIENTRY _DllMainCRTStartup( HANDLE hModule,
|
|||
}
|
||||
return TRUE;
|
||||
}
|
||||
#endif /* _WIN32_WCE and building DLL with Watcom C */
|
||||
#endif /* building DLL with Watcom C */
|
||||
|
||||
#endif /* OS/2 elif __WIN32__ */
|
||||
|
|
|
@ -550,12 +550,13 @@ done:
|
|||
if ( format != NULL ) {
|
||||
SDL_free(format);
|
||||
}
|
||||
if ( freesrc && src ) {
|
||||
SDL_RWclose(src);
|
||||
}
|
||||
else {
|
||||
// seek to the end of the file (given by the RIFF chunk)
|
||||
SDL_RWseek(src, wavelen - chunk.length - headerDiff, RW_SEEK_CUR);
|
||||
if ( src ) {
|
||||
if ( freesrc ) {
|
||||
SDL_RWclose(src);
|
||||
} else {
|
||||
// seek to the end of the file (given by the RIFF chunk)
|
||||
SDL_RWseek(src, wavelen - chunk.length - headerDiff, RW_SEEK_CUR);
|
||||
}
|
||||
}
|
||||
if ( was_error ) {
|
||||
spec = NULL;
|
||||
|
|
|
@ -26,16 +26,11 @@
|
|||
|
||||
/* Output raw audio data to a file. */
|
||||
|
||||
#if HAVE_STDIO_H
|
||||
#include <stdio.h>
|
||||
#include <string.h> /* For strerror() */
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#endif
|
||||
|
||||
#include "SDL_rwops.h"
|
||||
#include "SDL_timer.h"
|
||||
#include "SDL_audio.h"
|
||||
#include "../SDL_audiomem.h"
|
||||
|
@ -61,44 +56,18 @@ static void DISKAUD_CloseAudio(_THIS);
|
|||
|
||||
static const char *DISKAUD_GetOutputFilename(void)
|
||||
{
|
||||
const char *envr = SDL_getenv(DISKENVR_OUTFILE);
|
||||
return((envr != NULL) ? envr : DISKDEFAULT_OUTFILE);
|
||||
const char *envr = SDL_getenv(DISKENVR_OUTFILE);
|
||||
return((envr != NULL) ? envr : DISKDEFAULT_OUTFILE);
|
||||
}
|
||||
|
||||
/* Audio driver bootstrap functions */
|
||||
static int DISKAUD_Available(void)
|
||||
{
|
||||
#if 0
|
||||
int fd;
|
||||
int available;
|
||||
int exists = 0;
|
||||
struct stat statbuf;
|
||||
const char *fname = DISKAUD_GetOutputFilename();
|
||||
const char *envr = SDL_getenv("SDL_AUDIODRIVER");
|
||||
available = 0;
|
||||
|
||||
if ((envr) && (SDL_strcmp(envr, DISKAUD_DRIVER_NAME) == 0)) {
|
||||
if (stat(fname, &statbuf) == 0)
|
||||
exists = 1;
|
||||
|
||||
fd = open(fname, O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR);
|
||||
if ( fd != -1 ) {
|
||||
available = 1;
|
||||
close(fd);
|
||||
if (!exists) {
|
||||
unlink(fname);
|
||||
}
|
||||
}
|
||||
}
|
||||
return(available);
|
||||
#else
|
||||
const char *envr = SDL_getenv("SDL_AUDIODRIVER");
|
||||
if ((envr) && (SDL_strcmp(envr, DISKAUD_DRIVER_NAME) == 0)) {
|
||||
if (envr && (SDL_strcmp(envr, DISKAUD_DRIVER_NAME) == 0)) {
|
||||
return(1);
|
||||
}
|
||||
|
||||
return(0);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void DISKAUD_DeleteDevice(SDL_AudioDevice *device)
|
||||
|
@ -110,7 +79,7 @@ static void DISKAUD_DeleteDevice(SDL_AudioDevice *device)
|
|||
static SDL_AudioDevice *DISKAUD_CreateDevice(int devindex)
|
||||
{
|
||||
SDL_AudioDevice *this;
|
||||
const char *envr;
|
||||
const char *envr;
|
||||
|
||||
/* Initialize all variables that we clean on shutdown */
|
||||
this = (SDL_AudioDevice *)SDL_malloc(sizeof(SDL_AudioDevice));
|
||||
|
@ -128,8 +97,8 @@ static SDL_AudioDevice *DISKAUD_CreateDevice(int devindex)
|
|||
}
|
||||
SDL_memset(this->hidden, 0, (sizeof *this->hidden));
|
||||
|
||||
envr = SDL_getenv(DISKENVR_WRITEDELAY);
|
||||
this->hidden->write_delay = (envr) ? SDL_atoi(envr) : DISKDEFAULT_WRITEDELAY;
|
||||
envr = SDL_getenv(DISKENVR_WRITEDELAY);
|
||||
this->hidden->write_delay = (envr) ? SDL_atoi(envr) : DISKDEFAULT_WRITEDELAY;
|
||||
|
||||
/* Set the function pointers */
|
||||
this->OpenAudio = DISKAUD_OpenAudio;
|
||||
|
@ -151,26 +120,20 @@ AudioBootStrap DISKAUD_bootstrap = {
|
|||
/* This function waits until it is possible to write a full sound buffer */
|
||||
static void DISKAUD_WaitAudio(_THIS)
|
||||
{
|
||||
SDL_Delay(this->hidden->write_delay);
|
||||
SDL_Delay(this->hidden->write_delay);
|
||||
}
|
||||
|
||||
static void DISKAUD_PlayAudio(_THIS)
|
||||
{
|
||||
int written;
|
||||
|
||||
/* Write the audio data, checking for EAGAIN on broken audio drivers */
|
||||
do {
|
||||
written = write(this->hidden->audio_fd,
|
||||
this->hidden->mixbuf,
|
||||
/* Write the audio data */
|
||||
written = SDL_RWwrite(this->hidden->output,
|
||||
this->hidden->mixbuf, 1,
|
||||
this->hidden->mixlen);
|
||||
if ( (written < 0) && ((errno == 0) || (errno == EAGAIN)) ) {
|
||||
SDL_Delay(1); /* Let a little CPU time go by */
|
||||
}
|
||||
} while ( (written < 0) &&
|
||||
((errno == 0) || (errno == EAGAIN) || (errno == EINTR)) );
|
||||
|
||||
/* If we couldn't write, assume fatal error for now */
|
||||
if ( written < 0 ) {
|
||||
if ( written != this->hidden->mixlen ) {
|
||||
this->enabled = 0;
|
||||
}
|
||||
#ifdef DEBUG_AUDIO
|
||||
|
@ -189,25 +152,26 @@ static void DISKAUD_CloseAudio(_THIS)
|
|||
SDL_FreeAudioMem(this->hidden->mixbuf);
|
||||
this->hidden->mixbuf = NULL;
|
||||
}
|
||||
if ( this->hidden->audio_fd >= 0 ) {
|
||||
close(this->hidden->audio_fd);
|
||||
this->hidden->audio_fd = -1;
|
||||
if ( this->hidden->output != NULL ) {
|
||||
SDL_RWclose(this->hidden->output);
|
||||
this->hidden->output = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static int DISKAUD_OpenAudio(_THIS, SDL_AudioSpec *spec)
|
||||
{
|
||||
const char *fname = DISKAUD_GetOutputFilename();
|
||||
const char *fname = DISKAUD_GetOutputFilename();
|
||||
|
||||
/* Open the audio device */
|
||||
this->hidden->audio_fd = open(fname, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
|
||||
if ( this->hidden->audio_fd < 0 ) {
|
||||
SDL_SetError("Couldn't open %s: %s", fname, strerror(errno));
|
||||
this->hidden->output = SDL_RWFromFile(fname, "wb");
|
||||
if ( this->hidden->output == NULL ) {
|
||||
return(-1);
|
||||
}
|
||||
|
||||
fprintf(stderr, "WARNING: You are using the SDL disk writer"
|
||||
#if HAVE_STDIO_H
|
||||
fprintf(stderr, "WARNING: You are using the SDL disk writer"
|
||||
" audio driver!\n Writing to file [%s].\n", fname);
|
||||
#endif
|
||||
|
||||
/* Allocate mixing buffer */
|
||||
this->hidden->mixlen = spec->size;
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#ifndef _SDL_diskaudio_h
|
||||
#define _SDL_diskaudio_h
|
||||
|
||||
#include "SDL_rwops.h"
|
||||
#include "../SDL_sysaudio.h"
|
||||
|
||||
/* Hidden "this" pointer for the video functions */
|
||||
|
@ -31,10 +32,10 @@
|
|||
|
||||
struct SDL_PrivateAudioData {
|
||||
/* The file descriptor for the audio device */
|
||||
int audio_fd;
|
||||
Uint8 *mixbuf;
|
||||
Uint32 mixlen;
|
||||
Uint32 write_delay;
|
||||
SDL_RWops *output;
|
||||
Uint8 *mixbuf;
|
||||
Uint32 mixlen;
|
||||
Uint32 write_delay;
|
||||
};
|
||||
|
||||
#endif /* _SDL_diskaudio_h */
|
||||
|
|
|
@ -29,16 +29,25 @@
|
|||
#include "SDL_rwops.h"
|
||||
|
||||
|
||||
#ifdef __WIN32__
|
||||
#if defined(__WIN32__)
|
||||
|
||||
/* Functions to read/write Win32 API file pointers */
|
||||
/* Will not use it on WinCE because stdio is buffered, it means
|
||||
faster, and all stdio functions anyway are embedded in coredll.dll -
|
||||
the main wince dll*/
|
||||
|
||||
#define WINDOWS_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
|
||||
static int win32_file_open(SDL_RWops *context, const char *filename, const char *mode) {
|
||||
|
||||
#ifndef INVALID_SET_FILE_POINTER
|
||||
#define INVALID_SET_FILE_POINTER 0xFFFFFFFF
|
||||
#endif
|
||||
|
||||
static int win32_file_open(SDL_RWops *context, const char *filename, const char *mode)
|
||||
{
|
||||
#ifndef _WIN32_WCE
|
||||
UINT old_error_mode;
|
||||
#endif
|
||||
HANDLE h;
|
||||
DWORD r_right, w_right;
|
||||
DWORD must_exist, truncate;
|
||||
|
@ -64,15 +73,31 @@ static int win32_file_open(SDL_RWops *context, const char *filename, const char
|
|||
|
||||
if (!r_right && !w_right) /* inconsistent mode */
|
||||
return -1; /* failed (invalid call)*/
|
||||
|
||||
|
||||
#ifdef _WIN32_WCE
|
||||
{
|
||||
size_t size = SDL_strlen(filename)+1;
|
||||
wchar_t *filenameW = SDL_stack_alloc(wchar_t, size);
|
||||
|
||||
if ( MultiByteToWideChar(CP_UTF8, 0, filename, -1, filenameW, size) == 0 ) {
|
||||
SDL_SetError("Unable to convert filename to Unicode");
|
||||
SDL_stack_free(filenameW);
|
||||
return -1;
|
||||
}
|
||||
h = CreateFile(filenameW, (w_right|r_right), (w_right)? 0 : FILE_SHARE_READ,
|
||||
NULL, (must_exist|truncate|a_mode), FILE_ATTRIBUTE_NORMAL,NULL);
|
||||
SDL_stack_free(filenameW);
|
||||
}
|
||||
#else
|
||||
/* Do not open a dialog box if failure */
|
||||
old_error_mode = SetErrorMode(SEM_NOOPENFILEERRORBOX|SEM_FAILCRITICALERRORS);
|
||||
|
||||
old_error_mode = SetErrorMode(SEM_NOOPENFILEERRORBOX|SEM_FAILCRITICALERRORS);
|
||||
|
||||
h = CreateFile(filename, (w_right|r_right), (w_right)? 0 : FILE_SHARE_READ,
|
||||
NULL, (must_exist|truncate|a_mode), FILE_ATTRIBUTE_NORMAL,NULL);
|
||||
|
||||
|
||||
/* restore old behaviour */
|
||||
SetErrorMode(old_error_mode);
|
||||
#endif /* _WIN32_WCE */
|
||||
|
||||
if (h==INVALID_HANDLE_VALUE) {
|
||||
SDL_SetError("Couldn't open %s",filename);
|
||||
|
@ -83,7 +108,8 @@ static int win32_file_open(SDL_RWops *context, const char *filename, const char
|
|||
|
||||
return 0; /* ok */
|
||||
}
|
||||
static int win32_file_seek(SDL_RWops *context, int offset, int whence) {
|
||||
static int win32_file_seek(SDL_RWops *context, int offset, int whence)
|
||||
{
|
||||
DWORD win32whence;
|
||||
int file_pos;
|
||||
|
||||
|
@ -112,7 +138,8 @@ static int win32_file_seek(SDL_RWops *context, int offset, int whence) {
|
|||
SDL_Error(SDL_EFSEEK);
|
||||
return -1; /* error */
|
||||
}
|
||||
static int win32_file_read(SDL_RWops *context, void *ptr, int size, int maxnum) {
|
||||
static int win32_file_read(SDL_RWops *context, void *ptr, int size, int maxnum)
|
||||
{
|
||||
|
||||
int total_bytes;
|
||||
DWORD byte_read,nread;
|
||||
|
@ -129,7 +156,8 @@ static int win32_file_read(SDL_RWops *context, void *ptr, int size, int maxnum)
|
|||
nread = byte_read/size;
|
||||
return nread;
|
||||
}
|
||||
static int win32_file_write(SDL_RWops *context, const void *ptr, int size, int num) {
|
||||
static int win32_file_write(SDL_RWops *context, const void *ptr, int size, int num)
|
||||
{
|
||||
|
||||
int total_bytes;
|
||||
DWORD byte_written,nwritten;
|
||||
|
@ -155,7 +183,8 @@ static int win32_file_write(SDL_RWops *context, const void *ptr, int size, int n
|
|||
nwritten = byte_written/size;
|
||||
return nwritten;
|
||||
}
|
||||
static int win32_file_close(SDL_RWops *context) {
|
||||
static int win32_file_close(SDL_RWops *context)
|
||||
{
|
||||
|
||||
if ( context ) {
|
||||
if (context->hidden.win32io.h != INVALID_HANDLE_VALUE) {
|
||||
|
@ -249,7 +278,7 @@ static int mem_read(SDL_RWops *context, void *ptr, int size, int maxnum)
|
|||
size_t mem_available;
|
||||
|
||||
total_bytes = (maxnum * size);
|
||||
if ( (maxnum <= 0) || (size <= 0) || ((total_bytes / maxnum) != size) ) {
|
||||
if ( (maxnum <= 0) || (size <= 0) || ((total_bytes / maxnum) != (size_t) size) ) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -335,13 +364,15 @@ static char *unix_to_mac(const char *file)
|
|||
SDL_RWops *SDL_RWFromFile(const char *file, const char *mode)
|
||||
{
|
||||
SDL_RWops *rwops = NULL;
|
||||
|
||||
#ifdef HAVE_STDIO_H
|
||||
FILE *fp = NULL;
|
||||
#endif
|
||||
if ( !file || !*file || !mode || !*mode ) {
|
||||
SDL_SetError("SDL_RWFromFile(): No file or no mode specified");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#ifdef __WIN32__
|
||||
#if defined(__WIN32__)
|
||||
rwops = SDL_AllocRW();
|
||||
if (!rwops)
|
||||
return NULL; /* SDL_SetError already setup by SDL_AllocRW() */
|
||||
|
@ -356,7 +387,6 @@ SDL_RWops *SDL_RWFromFile(const char *file, const char *mode)
|
|||
rwops->close = win32_file_close;
|
||||
|
||||
#elif HAVE_STDIO_H
|
||||
FILE *fp;
|
||||
|
||||
#ifdef __MACOS__
|
||||
{
|
||||
|
|
|
@ -51,27 +51,6 @@
|
|||
#if defined(_WIN32_WCE) && _WIN32_WCE < 300
|
||||
/* seems to be undefined in Win CE although in online help */
|
||||
#define isspace(a) (((CHAR)a == ' ') || ((CHAR)a == '\t'))
|
||||
|
||||
/* seems to be undefined in Win CE although in online help */
|
||||
char *SDL_strrchr(char *str, int c)
|
||||
{
|
||||
char *p;
|
||||
|
||||
/* Skip to the end of the string */
|
||||
p=str;
|
||||
while (*p)
|
||||
p++;
|
||||
|
||||
/* Look for the given character */
|
||||
while ( (p >= str) && (*p != (CHAR)c) )
|
||||
p--;
|
||||
|
||||
/* Return NULL if character not found */
|
||||
if ( p < str ) {
|
||||
p = NULL;
|
||||
}
|
||||
return p;
|
||||
}
|
||||
#endif /* _WIN32_WCE < 300 */
|
||||
|
||||
/* Parse a command line buffer into arguments */
|
||||
|
@ -281,8 +260,13 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw)
|
|||
}
|
||||
path[pathlen] = '\0';
|
||||
|
||||
#ifdef _WIN32_WCE
|
||||
wcsncpy( stdoutPath, path, SDL_arraysize(stdoutPath) );
|
||||
wcsncat( stdoutPath, DIR_SEPERATOR STDOUT_FILE, SDL_arraysize(stdoutPath) );
|
||||
#else
|
||||
SDL_strlcpy( stdoutPath, path, SDL_arraysize(stdoutPath) );
|
||||
SDL_strlcat( stdoutPath, DIR_SEPERATOR STDOUT_FILE, SDL_arraysize(stdoutPath) );
|
||||
#endif
|
||||
|
||||
/* Redirect standard input and standard output */
|
||||
newfp = freopen(stdoutPath, TEXT("w"), stdout);
|
||||
|
@ -300,8 +284,13 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw)
|
|||
}
|
||||
#endif /* _WIN32_WCE */
|
||||
|
||||
#ifdef _WIN32_WCE
|
||||
wcsncpy( stderrPath, path, SDL_arraysize(stdoutPath) );
|
||||
wcsncat( stderrPath, DIR_SEPERATOR STDOUT_FILE, SDL_arraysize(stdoutPath) );
|
||||
#else
|
||||
SDL_strlcpy( stderrPath, path, SDL_arraysize(stderrPath) );
|
||||
SDL_strlcat( stderrPath, DIR_SEPERATOR STDERR_FILE, SDL_arraysize(stderrPath) );
|
||||
#endif
|
||||
|
||||
newfp = freopen(stderrPath, TEXT("w"), stderr);
|
||||
#ifndef _WIN32_WCE
|
||||
|
@ -329,7 +318,7 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw)
|
|||
wcscpy (bufp+wcslen(bufp), TEXT("\" "));
|
||||
wcsncpy(bufp+wcslen(bufp), szCmdLine,nLen-wcslen(bufp));
|
||||
nLen = wcslen(bufp)+1;
|
||||
cmdline = SDL_stack_alloc(wchar_t, nLen);
|
||||
cmdline = SDL_stack_alloc(char, nLen);
|
||||
if ( cmdline == NULL ) {
|
||||
return OutOfMemory();
|
||||
}
|
||||
|
|
|
@ -27,17 +27,12 @@
|
|||
|
||||
#ifndef HAVE_MALLOC
|
||||
|
||||
#define LACKS_SYS_TYPES_H
|
||||
#define LACKS_STDIO_H
|
||||
#define LACKS_STRINGS_H
|
||||
#define LACKS_STRING_H
|
||||
#define LACKS_STDLIB_H
|
||||
#define ABORT
|
||||
#define memset SDL_memset
|
||||
#define memcpy SDL_memcpy
|
||||
#define malloc SDL_malloc
|
||||
#define calloc SDL_calloc
|
||||
#define realloc SDL_realloc
|
||||
#define free SDL_free
|
||||
|
||||
/*
|
||||
This is a version (aka dlmalloc) of malloc/free/realloc written by
|
||||
|
@ -496,6 +491,7 @@ DEFAULT_MMAP_THRESHOLD default: 256K
|
|||
#define LACKS_STRINGS_H
|
||||
#define LACKS_SYS_TYPES_H
|
||||
#define LACKS_ERRNO_H
|
||||
#define LACKS_FCNTL_H
|
||||
#define MALLOC_FAILURE_ACTION
|
||||
#define MMAP_CLEARS 0 /* WINCE and some others apparently don't clear */
|
||||
#endif /* WIN32 */
|
||||
|
@ -613,6 +609,13 @@ DEFAULT_MMAP_THRESHOLD default: 256K
|
|||
#define MALLINFO_FIELD_TYPE size_t
|
||||
#endif /* MALLINFO_FIELD_TYPE */
|
||||
|
||||
#define memset SDL_memset
|
||||
#define memcpy SDL_memcpy
|
||||
#define malloc SDL_malloc
|
||||
#define calloc SDL_calloc
|
||||
#define realloc SDL_realloc
|
||||
#define free SDL_free
|
||||
|
||||
/*
|
||||
mallopt tuning options. SVID/XPG defines four standard parameter
|
||||
numbers for mallopt, normally defined in malloc.h. None of these
|
||||
|
|
|
@ -33,15 +33,24 @@ Inspired by http://arisme.free.fr/ports/SDL.php
|
|||
// TODO: windib on SH3 PPC2000 landscape test
|
||||
// TODO: optimize 8bpp landscape mode
|
||||
|
||||
// there is some problems in runnings apps from a device landscape mode
|
||||
// due to WinCE bugs. Some works and some - does not.
|
||||
// TODO: finish Axim Dell X30 and user landscape mode, device landscape mode
|
||||
// TODO: finish Axim Dell X30 user portrait, device landscape stylus conversion
|
||||
// TODO: fix running GAPI apps from landscape mode -
|
||||
// wince goes to portrait mode, but does not update video memory
|
||||
|
||||
|
||||
#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 "../../events/SDL_events_c.h"
|
||||
|
||||
#include "SDL_syswm_c.h"
|
||||
#include "SDL_sysmouse_c.h"
|
||||
#include "SDL_dibevents_c.h"
|
||||
#include "../wincommon/SDL_syswm_c.h"
|
||||
#include "../wincommon/SDL_sysmouse_c.h"
|
||||
#include "../windib/SDL_dibevents_c.h"
|
||||
|
||||
#include "SDL_gapivideo.h"
|
||||
|
||||
|
@ -55,6 +64,8 @@ Inspired by http://arisme.free.fr/ports/SDL.php
|
|||
|
||||
// for testing with GapiEmu
|
||||
#define USE_GAPI_EMU 0
|
||||
#define EMULATE_AXIM_X30 0
|
||||
#define WITHOUT_GAPI 0
|
||||
|
||||
#if USE_GAPI_EMU && !REPORT_VIDEO_INFO
|
||||
#pragma message("Warning: Using GapiEmu in release build. I assume you'd like to set USE_GAPI_EMU to zero.")
|
||||
|
@ -113,7 +124,25 @@ static struct _RawFrameBufferInfo g_RawFrameBufferInfo = {0};
|
|||
|
||||
#define FORMAT_565 1
|
||||
#define FORMAT_555 2
|
||||
#define FORMAT_OTHER 3
|
||||
#define FORMAT_OTHER 3
|
||||
|
||||
/* Dell Axim x30 hangs when we use GAPI from landscape,
|
||||
so lets avoid using GxOpenDisplay there via GETGXINFO trick
|
||||
It seems that GAPI subsystem use the same ExtEscape code.
|
||||
*/
|
||||
#define GETGXINFO 0x00020000
|
||||
|
||||
typedef struct GXDeviceInfo
|
||||
{
|
||||
long Version; //00 (should filled with 100 before calling ExtEscape)
|
||||
void * pvFrameBuffer; //04
|
||||
unsigned long cbStride; //08
|
||||
unsigned long cxWidth; //0c
|
||||
unsigned long cyHeight; //10
|
||||
unsigned long cBPP; //14
|
||||
unsigned long ffFormat; //18
|
||||
char Unused[0x84-7*4];
|
||||
} GXDeviceInfo;
|
||||
|
||||
static int GAPI_Available(void)
|
||||
{
|
||||
|
@ -123,6 +152,10 @@ static int GAPI_Available(void)
|
|||
ReleaseDC(NULL, hdc);
|
||||
g_bRawBufferAvailable = result > 0;
|
||||
|
||||
#if WITHOUT_GAPI
|
||||
return g_bRawBufferAvailable;
|
||||
#endif
|
||||
|
||||
#if USE_GAPI_EMU
|
||||
g_hGapiLib = LoadLibrary(_T("GAPI_Emu.dll"));
|
||||
if( !g_hGapiLib )
|
||||
|
@ -332,6 +365,8 @@ static void FillStructs(_THIS, BOOL useVga)
|
|||
this->hidden->needUpdate = 1;
|
||||
this->hidden->hiresFix = 0;
|
||||
this->hidden->useVga = 0;
|
||||
this->hidden->useGXOpenDisplay = 1;
|
||||
|
||||
#ifdef _ARM_
|
||||
/* check some devices and extract addition info */
|
||||
SystemParametersInfo( SPI_GETOEMINFO, sizeof( oemstr ), oemstr, 0 );
|
||||
|
@ -344,6 +379,29 @@ static void FillStructs(_THIS, BOOL useVga)
|
|||
this->hidden->gxProperties.cbyPitch = 2;
|
||||
this->hidden->needUpdate = 0;
|
||||
}
|
||||
#if (EMULATE_AXIM_X30 == 0)
|
||||
// buggy Dell Axim X30
|
||||
if( _tcsncmp(oemstr, L"Dell Axim X30", 13) == 0 )
|
||||
#endif
|
||||
{
|
||||
GXDeviceInfo gxInfo = {0};
|
||||
HDC hdc = GetDC(NULL);
|
||||
int result;
|
||||
|
||||
gxInfo.Version = 100;
|
||||
result = ExtEscape(hdc, GETGXINFO, 0, NULL, sizeof(gxInfo), (char *)&gxInfo);
|
||||
if( result > 0 )
|
||||
{
|
||||
this->hidden->useGXOpenDisplay = 0;
|
||||
this->hidden->videoMem = gxInfo.pvFrameBuffer;
|
||||
this->hidden->needUpdate = 0;
|
||||
this->hidden->gxProperties.cbxPitch = 2;
|
||||
this->hidden->gxProperties.cbyPitch = 480;
|
||||
this->hidden->gxProperties.cxWidth = gxInfo.cxWidth;
|
||||
this->hidden->gxProperties.cyHeight = gxInfo.cyHeight;
|
||||
this->hidden->gxProperties.ffFormat = gxInfo.ffFormat;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
} else
|
||||
{
|
||||
|
@ -598,7 +656,7 @@ SDL_Surface *GAPI_SetVideoMode(_THIS, SDL_Surface *current,
|
|||
return(NULL);
|
||||
}
|
||||
|
||||
/* detect landscape mode */
|
||||
/* detect user landscape mode */
|
||||
if( (width > height) && (GetSystemMetrics(SM_CXSCREEN) < GetSystemMetrics(SM_CYSCREEN)))
|
||||
gapi->userOrientation = SDL_ORIENTATION_RIGHT;
|
||||
|
||||
|
@ -610,7 +668,8 @@ SDL_Surface *GAPI_SetVideoMode(_THIS, SDL_Surface *current,
|
|||
gapi->hiresFix = 1;
|
||||
} else
|
||||
if( (width > GetSystemMetrics(SM_CXSCREEN)) || (height > GetSystemMetrics(SM_CYSCREEN)))
|
||||
gapi->hiresFix = 1;
|
||||
if( !((width == GetSystemMetrics(SM_CYSCREEN)) && (height == GetSystemMetrics(SM_CXSCREEN)))) // user portrait, device landscape
|
||||
gapi->hiresFix = 1;
|
||||
|
||||
switch( gapi->userOrientation )
|
||||
{
|
||||
|
@ -652,7 +711,7 @@ SDL_Surface *GAPI_SetVideoMode(_THIS, SDL_Surface *current,
|
|||
|
||||
if (!SDL_windowid)
|
||||
SetWindowLong(SDL_Window, GWL_STYLE, style);
|
||||
|
||||
|
||||
/* Allocate bitmap */
|
||||
if(gapiBuffer)
|
||||
{
|
||||
|
@ -672,6 +731,14 @@ SDL_Surface *GAPI_SetVideoMode(_THIS, SDL_Surface *current,
|
|||
ShowWindow(SDL_Window, SW_SHOW);
|
||||
SetForegroundWindow(SDL_Window);
|
||||
|
||||
/* Open GAPI display */
|
||||
if( !gapi->useVga && this->hidden->useGXOpenDisplay )
|
||||
if( !gapi->gxFunc.GXOpenDisplay(SDL_Window, GX_FULLSCREEN) )
|
||||
{
|
||||
SDL_SetError("Couldn't initialize GAPI");
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
#if REPORT_VIDEO_INFO
|
||||
printf("Video properties:\n");
|
||||
printf("display bpp: %d\n", gapi->gxProperties.cBPP);
|
||||
|
@ -680,24 +747,24 @@ SDL_Surface *GAPI_SetVideoMode(_THIS, SDL_Surface *current,
|
|||
printf("x pitch: %d\n", gapi->gxProperties.cbxPitch);
|
||||
printf("y pitch: %d\n", gapi->gxProperties.cbyPitch);
|
||||
printf("gapi flags: 0x%x\n", gapi->gxProperties.ffFormat);
|
||||
|
||||
if( !gapi->useVga && this->hidden->useGXOpenDisplay && gapi->needUpdate)
|
||||
{
|
||||
gapi->videoMem = gapi->gxFunc.GXBeginDraw();
|
||||
gapi->gxFunc.GXEndDraw();
|
||||
}
|
||||
|
||||
printf("video memory: 0x%x\n", gapi->videoMem);
|
||||
printf("need update: %d\n", gapi->needUpdate);
|
||||
printf("hi-res fix: %d\n", gapi->hiresFix);
|
||||
printf("VGA is available on the device: %d\n", g_bRawBufferAvailable);
|
||||
printf("use VGA resolution: %d\n", gapi->useVga);
|
||||
printf("use raw framebuffer: %d\n", gapi->useVga);
|
||||
printf("video surface bpp: %d\n", video->format->BitsPerPixel);
|
||||
printf("video surface width: %d\n", video->w);
|
||||
printf("video surface height: %d\n", video->h);
|
||||
#endif
|
||||
|
||||
/* Open GAPI display */
|
||||
if( !gapi->useVga )
|
||||
if( !gapi->gxFunc.GXOpenDisplay(SDL_Window, GX_FULLSCREEN) )
|
||||
{
|
||||
SDL_SetError("Couldn't initialize GAPI");
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
|
||||
/* Blank screen */
|
||||
allScreen.x = allScreen.y = 0;
|
||||
allScreen.w = video->w - 1;
|
||||
|
@ -790,6 +857,7 @@ static int updateLine16to16(_THIS, PIXEL *srcPointer, PIXEL *destPointer, int wi
|
|||
else
|
||||
{
|
||||
destPointer += gapi->gxProperties.cbyPitch / 2;
|
||||
|
||||
while(width--) // iPaq 3660
|
||||
{
|
||||
*(DWORD*)destPointer =(*line1++ << 16) | *line2++;
|
||||
|
|
|
@ -136,6 +136,7 @@ struct SDL_PrivateVideoData {
|
|||
int invert;
|
||||
char hiresFix; // using hires mode without defining hires resource
|
||||
// --------------
|
||||
int useGXOpenDisplay; /* use GXOpenDispplay */
|
||||
int w, h;
|
||||
enum SDL_ScreenOrientation gapiOrientation;
|
||||
|
||||
|
|
|
@ -27,6 +27,16 @@
|
|||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
|
||||
#ifndef SetClassLongPtr
|
||||
#define SetClassLongPtr SetClassLong
|
||||
#endif
|
||||
#ifndef GetWindowLongPtr
|
||||
#define GetWindowLongPtr GetWindowLong
|
||||
#endif
|
||||
#ifndef SetWindowLongPtr
|
||||
#define SetWindowLongPtr SetWindowLong
|
||||
#endif
|
||||
|
||||
#include "../SDL_sysvideo.h"
|
||||
|
||||
/* Hidden "this" pointer for the video functions */
|
||||
|
|
|
@ -40,10 +40,14 @@
|
|||
#endif
|
||||
|
||||
#ifdef _WIN32_WCE
|
||||
#include "SDL_gapivideo.h"
|
||||
#include "../gapi/SDL_gapivideo.h"
|
||||
|
||||
#define IsZoomed(HWND) 1
|
||||
#define NO_GETKEYBOARDSTATE
|
||||
#if _WIN32_WCE < 420
|
||||
#define NO_CHANGEDISPLAYSETTINGS
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* The window we use for everything... */
|
||||
#ifdef _WIN32_WCE
|
||||
|
@ -120,6 +124,29 @@ static void GapiTransform(SDL_ScreenOrientation rotate, char hires, Sint16 *x, S
|
|||
|
||||
switch(rotate) {
|
||||
case SDL_ORIENTATION_UP:
|
||||
{
|
||||
/* this code needs testing on a real device!
|
||||
So it will be enabled later */
|
||||
/*
|
||||
#ifdef _WIN32_WCE
|
||||
#if _WIN32_WCE >= 420
|
||||
// test device orientation
|
||||
// FIXME: do not check every mouse message
|
||||
DEVMODE settings;
|
||||
SDL_memset(&settings, 0, sizeof(DEVMODE));
|
||||
settings.dmSize = sizeof(DEVMODE);
|
||||
settings.dmFields = DM_DISPLAYORIENTATION;
|
||||
ChangeDisplaySettingsEx(NULL, &settings, NULL, CDS_TEST, NULL);
|
||||
if( settings.dmOrientation == DMDO_90 )
|
||||
{
|
||||
rotatedX = SDL_VideoSurface->h - *x;
|
||||
rotatedY = *y;
|
||||
*x = rotatedX;
|
||||
*y = rotatedY;
|
||||
}
|
||||
#endif
|
||||
#endif */
|
||||
}
|
||||
break;
|
||||
case SDL_ORIENTATION_RIGHT:
|
||||
if (!SDL_VideoSurface)
|
||||
|
@ -144,17 +171,21 @@ static void GapiTransform(SDL_ScreenOrientation rotate, char hires, Sint16 *x, S
|
|||
|
||||
static void SDL_RestoreGameMode(void)
|
||||
{
|
||||
#ifndef NO_CHANGEDISPLAYSETTINGS
|
||||
ShowWindow(SDL_Window, SW_RESTORE);
|
||||
#ifndef NO_CHANGEDISPLAYSETTINGS
|
||||
#ifndef _WIN32_WCE
|
||||
ChangeDisplaySettings(&SDL_fullscreen_mode, CDS_FULLSCREEN);
|
||||
#endif
|
||||
#endif /* NO_CHANGEDISPLAYSETTINGS */
|
||||
}
|
||||
static void SDL_RestoreDesktopMode(void)
|
||||
{
|
||||
#ifndef NO_CHANGEDISPLAYSETTINGS
|
||||
ShowWindow(SDL_Window, SW_MINIMIZE);
|
||||
#ifndef NO_CHANGEDISPLAYSETTINGS
|
||||
#ifndef _WIN32_WCE
|
||||
ChangeDisplaySettings(NULL, 0);
|
||||
#endif
|
||||
#endif /* NO_CHANGEDISPLAYSETTINGS */
|
||||
}
|
||||
|
||||
#ifdef WM_MOUSELEAVE
|
||||
|
|
|
@ -220,9 +220,6 @@ void WIN_SetWMIcon(_THIS, SDL_Surface *icon, Uint8 *mask)
|
|||
if ( screen_icn == NULL ) {
|
||||
SDL_SetError("Couldn't create Win32 icon handle");
|
||||
} else {
|
||||
#ifndef SetClassLongPtr
|
||||
#define SetClassLongPtr SetClassLong
|
||||
#endif
|
||||
SetClassLongPtr(SDL_Window, GCL_HICON, (LONG_PTR)screen_icn);
|
||||
}
|
||||
SDL_stack_free(icon_win32);
|
||||
|
|
|
@ -24,13 +24,6 @@
|
|||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
|
||||
#if defined(_WIN32_WCE)
|
||||
|
||||
// defined and used in SDL_sysevents.c
|
||||
extern HINSTANCE aygshell;
|
||||
|
||||
#endif
|
||||
|
||||
/* Not yet in the mingw32 cross-compile headers */
|
||||
#ifndef CDS_FULLSCREEN
|
||||
#define CDS_FULLSCREEN 4
|
||||
|
@ -49,8 +42,12 @@ extern HINSTANCE aygshell;
|
|||
|
||||
#ifdef _WIN32_WCE
|
||||
#define NO_GETDIBITS
|
||||
#define NO_CHANGEDISPLAYSETTINGS
|
||||
#define NO_GAMMA_SUPPORT
|
||||
#if _WIN32_WCE < 420
|
||||
#define NO_CHANGEDISPLAYSETTINGS
|
||||
#else
|
||||
#define ChangeDisplaySettings(lpDevMode, dwFlags) ChangeDisplaySettingsEx(NULL, (lpDevMode), 0, (dwFlags), 0)
|
||||
#endif
|
||||
#endif
|
||||
#ifndef WS_MAXIMIZE
|
||||
#define WS_MAXIMIZE 0
|
||||
|
@ -65,6 +62,11 @@ extern HINSTANCE aygshell;
|
|||
#define PC_NOCOLLAPSE 0
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32_WCE
|
||||
// defined and used in SDL_sysevents.c
|
||||
extern HINSTANCE aygshell;
|
||||
#endif
|
||||
|
||||
/* Initialization/Query functions */
|
||||
static int DIB_VideoInit(_THIS, SDL_PixelFormat *vformat);
|
||||
static SDL_Rect **DIB_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags);
|
||||
|
@ -190,8 +192,6 @@ VideoBootStrap WINDIB_bootstrap = {
|
|||
DIB_Available, DIB_CreateDevice
|
||||
};
|
||||
|
||||
#ifndef NO_CHANGEDISPLAYSETTINGS
|
||||
|
||||
static int cmpmodes(const void *va, const void *vb)
|
||||
{
|
||||
SDL_Rect *a = *(SDL_Rect **)va;
|
||||
|
@ -248,8 +248,6 @@ static int DIB_AddMode(_THIS, int bpp, int w, int h)
|
|||
return(0);
|
||||
}
|
||||
|
||||
#endif /* !NO_CHANGEDISPLAYSETTINGS */
|
||||
|
||||
static HPALETTE DIB_CreatePalette(int bpp)
|
||||
{
|
||||
/* RJR: March 28, 2000
|
||||
|
@ -326,6 +324,13 @@ int DIB_VideoInit(_THIS, SDL_PixelFormat *vformat)
|
|||
DIB_CheckGamma(this);
|
||||
|
||||
#ifndef NO_CHANGEDISPLAYSETTINGS
|
||||
|
||||
settings.dmSize = sizeof(DEVMODE);
|
||||
settings.dmDriverExtra = 0;
|
||||
#ifdef _WIN32_WCE
|
||||
settings.dmFields = DM_DISPLAYQUERYORIENTATION;
|
||||
this->hidden->supportRotation = ChangeDisplaySettingsEx(NULL, &settings, NULL, CDS_TEST, NULL) == DISP_CHANGE_SUCCESSFUL;
|
||||
#endif
|
||||
/* Query for the desktop resolution */
|
||||
EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &SDL_desktop_mode);
|
||||
|
||||
|
@ -333,13 +338,30 @@ int DIB_VideoInit(_THIS, SDL_PixelFormat *vformat)
|
|||
for ( i=0; EnumDisplaySettings(NULL, i, &settings); ++i ) {
|
||||
DIB_AddMode(this, settings.dmBitsPerPel,
|
||||
settings.dmPelsWidth, settings.dmPelsHeight);
|
||||
#ifdef _WIN32_WCE
|
||||
if( this->hidden->supportRotation )
|
||||
DIB_AddMode(this, settings.dmBitsPerPel,
|
||||
settings.dmPelsHeight, settings.dmPelsWidth);
|
||||
#endif
|
||||
}
|
||||
/* Sort the mode lists */
|
||||
if( i > 1 )
|
||||
for ( i=0; i<NUM_MODELISTS; ++i ) {
|
||||
if ( SDL_nummodes[i] > 0 ) {
|
||||
SDL_qsort(SDL_modelist[i], SDL_nummodes[i], sizeof *SDL_modelist[i], cmpmodes);
|
||||
}
|
||||
}
|
||||
#else
|
||||
// WinCE and fullscreen mode:
|
||||
// We use only vformat->BitsPerPixel that allow SDL to
|
||||
// emulate other bpp (8, 32) and use triple buffer,
|
||||
// because SDL surface conversion is much faster than the WinCE one.
|
||||
// Although it should be tested on devices with graphics accelerator.
|
||||
|
||||
DIB_AddMode(this, vformat->BitsPerPixel,
|
||||
GetDeviceCaps(GetDC(NULL), HORZRES),
|
||||
GetDeviceCaps(GetDC(NULL), VERTRES));
|
||||
|
||||
#endif /* !NO_CHANGEDISPLAYSETTINGS */
|
||||
|
||||
/* Grab an identity palette if we are in a palettized mode */
|
||||
|
@ -352,6 +374,10 @@ int DIB_VideoInit(_THIS, SDL_PixelFormat *vformat)
|
|||
/* Fill in some window manager capabilities */
|
||||
this->info.wm_available = 1;
|
||||
|
||||
#ifdef _WIN32_WCE
|
||||
this->hidden->origRotation = -1;
|
||||
#endif
|
||||
|
||||
/* We're done! */
|
||||
return(0);
|
||||
}
|
||||
|
@ -359,15 +385,11 @@ int DIB_VideoInit(_THIS, SDL_PixelFormat *vformat)
|
|||
/* We support any format at any dimension */
|
||||
SDL_Rect **DIB_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags)
|
||||
{
|
||||
#ifdef NO_CHANGEDISPLAYSETTINGS
|
||||
return((SDL_Rect **)-1);
|
||||
#else
|
||||
if ( (flags & SDL_FULLSCREEN) == SDL_FULLSCREEN ) {
|
||||
return(SDL_modelist[((format->BitsPerPixel+7)/8)-1]);
|
||||
} else {
|
||||
return((SDL_Rect **)-1);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
@ -531,6 +553,61 @@ SDL_Surface *DIB_SetVideoMode(_THIS, SDL_Surface *current,
|
|||
|
||||
SDL_memset(&settings, 0, sizeof(DEVMODE));
|
||||
settings.dmSize = sizeof(DEVMODE);
|
||||
|
||||
#ifdef _WIN32_WCE
|
||||
// try to rotate screen to fit requested resolution
|
||||
if( this->hidden->supportRotation )
|
||||
{
|
||||
DWORD rotation;
|
||||
|
||||
// ask current mode
|
||||
settings.dmFields = DM_DISPLAYORIENTATION;
|
||||
ChangeDisplaySettingsEx(NULL, &settings, NULL, CDS_TEST, NULL);
|
||||
rotation = settings.dmDisplayOrientation;
|
||||
|
||||
if( (width > GetDeviceCaps(GetDC(NULL), HORZRES))
|
||||
&& (height < GetDeviceCaps(GetDC(NULL), VERTRES)))
|
||||
{
|
||||
switch( rotation )
|
||||
{
|
||||
case DMDO_0:
|
||||
settings.dmDisplayOrientation = DMDO_90;
|
||||
break;
|
||||
case DMDO_270:
|
||||
settings.dmDisplayOrientation = DMDO_180;
|
||||
break;
|
||||
}
|
||||
if( settings.dmDisplayOrientation != rotation )
|
||||
{
|
||||
// go to landscape
|
||||
this->hidden->origRotation = rotation;
|
||||
ChangeDisplaySettingsEx(NULL,&settings,NULL,CDS_RESET,NULL);
|
||||
}
|
||||
}
|
||||
if( (width < GetDeviceCaps(GetDC(NULL), HORZRES))
|
||||
&& (height > GetDeviceCaps(GetDC(NULL), VERTRES)))
|
||||
{
|
||||
switch( rotation )
|
||||
{
|
||||
case DMDO_90:
|
||||
settings.dmDisplayOrientation = DMDO_0;
|
||||
break;
|
||||
case DMDO_180:
|
||||
settings.dmDisplayOrientation = DMDO_270;
|
||||
break;
|
||||
}
|
||||
if( settings.dmDisplayOrientation != rotation )
|
||||
{
|
||||
// go to portrait
|
||||
this->hidden->origRotation = rotation;
|
||||
ChangeDisplaySettingsEx(NULL,&settings,NULL,CDS_RESET,NULL);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef _WIN32_WCE
|
||||
settings.dmBitsPerPel = video->format->BitsPerPixel;
|
||||
settings.dmPelsWidth = width;
|
||||
settings.dmPelsHeight = height;
|
||||
|
@ -545,10 +622,14 @@ SDL_Surface *DIB_SetVideoMode(_THIS, SDL_Surface *current,
|
|||
settings.dmFields &= ~DM_DISPLAYFREQUENCY;
|
||||
changed = (ChangeDisplaySettings(&settings, CDS_FULLSCREEN) == DISP_CHANGE_SUCCESSFUL);
|
||||
}
|
||||
#else
|
||||
changed = 1;
|
||||
#endif
|
||||
if ( changed ) {
|
||||
video->flags |= SDL_FULLSCREEN;
|
||||
SDL_fullscreen_mode = settings;
|
||||
}
|
||||
|
||||
}
|
||||
#endif /* !NO_CHANGEDISPLAYSETTINGS */
|
||||
|
||||
|
@ -669,9 +750,12 @@ SDL_Surface *DIB_SetVideoMode(_THIS, SDL_Surface *current,
|
|||
video->flags |= SDL_HWPALETTE;
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef _WIN32_WCE
|
||||
/* Resize the window */
|
||||
if ( !SDL_windowid && !IsZoomed(SDL_Window) ) {
|
||||
#else
|
||||
if ( !SDL_windowid ) {
|
||||
#endif
|
||||
HWND top;
|
||||
UINT swp_flags;
|
||||
const char *window = NULL;
|
||||
|
|
|
@ -46,8 +46,12 @@ struct SDL_PrivateVideoData {
|
|||
SDL_Rect **SDL_modelist[NUM_MODELISTS];
|
||||
|
||||
SDL_ScreenOrientation orientation;
|
||||
int invert;
|
||||
char hiresFix; // using hires mode without defining hires resource
|
||||
#ifdef _WIN32_WCE
|
||||
int invert; /* do to remove, used by GAPI driver! */
|
||||
char hiresFix; /* using hires mode without defining hires resource */
|
||||
int supportRotation; /* for Pocket PC devices */
|
||||
DWORD origRotation; /* for Pocket PC devices */
|
||||
#endif
|
||||
};
|
||||
/* Old variable names */
|
||||
#define screen_bmp (this->hidden->screen_bmp)
|
||||
|
|
|
@ -45,7 +45,7 @@ static void FillBackground(SDL_Surface *screen)
|
|||
{
|
||||
for ( i=0; i<screen->h; ++i ) {
|
||||
gradient=((i*255)/screen->h);
|
||||
color = SDL_MapRGB(screen->format, gradient, gradient, gradient);
|
||||
color = (Uint16)SDL_MapRGB(screen->format, gradient, gradient, gradient);
|
||||
buffer16=(Uint16*)buffer;
|
||||
for (k=0; k<screen->w; k++)
|
||||
{
|
||||
|
@ -340,8 +340,14 @@ int main(int argc, char *argv[])
|
|||
}
|
||||
|
||||
/* Alpha blending doesn't work well at 8-bit color */
|
||||
#ifdef _WIN32_WCE
|
||||
/* Pocket PC */
|
||||
w = 240;
|
||||
h = 320;
|
||||
#else
|
||||
w = 640;
|
||||
h = 480;
|
||||
#endif
|
||||
info = SDL_GetVideoInfo();
|
||||
if ( info->vfmt->BitsPerPixel > 8 ) {
|
||||
video_bpp = info->vfmt->BitsPerPixel;
|
||||
|
@ -386,21 +392,12 @@ int main(int argc, char *argv[])
|
|||
}
|
||||
}
|
||||
|
||||
/* Set 640x480 video mode */
|
||||
#ifndef _WIN32_WCE
|
||||
/* Set video mode */
|
||||
if ( (screen=SDL_SetVideoMode(w,h,video_bpp,videoflags)) == NULL ) {
|
||||
fprintf(stderr, "Couldn't set 640x480x%d video mode: %s\n",
|
||||
video_bpp, SDL_GetError());
|
||||
fprintf(stderr, "Couldn't set %dx%dx%d video mode: %s\n",
|
||||
w, h, video_bpp, SDL_GetError());
|
||||
quit(2);
|
||||
}
|
||||
#else
|
||||
/* Pocket PC */
|
||||
if ( (screen=SDL_SetVideoMode(240,320,video_bpp,SDL_FULLSCREEN)) == NULL ) {
|
||||
fprintf(stderr, "Couldn't set 240x320x%d video mode: %s\n",
|
||||
video_bpp, SDL_GetError());
|
||||
quit(2);
|
||||
}
|
||||
#endif
|
||||
FillBackground(screen);
|
||||
|
||||
/* Create the light */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue