diff options
| author | Nicolas Bacca | 2002-04-19 06:23:49 +0000 | 
|---|---|---|
| committer | Nicolas Bacca | 2002-04-19 06:23:49 +0000 | 
| commit | 44cc8c24a3e4d72e95620d45a7707d546258a3cc (patch) | |
| tree | 84ece5e2879d70f2b63e4364926526bd352a8b77 | |
| parent | 6215c253d4f5605201109a075e90b3d1344a8d6e (diff) | |
| download | scummvm-rg350-44cc8c24a3e4d72e95620d45a7707d546258a3cc.tar.gz scummvm-rg350-44cc8c24a3e4d72e95620d45a7707d546258a3cc.tar.bz2 scummvm-rg350-44cc8c24a3e4d72e95620d45a7707d546258a3cc.zip | |
Update minimalist (and broken) WinCE port
svn-id: r4000
| -rw-r--r-- | gameDetector.cpp | 7 | ||||
| -rw-r--r-- | simon/simon.cpp | 26 | ||||
| -rw-r--r-- | system.h | 2 | ||||
| -rw-r--r-- | wince/pocketpc.cpp | 1025 | 
4 files changed, 607 insertions, 453 deletions
| diff --git a/gameDetector.cpp b/gameDetector.cpp index 7fdb3d64f9..11310c7489 100644 --- a/gameDetector.cpp +++ b/gameDetector.cpp @@ -406,6 +406,9 @@ OSystem *GameDetector::createSystem() {  #else  	case GD_SDL:  	case GD_AUTO: +#ifdef _WIN32_WCE +		return OSystem_WINCE3_create(); +#endif  #if !defined(__MORPHOS__)  		return OSystem_SDL_create(_gfx_mode, _fullScreen);  #endif @@ -435,7 +438,7 @@ OSystem *GameDetector::createSystem() {  MidiDriver *GameDetector::createMidi() {  	int drv = _midi_driver; -#ifdef WIN32 +#if defined (WIN32) && !defined(_WIN32_WCE)  	/* MD_WINDOWS is default MidiDriver on windows targets */  	if (drv == MD_AUTO) drv = MD_WINDOWS;	  #endif @@ -443,7 +446,7 @@ MidiDriver *GameDetector::createMidi() {  	switch(drv) {  	case MD_AUTO:  	case MD_NULL:			return MidiDriver_NULL_create(); -#ifdef WIN32 +#if defined(WIN32) && !defined(_WIN32_WCE)  	case MD_WINDOWS:	return MidiDriver_WIN_create();  #endif  #ifdef __MORPHOS__ diff --git a/simon/simon.cpp b/simon/simon.cpp index 2d117a1a1e..460ff54b2f 100644 --- a/simon/simon.cpp +++ b/simon/simon.cpp @@ -27,7 +27,9 @@  #include "simon.h" +#ifndef _WIN32_WCE  #include <errno.h> +#endif  #include <time.h>  #ifdef WIN32  #include <malloc.h> @@ -601,7 +603,7 @@ bool SimonState::loadGamePcFile(const char *filename) {  	_tbl_list = (byte*)malloc(file_size);  	if (_tbl_list == NULL)  		error("Out of memory for strip table list"); -	rewind(in); +	fseek(in, 0, SEEK_SET);  	fread(_tbl_list, file_size, 1, in);  	fclose(in); @@ -619,7 +621,7 @@ bool SimonState::loadGamePcFile(const char *filename) {  	_stripped_txt_mem = (byte*)malloc(file_size);  	if (_stripped_txt_mem == NULL)  		error("Out of memory for strip text list"); -	rewind(in); +	fseek(in, 0, SEEK_SET);  	fread(_stripped_txt_mem, file_size, 1, in);  	fclose(in); @@ -2242,7 +2244,7 @@ uint SimonState::loadTextFile_simon1(const char *filename, byte *dst) {  	fseek(fo, 0, SEEK_END);  	size = ftell(fo); -	rewind(fo); +	fseek(fo, 0, SEEK_SET);  	if (fread(dst, size,1, fo) != 1)  		error("loadTextFile: fread failed"); @@ -3185,7 +3187,7 @@ void SimonState::loadIconFile() {  	if (_icon_file_ptr == NULL)  		error("Out of icon memory"); -	rewind(in); +	fseek(in, 0, SEEK_SET);  	fread(_icon_file_ptr, size, 1, in);  	fclose(in); @@ -6896,7 +6898,7 @@ void SimonState::readSfxFile(const char *filename) {  		fseek(in, 0, SEEK_END);  		size = ftell(in); -		rewind(in); +		fseek(in, 0, SEEK_SET);  		/* stop all sounds */  		_mixer->stop_all(); @@ -7631,7 +7633,7 @@ void SimonState::read_vga_from_datfile_1(uint vga_id) {  		fseek(in, 0, SEEK_END);  		size = ftell(in); -		rewind(in); +		fseek(in, 0, SEEK_SET);  		if (fread(_vga_buffer_pointers[11].vgaFile2, size, 1, in) != 1)  			error("read_vga_from_datfile_1: read failed"); @@ -7660,7 +7662,7 @@ byte *SimonState::read_vga_from_datfile_2(uint id) {  		fseek(in, 0, SEEK_END);  		size = ftell(in); -		rewind(in); +		fseek(in, 0, SEEK_SET);  		dst = setup_vga_destination(size); @@ -7992,7 +7994,9 @@ bool SimonState::save_game(uint slot, const char *caption) {  	_lock_word |= 0x100; +#ifndef _WIN32_WCE  	errno = 0; +#endif  	f = fopen(gen_savename(slot), "wb");  	if (f==NULL) @@ -8084,8 +8088,12 @@ char *SimonState::gen_savename(int slot) {  	const char *dir;  	/* perhaps getenv should be added to OSystem */ +#ifndef _WIN32_WCE  	dir = getenv("SCUMMVM_SAVEPATH");  	if (dir == NULL) dir = ""; +#else +	dir = _game_path; +#endif  	sprintf(buf, "%sSAVE.%.3d", dir, slot);  	return buf; @@ -8098,7 +8106,9 @@ bool SimonState::load_game(uint slot) {  	_lock_word |= 0x100; +#ifndef _WIN32_WCE  	errno = 0; +#endif  	f = fopen(gen_savename(slot), "rb");  	if (f==NULL) @@ -8200,8 +8210,10 @@ bool SimonState::load_game(uint slot) {  	_lock_word &= ~0x100; +#ifndef _WIN32_WCE  	if (errno != 0)  		error("load failed"); +#endif  	return true;  } @@ -121,6 +121,7 @@ OSystem *OSystem_SDL_create(int gfx_driver, bool full_screen);  OSystem *OSystem_NULL_create();  OSystem *OSystem_MorphOS_create(int game_id, int gfx_driver, bool full_screen);  OSystem *OSystem_Dreamcast_create(); +OSystem *OSystem_WINCE3_create();  enum {  	GFX_NORMAL = 0, @@ -140,6 +141,7 @@ enum {  	GD_X = 3,  	GD_NULL = 4,  	GD_MORPHOS = 5, +	GD_WINCE = 6  }; diff --git a/wince/pocketpc.cpp b/wince/pocketpc.cpp index 2cd7953ad4..edc174498f 100644 --- a/wince/pocketpc.cpp +++ b/wince/pocketpc.cpp @@ -20,33 +20,29 @@  #include "stdafx.h"  #include <assert.h> -#include <aygshell.h> -#include "resource.h" -  #include "scumm.h"  #include "screen.h" - -#include "sound.h" -  #include "gui.h" +#include "mididrv.h" +#include "gameDetector.h" +#include "simon/simon.h" +#include "gapi_keys.h" -#include "commctrl.h" +#include "commctrl.h"  #include <Winuser.h> -  #include <Winnls.h>  #include <sipapi.h>  #include <Aygshell.h>  #include <gx.h> - -#include "gapi_keys.h" +#include <aygshell.h> +#include "resource.h"  #include "SDL.h"  #include "SDL_audio.h"  #include "SDL_timer.h"  #include "SDL_thread.h" -  #define VERSION "(VM " SCUMMVM_CVS ")"  #define SHMenuBar_GetMenu(hWndMB,ID_MENU) (HMENU)SendMessage((hWndMB), SHCMBM_GETSUBMENU, (WPARAM)0, (LPARAM)ID_MENU) @@ -100,6 +96,12 @@ static int old_mouse_x, old_mouse_y;  static int old_mouse_h, old_mouse_w;  static bool has_mouse, hide_mouse; +GameDetector detector; +Gui gui; + +Scumm *g_scumm; + +  #define BAK_WIDTH 40  #define BAK_HEIGHT 40  unsigned char old_backup[BAK_WIDTH * BAK_HEIGHT]; @@ -114,34 +116,6 @@ unsigned char old_backup[BAK_WIDTH * BAK_HEIGHT];      num_of_dirty_square++;					\    } -// Practically identical to the one in windows.cpp -class WndMan -{ -	HMODULE hInst; -	HWND hWnd; - -	bool terminated;	 - -public: -	byte *_vgabuf; -	Scumm *_scumm; - -	HANDLE _event; -	DWORD _threadId; -	HWAVEOUT _handle; -	WAVEHDR _hdr[2]; - - -public: -	void init(); - -	bool handleMessage(); -	void run(); -	void setPalette(byte *ctab, int first, int num); -	void writeToScreen(); - -}; -  // Similar to Error in windows.cpp but has to take Unicode in account  void Error(LPCTSTR msg)  { @@ -152,14 +126,10 @@ void Error(LPCTSTR msg)  //{{  Scumm scumm; -ScummDebugger debugger; -Gui gui; -IMuse sound; -SOUND_DRIVER_TYPE snd_driv; +//IMuse sound; +//SOUND_DRIVER_TYPE snd_driv; - -WndMan wm[1];  byte veryFastMode;  //}} @@ -283,12 +253,14 @@ void registry_save() {  /* Action functions */ +// FIX ACTIONS +  void action_right_click() { -	wm->_scumm->_rightBtnPressed |= msDown|msClicked; +	//wm->_scumm->_rightBtnPressed |= msDown|msClicked;  }  void action_pause() { -	wm->_scumm->_keyPressed = mapKey(VK_SPACE); +	//wm->_scumm->_keyPressed = mapKey(VK_SPACE);  }  void action_save() { @@ -298,7 +270,7 @@ void action_save() {  			toolbar_drawn = false;  	} -	wm->_scumm->_keyPressed = mapKey(VK_F5); +	//wm->_scumm->_keyPressed = mapKey(VK_F5);  }  void action_quit() { @@ -306,14 +278,14 @@ void action_quit() {  }  void action_skip() { -	wm->_scumm->_keyPressed = mapKey(VK_ESCAPE); +	//wm->_scumm->_keyPressed = mapKey(VK_ESCAPE);  }  void action_hide() {  	hide_toolbar = !hide_toolbar;  	Cls();  	toolbar_drawn = hide_toolbar; -	wm->writeToScreen(); +	//wm->writeToScreen();  }  void action_keyboard() { @@ -326,7 +298,7 @@ void action_keyboard() {  void action_sound() {  	sound_activated = !sound_activated; -	wm->_scumm->_soundsPaused2 = !sound_activated; +	//wm->_scumm->_soundsPaused2 = !sound_activated;  }  /* Initialization */ @@ -344,22 +316,445 @@ void keypad_close() {  	GXCloseInput();	  } -/* *************************************************************************** */ -/* SDL sound */ -/* *************************************************************************** */ +// This function is very similar to the one in windows.cpp except for +// one line removed. + +// TODO : use dirty rects + +/* +void blitToScreen(Scumm *s, byte *src,int x, int y, int w, int h) { +	byte *dst; +	//int i; + +	dst = (byte*)wm->_vgabuf + y*320 + x; + +	if (h<=0)	return; + +	hide_mouse = true; +	if (has_mouse) { +	 s->drawMouse(); +	} +   +	AddDirtyRec(x, y, w, h); + +	do { +		memcpy(dst, src, w); +		dst += 320; +		src += 320; +	} while (--h); + +} +*/ + +//{{ +int clock; + +// TODO : use dirty rects for faster screen updates + +/* +void updateScreen(Scumm *s) { + +  if (hide_mouse) { +    hide_mouse = false; +    s->drawMouse(); +  } + +	if (s->_palDirtyMax != -1) { +		wm->setPalette(s->_currentPalette, 0, 256);	 +		s->_palDirtyMax = -1; +	} + +	wm->writeToScreen(); +} + +void waitForTimer(Scumm *s, int delay) { +	wm->handleMessage(); +	if (!veryFastMode) { +		assert(delay<5000); +		if(!delay) +			delay++; +		Sleep(delay); +	}  +} +*/ + +// Copy/Paste from X11 +// Dirty rects not managed now + +/* + +void drawMouse(int xdraw, int ydraw, int w, int h, byte *buf, bool visible) { +  unsigned char *dst,*bak; + +  if ((xdraw >= 320) || ((xdraw + w) <= 0) || +      (ydraw >= 200) || ((ydraw + h) <= 0)) { +    if (hide_mouse) visible = false; +    if (has_mouse) has_mouse = false; +    if (visible) has_mouse = true; +    return; +  } + +  if (hide_mouse) +    visible = false; +   +  assert(w<=BAK_WIDTH && h<=BAK_HEIGHT); + +  if (has_mouse) { +    int old_h = old_mouse_h; + +    has_mouse = false; +    AddDirtyRec(old_mouse_x, old_mouse_y, old_mouse_w, old_mouse_h); + +    dst = wm->_vgabuf + (old_mouse_y * 320) + old_mouse_x; +    bak = old_backup; +     +    while (old_h > 0) { +      memcpy(dst, bak, old_mouse_w); +      bak += BAK_WIDTH; +      dst += 320; +      old_h--; +    } +  } + +  if (visible) { +    int real_w; +    int real_h; +    int real_h_2; +    unsigned char *dst2; + +    if (ydraw < 0) { +      real_h = h + ydraw; +      buf += (-ydraw) * w; +      ydraw = 0; +    } else { +      real_h = (ydraw + h) > 200 ? (200 - ydraw) : h; +    } +    if (xdraw < 0) { +      real_w = w + xdraw; +      buf += (-xdraw); +      xdraw = 0; +    } else { +      real_w = (xdraw + w) > 320 ? (320 - xdraw) : w; +    } +     +    dst =  wm->_vgabuf + (ydraw * 320) + xdraw; +    dst2 = dst; +    bak = old_backup; +         +    has_mouse = true; + +    AddDirtyRec(xdraw, ydraw, real_w, real_h); +    old_mouse_x = xdraw; +    old_mouse_y = ydraw; +    old_mouse_w = real_w; +    old_mouse_h = real_h; +     +    real_h_2 = real_h; +    while (real_h_2 > 0) { +      memcpy(bak, dst, real_w); +      bak += BAK_WIDTH; +      dst += 320; +      real_h_2--; +    } +    while (real_h > 0) { +      int width = real_w; +      while (width > 0) { +	unsigned char color = *buf; +	if (color != 0xFF) { +	  *dst2 = color; +	} +	buf++; +	dst2++; +	width--; +      } +      buf += w - real_w; +      dst2 += 320 - real_w; +      real_h--; +    } +  } +} +*/ + + +BOOL CALLBACK SelectDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ +	switch(uMsg) +	{ +	case WM_INITDIALOG: +		{ +			TCHAR work[1024]; +			RECT rc; GetWindowRect(hwndDlg, &rc); +			MoveWindow(hwndDlg, +				(GetSystemMetrics(SM_CXSCREEN)-rc.right+rc.left)/2, +				(GetSystemMetrics(SM_CYSCREEN)-rc.bottom+rc.top)/2, +				rc.right-rc.left, rc.bottom-rc.top, TRUE); +			BringWindowToTop(hwndDlg); +			setFindGameDlgHandle(hwndDlg); +			MultiByteToWideChar(CP_ACP, 0, VERSION, strlen(VERSION) + 1, work, sizeof(work)); +			SetDlgItemText(hwndDlg, IDC_GAMEDESC, work); +			loadGameSettings(); +		} +		return TRUE; + +	case WM_COMMAND: + +		if (LOWORD(wParam) == IDC_LISTAVAILABLE && HIWORD(wParam) == LBN_SELCHANGE) +			displayGameInfo(); -void fill_sound(void *userdata, Uint8 *stream, int len) { -	scumm.mixWaves((int16*)stream, len>>1); +		if (wParam == IDC_SCAN) +			startFindGame(); + +		if (wParam == IDC_PLAY) { +			int item; + +			item = SendMessage(GetDlgItem(hwndDlg, IDC_LISTAVAILABLE), LB_GETCURSEL, 0, 0); +			if (item == LB_ERR) { +				MessageBox(hwndDlg, TEXT("Please select a game"), TEXT("Error"), MB_OK); +			} +			else +				EndDialog(hwndDlg, item + 1000); +		} + +		if (wParam == IDC_EXIT) +			EndDialog(hwndDlg, 0);	 +		return TRUE; +	default: +		return FALSE; +	}  } +char* GameSelector() +{ +	TCHAR directory[MAX_PATH];	 +	static char  id[100]; + +	DWORD result = DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_GAMESELECT), HWND_DESKTOP, SelectDlgProc); +	if (result < 1000) +		return NULL; +	result -= 1000; + +	getSelectedGame(result, id, directory); + +	WideCharToMultiByte(CP_ACP, 0, directory, wcslen(directory) + 1, _directory, sizeof(_directory), NULL, NULL); + +	strcat(_directory, "\\"); +	 +	return id; +	 +} + +// Directly corresponds to main in windows.cpp +int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd) +{ +	 +	int argc = 3; +	char* argv[3]; +	char argdir[MAX_PATH]; +	sound_activated = true; +	hide_toolbar = false; + +	argv[0] = NULL; +	argv[1] = GameSelector(); +	sprintf(argdir, "-p%s", _directory); +	argv[2] = argdir; + +	if (!argv[1]) +		return 0; + +	if (detector.detectMain(argc, argv)) +		return (-1); + +	OSystem *system = detector.createSystem(); +	 +	/* Simon the Sorcerer? */ +	if (detector._gameId >= GID_SIMON_FIRST && detector._gameId <= GID_SIMON_LAST) { +		/* Simon the Sorcerer. Completely different initialization */ +		MidiDriver *midi = detector.createMidi(); +		 +		SimonState *simon = SimonState::create(system, midi); +		simon->_game = detector._gameId - GID_SIMON_FIRST; +		simon->set_volume(detector._sfx_volume); +		simon->_game_path = detector._gameDataPath; +		simon->go(); + +	} else { +		Scumm *scumm = Scumm::createFromDetector(&detector, system); +		g_scumm = scumm; + +		/* bind to Gui */ +		scumm->_gui = &gui; +		gui.init(scumm);	/* Reinit GUI after loading a game */ + +		scumm->go(); +	} +	 +	return 0; +} + +class OSystem_WINCE3 : public OSystem { +public: +	// Set colors of the palette +	void set_palette(const byte *colors, uint start, uint num); + +	// Set the size of the video bitmap. +	// Typically, 320x200 +	void init_size(uint w, uint h); + +	// Draw a bitmap to screen. +	// The screen will not be updated to reflect the new bitmap +	void copy_rect(const byte *buf, int pitch, int x, int y, int w, int h); + +	// Update the dirty areas of the screen +	void update_screen(); + +	// Either show or hide the mouse cursor +	bool show_mouse(bool visible); +	 +	// Set the position of the mouse cursor +	void set_mouse_pos(int x, int y); +	 +	// Set the bitmap that's used when drawing the cursor. +	void set_mouse_cursor(const byte *buf, uint w, uint h, int hotspot_x, int hotspot_y); +	 +	// Shaking is used in SCUMM. Set current shake position. +	void set_shake_pos(int shake_pos); +		 +	// Get the number of milliseconds since the program was started. +	uint32 get_msecs(); +	 +	// Delay for a specified amount of milliseconds +	void delay_msecs(uint msecs); +	 +	// Create a thread +	void *create_thread(ThreadProc *proc, void *param); +	 +	// Get the next event. +	// Returns true if an event was retrieved.	 +	bool poll_event(Event *event); +	 +	// Set function that generates samples  +	bool set_sound_proc(void *param, SoundProc *proc, byte sound); +		 +	// Poll cdrom status +	// Returns true if cd audio is playing +	bool poll_cdrom(); + +	// Play cdrom audio track +	void play_cdrom(int track, int num_loops, int start_frame, int end_frame); + +	// Stop cdrom audio track +	void stop_cdrom(); + +	// Update cdrom audio status +	void update_cdrom(); + +	// Quit +	void quit(); + +	// Set a parameter +	uint32 property(int param, uint32 value); + +	// Windows callbacks & stuff + +	bool handleMessage(); +	static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); + +	// Constructor + +	static OSystem *create(); + +private: + +	byte *_vgabuf; +	uint32 _start_time; +	Event _event; +	HMODULE hInst; +	HWND hWnd; +	bool terminated;	 +}; + +// Create class + +	OSystem* OSystem_WINCE3_create() { +	return OSystem_WINCE3::create(); +} + +// Constructor + +OSystem* OSystem_WINCE3::create() { + +	OSystem_WINCE3 *syst = new OSystem_WINCE3(); + +	syst->_vgabuf = (byte*)calloc(320,200); +	syst->_event.event_code = -1; + +	/* Retrieve the handle of this module */ +	syst->hInst = GetModuleHandle(NULL); + +	/* Register the window class */ +	WNDCLASS wcex; +	wcex.style			= CS_HREDRAW | CS_VREDRAW; +	wcex.lpfnWndProc	= (WNDPROC)WndProc; +	wcex.cbClsExtra		= 0; +	wcex.cbWndExtra		= 0; +	wcex.hInstance		= syst->hInst; +	wcex.hIcon			= 0; +	wcex.hCursor		= NULL; +	wcex.hbrBackground	= (HBRUSH)GetStockObject(BLACK_BRUSH); +	wcex.lpszMenuName	= 0;	 +	wcex.lpszClassName	= TEXT("ScummVM"); +	if (!RegisterClass(&wcex)) +		Error(TEXT("Cannot register window class!")); + +	syst->hWnd = CreateWindow(TEXT("ScummVM"), TEXT("ScummVM"), WS_VISIBLE, +      0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), NULL, NULL, syst->hInst, NULL); +	hWnd_Window = syst->hWnd; +	SetWindowLong(syst->hWnd, GWL_USERDATA, (long)syst); + +	ShowWindow(syst->hWnd, SW_SHOW); + +	SHMENUBARINFO smbi; +	smbi.cbSize = sizeof(smbi);  +	smbi.hwndParent = syst->hWnd;  +	smbi.dwFlags = 0;  +	smbi.nToolBarId = IDM_MENU;  +	smbi.hInstRes = GetModuleHandle(NULL);  +	smbi.nBmpId = 0;  +	smbi.cBmpImages = 0;  +	smbi.hwndMB = NULL; +	BOOL res = SHCreateMenuBar(&smbi); +	hWnd_MainMenu = smbi.hwndMB; + +	/* Sound is activated on default - initialize it in the menu */ +	CheckMenuItem((HMENU)SHMenuBar_GetMenu (hWnd_MainMenu, IDM_POCKETSCUMM), +		IDC_SOUND,  +		MF_BYCOMMAND | MF_CHECKED); + +	GraphicsOn(syst->hWnd); + +	SetWindowPos(syst->hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE); +	SetForegroundWindow(syst->hWnd); +//	SHFullScreen(hWnd, SHFS_SHOWSIPBUTTON); +	SHFullScreen(syst->hWnd, SHFS_HIDESIPBUTTON | SHFS_HIDETASKBAR | SHFS_HIDESTARTICON); + +	//Cls(); + +// Mini SDL init + +	if (SDL_Init(SDL_INIT_AUDIO)==-1) {		 +	    exit(1); +	} + +	return syst; +} -// TODO : check SIP state - menu seems to be not drawn on some devices +// Windows specific callbacks -static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +LRESULT CALLBACK OSystem_WINCE3::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)  {  	static		 SHACTIVATEINFO sai; -	WndMan *wm = (WndMan*)GetWindowLong(hWnd, GWL_USERDATA);	 +	OSystem_WINCE3 *wm = (OSystem_WINCE3*)GetWindowLong(hWnd, GWL_USERDATA);	  	switch (message)   	{ @@ -408,7 +803,7 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM l  		}  //		SHSipPreference(hWnd, SIP_UP); /* Hack! */  		/* It does not happen often but I don't want to see tooltip traces */ -		wm->writeToScreen(); +		wm->update_screen();  		return 0;  	case WM_ACTIVATE: @@ -433,16 +828,17 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM l  	case WM_COMMAND:  		switch(wParam)  		{ -		case IDC_OPTIONS: -			wm->_scumm->_keyPressed = KEY_SET_OPTIONS; +		case IDC_OPTIONS:			 +			wm->_event.kbd.ascii = KEY_SET_OPTIONS; +			wm->_event.event_code = EVENT_KEYDOWN;  			break;  		case IDC_EXIT:  			DestroyWindow(hWnd);  			do_quit();			  			break;  		case IDC_SKIP: -			wParam = VK_ESCAPE; -			wm->_scumm->_keyPressed = mapKey(wParam); +			wm->_event.kbd.ascii = mapKey(VK_ESCAPE);; +			wm->_event.event_code = EVENT_KEYDOWN;  			break;  		case IDC_LOADSAVE:  			if (GetScreenMode()) { @@ -450,17 +846,18 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM l  				if (!hide_toolbar)  					toolbar_drawn = false;  			} -			wParam = VK_F5; -			wm->_scumm->_keyPressed = mapKey(wParam); +			wm->_event.kbd.ascii = mapKey(VK_F5); +			wm->_event.event_code = EVENT_KEYDOWN;  			break;  		case IDC_SOUND: +			// FIXME  			sound_activated = !sound_activated;  			CheckMenuItem (  				SHMenuBar_GetMenu (hWnd_MainMenu, IDM_POCKETSCUMM),  				IDC_SOUND,   				MF_BYCOMMAND | (sound_activated ? MF_CHECKED : MF_UNCHECKED));	 -			wm->_scumm->_soundsPaused2 = !sound_activated; +			//wm->_scumm->_soundsPaused2 = !sound_activated;  			break;             break; @@ -489,13 +886,16 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM l  			GAPI_key = getGAPIKeyMapping((short)wParam);  			if (GAPI_key) { -				if (get_key_mapping) -					wm->_scumm->_keyPressed = GAPI_KEY_BASE + GAPI_key; +				if (get_key_mapping) { +					wm->_event.kbd.ascii = GAPI_KEY_BASE + GAPI_key; +					wm->_event.event_code = EVENT_KEYDOWN; +				}					  				else  					processAction((short)wParam);  			}  			else { -				wm->_scumm->_keyPressed = mapKey(wParam); +				wm->_event.kbd.ascii = mapKey(wParam); +				wm->_event.event_code = EVENT_KEYDOWN;								  			}  		} @@ -506,8 +906,9 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM l  			int x = ((int16*)&lParam)[0];  			int y = ((int16*)&lParam)[1];  			Translate(&x, &y); -			wm->_scumm->mouse.x = x; -			wm->_scumm->mouse.y = y; +			wm->_event.event_code = EVENT_MOUSEMOVE; +			wm->_event.mouse.x = x; +			wm->_event.mouse.y = y;  		}  		break;  	case WM_LBUTTONDOWN: @@ -522,7 +923,8 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM l  				if (x<185 && y>=200) {  					//Alpha selection -					wm->_scumm->_keyPressed =  +					wm->_event.event_code = EVENT_KEYDOWN; +					wm->_event.kbd.ascii =   						(y <= 220 ? KEYBOARD_MAPPING_ALPHA_HIGH[((x + 10) / 14) - 1] :  									KEYBOARD_MAPPING_ALPHA_LOW[((x + 10) / 14) - 1]);  					break; @@ -530,7 +932,8 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM l  				else  				if (x>=186 && y>=200 && x<=255) {  				   // Numeric selection -				   wm->_scumm->_keyPressed = +				   wm->_event.event_code = EVENT_KEYDOWN; +				   wm->_event.kbd.ascii =  					   (y <= 220 ? KEYBOARD_MAPPING_NUMERIC_HIGH[((x - 187 + 10) / 14) - 1] :  								   KEYBOARD_MAPPING_NUMERIC_LOW[((x - 187 + 10) / 14) - 1]);  				   break; @@ -538,13 +941,14 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM l  				else  				if (x>=302 && x <= 316 && y >= 200 && y <= 220) {  				  // Backspace -				  wm->_scumm->_keyPressed = mapKey(VK_BACK); +				  wm->_event.event_code = EVENT_KEYDOWN; +				  wm->_event.kbd.ascii = mapKey(VK_BACK);  				  break;  				} -				wm->_scumm->mouse.x = x; -				wm->_scumm->mouse.y = y; -				wm->_scumm->_leftBtnPressed |= msClicked|msDown; +				wm->_event.event_code = EVENT_LBUTTONDOWN; +				wm->_event.mouse.x = x; +				wm->_event.mouse.y = y;  				break;  			} @@ -553,15 +957,16 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM l  			toolbar_selection = (hide_toolbar || get_key_mapping ? ToolbarNone :   									getToolbarSelection(x, y));  			if (toolbar_selection == ToolbarNone) {				 -				wm->_scumm->mouse.x = x; -				wm->_scumm->mouse.y = y; - -				wm->_scumm->_leftBtnPressed |= msClicked|msDown; +				wm->_event.event_code = EVENT_LBUTTONDOWN; +				wm->_event.mouse.x = x; +				wm->_event.mouse.y = y;  				if(y > 200 && !hide_toolbar)  				{ -					if(x<160) -						wm->_scumm->_keyPressed = VK_ESCAPE;				 +					if(x<160) { +					   wm->_event.event_code = EVENT_KEYDOWN; +					   wm->_event.kbd.ascii = mapKey(VK_ESCAPE); +					}  					else  					{  						SetScreenMode(0); // restore normal tap logic @@ -579,17 +984,21 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM l  							if (!hide_toolbar)  								toolbar_drawn = false;  						} -						wm->_scumm->_keyPressed = mapKey(VK_F5); +						wm->_event.event_code = EVENT_KEYDOWN; +						wm->_event.kbd.ascii = mapKey(VK_F5);  						break;  					case ToolbarExit: -						wm->_scumm->_keyPressed = KEY_SET_OPTIONS; +						wm->_event.event_code = EVENT_KEYDOWN; +						wm->_event.kbd.ascii = KEY_SET_OPTIONS;  						break;  					case ToolbarSkip: -						wm->_scumm->_keyPressed = mapKey(VK_ESCAPE);				 +						wm->_event.event_code = EVENT_KEYDOWN; +						wm->_event.kbd.ascii = mapKey(VK_ESCAPE);				  						break;  					case ToolbarSound: +						// FIXME !!!!!  						sound_activated = !sound_activated; -						wm->_scumm->_soundsPaused2 = !sound_activated; +						//wm->_scumm->_soundsPaused2 = !sound_activated;  						redrawSoundItem();  						break;  					default: @@ -601,11 +1010,12 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM l  	case WM_LBUTTONUP:  		{  			// pinched from the SDL code. Distinguishes between taps and not -			wm->_scumm->_leftBtnPressed &= ~msDown; +			wm->_event.event_code = EVENT_LBUTTONUP; +  		}  		break;  	case WM_LBUTTONDBLCLK:  // doesn't seem to work right now -		wm->_scumm->_rightBtnPressed |= msClicked | msDown; +		//wm->_scumm->_rightBtnPressed |= msClicked | msDown;  		break;  	default:  		return DefWindowProc(hWnd, message, wParam, lParam); @@ -613,79 +1023,8 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM l     return 0;  } -// writeToScreen, setPalette and init are very port-specific -void WndMan::writeToScreen() -{ -	Blt(_vgabuf); -} - -void WndMan::setPalette(byte *ctab, int first, int num) { -	int i; - -	for (i=0; i<256; i++) -		SetPalEntry(i, ctab[i*3+0], ctab[i*3+1], ctab[i*3+2]); - -	palette_update(); -} - - -void WndMan::init() -{ -	/* Retrieve the handle of this module */ -	hInst = GetModuleHandle(NULL); -	/* Register the window class */ -	WNDCLASS wcex; -	wcex.style			= CS_HREDRAW | CS_VREDRAW; -	wcex.lpfnWndProc	= (WNDPROC)WndProc; -	wcex.cbClsExtra		= 0; -	wcex.cbWndExtra		= 0; -	wcex.hInstance		= hInst; -	wcex.hIcon			= 0; -	wcex.hCursor		= NULL; -	wcex.hbrBackground	= (HBRUSH)GetStockObject(BLACK_BRUSH); -	wcex.lpszMenuName	= 0;	 -	wcex.lpszClassName	= TEXT("ScummVM"); -	if (!RegisterClass(&wcex)) -		Error(TEXT("Cannot register window class!")); - -	hWnd = CreateWindow(TEXT("ScummVM"), TEXT("ScummVM"), WS_VISIBLE, -      0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), NULL, NULL, hInst, NULL); -	hWnd_Window = hWnd; -	SetWindowLong(hWnd, GWL_USERDATA, (long)this); - -	ShowWindow(hWnd, SW_SHOW); - -	SHMENUBARINFO smbi; -	smbi.cbSize = sizeof(smbi);  -	smbi.hwndParent = hWnd;  -	smbi.dwFlags = 0;  -	smbi.nToolBarId = IDM_MENU;  -	smbi.hInstRes = GetModuleHandle(NULL);  -	smbi.nBmpId = 0;  -	smbi.cBmpImages = 0;  -	smbi.hwndMB = NULL; -	BOOL res = SHCreateMenuBar(&smbi); -	hWnd_MainMenu = smbi.hwndMB; - -	/* Sound is activated on default - initialize it in the menu */ -	CheckMenuItem((HMENU)SHMenuBar_GetMenu (hWnd_MainMenu, IDM_POCKETSCUMM), -		IDC_SOUND,  -		MF_BYCOMMAND | MF_CHECKED); - -	GraphicsOn(hWnd); - -	SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE); -	SetForegroundWindow(hWnd); -//	SHFullScreen(hWnd, SHFS_SHOWSIPBUTTON); -	SHFullScreen(hWnd, SHFS_HIDESIPBUTTON | SHFS_HIDETASKBAR | SHFS_HIDESTARTICON); - -	Cls(); -} - - -//{{ -bool WndMan::handleMessage() { +bool OSystem_WINCE3::handleMessage() {  	MSG msg;  	if (!PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) @@ -702,331 +1041,129 @@ bool WndMan::handleMessage() {  	return true;  } -//}} -// This function is very similar to the one in windows.cpp except for -// one line removed. +void OSystem_WINCE3::set_palette(const byte *colors, uint start, uint num) { +	int i; -// TODO : use dirty rects +	for (i=0; i<256; i++) +		SetPalEntry(i, colors[i*3+0], colors[i*3+1], colors[i*3+2]); -void blitToScreen(Scumm *s, byte *src,int x, int y, int w, int h) { -	byte *dst; -	//int i; +	palette_update(); -	dst = (byte*)wm->_vgabuf + y*320 + x; +} -	if (h<=0)	return; +void OSystem_WINCE3::init_size(uint w, uint h) { +} -	hide_mouse = true; -	if (has_mouse) { -	 s->drawMouse(); -	} -   -	AddDirtyRec(x, y, w, h); +void OSystem_WINCE3::copy_rect(const byte *buf, int pitch, int x, int y, int w, int h) { +	byte *dst; +	dst = _vgabuf + y * 320 + x;  	do { -		memcpy(dst, src, w); +		memcpy(dst, buf, w);  		dst += 320; -		src += 320; +		buf += pitch;  	} while (--h); - +		  } -//{{ -int clock; +void OSystem_WINCE3::update_screen() { +	Blt(_vgabuf); +} -// TODO : use dirty rects for faster screen updates +// FIXME : implement mouse functions -void updateScreen(Scumm *s) { +bool OSystem_WINCE3::show_mouse(bool visible) { +	return false; +} +	 -  if (hide_mouse) { -    hide_mouse = false; -    s->drawMouse(); -  } +void OSystem_WINCE3::set_mouse_pos(int x, int y) { +} +	 -	if (s->_palDirtyMax != -1) { -		wm->setPalette(s->_currentPalette, 0, 256);	 -		s->_palDirtyMax = -1; -	} +void OSystem_WINCE3::set_mouse_cursor(const byte *buf, uint w, uint h, int hotspot_x, int hotspot_y) { +} +	 +void OSystem_WINCE3::set_shake_pos(int shake_pos) { +} +		 -	wm->writeToScreen(); +uint32 OSystem_WINCE3::get_msecs() { +	return GetTickCount() - _start_time; +} +		 +void OSystem_WINCE3::delay_msecs(uint msecs) { +	handleMessage(); +	Sleep(msecs);  } +	 -void waitForTimer(Scumm *s, int delay) { -	wm->handleMessage(); -	if (!veryFastMode) { -		assert(delay<5000); -		if(!delay) -			delay++; -		Sleep(delay); -	}  +void* OSystem_WINCE3::create_thread(ThreadProc *proc, void *param) { +	// Implement if needed by Midi Music +	return NULL;  } +	 +//FIXME : add a minimal queue (just testing here) -void initGraphics(Scumm *s, bool fullScreen, unsigned int scaleFactor) { -	SDL_AudioSpec desired; +bool OSystem_WINCE3::poll_event(Event *event) { +	if (_event.event_code < 0) +		return false; -	if(fullScreen) -		warning("Use SDL for fullscreen support"); +	*event = _event; +	_event.event_code = -1; -	if (SDL_Init(SDL_INIT_AUDIO)==-1) {		 -	    exit(1); -	} +	return true; +} +	 +	 +bool OSystem_WINCE3::set_sound_proc(void *param, SoundProc *proc, byte sound) { +	SDL_AudioSpec desired;  	desired.freq = 11025;  	desired.format = AUDIO_S16SYS;  	desired.channels = 1;  	desired.samples = 128;               // seems correct -	desired.callback = fill_sound; +	desired.callback = proc; +	desired.userdata = param;  	SDL_OpenAudio(&desired, NULL);  	SDL_PauseAudio(0); -} - -// Copy/Paste from X11 -// Dirty rects not managed now - -void drawMouse(int xdraw, int ydraw, int w, int h, byte *buf, bool visible) { -  unsigned char *dst,*bak; - -  if ((xdraw >= 320) || ((xdraw + w) <= 0) || -      (ydraw >= 200) || ((ydraw + h) <= 0)) { -    if (hide_mouse) visible = false; -    if (has_mouse) has_mouse = false; -    if (visible) has_mouse = true; -    return; -  } - -  if (hide_mouse) -    visible = false; -   -  assert(w<=BAK_WIDTH && h<=BAK_HEIGHT); - -  if (has_mouse) { -    int old_h = old_mouse_h; - -    has_mouse = false; -    AddDirtyRec(old_mouse_x, old_mouse_y, old_mouse_w, old_mouse_h); - -    dst = wm->_vgabuf + (old_mouse_y * 320) + old_mouse_x; -    bak = old_backup; -     -    while (old_h > 0) { -      memcpy(dst, bak, old_mouse_w); -      bak += BAK_WIDTH; -      dst += 320; -      old_h--; -    } -  } - -  if (visible) { -    int real_w; -    int real_h; -    int real_h_2; -    unsigned char *dst2; - -    if (ydraw < 0) { -      real_h = h + ydraw; -      buf += (-ydraw) * w; -      ydraw = 0; -    } else { -      real_h = (ydraw + h) > 200 ? (200 - ydraw) : h; -    } -    if (xdraw < 0) { -      real_w = w + xdraw; -      buf += (-xdraw); -      xdraw = 0; -    } else { -      real_w = (xdraw + w) > 320 ? (320 - xdraw) : w; -    } -     -    dst =  wm->_vgabuf + (ydraw * 320) + xdraw; -    dst2 = dst; -    bak = old_backup; -         -    has_mouse = true; +	desired.userdata = param; -    AddDirtyRec(xdraw, ydraw, real_w, real_h); -    old_mouse_x = xdraw; -    old_mouse_y = ydraw; -    old_mouse_w = real_w; -    old_mouse_h = real_h; -     -    real_h_2 = real_h; -    while (real_h_2 > 0) { -      memcpy(bak, dst, real_w); -      bak += BAK_WIDTH; -      dst += 320; -      real_h_2--; -    } -    while (real_h > 0) { -      int width = real_w; -      while (width > 0) { -	unsigned char color = *buf; -	if (color != 0xFF) { -	  *dst2 = color; -	} -	buf++; -	dst2++; -	width--; -      } -      buf += w - real_w; -      dst2 += 320 - real_w; -      real_h--; -    } -  } +	return true;  } +		 +// No CD functions to implement - - -BOOL CALLBACK SelectDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ -	switch(uMsg) -	{ -	case WM_INITDIALOG: -		{ -			TCHAR work[1024]; -			RECT rc; GetWindowRect(hwndDlg, &rc); -			MoveWindow(hwndDlg, -				(GetSystemMetrics(SM_CXSCREEN)-rc.right+rc.left)/2, -				(GetSystemMetrics(SM_CYSCREEN)-rc.bottom+rc.top)/2, -				rc.right-rc.left, rc.bottom-rc.top, TRUE); -			BringWindowToTop(hwndDlg); -			setFindGameDlgHandle(hwndDlg); -			MultiByteToWideChar(CP_ACP, 0, VERSION, strlen(VERSION) + 1, work, sizeof(work)); -			SetDlgItemText(hwndDlg, IDC_GAMEDESC, work); -			loadGameSettings(); -		} -		return TRUE; - -	case WM_COMMAND: - -		if (LOWORD(wParam) == IDC_LISTAVAILABLE && HIWORD(wParam) == LBN_SELCHANGE) -			displayGameInfo(); - -		if (wParam == IDC_SCAN) -			startFindGame(); - -		if (wParam == IDC_PLAY) { -			int item; - -			item = SendMessage(GetDlgItem(hwndDlg, IDC_LISTAVAILABLE), LB_GETCURSEL, 0, 0); -			if (item == LB_ERR) { -				MessageBox(hwndDlg, TEXT("Please select a game"), TEXT("Error"), MB_OK); -			} -			else -				EndDialog(hwndDlg, item + 1000); -		} - -		if (wParam == IDC_EXIT) -			EndDialog(hwndDlg, 0);	 -		return TRUE; -	default: -		return FALSE; -	} +bool OSystem_WINCE3::poll_cdrom() { +	return false;  } -char* GameSelector() -{ -	TCHAR directory[MAX_PATH];	 -	static char  id[100]; - -	DWORD result = DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_GAMESELECT), HWND_DESKTOP, SelectDlgProc); -	if (result < 1000) -		return NULL; -	result -= 1000; - -	getSelectedGame(result, id, directory); - -	WideCharToMultiByte(CP_ACP, 0, directory, wcslen(directory) + 1, _directory, sizeof(_directory), NULL, NULL); - -	strcat(_directory, "\\"); -	 -	return id; -	 +void OSystem_WINCE3::play_cdrom(int track, int num_loops, int start_frame, int end_frame) {  } -// Directly corresponds to main in windows.cpp -int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd) -{ -	int delta; -	int tmp; - -	int argc = 3; -	char* argv[3]; -	char argdir[MAX_PATH]; -	IMuse *se; - -	sound_activated = true; -	hide_toolbar = false; - -	argv[0] = NULL; -	argv[1] = GameSelector(); -	sprintf(argdir, "-p%s", _directory); -	argv[2] = argdir; -	scumm._savegame_dir = _directory; -//	scumm._error_handler = error_handler; - -	if(argv[1] == NULL) -		return 0; - -	wm->init(); -	wm->_vgabuf = (byte*)calloc(320,200); -	wm->_scumm = &scumm; -	 -	sound.initialize(&scumm, &snd_driv); -	scumm._soundsPaused = false; -	scumm._soundsPaused2 = false; - -	scumm._gui = &gui; - -	scumm.scummMain(argc, argv); -	gui.init(&scumm); -	 -	keypad_init(); -	registry_init(); - -	se = scumm._imuse; -	se->set_music_volume(scumm._sound_volume_music); -	se->set_master_volume(scumm._sound_volume_master); - -	delta = 0; -	tmp = 0; -	do -	{ -		updateScreen(&scumm); +void OSystem_WINCE3::stop_cdrom() { +} -		waitForTimer(&scumm, tmp*10); +void OSystem_WINCE3::update_cdrom() { +} -		if(gui._active) -		{ -			gui.loop(); -			tmp = 5; -		} -		else -		{ -			tmp = delta = scumm.scummLoop(delta); +void OSystem_WINCE3::quit() { +	do_quit(); +} -			tmp += tmp>>1; -			 -			if(scumm._fastMode) -				tmp=1; -		} +uint32 OSystem_WINCE3::property(int param, uint32 value) { +	switch(param) { +		case PROP_GET_SAMPLE_RATE: +			return 11025;  	} -	while(1);  	return 0;  } -/* Unsupported funcs */ - -// TODO : implement -void setShakePos(Scumm *s, int shake_pos) {} -// TODO : switch to MP3 support -void cd_playtrack(int track, int offset, int delay) {} - -// Never happening on Pocket version +OSystem *OSystem_NULL_create() { +	return NULL; +} -void launcherLoop() {;} -void cd_playtrack(int track, int offset, int delay) {;} -void cd_play(int track, int num_loops, int start_frame) {;} -void cd_stop() {;} -int cd_is_running() {return 0;}
\ No newline at end of file +void ScummDebugger::attach(Scumm *s) { +} | 
