From 52a898ddb12387f2cc9501947dd9d24e927c2c71 Mon Sep 17 00:00:00 2001 From: David Gow Date: Thu, 14 Sep 2023 21:19:00 +0800 Subject: [PATCH] Quirks: Hyperspace Delivery Boy should run in 16bpp mode The LGP port of Hyperspace Delivery Boy has broken colour keys if run in 32-bpp mode (see bug #317). This is because it relies heavily on the imprecise RGB565->RGB888 conversion in earlier SDL 1.2 versions, when running in 32-bpp mode. The game's assets are all in 565 format, and the game converts these to the screen's format on load. It then sets a colour key. This presents a problem, because: - The generic BlitNToN implementation in SDL 1.2 just shifted the values, so the resulting image was not at full range. Magenta became (F800F8). - Early versions of SDL 1.2 fell back to the BlitNToN blitter very frequently: https://github.com/libsdl-org/SDL-1.2/commit/6f4a75de61ce7fd63e14aa3207a51a767cac3a48 - So, Hyperspace Delivery Boy calls SDL_MapRGB(0xF8, 0, 0xF8) to get the colour key, then sets it on the converted surface. - In SDL 2.0, the blitters now properly do a full-range conversion, so the magenta becomes (FF00FF), which now doesn't match the hardcoded (F800F8). - That being said, in general, it's not guaranteed that SDL_MapRGB() will do the same format conversion as SDL_CovertSurface(), so the "correct" way of handling this is to set the colour key before converting, which works (albeit slowly) in SDL2: https://github.com/libsdl-org/SDL/issues/1854 - Since the conversion behaviour is different even between SDL 1.2 versions, it's not worth trying to imitate it here, so we just force the game to run in 16-bpp mode, which works fine. - (And the game's README recommends it, too.) --- src/SDL12_compat.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/SDL12_compat.c b/src/SDL12_compat.c index 0319ce557..f3ecd3bf5 100644 --- a/src/SDL12_compat.c +++ b/src/SDL12_compat.c @@ -1274,6 +1274,10 @@ static QuirkEntryType quirks[] = { {"fillets", "SDL12COMPAT_ALLOW_SYSWM", "0"}, {"fillets", "SDL12COMPAT_COMPATIBILITY_AUDIOCVT", "1"}, + /* Hyperspace Delivery Boy relies on the exact imprecision of the format conversion in some + earlier versions of SDL 1.2. It also recommends 16-bit in the README, so force it. */ + {"hdb", "SDL12COMPAT_MAX_BPP", "16"}, + /* Mark of the Ninja doesn't work with OpenGL scaling */ {"ninja-bin32", "SDL12COMPAT_OPENGL_SCALING", "0"}, {"ninja-bin64", "SDL12COMPAT_OPENGL_SCALING", "0"},