aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--windows.cpp618
1 files changed, 0 insertions, 618 deletions
diff --git a/windows.cpp b/windows.cpp
deleted file mode 100644
index 6e4037409a..0000000000
--- a/windows.cpp
+++ /dev/null
@@ -1,618 +0,0 @@
-/* ScummVM - Scumm Interpreter
- * Copyright (C) 2001 Ludvig Strigeus
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
-
- * This program 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 General Public License for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Header$
- */
-
-#include "stdafx.h"
-#include <assert.h>
-
-#include "scumm.h"
-#include "cdmusic.h"
-#include "gui.h"
-
-#if !defined(ALLOW_GDI)
-#error The GDI driver is not as complete as the SDL driver. You need to define ALLOW_GDI to use this driver.
-#endif
-
-#define SRC_WIDTH 320
-#define SRC_HEIGHT 200
-#define SRC_PITCH (320)
-
-#define DEST_WIDTH 320
-#define DEST_HEIGHT 200
-
-#define USE_DIRECTX 0
-#define USE_DRAWDIB 0
-#define USE_GDI 1
-
-#define SAMPLES_PER_SEC 22050
-#define BUFFER_SIZE (8192)
-#define BITS_PER_SAMPLE 16
-
-static bool shutdown;
-static unsigned int scale;
-
-#if USE_GDI
-typedef struct DIB {
- HBITMAP hSect;
- byte *buf;
- RGBQUAD *pal;
- bool new_pal;
-} DIB;
-#endif
-
-class WndMan {
- HMODULE hInst;
- HWND hWnd;
-
-
- bool terminated;
-
-#if USE_GDI
-public:
- DIB dib;
-private:
-#endif
-
-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();
-
- void prepare_header(WAVEHDR * wh, int i);
- void sound_init();
- static DWORD _stdcall sound_thread(WndMan * wm);
-
-#if USE_GDI
- bool allocateDIB(int w, int h);
-#endif
-};
-
-void Error(const char *msg)
-{
- OutputDebugString(msg);
- MessageBoxA(0, msg, "Error", MB_ICONSTOP);
- exit(1);
-}
-
-int sel;
-Scumm scumm;
-ScummDebugger debugger;
-Gui gui;
-IMuse sound;
-SOUND_DRIVER_TYPE snd_driv;
-
-WndMan wm[1];
-byte veryFastMode;
-
-void modifyslot(int sel, int what);
-void launcherLoop()
-{;
-}
-
-int mapKey(int key)
-{
- if (key >= VK_F1 && key <= VK_F9) {
- return key - VK_F1 + 315;
- }
- return key;
-}
-
-// FIXME: CD Music Stubs
-void cd_playtrack(int track, int offset, int delay)
-{;
-}
-void cd_play(Scumm *s, int track, int num_loops, int start_frame)
-{;
-}
-void cd_stop()
-{;
-}
-int cd_is_running()
-{
- return 0;
-}
-
-static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam,
- LPARAM lParam)
-{
- WndMan *wm = (WndMan *) GetWindowLong(hWnd, GWL_USERDATA);
-
- switch (message) {
- case WM_DESTROY:
- case WM_CLOSE:
- exit(0);
- break;
-
- case WM_KEYDOWN:
- if (wParam >= '0' && wParam <= '9') {
- wm->_scumm->_saveLoadSlot = wParam - '0';
- if (GetAsyncKeyState(VK_SHIFT) < 0) {
- sprintf(wm->_scumm->_saveLoadName, "Quicksave %d",
- wm->_scumm->_saveLoadSlot);
- wm->_scumm->_saveLoadFlag = 1;
- } else if (GetAsyncKeyState(VK_CONTROL) < 0)
- wm->_scumm->_saveLoadFlag = 2;
- wm->_scumm->_saveLoadCompatible = false;
- }
-
- if (GetAsyncKeyState(VK_CONTROL) < 0) {
- if (wParam == 'F') {
- wm->_scumm->_fastMode ^= 1;
- }
-
- if (wParam == 'G') {
- veryFastMode ^= 1;
- }
-
- if (wParam == 'D') {
- debugger.attach(wm->_scumm);
- }
-
- if (wParam == 'S') {
- wm->_scumm->resourceStats();
- }
- }
-
- wm->_scumm->_keyPressed = mapKey(wParam);
- break;
-
- case WM_MOUSEMOVE:
- wm->_scumm->mouse.x = ((int16 *) & lParam)[0];
- wm->_scumm->mouse.y = ((int16 *) & lParam)[1];
- break;
- case WM_LBUTTONDOWN:
- wm->_scumm->_leftBtnPressed |= msClicked | msDown;
- break;
- case WM_LBUTTONUP:
- wm->_scumm->_leftBtnPressed &= ~msDown;
- break;
- case WM_RBUTTONDOWN:
- wm->_scumm->_rightBtnPressed |= msClicked | msDown;
- break;
- case WM_RBUTTONUP:
- wm->_scumm->_rightBtnPressed &= ~msDown;
- break;
- default:
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- return 0;
-}
-
-#if USE_GDI
-
-bool WndMan::allocateDIB(int w, int h)
-{
- struct {
- BITMAPINFOHEADER bih;
- RGBQUAD rgb[256];
- } d;
-
- if (dib.hSect)
- return true;
-
- memset(&d.bih, 0, sizeof(d.bih));
- d.bih.biSize = sizeof(d.bih);
- d.bih.biWidth = w;
- d.bih.biHeight = -h;
- d.bih.biPlanes = 1;
- d.bih.biBitCount = 8;
- d.bih.biCompression = BI_RGB;
-
- memcpy(d.rgb, dib.pal, 256 * sizeof(RGBQUAD));
- dib.new_pal = false;
-
- dib.hSect =
- CreateDIBSection(0, (BITMAPINFO *) & d, DIB_RGB_COLORS, (void **)&dib.buf,
- NULL, NULL);
-
- return dib.hSect != NULL;
-}
-
-void WndMan::writeToScreen()
-{
- RECT r;
- HDC dc, bmpdc;
- HBITMAP bmpOld;
-#if DEST_WIDTH==320
- if (_vgabuf) {
- for (int y = 0; y < 200; y++) {
- memcpy(dib.buf + y * 320, _vgabuf + y * 320, 320);
- }
- }
-#endif
-
- r.left = r.top = 0;
- r.right = DEST_WIDTH;
- r.bottom = DEST_HEIGHT;
-
- dc = GetDC(hWnd);
-
- bmpdc = CreateCompatibleDC(dc);
- bmpOld = (HBITMAP) SelectObject(bmpdc, dib.hSect);
-
- if (dib.new_pal) {
- dib.new_pal = false;
- SetDIBColorTable(bmpdc, 0, 256, dib.pal);
- }
-
- SetStretchBltMode(dc, BLACKONWHITE);
-
-#if DEST_WIDTH==320
- StretchBlt(dc, r.left, r.top, r.right - r.left, r.bottom - r.top, bmpdc, 0,
- 0, 320, 200, SRCCOPY);
-#endif
-
-
- SelectObject(bmpdc, bmpOld);
- DeleteDC(bmpdc);
- ReleaseDC(hWnd, dc);
-}
-
-void WndMan::setPalette(byte *ctab, int first, int num)
-{
- int i;
-
- for (i = 0; i < 256; i++) {
- dib.pal[i].rgbRed = ctab[i * 3 + 0];
- dib.pal[i].rgbGreen = ctab[i * 3 + 1];
- dib.pal[i].rgbBlue = ctab[i * 3 + 2];
- }
-
- dib.new_pal = true;
-}
-
-#endif
-
-HWND globWnd;
-
-void WndMan::init()
-{
-
- /* Retrieve the handle of this module */
- hInst = GetModuleHandle(NULL);
-
- /* Register the window class */
- WNDCLASSEX wcex;
- wcex.cbSize = sizeof(WNDCLASSEX);
- wcex.style = CS_HREDRAW | CS_VREDRAW;
- wcex.lpfnWndProc = (WNDPROC) WndProc;
- wcex.cbClsExtra = 0;
- wcex.cbWndExtra = 0;
- wcex.hInstance = hInst;
- wcex.hIcon = 0;
- wcex.hCursor =::LoadCursor(NULL, IDC_ARROW);
- wcex.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
- wcex.lpszMenuName = 0;
- wcex.lpszClassName = "ScummVM";
- wcex.hIconSm = 0;
- if (!RegisterClassEx(&wcex))
- Error("Cannot register window class!");
-
-#if USE_GDI
- globWnd = hWnd = CreateWindow("ScummVM", "ScummVM", WS_OVERLAPPEDWINDOW,
- CW_USEDEFAULT, CW_USEDEFAULT, DEST_WIDTH + 10,
- DEST_HEIGHT + 30, NULL, NULL, hInst, NULL);
- SetWindowLong(hWnd, GWL_USERDATA, (long)this);
-
- dib.pal = (RGBQUAD *) calloc(sizeof(RGBQUAD), 256);
- dib.new_pal = false;
-
- if (!allocateDIB(DEST_WIDTH, DEST_HEIGHT))
- Error("allocateDIB failed!");
-
- ShowWindow(hWnd, SW_SHOW);
-#endif
-
-}
-
-
-bool WndMan::handleMessage()
-{
- MSG msg;
-
- if (!PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
- return false;
-
- if (msg.message == WM_QUIT) {
- terminated = true;
- exit(1);
- return true;
- }
-
- TranslateMessage(&msg);
- DispatchMessage(&msg);
-
- return true;
-}
-
-
-unsigned long rdtsc_timer;
-
-void _declspec(naked) beginpentiumtest()
-{
- _asm {
- rdtsc mov rdtsc_timer, eax ret}
-}
-
-int _declspec(naked) endpentiumtest()
-{
- _asm {
- rdtsc sub eax, rdtsc_timer ret}
-}
-
-
-void decompressMask(byte *d, byte *s, int w = 320, int h = 144)
-{
- int x, y;
-
- for (y = 0; y < h; y++) {
- byte *p = s + y * 40;
- byte *pd = d + y * 320;
- byte bits = 0x80, bdata = *p++;
- for (x = 0; x < w; x++) {
- *pd++ = (bdata & bits) ? 128 : 0;
- bits >>= 1;
- if (!bits) {
- bdata = *p++;
- bits = 0x80;
- }
- }
- }
-}
-
-void outputlittlemask(byte *mask, int w, int h)
-{
- byte *old = wm->_vgabuf;
- wm->_vgabuf = NULL;
- decompressMask(wm->dib.buf, mask, w, h);
- wm->writeToScreen();
- wm->_vgabuf = old;
-}
-
-void outputdisplay2(Scumm *s, int disp)
-{
- byte *old = wm->_vgabuf;
-
- byte buf[64000];
-
- switch (disp) {
- case 0:
- wm->_vgabuf = buf;
- memcpy(buf, wm->_vgabuf, 64000);
- memcpy(buf, s->getResourceAddress(rtBuffer, 5), 320 * 200);
- break;
- case 1:
- wm->_vgabuf = buf;
- memcpy(buf, wm->_vgabuf, 64000);
- memcpy(buf, s->getResourceAddress(rtBuffer, 1), 320 * 200);
- break;
- case 2:
- wm->_vgabuf = NULL;
- decompressMask(wm->dib.buf,
- s->getResourceAddress(rtBuffer, 9) + s->_screenStartStrip);
- break;
- case 3:
- wm->_vgabuf = NULL;
- decompressMask(wm->dib.buf,
- s->getResourceAddress(rtBuffer,
- 9) + 8160 + s->_screenStartStrip);
- break;
- case 4:
- wm->_vgabuf = NULL;
- decompressMask(wm->dib.buf,
- s->getResourceAddress(rtBuffer,
- 9) + 8160 * 2 +
- s->_screenStartStrip);
- break;
- case 5:
- wm->_vgabuf = NULL;
- decompressMask(wm->dib.buf,
- s->getResourceAddress(rtBuffer,
- 9) + 8160 * 3 +
- s->_screenStartStrip);
- break;
- }
- wm->writeToScreen();
- wm->_vgabuf = old;
-}
-
-void blitToScreen(Scumm *s, byte *src, int x, int y, int w, int h)
-{
- byte *dst;
-
- dst = (byte *)wm->_vgabuf + y * 320 + x;
-
- do {
- memcpy(dst, src, w);
- dst += 320;
- src += 320;
- } while (--h);
-
-}
-
-void setShakePos(Scumm *s, int shake_pos)
-{
-}
-
-
-int clock;
-
-void updateScreen(Scumm *s)
-{
- 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 (s->_fastMode)
- delay = 10;
- Sleep(delay);
- }
-}
-
-void initGraphics(Scumm *s, bool fullScreen, unsigned int scaleFactor)
-{
- if (fullScreen)
- warning("Use SDL for fullscreen support");
- scale = scaleFactor; // not supported yet! ignored.
-}
-
-void drawMouse(int, int, int, byte *, bool)
-{
-}
-
-void drawMouse(int x, int y, int w, int h, byte *buf, bool visible)
-{
-}
-
-void fill_buffer(int16 * buf, int len)
-{
- scumm.mixWaves(buf, len);
-}
-
-void WndMan::prepare_header(WAVEHDR * wh, int i)
-{
- memset(wh, 0, sizeof(WAVEHDR));
- wh->lpData = (char *)malloc(BUFFER_SIZE);
- wh->dwBufferLength = BUFFER_SIZE;
-
- waveOutPrepareHeader(_handle, wh, sizeof(WAVEHDR));
-
- fill_buffer((int16 *) wh->lpData, wh->dwBufferLength >> 1);
- waveOutWrite(_handle, wh, sizeof(WAVEHDR));
-}
-
-void WndMan::sound_init()
-{
- WAVEFORMATEX wfx;
-
- memset(&wfx, 0, sizeof(wfx));
- wfx.wFormatTag = WAVE_FORMAT_PCM;
- wfx.nChannels = 1;
- wfx.nSamplesPerSec = SAMPLES_PER_SEC;
- wfx.nAvgBytesPerSec = SAMPLES_PER_SEC * BITS_PER_SAMPLE / 8;
- wfx.wBitsPerSample = BITS_PER_SAMPLE;
- wfx.nBlockAlign = BITS_PER_SAMPLE * 1 / 8;
-
- CreateThread(NULL, 0, (unsigned long (__stdcall *) (void *))&sound_thread,
- this, 0, &_threadId);
- SetThreadPriority((void *)_threadId, THREAD_PRIORITY_HIGHEST);
-
- _event = CreateEvent(NULL, false, false, NULL);
-
- memset(_hdr, 0, sizeof(_hdr));
-
- waveOutOpen(&_handle, WAVE_MAPPER, &wfx, (long)_event, (long)this,
- CALLBACK_EVENT);
-
- prepare_header(&_hdr[0], 0);
- prepare_header(&_hdr[1], 1);
-}
-
-DWORD _stdcall WndMan::sound_thread(WndMan * wm)
-{
- int i;
- bool signaled;
- int time = GetTickCount(), cur;
-
- while (1) {
- cur = GetTickCount();
-
- if (!snd_driv.wave_based()) {
- while (time < cur) {
- sound.on_timer();
- time += 10;
- }
- }
-
- signaled = WaitForSingleObject(wm->_event, time - cur) == WAIT_OBJECT_0;
-
- if (signaled) {
- for (i = 0; i < 2; i++) {
- WAVEHDR *hdr = &wm->_hdr[i];
- if (hdr->dwFlags & WHDR_DONE) {
- fill_buffer((int16 *) hdr->lpData, hdr->dwBufferLength >> 1);
- waveOutWrite(wm->_handle, hdr, sizeof(WAVEHDR));
- }
- }
- }
- }
-}
-
-
-#undef main
-int main(int argc, char *argv[])
-{
- int delta;
-
- wm->init();
- wm->_vgabuf = (byte *)calloc(320, 200);
- wm->_scumm = &scumm;
-
- sound.initialize(&scumm, &snd_driv);
-
- wm->sound_init();
-
- scumm._gui = &gui;
- scumm.scummMain(argc, argv);
-
- if (!(scumm._features & GF_SMALL_HEADER))
- gui.init(&scumm);
-
- delta = 0;
- do {
- updateScreen(&scumm);
-
- waitForTimer(&scumm, delta * 15);
-
- if (gui._active) {
- gui.loop();
- delta = 3;
- } else {
- delta = scumm.scummLoop(delta);
- }
- } while (1);
-
- return 0;
-}
-
-void BoxTest(int num)
-{;
-} // Test code