diff options
Diffstat (limited to 'backends')
| -rw-r--r-- | backends/platform/wince/wince-sdl.cpp | 213 | 
1 files changed, 165 insertions, 48 deletions
diff --git a/backends/platform/wince/wince-sdl.cpp b/backends/platform/wince/wince-sdl.cpp index 5353c9e39d..31d8d9360d 100644 --- a/backends/platform/wince/wince-sdl.cpp +++ b/backends/platform/wince/wince-sdl.cpp @@ -23,8 +23,6 @@   *   */ -// NOTE: formatted for tabstop=4 -  #include "backends/platform/wince/wince-sdl.h"  #include "common/config-manager.h" @@ -69,6 +67,10 @@  #endif  #endif +#ifdef DYNAMIC_MODULES +#include "backends/plugins/win32/win32-provider.h" +#endif +  #ifdef __GNUC__  extern "C" _CRTIMP FILE* __cdecl   _wfreopen (const wchar_t*, const wchar_t*, FILE*);  #endif @@ -162,6 +164,7 @@ OSystem *OSystem_WINCE3_create() {  	return new OSystem_WINCE3();  } +extern "C" char *getcwd(char *buf, int size);  int SDL_main(int argc, char **argv) {  	FILE *newfp = NULL;  #ifdef __GNUC__ @@ -196,7 +199,7 @@ int SDL_main(int argc, char **argv) {  #else  		newfp = fopen(stdout_fname, "w");  		if (newfp) { -			*stdout = *newfp; +			//*stdout = *newfp;  			stdout_file = stdout;  		}  #endif @@ -209,15 +212,19 @@ int SDL_main(int argc, char **argv) {  #else  		newfp = fopen(stderr_fname, "w");  		if (newfp) { -			*stderr = *newfp; +			//*stderr = *newfp;  			stderr_file = stderr;  		}  #endif  	}  #endif -	int res = 0; +#ifdef DYNAMIC_MODULES +	PluginManager::instance().addPluginProvider(new Win32PluginProvider()); +#endif + +	int res = 0;  #if !defined(DEBUG) && !defined(__GNUC__)  	__try {  #endif @@ -236,6 +243,138 @@ int SDL_main(int argc, char **argv) {  	return res;  } +#ifdef DYNAMIC_MODULES + +/* This is the OS startup code in the case of a plugin-enabled build. + * It contains copied and slightly modified parts of SDL's win32/ce startup functions. + * We copy these here because the calling stub already has a WinMain procedure + * which overrides SDL's one and hence we essentially re-implement the startup procedure. + * Note also that this has to be here and not in the stub because SDL is statically + * linked in the scummvm.dll archive. + * Take a look at the comments in stub.cpp as well. + */ + +int console_main(int argc, char *argv[]) +{ +	int n; +	char *bufp, *appname; + +	appname = argv[0]; +	if ( (bufp=strrchr(argv[0], '\\')) != NULL ) +		appname = bufp + 1; +	else if ( (bufp=strrchr(argv[0], '/')) != NULL ) +		appname = bufp + 1; + +	if ( (bufp=strrchr(appname, '.')) == NULL ) +		n = strlen(appname); +	else +		n = (bufp-appname); + +	bufp = (char *) alloca(n + 1); +	strncpy(bufp, appname, n); +	bufp[n] = '\0'; +	appname = bufp; + +	if ( SDL_Init(SDL_INIT_NOPARACHUTE) < 0 ) { +		error("WinMain() error: %d", SDL_GetError()); +		return(FALSE); +	} + +	SDL_SetModuleHandle(GetModuleHandle(NULL)); + +	// Run the application main() code +	SDL_main(argc, argv); + +	return(0); +} + +static int ParseCommandLine(char *cmdline, char **argv) +{ +	char *bufp; +	int argc; + +	argc = 0; +	for (bufp = cmdline; *bufp;) { +		// Skip leading whitespace  +		while (isspace(*bufp)) +			++bufp; + +		// Skip over argument +		if (*bufp == '"') { +			++bufp; +			if (*bufp) { +				if (argv) +					argv[argc] = bufp; +				++argc; +			} +			// Skip over word +			while (*bufp && (*bufp != '"')) +				++bufp; +		} else { +			if (*bufp) { +				if (argv) +					argv[argc] = bufp; +				++argc; +			} +			// Skip over word +			while (*bufp && ! isspace(*bufp)) +				++bufp; +		} +		if (*bufp) { +			if (argv) +				*bufp = '\0'; +			++bufp; +		} +	} +	if (argv) +		argv[argc] = NULL; + +	return(argc); +} + +int dynamic_modules_main(HINSTANCE hInst, HINSTANCE hPrev, LPWSTR szCmdLine, int sw) { +	HINSTANCE handle; +	char **argv; +	int argc; +	char *cmdline; +	wchar_t *bufp; +	int nLen; + +	if (wcsncmp(szCmdLine, TEXT("\\"), 1)) { +		nLen = wcslen(szCmdLine)+128+1; +		bufp = (wchar_t *) alloca(nLen*2); +		wcscpy (bufp, TEXT("\"")); +		GetModuleFileName(NULL, bufp+1, 128-3); +		wcscpy (bufp+wcslen(bufp), TEXT("\" ")); +		wcsncpy(bufp+wcslen(bufp), szCmdLine,nLen-wcslen(bufp)); +	} else +		bufp = szCmdLine; + +	nLen = wcslen(bufp)+1; +	cmdline = (char *) alloca(nLen); +	WideCharToMultiByte(CP_ACP, 0, bufp, -1, cmdline, nLen, NULL, NULL); + +	// Parse command line into argv and argc +	argc = ParseCommandLine(cmdline, NULL); +	argv = (char **) alloca((argc+1)*(sizeof *argv)); +	ParseCommandLine(cmdline, argv); + +	/* fix gdb-emulator combo */ +	while (argc > 1 && !strstr(argv[0], ".exe")) { +		OutputDebugString(TEXT("SDL: gdb argv[0] fixup\n")); +		*(argv[1]-1) = ' '; +		int i; +		for (i=1; i<argc; i++) +			argv[i] = argv[i+1]; +		argc--; +	} + +	// Run the main program (after a little SDL initialization) +	return(console_main(argc, argv)); + +} +#endif +  // ******************************************************************************************** @@ -1206,7 +1345,6 @@ void OSystem_WINCE3::loadGFXMode() {  	_fullscreen = true; // forced  	_forceFull = true; -	_modeFlags |= DF_UPDATE_EXPAND_1_PIXEL;  	_tmpscreen = NULL; @@ -1381,7 +1519,8 @@ void OSystem_WINCE3::update_keyboard() {  	if (_monkeyKeyboard && !_isSmartphone)  		if (!_panelVisible || _toolbarHandler.activeName() != NAME_PANEL_KEYBOARD)  			swap_panel(); -#ifndef DISABLE_SCUMM +#if !defined(DISABLE_SCUMM) && !defined(DYNAMIC_MODULES) +	// This REALLY, REALLY has to go. Check out Fingolfin's comment at the top.  	if (_monkeyKeyboard && Scumm::g_scumm->VAR_ROOM != 0xff && Scumm::g_scumm && Scumm::g_scumm->VAR(Scumm::g_scumm->VAR_ROOM) != 108 &&  		Scumm::g_scumm->VAR(Scumm::g_scumm->VAR_ROOM) != 90) {  			// Switch back to the normal panel now that the keyboard is not used anymore @@ -1395,7 +1534,7 @@ void OSystem_WINCE3::internUpdateScreen() {  	SDL_Surface *srcSurf, *origSurf;  	static bool old_overlayVisible = false;  	int numRectsOut = 0; -	int16 routx, routy, routw, routh; +	int16 routx, routy, routw, routh, stretch;  	assert(_hwscreen != NULL); @@ -1431,8 +1570,7 @@ void OSystem_WINCE3::internUpdateScreen() {  	if (!_overlayVisible) {  		origSurf = _screen;  		srcSurf = _tmpscreen; -	} -	else { +	} else {  		origSurf = _overlayscreen;  		srcSurf = _tmpscreen2;  	} @@ -1486,6 +1624,21 @@ void OSystem_WINCE3::internUpdateScreen() {  		dstPitch = _hwscreen->pitch;  		for (r = _dirtyRectList, rout = _dirtyRectOut; r != last_rect; ++r) { + +			// always clamp to enclosing, downsampled-grid-aligned rect in the downscaled image +			if (_scaleFactorXd != 1) { +				stretch = r->x % _scaleFactorXd; +				r->x -= stretch; +				r->w += stretch; +				r->w = (r->x + r->w + _scaleFactorXd - 1) / _scaleFactorXd * _scaleFactorXd - r->x; +			} +			if (_scaleFactorYd != 1) { +				stretch = r->y % _scaleFactorYd; +				r->y -= stretch; +				r->h += stretch; +				r->h = (r->y + r->h + _scaleFactorYd - 1) / _scaleFactorYd * _scaleFactorYd - r->y; +			} +  			// transform  			routx = r->x * _scaleFactorXm / _scaleFactorXd;				// locate position in scaled screen  			routy = (r->y + _currentShakePos) * _scaleFactorYm / _scaleFactorYd;	// adjust for shake offset @@ -1589,7 +1742,7 @@ void OSystem_WINCE3::internUpdateScreen() {  }  Graphics::Surface *OSystem_WINCE3::lockScreen() { -	// FIXME: Fingolfing asks: Why is undrawMouse() needed here? +	// FIXME: Fingolfin asks: Why is undrawMouse() needed here?  	// Please document this.  	undrawMouse();  	return OSystem_SDL::lockScreen(); @@ -2044,43 +2197,7 @@ void OSystem_WINCE3::warpMouse(int x, int y) {  void OSystem_WINCE3::addDirtyRect(int x, int y, int w, int h, bool mouseRect) { -	// Align on boundaries -	if (_scaleFactorXd > 1) { -		while (x % _scaleFactorXd) { -			x--; -			w++; -		} -		while (w % _scaleFactorXd) w++; -	} - -	if (_scaleFactorYd > 1) { -		while (y % _scaleFactorYd) { -			y--; -			h++; -		} -		while (h % _scaleFactorYd) h++; -	} - -	if (_scalerProc == PocketPCHalfZoom) { -		// Restrict rect if we're zooming -		if (_zoomUp) { -			if (y + h >= 240) { -				if (y >= 240) -					return; -				else -					h = 240 - y; -			} -		} else if (_zoomDown) { -			if (y + h >= 240) { -				if (y < 240) { -					h = 240 - y; -					y = 240; -				} -			} -			else -				return; -		} -	} +	if (_forceFull || _paletteDirtyEnd) return;  	OSystem_SDL::addDirtyRect(x, y, w, h, false);  }  | 
