From a2698b220ca90c6fc25986a631210f4274eccce3 Mon Sep 17 00:00:00 2001 From: Alexander Batalov Date: Tue, 24 May 2022 23:19:36 +0300 Subject: [PATCH] Get rid of DirectDraw --- src/core.cc | 141 ++++++++++++++++------------------------------ src/core.h | 10 ++-- src/game_movie.cc | 5 -- src/movie.cc | 118 ++++++++++++++++++-------------------- src/movie.h | 10 ++-- src/movie_lib.cc | 126 +++++++++++++++++------------------------ src/movie_lib.h | 21 ++++--- src/win32.cc | 23 -------- src/win32.h | 6 -- 9 files changed, 174 insertions(+), 286 deletions(-) diff --git a/src/core.cc b/src/core.cc index e9c8031..3d27d2e 100644 --- a/src/core.cc +++ b/src/core.cc @@ -71,18 +71,6 @@ unsigned int _ticker_ = 0; // 0x51E2AC int gMouseButtonsState = 0; -// 0x51E2B0 -LPDIRECTDRAW gDirectDraw = NULL; - -// 0x51E2B4 -LPDIRECTDRAWSURFACE gDirectDrawSurface1 = NULL; - -// 0x51E2B8 -LPDIRECTDRAWSURFACE gDirectDrawSurface2 = NULL; - -// 0x51E2BC -LPDIRECTDRAWPALETTE gDirectDrawPalette = NULL; - // NOTE: This value is never set, so it's impossible to understand it's // meaning. // @@ -2120,26 +2108,17 @@ int directDrawInit(int width, int height, int bpp) } SDL_SetPaletteColors(gSdlSurface->format->palette, colors, 0, 256); - - return 0; } else { - DDPIXELFORMAT ddpf; - ddpf.dwSize = sizeof(DDPIXELFORMAT); + gRedMask = gSdlSurface->format->Rmask; + gGreenMask = gSdlSurface->format->Gmask; + gBlueMask = gSdlSurface->format->Bmask; - if (IDirectDrawSurface_GetPixelFormat(gDirectDrawSurface1, &ddpf) != DD_OK) { - return -1; - } - - gRedMask = ddpf.dwRBitMask; - gGreenMask = ddpf.dwGBitMask; - gBlueMask = ddpf.dwBBitMask; - - gRedShift = getShiftForBitMask(gRedMask) - 7; - gGreenShift = getShiftForBitMask(gGreenMask) - 7; - gBlueShift = getShiftForBitMask(gBlueMask) - 7; - - return 0; + gRedShift = gSdlSurface->format->Rshift; + gGreenShift = gSdlSurface->format->Gshift; + gBlueShift = gSdlSurface->format->Bshift; } + + return 0; } // 0x4CB1B0 @@ -2299,29 +2278,12 @@ void _GNW95_ShowRect(unsigned char* src, int srcPitch, int a3, int srcX, int src // 0x4CB93C void _GNW95_MouseShowRect16(unsigned char* src, int srcPitch, int a3, int srcX, int srcY, int srcWidth, int srcHeight, int destX, int destY) { - DDSURFACEDESC ddsd; - HRESULT hr; - if (!gProgramIsActive) { return; } - while (1) { - ddsd.dwSize = sizeof(ddsd); - - hr = IDirectDrawSurface_Lock(gDirectDrawSurface1, NULL, &ddsd, 1, NULL); - if (hr == DD_OK) { - break; - } - - if (hr == DDERR_SURFACELOST) { - if (IDirectDrawSurface_Restore(gDirectDrawSurface2) != DD_OK) { - return; - } - } - } - - unsigned char* dest = (unsigned char*)ddsd.lpSurface + ddsd.lPitch * destY + 2 * destX; + SDL_LockSurface(gSdlSurface); + unsigned char* dest = (unsigned char*)gSdlSurface->pixels + gSdlSurface->pitch * destY + 2 * destX; src += srcPitch * srcY + srcX; @@ -2334,11 +2296,23 @@ void _GNW95_MouseShowRect16(unsigned char* src, int srcPitch, int a3, int srcX, srcPtr++; } - dest += ddsd.lPitch; + dest += gSdlSurface->pitch; src += srcPitch; } - IDirectDrawSurface_Unlock(gDirectDrawSurface1, ddsd.lpSurface); + SDL_UnlockSurface(gSdlSurface); + + SDL_Rect srcRect; + srcRect.x = destX; + srcRect.y = destY; + srcRect.w = srcWidth; + srcRect.h = srcHeight; + + SDL_Rect destRect; + destRect.x = destX; + destRect.y = destY; + SDL_BlitSurface(gSdlSurface, &srcRect, gSdlWindowSurface, &destRect); + SDL_UpdateWindowSurface(gSdlWindow); } // 0x4CBA44 @@ -2350,29 +2324,12 @@ void _GNW95_ShowRect16(unsigned char* src, int srcPitch, int a3, int srcX, int s // 0x4CBAB0 void _GNW95_MouseShowTransRect16(unsigned char* src, int srcPitch, int a3, int srcX, int srcY, int srcWidth, int srcHeight, int destX, int destY, unsigned char keyColor) { - DDSURFACEDESC ddsd; - HRESULT hr; - if (!gProgramIsActive) { return; } - while (1) { - ddsd.dwSize = sizeof(ddsd); - - hr = IDirectDrawSurface_Lock(gDirectDrawSurface1, NULL, &ddsd, 1, NULL); - if (hr == DD_OK) { - break; - } - - if (hr == DDERR_SURFACELOST) { - if (IDirectDrawSurface_Restore(gDirectDrawSurface2) != DD_OK) { - return; - } - } - } - - unsigned char* dest = (unsigned char*)ddsd.lpSurface + ddsd.lPitch * destY + 2 * destX; + SDL_LockSurface(gSdlSurface); + unsigned char* dest = (unsigned char*)gSdlSurface->pixels + gSdlSurface->pitch * destY + 2 * destX; src += srcPitch * srcY + srcX; @@ -2387,11 +2344,23 @@ void _GNW95_MouseShowTransRect16(unsigned char* src, int srcPitch, int a3, int s srcPtr++; } - dest += ddsd.lPitch; + dest += gSdlSurface->pitch; src += srcPitch; } - IDirectDrawSurface_Unlock(gDirectDrawSurface1, ddsd.lpSurface); + SDL_UnlockSurface(gSdlSurface); + + SDL_Rect srcRect; + srcRect.x = destX; + srcRect.y = destY; + srcRect.w = srcWidth; + srcRect.h = srcHeight; + + SDL_Rect destRect; + destRect.x = destX; + destRect.y = destY; + SDL_BlitSurface(gSdlSurface, &srcRect, gSdlWindowSurface, &destRect); + SDL_UpdateWindowSurface(gSdlWindow); } // Clears drawing surface. @@ -2399,36 +2368,22 @@ void _GNW95_MouseShowTransRect16(unsigned char* src, int srcPitch, int a3, int s // 0x4CBBC8 void _GNW95_zero_vid_mem() { - DDSURFACEDESC ddsd; - HRESULT hr; - unsigned char* surface; - if (!gProgramIsActive) { return; } - while (1) { - ddsd.dwSize = sizeof(DDSURFACEDESC); + SDL_LockSurface(gSdlSurface); - hr = IDirectDrawSurface_Lock(gDirectDrawSurface1, NULL, &ddsd, 1, NULL); - if (hr == DD_OK) { - break; - } - - if (hr == DDERR_SURFACELOST) { - if (IDirectDrawSurface_Restore(gDirectDrawSurface2) != DD_OK) { - return; - } - } + unsigned char* surface = (unsigned char*)gSdlSurface->pixels; + for (unsigned int y = 0; y < gSdlSurface->h; y++) { + memset(surface, 0, gSdlSurface->w); + surface += gSdlSurface->pitch; } - surface = (unsigned char*)ddsd.lpSurface; - for (unsigned int y = 0; y < ddsd.dwHeight; y++) { - memset(surface, 0, ddsd.dwWidth); - surface += ddsd.lPitch; - } + SDL_UnlockSurface(gSdlSurface); - IDirectDrawSurface_Unlock(gDirectDrawSurface1, ddsd.lpSurface); + SDL_BlitSurface(gSdlSurface, NULL, gSdlWindowSurface, NULL); + SDL_UpdateWindowSurface(gSdlWindow); } // 0x4CBC90 diff --git a/src/core.h b/src/core.h index cba59f6..c934568 100644 --- a/src/core.h +++ b/src/core.h @@ -6,7 +6,7 @@ #include "geometry.h" #include "window.h" -#include +#include #include @@ -439,10 +439,6 @@ extern double gMouseSensitivity; extern unsigned int _ticker_; extern int gMouseButtonsState; -extern LPDIRECTDRAW gDirectDraw; -extern LPDIRECTDRAWSURFACE gDirectDrawSurface1; -extern LPDIRECTDRAWSURFACE gDirectDrawSurface2; -extern LPDIRECTDRAWPALETTE gDirectDrawPalette; extern void (*_update_palette_func)(); extern bool gMmxEnabled; extern bool gMmxProbed; @@ -530,6 +526,10 @@ extern KeyboardEvent gLastKeyboardEvent; extern int gKeyboardLayout; extern unsigned char gPressedPhysicalKeysCount; +extern SDL_Window* gSdlWindow; +extern SDL_Surface* gSdlWindowSurface; +extern SDL_Surface* gSdlSurface; + int coreInit(int a1); void coreExit(); int _get_input(); diff --git a/src/game_movie.cc b/src/game_movie.cc index e17226d..dd86da6 100644 --- a/src/game_movie.cc +++ b/src/game_movie.cc @@ -132,11 +132,6 @@ int gameMoviesSave(File* stream) // 0x44E690 int gameMoviePlay(int movie, int flags) { - // TODO: SDL - paletteSetEntries(gPaletteBlack); - gGameMoviesSeen[movie] = 1; - return 0; - gGameMovieIsPlaying = true; const char* movieFileName = gMovieFileNames[movie]; diff --git a/src/movie.cc b/src/movie.cc index 5b283f2..d7477b7 100644 --- a/src/movie.cc +++ b/src/movie.cc @@ -114,9 +114,6 @@ int _movieW; // 0x638E98 void (*_movieFrameGrabFunc)(); -// 0x638E9C -LPDIRECTDRAWSURFACE gMovieDirectDrawSurface; - // 0x638EA0 int _subtitleH; @@ -144,6 +141,8 @@ File* _alphaHandle; // 0x638EC0 unsigned char* _alphaBuf; +SDL_Surface* gMovieSdlSurface = NULL; + // 0x4865FC void* movieMallocImpl(size_t size) { @@ -163,83 +162,80 @@ bool movieReadImpl(int fileHandle, void* buf, int count) } // 0x486654 -void movieDirectImpl(LPDIRECTDRAWSURFACE a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9) +void movieDirectImpl(SDL_Surface* surface, int srcWidth, int srcHeight, int srcX, int srcY, int destWidth, int destHeight, int a8, int a9) { int v14; int v15; - DDSURFACEDESC ddsd; - memset(&ddsd, 0, sizeof(DDSURFACEDESC)); - ddsd.dwSize = sizeof(DDSURFACEDESC); - - RECT srcRect; - srcRect.left = a4; - srcRect.top = a5; - srcRect.right = a2 + a4; - srcRect.bottom = a3 + a5; + SDL_Rect srcRect; + srcRect.x = srcX; + srcRect.y = srcY; + srcRect.w = srcWidth; + srcRect.h = srcHeight; v14 = gMovieWindowRect.right - gMovieWindowRect.left; v15 = gMovieWindowRect.right - gMovieWindowRect.left + 1; - RECT destRect; + SDL_Rect destRect; if (_movieScaleFlag) { if ((gMovieFlags & MOVIE_EXTENDED_FLAG_0x08) != 0) { - destRect.top = (gMovieWindowRect.bottom - gMovieWindowRect.top + 1 - a7) / 2; - destRect.left = (v15 - 4 * a2 / 3) / 2; + destRect.y = (gMovieWindowRect.bottom - gMovieWindowRect.top + 1 - destHeight) / 2; + destRect.x = (v15 - 4 * srcWidth / 3) / 2; } else { - destRect.top = _movieY + gMovieWindowRect.top; - destRect.left = gMovieWindowRect.left + _movieX; + destRect.y = _movieY + gMovieWindowRect.top; + destRect.x = gMovieWindowRect.left + _movieX; } - destRect.right = 4 * a2 / 3 + destRect.left; - destRect.bottom = a7 + destRect.top; + destRect.w = 4 * srcWidth / 3; + destRect.h = destHeight; } else { if ((gMovieFlags & MOVIE_EXTENDED_FLAG_0x08) != 0) { - destRect.top = (gMovieWindowRect.bottom - gMovieWindowRect.top + 1 - a7) / 2; - destRect.left = (v15 - a6) / 2; + destRect.y = (gMovieWindowRect.bottom - gMovieWindowRect.top + 1 - destHeight) / 2; + destRect.x = (v15 - destWidth) / 2; } else { - destRect.top = _movieY + gMovieWindowRect.top; - destRect.left = gMovieWindowRect.left + _movieX; + destRect.y = _movieY + gMovieWindowRect.top; + destRect.x = gMovieWindowRect.left + _movieX; } - destRect.right = a6 + destRect.left; - destRect.bottom = a7 + destRect.top; + destRect.w = destWidth; + destRect.h = destHeight; } - _lastMovieSX = a4; - _lastMovieSY = a5; - _lastMovieX = destRect.left; - _lastMovieY = destRect.top; - _lastMovieBH = a3; - _lastMovieW = destRect.right - destRect.left; - gMovieDirectDrawSurface = a1; - _lastMovieBW = a2; - _lastMovieH = destRect.bottom - destRect.top; + _lastMovieSX = srcX; + _lastMovieSY = srcY; + _lastMovieX = destRect.x; + _lastMovieY = destRect.y; + _lastMovieBH = srcHeight; + _lastMovieW = destRect.w; + gMovieSdlSurface = surface; + _lastMovieBW = srcWidth; + _lastMovieH = destRect.h; // The code above assumes `gMovieWindowRect` is always at (0,0) which is not // the case in HRP. For blitting purposes we have to adjust it relative to // the actual origin. We do it here because the variables above need to stay // in movie window coordinate space (for proper subtitles positioning). - destRect.left += gMovieWindowRect.left; - destRect.top += gMovieWindowRect.top; - destRect.right += gMovieWindowRect.left; - destRect.bottom += gMovieWindowRect.top; + destRect.x += gMovieWindowRect.left; + destRect.y += gMovieWindowRect.top; - HRESULT hr; - do { - if (_movieCaptureFrameFunc != NULL) { - if (IDirectDrawSurface_Lock(a1, NULL, &ddsd, 1, NULL) == DD_OK) { - _movieCaptureFrameFunc(ddsd.lpSurface, a2, destRect.left, destRect.top, destRect.right - destRect.left, destRect.bottom - destRect.top); - IDirectDrawSurface_Unlock(a1, ddsd.lpSurface); - } + if (_movieCaptureFrameFunc != NULL) { + if (SDL_LockSurface(surface) == 0) { + _movieCaptureFrameFunc(surface->pixels, srcWidth, destRect.x, destRect.y, destRect.w, destRect.h); + SDL_UnlockSurface(surface); } + } - hr = IDirectDrawSurface_Blt(gDirectDrawSurface1, &destRect, a1, &srcRect, 0, NULL); - } while (hr != DD_OK && hr != DDERR_SURFACELOST && hr == DDERR_WASSTILLDRAWING); + // TODO: This is a super-ugly hack. The reason is that surfaces managed by + // MVE does not have palette. If we blit from these internal surfaces into + // backbuffer surface (with palette set), all we get is shiny white box. + SDL_SetSurfacePalette(surface, gSdlSurface->format->palette); + SDL_BlitSurface(surface, &srcRect, gSdlSurface, &destRect); + SDL_BlitSurface(gSdlSurface, NULL, gSdlWindowSurface, NULL); + SDL_UpdateWindowSurface(gSdlWindow); } // 0x486900 -void movieBufferedImpl(LPDIRECTDRAWSURFACE a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9) +void movieBufferedImpl(SDL_Surface* a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9) { int v13; @@ -248,7 +244,7 @@ void movieBufferedImpl(LPDIRECTDRAWSURFACE a1, int a2, int a3, int a4, int a5, i } _lastMovieBW = a2; - gMovieDirectDrawSurface = a1; + gMovieSdlSurface = a1; _lastMovieBH = a2; _lastMovieW = a6; _lastMovieH = a7; @@ -257,10 +253,7 @@ void movieBufferedImpl(LPDIRECTDRAWSURFACE a1, int a2, int a3, int a4, int a5, i _lastMovieSX = a4; _lastMovieSY = a5; - DDSURFACEDESC ddsd; - ddsd.dwSize = sizeof(DDSURFACEDESC); - - if (IDirectDrawSurface_Lock(a1, NULL, &ddsd, 1, NULL) != DD_OK) { + if (SDL_LockSurface(a1) != 0) { return; } @@ -277,7 +270,7 @@ void movieBufferedImpl(LPDIRECTDRAWSURFACE a1, int a2, int a3, int a4, int a5, i // TODO: Incomplete. } - IDirectDrawSurface_Unlock(a1, ddsd.lpSurface); + SDL_UnlockSurface(a1); } // 0x486C74 @@ -338,7 +331,6 @@ void movieInit() movieLibSetMemoryProcs(movieMallocImpl, movieFreeImpl); movieLibSetDirectSound(gDirectSound); gMovieDirectSoundInitialized = (gDirectSound != NULL); - movieLibSetDirectDraw(gDirectDraw); movieLibSetPaletteEntriesProc(movieSetPaletteEntriesImpl); _MVE_sfSVGA(640, 480, 480, 0, 0, 0, 0, 0, 0); movieLibSetReadProc(movieReadImpl); @@ -366,18 +358,16 @@ void _cleanupMovie(int a1) _lastMovieBuffer = NULL; } - if (gMovieDirectDrawSurface != NULL) { - DDSURFACEDESC ddsd; - ddsd.dwSize = sizeof(DDSURFACEDESC); - if (IDirectDrawSurface_Lock(gMovieDirectDrawSurface, 0, &ddsd, 1, NULL) == DD_OK) { + if (gMovieSdlSurface != NULL) { + if (SDL_LockSurface(gMovieSdlSurface) == 0) { _lastMovieBuffer = (unsigned char*)internal_malloc_safe(_lastMovieBH * _lastMovieBW, __FILE__, __LINE__); // "..\\int\\MOVIE.C", 802 - blitBufferToBuffer((unsigned char*)ddsd.lpSurface + ddsd.lPitch * _lastMovieSX + _lastMovieSY, _lastMovieBW, _lastMovieBH, ddsd.lPitch, _lastMovieBuffer, _lastMovieBW); - IDirectDrawSurface_Unlock(gMovieDirectDrawSurface, ddsd.lpSurface); + blitBufferToBuffer((unsigned char*)gMovieSdlSurface->pixels + gMovieSdlSurface->pitch * _lastMovieSX + _lastMovieSY, _lastMovieBW, _lastMovieBH, gMovieSdlSurface->pitch, _lastMovieBuffer, _lastMovieBW); + SDL_UnlockSurface(gMovieSdlSurface); } else { debugPrint("Couldn't lock movie surface\n"); } - gMovieDirectDrawSurface = NULL; + gMovieSdlSurface = NULL; } if (a1) { @@ -501,7 +491,7 @@ void _cleanupLast() _lastMovieBuffer = NULL; } - gMovieDirectDrawSurface = NULL; + gMovieSdlSurface = NULL; } // 0x48731C diff --git a/src/movie.h b/src/movie.h index de0fa15..946c4ce 100644 --- a/src/movie.h +++ b/src/movie.h @@ -3,7 +3,8 @@ #include "db.h" #include "geometry.h" -#include "win32.h" + +#include typedef enum MovieFlags { MOVIE_FLAG_0x01 = 0x01, @@ -63,7 +64,6 @@ extern void (*_movieCaptureFrameFunc)(void*, int, int, int, int, int); extern unsigned char* _lastMovieBuffer; extern int _movieW; extern void (*_movieFrameGrabFunc)(); -extern LPDIRECTDRAWSURFACE gMovieDirectDrawSurface; extern int _subtitleH; extern int _running; extern File* gMovieFileStream; @@ -74,11 +74,13 @@ extern bool gMovieDirectSoundInitialized; extern File* _alphaHandle; extern unsigned char* _alphaBuf; +extern SDL_Surface* gMovieSdlSurface; + void* movieMallocImpl(size_t size); void movieFreeImpl(void* ptr); bool movieReadImpl(int fileHandle, void* buf, int count); -void movieDirectImpl(LPDIRECTDRAWSURFACE a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9); -void movieBufferedImpl(LPDIRECTDRAWSURFACE a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9); +void movieDirectImpl(SDL_Surface* a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9); +void movieBufferedImpl(SDL_Surface* a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9); int _movieScaleSubRectAlpha(int a1); int _blitAlpha(int win, unsigned char* a2, int a3, int a4, int a5); int _blitNormal(int win, int a2, int a3, int a4, int a5); diff --git a/src/movie_lib.cc b/src/movie_lib.cc index 573cb99..6d9d7cb 100644 --- a/src/movie_lib.cc +++ b/src/movie_lib.cc @@ -52,9 +52,6 @@ unsigned short word_51EBE0[256] = { // clang-format on }; -// 0x51EDE0 -LPDIRECTDRAW gMovieLibDirectDraw = NULL; - // 0x51EDE4 int _sync_active = 0; @@ -76,14 +73,8 @@ int gMovieLibVolume = 0; // 0x51EDFC int gMovieLibPan = 0; -// 0x51EE00 -LPDIRECTDRAWSURFACE gMovieDirectDrawSurface1 = NULL; - -// 0x51EE04 -LPDIRECTDRAWSURFACE gMovieDirectDrawSurface2 = NULL; - // 0x51EE08 -void (*_sf_ShowFrame)(LPDIRECTDRAWSURFACE, int, int, int, int, int, int, int, int) = _do_nothing_2; +MovieShowFrameProc* _sf_ShowFrame = _do_nothing_2; // 0x51EE0C int dword_51EE0C = 1; @@ -436,6 +427,9 @@ int dword_6B403B; // 0x6B403F int dword_6B403F; +SDL_Surface* gMovieSdlSurface1; +SDL_Surface* gMovieSdlSurface2; + // 0x4F4800 void movieLibSetMemoryProcs(MallocProc* mallocProc, FreeProc* freeProc) { @@ -524,13 +518,13 @@ void _MVE_sfSVGA(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, } // 0x4F49F0 -void _MVE_sfCallbacks(void (*fn)(LPDIRECTDRAWSURFACE, int, int, int, int, int, int, int, int)) +void _MVE_sfCallbacks(MovieShowFrameProc* proc) { - _sf_ShowFrame = fn; + _sf_ShowFrame = proc; } // 0x4F4A00 -void _do_nothing_2(LPDIRECTDRAWSURFACE a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9) +void _do_nothing_2(SDL_Surface* a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9) { } @@ -546,12 +540,6 @@ int _sub_4F4B5() return 0; } -// 0x4F4B80 -void movieLibSetDirectDraw(LPDIRECTDRAW dd) -{ - gMovieLibDirectDraw = dd; -} - // 0x4F4B90 void _MVE_rmCallbacks(int (*fn)()) { @@ -580,10 +568,6 @@ int _MVE_rmPrepMovie(int fileHandle, int a2, int a3, char a4) { _sub_4F4DD(); - if (gMovieLibDirectDraw == NULL) { - return -11; - } - _rm_dx = a2; _rm_dy = a3; _rm_track_bit = 1 << a4; @@ -1434,16 +1418,14 @@ void _MVE_sndResume() // 0x4F5CB0 int _nfConfig(int a1, int a2, int a3, int a4) { - DDSURFACEDESC ddsd; - - if (gMovieDirectDrawSurface1 != NULL) { - IDirectDrawSurface_Release(gMovieDirectDrawSurface1); - gMovieDirectDrawSurface1 = NULL; + if (gMovieSdlSurface1 != NULL) { + SDL_FreeSurface(gMovieSdlSurface1); + gMovieSdlSurface1 = NULL; } - if (gMovieDirectDrawSurface2 != NULL) { - IDirectDrawSurface_Release(gMovieDirectDrawSurface2); - gMovieDirectDrawSurface2 = NULL; + if (gMovieSdlSurface2 != NULL) { + SDL_FreeSurface(gMovieSdlSurface2); + gMovieSdlSurface2 = NULL; } byte_6B400D = a1; @@ -1456,31 +1438,29 @@ int _nfConfig(int a1, int a2, int a3, int a4) _mveBH >>= 1; } - memset(&ddsd, 0, sizeof(DDSURFACEDESC)); - - ddsd.dwSize = sizeof(DDSURFACEDESC); - ddsd.dwFlags = (DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT); - ddsd.dwWidth = _mveBW; - ddsd.dwHeight = _mveBH; - ddsd.ddsCaps.dwCaps = (DDSCAPS_SYSTEMMEMORY | DDSCAPS_OFFSCREENPLAIN); - ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); - + int depth; + int rmask; + int gmask; + int bmask; if (a4) { - ddsd.ddpfPixelFormat.dwFlags = 64; - ddsd.ddpfPixelFormat.dwRGBBitCount = 16; - ddsd.ddpfPixelFormat.dwRBitMask = 0x7C00; - ddsd.ddpfPixelFormat.dwGBitMask = 0x3E0; - ddsd.ddpfPixelFormat.dwBBitMask = 0x1F; + depth = 16; + rmask = 0x7C00; + gmask = 0x3E0; + bmask = 0x1F; } else { - ddsd.ddpfPixelFormat.dwFlags = 96; - ddsd.ddpfPixelFormat.dwRGBBitCount = 8; + depth = 8; + rmask = 0; + gmask = 0; + bmask = 0; } - if (IDirectDraw_CreateSurface(gMovieLibDirectDraw, &ddsd, &gMovieDirectDrawSurface1, NULL) != DD_OK) { + gMovieSdlSurface1 = SDL_CreateRGBSurface(0, _mveBW, _mveBH, depth, rmask, gmask, bmask, 0); + if (gMovieSdlSurface1 == NULL) { return 0; } - if (IDirectDraw_CreateSurface(gMovieLibDirectDraw, &ddsd, &gMovieDirectDrawSurface2, NULL) != DD_OK) { + gMovieSdlSurface2 = SDL_CreateRGBSurface(0, _mveBW, _mveBH, depth, rmask, gmask, bmask, 0); + if (gMovieSdlSurface2 == NULL) { return 0; } @@ -1503,22 +1483,18 @@ int _nfConfig(int a1, int a2, int a3, int a4) // 0x4F5E60 bool movieLockSurfaces() { - DDSURFACEDESC ddsd; - - ddsd.dwSize = sizeof(DDSURFACEDESC); - - if (gMovieDirectDrawSurface1 != NULL && gMovieDirectDrawSurface2 != NULL) { - if (IDirectDrawSurface_Lock(gMovieDirectDrawSurface1, NULL, &ddsd, 0, NULL) != DD_OK) { + if (gMovieSdlSurface1 != NULL && gMovieSdlSurface2 != NULL) { + if (SDL_LockSurface(gMovieSdlSurface1) != 0) { return false; } - gMovieDirectDrawSurfaceBuffer1 = (unsigned char*)ddsd.lpSurface; + gMovieDirectDrawSurfaceBuffer1 = (unsigned char*)gMovieSdlSurface1->pixels; - if (IDirectDrawSurface_Lock(gMovieDirectDrawSurface2, NULL, &ddsd, 0, NULL) != DD_OK) { + if (SDL_LockSurface(gMovieSdlSurface2) != 0) { return false; } - gMovieDirectDrawSurfaceBuffer2 = (unsigned char*)ddsd.lpSurface; + gMovieDirectDrawSurfaceBuffer2 = (unsigned char*)gMovieSdlSurface2->pixels; } return true; @@ -1527,16 +1503,16 @@ bool movieLockSurfaces() // 0x4F5EF0 void movieUnlockSurfaces() { - IDirectDrawSurface_Unlock(gMovieDirectDrawSurface1, NULL); - IDirectDrawSurface_Unlock(gMovieDirectDrawSurface2, NULL); + SDL_UnlockSurface(gMovieSdlSurface1); + SDL_UnlockSurface(gMovieSdlSurface2); } // 0x4F5F20 void movieSwapSurfaces() { - LPDIRECTDRAWSURFACE tmp = gMovieDirectDrawSurface2; - gMovieDirectDrawSurface2 = gMovieDirectDrawSurface1; - gMovieDirectDrawSurface1 = tmp; + SDL_Surface* tmp = gMovieSdlSurface2; + gMovieSdlSurface2 = gMovieSdlSurface1; + gMovieSdlSurface1 = tmp; } // 0x4F5F40 @@ -1586,9 +1562,9 @@ void _sfShowFrame(int a1, int a2, int a3) // TODO: Incomplete. // _mve_ShowFrameField(off_6B4033, _mveBW, v6, dword_6B401B, dword_6B401F, dword_6B4017, dword_6B4023, v7, v5, a3); } else if (dword_51EBDC == 4) { - _sf_ShowFrame(gMovieDirectDrawSurface1, _mveBW, v6, dword_6B401B, dword_6B401F, dword_6B4017, dword_6B4023, v7, v5); + _sf_ShowFrame(gMovieSdlSurface1, _mveBW, v6, dword_6B401B, dword_6B401F, dword_6B4017, dword_6B4023, v7, v5); } else { - _sf_ShowFrame(gMovieDirectDrawSurface1, _mveBW, v6, 0, dword_6B401F, ((4 * _mveBW / dword_51EBDC - 12) & 0xFFFFFFF0) + 12, dword_6B4023, v7, v5); + _sf_ShowFrame(gMovieSdlSurface1, _mveBW, v6, 0, dword_6B401F, ((4 * _mveBW / dword_51EBDC - 12) & 0xFFFFFFF0) + 12, dword_6B4023, v7, v5); } } @@ -1682,14 +1658,14 @@ void _MVE_sndRelease() // 0x4F6390 void _nfRelease() { - if (gMovieDirectDrawSurface1 != NULL) { - IDirectDrawSurface_Release(gMovieDirectDrawSurface1); - gMovieDirectDrawSurface1 = NULL; + if (gMovieSdlSurface1 != NULL) { + SDL_FreeSurface(gMovieSdlSurface1); + gMovieSdlSurface1 = NULL; } - if (gMovieDirectDrawSurface2 != NULL) { - IDirectDrawSurface_Release(gMovieDirectDrawSurface2); - gMovieDirectDrawSurface2 = NULL; + if (gMovieSdlSurface2 != NULL) { + SDL_FreeSurface(gMovieSdlSurface2); + gMovieSdlSurface2 = NULL; } } @@ -1702,8 +1678,8 @@ void _frLoad(STRUCT_4F6930* a1) _io_mem_buf.field_8 = a1->field_8.field_8; _io_handle = a1->fileHandle; _io_next_hdr = a1->field_18; - gMovieDirectDrawSurface1 = a1->field_24; - gMovieDirectDrawSurface2 = a1->field_28; + gMovieSdlSurface1 = a1->field_24; + gMovieSdlSurface2 = a1->field_28; dword_6B3AE8 = a1->field_2C; gMovieDirectDrawSurfaceBuffer1 = a1->field_30; gMovieDirectDrawSurfaceBuffer2 = a1->field_34; @@ -1730,8 +1706,8 @@ void _frSave(STRUCT_4F6930* a1) ptr->field_8 = _io_mem_buf.field_8; a1->fileHandle = _io_handle; a1->field_18 = _io_next_hdr; - a1->field_24 = gMovieDirectDrawSurface1; - a1->field_28 = gMovieDirectDrawSurface2; + a1->field_24 = gMovieSdlSurface1; + a1->field_28 = gMovieSdlSurface2; a1->field_2C = dword_6B3AE8; a1->field_30 = gMovieDirectDrawSurfaceBuffer1; a1->field_34 = gMovieDirectDrawSurfaceBuffer2; diff --git a/src/movie_lib.h b/src/movie_lib.h index 25497ef..06f2920 100644 --- a/src/movie_lib.h +++ b/src/movie_lib.h @@ -3,8 +3,7 @@ #include "memory_defs.h" -#define DIRECTDRAW_VERSION 0x0300 -#include +#include #define DIRECTSOUND_VERSION 0x0300 #include @@ -28,6 +27,7 @@ typedef struct Mve { #pragma pack() typedef bool MovieReadProc(int fileHandle, void* buffer, int count); +typedef void(MovieShowFrameProc)(SDL_Surface*, int, int, int, int, int, int, int, int); typedef struct STRUCT_4F6930 { int field_0; @@ -35,8 +35,8 @@ typedef struct STRUCT_4F6930 { STRUCT_6B3690 field_8; int fileHandle; int field_18; - LPDIRECTDRAWSURFACE field_24; - LPDIRECTDRAWSURFACE field_28; + SDL_Surface* field_24; + SDL_Surface* field_28; int field_2C; unsigned char* field_30; unsigned char* field_34; @@ -55,7 +55,6 @@ typedef struct STRUCT_4F6930 { extern int dword_51EBD8; extern int dword_51EBDC; extern unsigned short word_51EBE0[256]; -extern LPDIRECTDRAW gMovieLibDirectDraw; extern int _sync_active; extern int _sync_late; extern int _sync_FrameDropped; @@ -63,9 +62,7 @@ extern LPDIRECTSOUND gMovieLibDirectSound; extern LPDIRECTSOUNDBUFFER gMovieLibDirectSoundBuffer; extern int gMovieLibVolume; extern int gMovieLibPan; -extern LPDIRECTDRAWSURFACE gMovieDirectDrawSurface1; -extern LPDIRECTDRAWSURFACE gMovieDirectDrawSurface2; -extern void (*_sf_ShowFrame)(LPDIRECTDRAWSURFACE, int, int, int, int, int, int, int, int); +extern MovieShowFrameProc* _sf_ShowFrame; extern int dword_51EE0C; extern void (*_pal_SetPalette)(unsigned char*, int, int); extern int _rm_hold; @@ -136,6 +133,9 @@ extern unsigned char* gMovieDirectDrawSurfaceBuffer2; extern int dword_6B403B; extern int dword_6B403F; +extern SDL_Surface* gMovieSdlSurface1; +extern SDL_Surface* gMovieSdlSurface2; + void movieLibSetMemoryProcs(MallocProc* mallocProc, FreeProc* freeProc); void movieLibSetReadProc(MovieReadProc* readProc); void _MVE_MemInit(STRUCT_6B3690* a1, int a2, void* a3); @@ -144,11 +144,10 @@ void movieLibSetDirectSound(LPDIRECTSOUND ds); void movieLibSetVolume(int volume); void movieLibSetPan(int pan); void _MVE_sfSVGA(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9); -void _MVE_sfCallbacks(void (*fn)(LPDIRECTDRAWSURFACE, int, int, int, int, int, int, int, int)); -void _do_nothing_2(LPDIRECTDRAWSURFACE a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9); +void _MVE_sfCallbacks(MovieShowFrameProc* proc); +void _do_nothing_2(SDL_Surface* a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9); void movieLibSetPaletteEntriesProc(void (*fn)(unsigned char*, int, int)); int _sub_4F4B5(); -void movieLibSetDirectDraw(LPDIRECTDRAW dd); void _MVE_rmCallbacks(int (*fn)()); void _sub_4F4BB(int a1); void _MVE_rmFrameCounts(int* a1, int* a2); diff --git a/src/win32.cc b/src/win32.cc index 6eb6fbc..1a39731 100644 --- a/src/win32.cc +++ b/src/win32.cc @@ -7,9 +7,6 @@ #include -// 0x51E428 -DirectDrawCreateProc* gDirectDrawCreateProc = NULL; - // 0x51E430 DirectSoundCreateProc* gDirectSoundCreateProc = NULL; @@ -31,9 +28,6 @@ bool gProgramIsActive = false; // GNW95MUTEX HANDLE _GNW95_mutex = NULL; -// 0x51E44C -HMODULE gDDrawDLL = NULL; - // 0x51E454 HMODULE gDSoundDLL = NULL; @@ -96,16 +90,6 @@ bool _InitInstance() // 0x4DE8D0 bool _LoadDirectX() { - gDDrawDLL = LoadLibraryA("DDRAW.DLL"); - if (gDDrawDLL == NULL) { - goto err; - } - - gDirectDrawCreateProc = (DirectDrawCreateProc*)GetProcAddress(gDDrawDLL, "DirectDrawCreate"); - if (gDirectDrawCreateProc == NULL) { - goto err; - } - gDSoundDLL = LoadLibraryA("DSOUND.DLL"); if (gDSoundDLL == NULL) { goto err; @@ -134,13 +118,6 @@ void _UnloadDirectX(void) if (gDSoundDLL != NULL) { FreeLibrary(gDSoundDLL); gDSoundDLL = NULL; - gDirectDrawCreateProc = NULL; - } - - if (gDDrawDLL != NULL) { - FreeLibrary(gDDrawDLL); - gDDrawDLL = NULL; - gDirectSoundCreateProc = NULL; } } diff --git a/src/win32.h b/src/win32.h index 9b6275e..d54cbab 100644 --- a/src/win32.h +++ b/src/win32.h @@ -4,9 +4,6 @@ #define WIN32_LEAN_AND_MEAN #include -#define DIRECTDRAW_VERSION 0x0300 -#include - #include #define DIRECTSOUND_VERSION 0x0300 @@ -14,10 +11,8 @@ #include -typedef HRESULT(__stdcall DirectDrawCreateProc)(GUID*, LPDIRECTDRAW*, IUnknown*); typedef HRESULT(__stdcall DirectSoundCreateProc)(GUID*, LPDIRECTSOUND*, IUnknown*); -extern DirectDrawCreateProc* gDirectDrawCreateProc; extern DirectSoundCreateProc* gDirectSoundCreateProc; extern HWND gProgramWindow; extern HINSTANCE gInstance; @@ -25,7 +20,6 @@ extern LPSTR gCmdLine; extern int gCmdShow; extern bool gProgramIsActive; extern HANDLE _GNW95_mutex; -extern HMODULE gDDrawDLL; extern HMODULE gDSoundDLL; bool _InitInstance();