gosu 1.3.0 → 1.4.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/dependencies/SDL/include/SDL.h +108 -14
- data/dependencies/SDL/include/SDL_assert.h +81 -50
- data/dependencies/SDL/include/SDL_atomic.h +135 -35
- data/dependencies/SDL/include/SDL_audio.h +960 -355
- data/dependencies/SDL/include/SDL_bits.h +11 -6
- data/dependencies/SDL/include/SDL_blendmode.h +91 -14
- data/dependencies/SDL/include/SDL_clipboard.h +30 -7
- data/dependencies/SDL/include/SDL_config.h +277 -27
- data/dependencies/SDL/include/SDL_config_android.h +13 -38
- data/dependencies/SDL/include/SDL_config_iphoneos.h +21 -62
- data/dependencies/SDL/include/SDL_config_macosx.h +23 -92
- data/dependencies/SDL/include/SDL_config_minimal.h +1 -4
- data/dependencies/SDL/include/SDL_config_pandora.h +15 -22
- data/dependencies/SDL/include/SDL_config_psp.h +16 -37
- data/dependencies/SDL/include/SDL_config_windows.h +28 -91
- data/dependencies/SDL/include/SDL_config_winrt.h +33 -61
- data/dependencies/SDL/include/SDL_config_wiz.h +28 -56
- data/dependencies/SDL/include/SDL_copying.h +1 -1
- data/dependencies/SDL/include/SDL_cpuinfo.h +331 -71
- data/dependencies/SDL/include/SDL_egl.h +906 -280
- data/dependencies/SDL/include/SDL_endian.h +101 -47
- data/dependencies/SDL/include/SDL_error.h +70 -19
- data/dependencies/SDL/include/SDL_events.h +387 -79
- data/dependencies/SDL/include/SDL_filesystem.h +73 -64
- data/dependencies/SDL/include/SDL_gamecontroller.h +585 -125
- data/dependencies/SDL/include/SDL_gesture.h +36 -6
- data/dependencies/SDL/include/SDL_haptic.h +304 -210
- data/dependencies/SDL/include/SDL_hidapi.h +451 -0
- data/dependencies/SDL/include/SDL_hints.h +1286 -897
- data/dependencies/SDL/include/SDL_joystick.h +577 -130
- data/dependencies/SDL/include/SDL_keyboard.h +162 -63
- data/dependencies/SDL/include/SDL_keycode.h +7 -5
- data/dependencies/SDL/include/SDL_loadso.h +42 -8
- data/dependencies/SDL/include/SDL_locale.h +34 -32
- data/dependencies/SDL/include/SDL_log.h +212 -19
- data/dependencies/SDL/include/SDL_main.h +72 -17
- data/dependencies/SDL/include/SDL_messagebox.h +70 -23
- data/dependencies/SDL/include/SDL_metal.h +27 -32
- data/dependencies/SDL/include/SDL_misc.h +19 -15
- data/dependencies/SDL/include/SDL_mouse.h +262 -110
- data/dependencies/SDL/include/SDL_mutex.h +286 -66
- data/dependencies/SDL/include/SDL_name.h +1 -1
- data/dependencies/SDL/include/SDL_opengl.h +1 -1
- data/dependencies/SDL/include/SDL_opengles.h +1 -1
- data/dependencies/SDL/include/SDL_opengles2.h +2 -2
- data/dependencies/SDL/include/SDL_pixels.h +199 -34
- data/dependencies/SDL/include/SDL_platform.h +39 -2
- data/dependencies/SDL/include/SDL_power.h +23 -10
- data/dependencies/SDL/include/SDL_quit.h +1 -1
- data/dependencies/SDL/include/SDL_rect.h +78 -28
- data/dependencies/SDL/include/SDL_render.h +1204 -472
- data/dependencies/SDL/include/SDL_revision.h +2 -2
- data/dependencies/SDL/include/SDL_rwops.h +605 -33
- data/dependencies/SDL/include/SDL_scancode.h +1 -1
- data/dependencies/SDL/include/SDL_sensor.h +76 -42
- data/dependencies/SDL/include/SDL_shape.h +38 -27
- data/dependencies/SDL/include/SDL_stdinc.h +96 -24
- data/dependencies/SDL/include/SDL_surface.h +571 -139
- data/dependencies/SDL/include/SDL_system.h +339 -101
- data/dependencies/SDL/include/SDL_syswm.h +50 -20
- data/dependencies/SDL/include/SDL_test.h +1 -1
- data/dependencies/SDL/include/SDL_test_assert.h +2 -2
- data/dependencies/SDL/include/SDL_test_common.h +23 -6
- data/dependencies/SDL/include/SDL_test_compare.h +1 -1
- data/dependencies/SDL/include/SDL_test_crc32.h +1 -1
- data/dependencies/SDL/include/SDL_test_font.h +3 -3
- data/dependencies/SDL/include/SDL_test_fuzzer.h +28 -26
- data/dependencies/SDL/include/SDL_test_harness.h +6 -6
- data/dependencies/SDL/include/SDL_test_images.h +1 -1
- data/dependencies/SDL/include/SDL_test_log.h +1 -1
- data/dependencies/SDL/include/SDL_test_md5.h +1 -1
- data/dependencies/SDL/include/SDL_test_memory.h +1 -1
- data/dependencies/SDL/include/SDL_test_random.h +2 -2
- data/dependencies/SDL/include/SDL_thread.h +226 -128
- data/dependencies/SDL/include/SDL_timer.h +129 -22
- data/dependencies/SDL/include/SDL_touch.h +48 -8
- data/dependencies/SDL/include/SDL_types.h +1 -1
- data/dependencies/SDL/include/SDL_version.h +72 -46
- data/dependencies/SDL/include/SDL_video.h +1266 -460
- data/dependencies/SDL/include/SDL_vulkan.h +100 -161
- data/dependencies/SDL/include/begin_code.h +22 -1
- data/dependencies/SDL/include/close_code.h +1 -1
- data/dependencies/SDL/lib/x64/libSDL2.dll.a +0 -0
- data/dependencies/SDL/lib/x86/libSDL2.dll.a +0 -0
- data/dependencies/SDL_sound/SDL_sound.c +104 -70
- data/dependencies/SDL_sound/SDL_sound.h +6 -6
- data/dependencies/SDL_sound/SDL_sound_aiff.c +32 -32
- data/dependencies/SDL_sound/SDL_sound_au.c +14 -14
- data/dependencies/SDL_sound/SDL_sound_coreaudio.c +6 -7
- data/dependencies/SDL_sound/SDL_sound_flac.c +28 -30
- data/dependencies/SDL_sound/SDL_sound_internal.h +21 -14
- data/dependencies/SDL_sound/SDL_sound_modplug.c +26 -28
- data/dependencies/SDL_sound/SDL_sound_mp3.c +20 -36
- data/dependencies/SDL_sound/SDL_sound_raw.c +15 -16
- data/dependencies/SDL_sound/SDL_sound_shn.c +11 -10
- data/dependencies/SDL_sound/SDL_sound_voc.c +20 -18
- data/dependencies/SDL_sound/SDL_sound_vorbis.c +11 -9
- data/dependencies/SDL_sound/SDL_sound_wav.c +49 -43
- data/dependencies/SDL_sound/dr_flac.h +10925 -4466
- data/dependencies/SDL_sound/dr_mp3.h +2802 -844
- data/dependencies/SDL_sound/libmodplug/fastmix.c +63 -64
- data/dependencies/SDL_sound/libmodplug/libmodplug.h +25 -103
- data/dependencies/SDL_sound/libmodplug/load_669.c +14 -17
- data/dependencies/SDL_sound/libmodplug/load_amf.c +12 -7
- data/dependencies/SDL_sound/libmodplug/load_ams.c +103 -44
- data/dependencies/SDL_sound/libmodplug/load_dbm.c +8 -4
- data/dependencies/SDL_sound/libmodplug/load_dmf.c +55 -25
- data/dependencies/SDL_sound/libmodplug/load_far.c +9 -13
- data/dependencies/SDL_sound/libmodplug/load_gdm.c +448 -0
- data/dependencies/SDL_sound/libmodplug/load_it.c +61 -61
- data/dependencies/SDL_sound/libmodplug/load_mdl.c +94 -58
- data/dependencies/SDL_sound/libmodplug/load_med.c +20 -11
- data/dependencies/SDL_sound/libmodplug/load_mod.c +40 -15
- data/dependencies/SDL_sound/libmodplug/load_mt2.c +50 -19
- data/dependencies/SDL_sound/libmodplug/load_okt.c +59 -28
- data/dependencies/SDL_sound/libmodplug/load_psm.c +104 -79
- data/dependencies/SDL_sound/libmodplug/load_ptm.c +18 -17
- data/dependencies/SDL_sound/libmodplug/load_s3m.c +9 -7
- data/dependencies/SDL_sound/libmodplug/load_stm.c +3 -2
- data/dependencies/SDL_sound/libmodplug/load_ult.c +4 -3
- data/dependencies/SDL_sound/libmodplug/load_umx.c +315 -35
- data/dependencies/SDL_sound/libmodplug/load_xm.c +25 -21
- data/dependencies/SDL_sound/libmodplug/mmcmp.c +295 -149
- data/dependencies/SDL_sound/libmodplug/modplug.c +7 -123
- data/dependencies/SDL_sound/libmodplug/modplug.h +32 -29
- data/dependencies/SDL_sound/libmodplug/snd_dsp.c +0 -1
- data/dependencies/SDL_sound/libmodplug/snd_flt.c +2 -2
- data/dependencies/SDL_sound/libmodplug/snd_fx.c +32 -19
- data/dependencies/SDL_sound/libmodplug/sndfile.c +76 -160
- data/dependencies/SDL_sound/libmodplug/sndmix.c +7 -12
- data/dependencies/SDL_sound/libmodplug/tables.h +10 -15
- data/dependencies/SDL_sound/stb_vorbis.h +504 -329
- data/dependencies/{al_soft → mojoAL}/AL/al.h +38 -30
- data/dependencies/{al_soft → mojoAL}/AL/alc.h +27 -56
- data/dependencies/mojoAL/mojoal.c +4848 -0
- data/dependencies/stb/stb_image.h +208 -73
- data/dependencies/stb/stb_image_write.h +57 -23
- data/dependencies/stb/stb_truetype.h +345 -279
- data/dependencies/utf8proc/utf8proc.c +37 -18
- data/dependencies/utf8proc/utf8proc.h +17 -5
- data/dependencies/utf8proc/utf8proc_data.h +12012 -10089
- data/ext/gosu/extconf.rb +29 -30
- data/include/Gosu/Audio.hpp +70 -85
- data/include/Gosu/Buttons.hpp +103 -103
- data/include/Gosu/Color.hpp +19 -11
- data/include/Gosu/Directories.hpp +31 -24
- data/include/Gosu/Font.hpp +42 -44
- data/include/Gosu/Gosu.hpp +5 -8
- data/include/Gosu/Graphics.hpp +58 -71
- data/include/Gosu/GraphicsBase.hpp +26 -33
- data/include/Gosu/IO.hpp +0 -3
- data/include/Gosu/Image.hpp +56 -62
- data/include/Gosu/ImageData.hpp +23 -27
- data/include/Gosu/Inspection.hpp +1 -4
- data/include/Gosu/Math.hpp +0 -3
- data/include/Gosu/TextInput.hpp +34 -40
- data/include/Gosu/Timing.hpp +2 -8
- data/include/Gosu/Version.hpp +2 -2
- data/include/Gosu/Window.hpp +71 -70
- data/lib/SDL2.dll +0 -0
- data/lib/gosu/compat.rb +24 -37
- data/lib/gosu.rb +2 -2
- data/lib64/SDL2.dll +0 -0
- data/src/Audio.cpp +88 -86
- data/src/AudioFile.hpp +6 -6
- data/src/AudioFileAudioToolbox.cpp +1 -1
- data/src/AudioFileSDLSound.cpp +1 -1
- data/src/AudioImpl.cpp +0 -7
- data/src/AudioImpl.hpp +6 -8
- data/src/BitmapIO.cpp +23 -22
- data/src/BlockAllocator.cpp +2 -1
- data/src/Channel.cpp +22 -20
- data/src/Color.cpp +12 -9
- data/src/DirectoriesApple.cpp +25 -24
- data/src/DirectoriesUnix.cpp +14 -12
- data/src/DirectoriesWin.cpp +26 -30
- data/src/EmptyImageData.hpp +15 -17
- data/src/FileUnix.cpp +1 -1
- data/src/FileWin.cpp +1 -1
- data/src/Font.cpp +59 -54
- data/src/Graphics.cpp +135 -143
- data/src/Image.cpp +41 -47
- data/src/Input.cpp +1 -1
- data/src/InputUIKit.cpp +1 -1
- data/src/LargeImageData.cpp +108 -101
- data/src/LargeImageData.hpp +17 -15
- data/src/Log.hpp +6 -6
- data/src/Macro.cpp +35 -37
- data/src/Macro.hpp +11 -11
- data/src/Math.cpp +8 -1
- data/src/Resolution.cpp +12 -7
- data/src/RubyGosu.cxx +11 -39
- data/src/TexChunk.cpp +50 -41
- data/src/TexChunk.hpp +22 -22
- data/src/Text.cpp +37 -37
- data/src/TextBuilder.cpp +60 -57
- data/src/TextBuilder.hpp +20 -20
- data/src/TextInput.cpp +127 -135
- data/src/TimingApple.cpp +1 -7
- data/src/TimingUnix.cpp +0 -6
- data/src/TimingWin.cpp +0 -6
- data/src/TrueTypeFont.cpp +107 -107
- data/src/TrueTypeFont.hpp +39 -38
- data/src/TrueTypeFontApple.cpp +19 -22
- data/src/TrueTypeFontUnix.cpp +21 -26
- data/src/TrueTypeFontWin.cpp +30 -30
- data/src/Window.cpp +97 -87
- data/src/WindowUIKit.cpp +46 -49
- metadata +7 -17
- data/dependencies/SDL/include/SDL_config_os2.h +0 -188
- data/dependencies/SDL_sound/libmodplug/load_abc.c +0 -4725
- data/dependencies/SDL_sound/libmodplug/load_mid.c +0 -1405
- data/dependencies/SDL_sound/libmodplug/load_pat.c +0 -1143
- data/dependencies/SDL_sound/libmodplug/load_pat.h +0 -25
- data/dependencies/al_soft/AL/alext.h +0 -585
- data/dependencies/al_soft/AL/efx-creative.h +0 -3
- data/dependencies/al_soft/AL/efx-presets.h +0 -402
- data/dependencies/al_soft/AL/efx.h +0 -762
- data/dependencies/al_soft/x64/libOpenAL32.dll.a +0 -0
- data/dependencies/al_soft/x86/libOpenAL32.dll.a +0 -0
- data/lib/OpenAL32.dll +0 -0
- data/lib64/OpenAL32.dll +0 -0
@@ -9,11 +9,11 @@
|
|
9
9
|
|
10
10
|
BOOL PP20_Unpack(LPCBYTE *ppMemFile, LPDWORD pdwMemLength);
|
11
11
|
|
12
|
+
#pragma pack(1)
|
12
13
|
typedef struct MMCMPFILEHEADER
|
13
14
|
{
|
14
|
-
|
15
|
-
|
16
|
-
WORD hdrsize;
|
15
|
+
char id[8]; /* string 'ziRCONia' */
|
16
|
+
WORD hdrsize; /* sizeof MMCMPHEADER */
|
17
17
|
} MMCMPFILEHEADER, *LPMMCMPFILEHEADER;
|
18
18
|
|
19
19
|
typedef struct MMCMPHEADER
|
@@ -42,6 +42,13 @@ typedef struct MMCMPSUBBLOCK
|
|
42
42
|
DWORD unpk_pos;
|
43
43
|
DWORD unpk_size;
|
44
44
|
} MMCMPSUBBLOCK, *LPMMCMPSUBBLOCK;
|
45
|
+
#pragma pack()
|
46
|
+
|
47
|
+
/* make sure of structure sizes */
|
48
|
+
SDL_COMPILE_TIME_ASSERT(MMCMPFILEHEADER,sizeof(struct MMCMPFILEHEADER) == 10);
|
49
|
+
SDL_COMPILE_TIME_ASSERT(MMCMPHEADER,sizeof(struct MMCMPHEADER) == 14);
|
50
|
+
SDL_COMPILE_TIME_ASSERT(MMCMPBLOCK,sizeof(struct MMCMPBLOCK) == 20);
|
51
|
+
SDL_COMPILE_TIME_ASSERT(MMCMPSUBBLOCK,sizeof(struct MMCMPSUBBLOCK) == 8);
|
45
52
|
|
46
53
|
#define MMCMP_COMP 0x0001
|
47
54
|
#define MMCMP_DELTA 0x0002
|
@@ -59,101 +66,182 @@ typedef struct MMCMPBITBUFFER
|
|
59
66
|
} MMCMPBITBUFFER;
|
60
67
|
|
61
68
|
|
62
|
-
static DWORD MMCMPBITBUFFER_GetBits(MMCMPBITBUFFER *
|
63
|
-
//---------------------------------------
|
69
|
+
static DWORD MMCMPBITBUFFER_GetBits(MMCMPBITBUFFER *bbuf, UINT nBits)
|
64
70
|
{
|
65
71
|
DWORD d;
|
66
72
|
if (!nBits) return 0;
|
67
|
-
while (
|
73
|
+
while (bbuf->bitcount < 24)
|
68
74
|
{
|
69
|
-
|
70
|
-
|
75
|
+
bbuf->bitbuffer |= ((bbuf->pSrc < bbuf->pEnd) ? *bbuf->pSrc++ : 0) << bbuf->bitcount;
|
76
|
+
bbuf->bitcount += 8;
|
71
77
|
}
|
72
|
-
d =
|
73
|
-
|
74
|
-
|
78
|
+
d = bbuf->bitbuffer & ((1 << nBits) - 1);
|
79
|
+
bbuf->bitbuffer >>= nBits;
|
80
|
+
bbuf->bitcount -= nBits;
|
75
81
|
return d;
|
76
82
|
}
|
77
83
|
|
78
|
-
const DWORD MMCMP8BitCommands[8] =
|
84
|
+
static const DWORD MMCMP8BitCommands[8] =
|
79
85
|
{
|
80
86
|
0x01, 0x03, 0x07, 0x0F, 0x1E, 0x3C, 0x78, 0xF8
|
81
87
|
};
|
82
88
|
|
83
|
-
const UINT MMCMP8BitFetch[8] =
|
89
|
+
static const UINT MMCMP8BitFetch[8] =
|
84
90
|
{
|
85
91
|
3, 3, 3, 3, 2, 1, 0, 0
|
86
92
|
};
|
87
93
|
|
88
|
-
const DWORD MMCMP16BitCommands[16] =
|
94
|
+
static const DWORD MMCMP16BitCommands[16] =
|
89
95
|
{
|
90
96
|
0x01, 0x03, 0x07, 0x0F, 0x1E, 0x3C, 0x78, 0xF0,
|
91
97
|
0x1F0, 0x3F0, 0x7F0, 0xFF0, 0x1FF0, 0x3FF0, 0x7FF0, 0xFFF0
|
92
98
|
};
|
93
99
|
|
94
|
-
const UINT MMCMP16BitFetch[16] =
|
100
|
+
static const UINT MMCMP16BitFetch[16] =
|
95
101
|
{
|
96
102
|
4, 4, 4, 4, 3, 2, 1, 0,
|
97
103
|
0, 0, 0, 0, 0, 0, 0, 0
|
98
104
|
};
|
99
105
|
|
100
106
|
|
107
|
+
static void swap_mfh(LPMMCMPFILEHEADER fh)
|
108
|
+
{
|
109
|
+
fh->hdrsize = bswapLE16(fh->hdrsize);
|
110
|
+
}
|
111
|
+
|
112
|
+
static void swap_mmh(LPMMCMPHEADER mh)
|
113
|
+
{
|
114
|
+
mh->version = bswapLE16(mh->version);
|
115
|
+
mh->nblocks = bswapLE16(mh->nblocks);
|
116
|
+
mh->filesize = bswapLE32(mh->filesize);
|
117
|
+
mh->blktable = bswapLE32(mh->blktable);
|
118
|
+
}
|
119
|
+
|
120
|
+
static void swap_block (LPMMCMPBLOCK blk)
|
121
|
+
{
|
122
|
+
blk->unpk_size = bswapLE32(blk->unpk_size);
|
123
|
+
blk->pk_size = bswapLE32(blk->pk_size);
|
124
|
+
blk->xor_chk = bswapLE32(blk->xor_chk);
|
125
|
+
blk->sub_blk = bswapLE16(blk->sub_blk);
|
126
|
+
blk->flags = bswapLE16(blk->flags);
|
127
|
+
blk->tt_entries = bswapLE16(blk->tt_entries);
|
128
|
+
blk->num_bits = bswapLE16(blk->num_bits);
|
129
|
+
}
|
130
|
+
|
131
|
+
static void swap_subblock (LPMMCMPSUBBLOCK sblk)
|
132
|
+
{
|
133
|
+
sblk->unpk_pos = bswapLE32(sblk->unpk_pos);
|
134
|
+
sblk->unpk_size = bswapLE32(sblk->unpk_size);
|
135
|
+
}
|
136
|
+
|
137
|
+
static BOOL MMCMP_IsDstBlockValid(const MMCMPSUBBLOCK *psub, DWORD dstlen)
|
138
|
+
{
|
139
|
+
if (psub->unpk_pos >= dstlen) return FALSE;
|
140
|
+
if (psub->unpk_size > dstlen) return FALSE;
|
141
|
+
if (psub->unpk_size > dstlen - psub->unpk_pos) return FALSE;
|
142
|
+
return TRUE;
|
143
|
+
}
|
144
|
+
|
145
|
+
|
101
146
|
BOOL MMCMP_Unpack(LPCBYTE *ppMemFile, LPDWORD pdwMemLength)
|
102
|
-
//---------------------------------------------------------
|
103
147
|
{
|
104
|
-
DWORD dwMemLength
|
105
|
-
LPCBYTE lpMemFile
|
106
|
-
LPBYTE pBuffer;
|
107
|
-
LPMMCMPFILEHEADER pmfh
|
108
|
-
LPMMCMPHEADER pmmh
|
109
|
-
|
148
|
+
DWORD dwMemLength;
|
149
|
+
LPCBYTE lpMemFile;
|
150
|
+
LPBYTE pBuffer,pBufEnd;
|
151
|
+
LPMMCMPFILEHEADER pmfh;
|
152
|
+
LPMMCMPHEADER pmmh;
|
153
|
+
const DWORD *pblk_table;
|
110
154
|
DWORD dwFileSize;
|
155
|
+
BYTE tmp0[32], tmp1[32];
|
111
156
|
|
112
157
|
if (PP20_Unpack(ppMemFile, pdwMemLength))
|
113
158
|
{
|
114
159
|
return TRUE;
|
115
160
|
}
|
116
|
-
|
117
|
-
|
118
|
-
|
161
|
+
|
162
|
+
dwMemLength = *pdwMemLength;
|
163
|
+
lpMemFile = *ppMemFile;
|
164
|
+
if ((dwMemLength < 256) || (!lpMemFile)) return FALSE;
|
165
|
+
SDL_memcpy(tmp0, lpMemFile, 24);
|
166
|
+
pmfh = (LPMMCMPFILEHEADER)(tmp0);
|
167
|
+
pmmh = (LPMMCMPHEADER)(tmp0+10);
|
168
|
+
swap_mfh(pmfh);
|
169
|
+
swap_mmh(pmmh);
|
170
|
+
|
171
|
+
if ((SDL_memcmp(pmfh->id,"ziRCONia",8) != 0) || (pmfh->hdrsize != 14))
|
172
|
+
return FALSE;
|
173
|
+
if ((!pmmh->nblocks) || (pmmh->filesize < 16) || (pmmh->filesize > 0x8000000) ||
|
174
|
+
(pmmh->blktable >= dwMemLength) || (pmmh->blktable + 4*pmmh->nblocks > dwMemLength)) {
|
175
|
+
return FALSE;
|
176
|
+
}
|
119
177
|
dwFileSize = pmmh->filesize;
|
120
|
-
if ((pBuffer = (LPBYTE)
|
121
|
-
|
178
|
+
if ((pBuffer = (LPBYTE)SDL_malloc(dwFileSize)) == NULL)
|
179
|
+
return FALSE;
|
180
|
+
pBufEnd = pBuffer + dwFileSize;
|
181
|
+
pblk_table = (const DWORD *)(lpMemFile+pmmh->blktable);
|
122
182
|
for (UINT nBlock=0; nBlock<pmmh->nblocks; nBlock++)
|
123
183
|
{
|
124
|
-
DWORD dwMemPos = pblk_table[nBlock];
|
125
|
-
|
126
|
-
|
184
|
+
DWORD dwMemPos = bswapLE32(pblk_table[nBlock]);
|
185
|
+
DWORD dwSubPos;
|
186
|
+
LPMMCMPBLOCK pblk;
|
187
|
+
LPMMCMPSUBBLOCK psubblk;
|
188
|
+
|
189
|
+
if (dwMemPos >= dwMemLength - 20)
|
190
|
+
goto err;
|
191
|
+
SDL_memcpy(tmp1,lpMemFile+dwMemPos,28);
|
192
|
+
pblk = (LPMMCMPBLOCK)(tmp1);
|
193
|
+
psubblk = (LPMMCMPSUBBLOCK)(tmp1+20);
|
194
|
+
swap_block(pblk);
|
195
|
+
swap_subblock(psubblk);
|
196
|
+
|
197
|
+
if (!pblk->unpk_size || !pblk->pk_size || !pblk->sub_blk)
|
198
|
+
goto err;
|
199
|
+
if (pblk->pk_size <= pblk->tt_entries)
|
200
|
+
goto err;
|
201
|
+
if (pblk->sub_blk*8 >= dwMemLength - dwMemPos - 20)
|
202
|
+
goto err;
|
203
|
+
if (pblk->flags & MMCMP_COMP) {
|
204
|
+
if (pblk->flags & MMCMP_16BIT) {
|
205
|
+
if (pblk->num_bits >= 16)
|
206
|
+
goto err;
|
207
|
+
}
|
208
|
+
else {
|
209
|
+
if (pblk->num_bits >= 8)
|
210
|
+
goto err;
|
211
|
+
}
|
212
|
+
}
|
127
213
|
|
128
|
-
|
214
|
+
dwSubPos = dwMemPos + 20;
|
129
215
|
dwMemPos += 20 + pblk->sub_blk*8;
|
130
|
-
// Data is not packed
|
131
216
|
if (!(pblk->flags & MMCMP_COMP))
|
132
|
-
{
|
133
|
-
|
134
|
-
{
|
135
|
-
if ((psubblk
|
136
|
-
|
137
|
-
(psubblk->unpk_size > dwFileSize - psubblk->unpk_pos)) break;
|
217
|
+
{ /* Data is not packed */
|
218
|
+
UINT i=0;
|
219
|
+
while (1) {
|
220
|
+
if (!MMCMP_IsDstBlockValid(psubblk, dwFileSize))
|
221
|
+
goto err;
|
138
222
|
SDL_memcpy(pBuffer+psubblk->unpk_pos, lpMemFile+dwMemPos, psubblk->unpk_size);
|
139
223
|
dwMemPos += psubblk->unpk_size;
|
140
|
-
|
224
|
+
if (++i == pblk->sub_blk) break;
|
225
|
+
SDL_memcpy(tmp1+20,lpMemFile+dwSubPos+i*8,8);
|
226
|
+
swap_subblock(psubblk);
|
141
227
|
}
|
142
|
-
}
|
143
|
-
|
144
|
-
|
145
|
-
{
|
228
|
+
}
|
229
|
+
else if (pblk->flags & MMCMP_16BIT)
|
230
|
+
{ /* Data is 16-bit packed */
|
146
231
|
MMCMPBITBUFFER bb;
|
147
|
-
|
148
|
-
DWORD dwSize = psubblk->unpk_size
|
232
|
+
LPBYTE pDest = pBuffer + psubblk->unpk_pos;
|
233
|
+
DWORD dwSize = psubblk->unpk_size;
|
149
234
|
DWORD dwPos = 0;
|
150
235
|
UINT numbits = pblk->num_bits;
|
151
236
|
UINT subblk = 0, oldval = 0;
|
237
|
+
|
238
|
+
if (!MMCMP_IsDstBlockValid(psubblk, dwFileSize))
|
239
|
+
goto err;
|
152
240
|
bb.bitcount = 0;
|
153
241
|
bb.bitbuffer = 0;
|
154
242
|
bb.pSrc = lpMemFile+dwMemPos+pblk->tt_entries;
|
155
243
|
bb.pEnd = lpMemFile+dwMemPos+pblk->pk_size;
|
156
|
-
while (
|
244
|
+
while (1)
|
157
245
|
{
|
158
246
|
UINT newval = 0x10000;
|
159
247
|
DWORD d = MMCMPBITBUFFER_GetBits(&bb, numbits+1);
|
@@ -192,19 +280,26 @@ BOOL MMCMP_Unpack(LPCBYTE *ppMemFile, LPDWORD pdwMemLength)
|
|
192
280
|
{
|
193
281
|
newval ^= 0x8000;
|
194
282
|
}
|
195
|
-
pDest
|
283
|
+
if (pBufEnd - pDest < 2) goto err;
|
284
|
+
dwPos += 2;
|
285
|
+
*pDest++ = (BYTE) (((WORD)newval) & 0xff);
|
286
|
+
*pDest++ = (BYTE) (((WORD)newval) >> 8);
|
196
287
|
}
|
197
288
|
if (dwPos >= dwSize)
|
198
289
|
{
|
199
|
-
subblk
|
290
|
+
if (++subblk == pblk->sub_blk) break;
|
200
291
|
dwPos = 0;
|
201
|
-
|
202
|
-
|
292
|
+
SDL_memcpy(tmp1+20,lpMemFile+dwSubPos+subblk*8,8);
|
293
|
+
swap_subblock(psubblk);
|
294
|
+
if (!MMCMP_IsDstBlockValid(psubblk, dwFileSize))
|
295
|
+
goto err;
|
296
|
+
dwSize = psubblk->unpk_size;
|
297
|
+
pDest = pBuffer + psubblk->unpk_pos;
|
203
298
|
}
|
204
299
|
}
|
205
|
-
}
|
206
|
-
|
207
|
-
{
|
300
|
+
}
|
301
|
+
else
|
302
|
+
{ /* Data is 8-bit packed */
|
208
303
|
MMCMPBITBUFFER bb;
|
209
304
|
LPBYTE pDest = pBuffer + psubblk->unpk_pos;
|
210
305
|
DWORD dwSize = psubblk->unpk_size;
|
@@ -213,11 +308,13 @@ BOOL MMCMP_Unpack(LPCBYTE *ppMemFile, LPDWORD pdwMemLength)
|
|
213
308
|
UINT subblk = 0, oldval = 0;
|
214
309
|
LPCBYTE ptable = lpMemFile+dwMemPos;
|
215
310
|
|
311
|
+
if (!MMCMP_IsDstBlockValid(psubblk, dwFileSize))
|
312
|
+
goto err;
|
216
313
|
bb.bitcount = 0;
|
217
314
|
bb.bitbuffer = 0;
|
218
315
|
bb.pSrc = lpMemFile+dwMemPos+pblk->tt_entries;
|
219
316
|
bb.pEnd = lpMemFile+dwMemPos+pblk->pk_size;
|
220
|
-
while (
|
317
|
+
while (1)
|
221
318
|
{
|
222
319
|
UINT newval = 0x100;
|
223
320
|
DWORD d = MMCMPBITBUFFER_GetBits(&bb, numbits+1);
|
@@ -256,127 +353,176 @@ BOOL MMCMP_Unpack(LPCBYTE *ppMemFile, LPDWORD pdwMemLength)
|
|
256
353
|
}
|
257
354
|
if (dwPos >= dwSize)
|
258
355
|
{
|
259
|
-
subblk
|
356
|
+
if (++subblk == pblk->sub_blk) break;
|
260
357
|
dwPos = 0;
|
261
|
-
|
262
|
-
|
358
|
+
SDL_memcpy(tmp1+20,lpMemFile+dwSubPos+subblk*8,8);
|
359
|
+
swap_subblock(psubblk);
|
360
|
+
if (!MMCMP_IsDstBlockValid(psubblk, dwFileSize))
|
361
|
+
goto err;
|
362
|
+
dwSize = psubblk->unpk_size;
|
363
|
+
pDest = pBuffer + psubblk->unpk_pos;
|
263
364
|
}
|
264
365
|
}
|
265
|
-
} else
|
266
|
-
{
|
267
|
-
return FALSE;
|
268
366
|
}
|
269
367
|
}
|
270
368
|
*ppMemFile = pBuffer;
|
271
369
|
*pdwMemLength = dwFileSize;
|
272
370
|
return TRUE;
|
273
|
-
}
|
274
|
-
|
275
371
|
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
372
|
+
err:
|
373
|
+
SDL_free(pBuffer);
|
374
|
+
return FALSE;
|
375
|
+
}
|
280
376
|
|
281
|
-
typedef struct _PPBITBUFFER
|
282
|
-
{
|
283
|
-
UINT bitcount;
|
284
|
-
ULONG bitbuffer;
|
285
|
-
LPCBYTE pStart;
|
286
|
-
LPCBYTE pSrc;
|
287
|
-
} PPBITBUFFER;
|
288
377
|
|
378
|
+
/* PowerPack PP20 Unpacker */
|
289
379
|
|
290
|
-
|
380
|
+
/* Code from Heikki Orsila's amigadepack 0.02
|
381
|
+
* based on code by Stuart Caie <kyzer@4u.net>
|
382
|
+
* This software is in the Public Domain
|
383
|
+
*
|
384
|
+
* Modified for xmp by Claudio Matsuoka, 08/2007
|
385
|
+
* - merged mld's checks from the old depack sources. Original credits:
|
386
|
+
* - corrupt file and data detection
|
387
|
+
* (thanks to Don Adan and Dirk Stoecker for help and infos)
|
388
|
+
* - implemeted "efficiency" checks
|
389
|
+
* - further detection based on code by Georg Hoermann
|
390
|
+
*
|
391
|
+
* Modified for xmp by Claudio Matsuoka, 05/2013
|
392
|
+
* - decryption code removed
|
393
|
+
*
|
394
|
+
* Modified for libmodplug by O. Sezer, Apr. 2015
|
395
|
+
*/
|
396
|
+
|
397
|
+
#define PP_READ_BITS(nbits, var) do { \
|
398
|
+
bit_cnt = (nbits); \
|
399
|
+
while (bits_left < bit_cnt) { \
|
400
|
+
if (buf_src <= src) return 0; /* out of source bits */ \
|
401
|
+
bit_buffer |= (*--buf_src << bits_left); \
|
402
|
+
bits_left += 8; \
|
403
|
+
} \
|
404
|
+
(var) = 0; \
|
405
|
+
bits_left -= bit_cnt; \
|
406
|
+
while (bit_cnt--) { \
|
407
|
+
(var) = ((var) << 1) | (bit_buffer & 1); \
|
408
|
+
bit_buffer >>= 1; \
|
409
|
+
} \
|
410
|
+
} while(0)
|
411
|
+
|
412
|
+
#define PP_BYTE_OUT(byte) do { \
|
413
|
+
if (out <= dest) return 0; /* output overflow */ \
|
414
|
+
*--out = (byte); \
|
415
|
+
written++; \
|
416
|
+
} while (0)
|
417
|
+
|
418
|
+
static BOOL ppDecrunch(LPCBYTE src, LPBYTE dest,
|
419
|
+
LPCBYTE offset_lens,
|
420
|
+
DWORD src_len, DWORD dest_len,
|
421
|
+
BYTE skip_bits)
|
291
422
|
{
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
423
|
+
DWORD bit_buffer, x, todo, offbits, offset, written;
|
424
|
+
LPCBYTE buf_src;
|
425
|
+
LPBYTE out, dest_end;
|
426
|
+
BYTE bits_left, bit_cnt;
|
427
|
+
|
428
|
+
/* set up input and output pointers */
|
429
|
+
buf_src = src + src_len;
|
430
|
+
out = dest_end = dest + dest_len;
|
431
|
+
|
432
|
+
written = 0;
|
433
|
+
bit_buffer = 0;
|
434
|
+
bits_left = 0;
|
435
|
+
|
436
|
+
/* skip the first few bits */
|
437
|
+
PP_READ_BITS(skip_bits, x);
|
438
|
+
|
439
|
+
/* while there are input bits left */
|
440
|
+
while (written < dest_len) {
|
441
|
+
PP_READ_BITS(1, x);
|
442
|
+
if (x == 0) {
|
443
|
+
/* 1bit==0: literal, then match. 1bit==1: just match */
|
444
|
+
todo = 1; do { PP_READ_BITS(2, x); todo += x; } while (x == 3);
|
445
|
+
while (todo--) { PP_READ_BITS(8, x); PP_BYTE_OUT(x); }
|
446
|
+
|
447
|
+
/* should we end decoding on a literal, break out of the main loop */
|
448
|
+
if (written == dest_len) break;
|
305
449
|
}
|
306
|
-
return result;
|
307
|
-
}
|
308
450
|
|
451
|
+
/* match: read 2 bits for initial offset bitlength / match length */
|
452
|
+
PP_READ_BITS(2, x);
|
453
|
+
offbits = offset_lens[x];
|
454
|
+
todo = x+2;
|
455
|
+
if (x == 3) {
|
456
|
+
PP_READ_BITS(1, x);
|
457
|
+
if (x==0) offbits = 7;
|
458
|
+
PP_READ_BITS(offbits, offset);
|
459
|
+
do { PP_READ_BITS(3, x); todo += x; } while (x == 7);
|
460
|
+
}
|
461
|
+
else {
|
462
|
+
PP_READ_BITS(offbits, offset);
|
463
|
+
}
|
464
|
+
if ((out + offset) >= dest_end) return 0; /* match overflow */
|
465
|
+
while (todo--) { x = out[offset]; PP_BYTE_OUT(x); }
|
466
|
+
}
|
309
467
|
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
ULONG nBytesLeft;
|
314
|
-
|
315
|
-
BitBuffer.pStart = pSrc;
|
316
|
-
BitBuffer.pSrc = pSrc + nSrcLen - 4;
|
317
|
-
BitBuffer.bitbuffer = 0;
|
318
|
-
BitBuffer.bitcount = 0;
|
319
|
-
PPBITBUFFER_GetBits(&BitBuffer, pSrc[nSrcLen-1]);
|
320
|
-
nBytesLeft = nDstLen;
|
321
|
-
while (nBytesLeft > 0)
|
322
|
-
{
|
323
|
-
if (!PPBITBUFFER_GetBits(&BitBuffer, 1))
|
324
|
-
{
|
325
|
-
UINT n = 1;
|
326
|
-
while (n < nBytesLeft)
|
327
|
-
{
|
328
|
-
UINT code = PPBITBUFFER_GetBits(&BitBuffer, 2);
|
329
|
-
n += code;
|
330
|
-
if (code != 3) break;
|
331
|
-
}
|
332
|
-
for (UINT i=0; i<n; i++)
|
333
|
-
{
|
334
|
-
pDst[--nBytesLeft] = (BYTE)PPBITBUFFER_GetBits(&BitBuffer, 8);
|
335
|
-
}
|
336
|
-
if (!nBytesLeft) break;
|
337
|
-
}
|
338
|
-
{
|
339
|
-
UINT n = PPBITBUFFER_GetBits(&BitBuffer, 2)+1;
|
340
|
-
UINT nbits = pSrc[n-1];
|
341
|
-
UINT nofs;
|
342
|
-
if (n==4)
|
343
|
-
{
|
344
|
-
nofs = PPBITBUFFER_GetBits(&BitBuffer, (PPBITBUFFER_GetBits(&BitBuffer, 1)) ? nbits : 7 );
|
345
|
-
while (n < nBytesLeft)
|
346
|
-
{
|
347
|
-
UINT code = PPBITBUFFER_GetBits(&BitBuffer, 3);
|
348
|
-
n += code;
|
349
|
-
if (code != 7) break;
|
350
|
-
}
|
351
|
-
} else
|
352
|
-
{
|
353
|
-
nofs = PPBITBUFFER_GetBits(&BitBuffer, nbits);
|
354
|
-
}
|
355
|
-
for (UINT i=0; i<=n; i++)
|
356
|
-
{
|
357
|
-
pDst[nBytesLeft-1] = (nBytesLeft+nofs < nDstLen) ? pDst[nBytesLeft+nofs] : 0;
|
358
|
-
if (!--nBytesLeft) break;
|
359
|
-
}
|
360
|
-
}
|
361
|
-
}
|
468
|
+
/* all output bytes written without error */
|
469
|
+
return 1;
|
470
|
+
/* return (src == buf_src) ? 1 : 0; */
|
362
471
|
}
|
363
472
|
|
364
|
-
|
365
473
|
BOOL PP20_Unpack(LPCBYTE *ppMemFile, LPDWORD pdwMemLength)
|
366
474
|
{
|
367
475
|
DWORD dwMemLength = *pdwMemLength;
|
368
476
|
LPCBYTE lpMemFile = *ppMemFile;
|
369
477
|
DWORD dwDstLen;
|
478
|
+
BYTE tmp[4], skip;
|
370
479
|
LPBYTE pBuffer;
|
371
480
|
|
372
|
-
if ((!lpMemFile) || (dwMemLength < 256) || (
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
481
|
+
if ((!lpMemFile) || (dwMemLength < 256) || (SDL_memcmp(lpMemFile,"PP20",4) != 0))
|
482
|
+
return FALSE;
|
483
|
+
if (dwMemLength & 3) /* file length should be a multiple of 4 */
|
484
|
+
return FALSE;
|
485
|
+
|
486
|
+
/* PP FORMAT:
|
487
|
+
* 1 longword identifier 'PP20' or 'PX20'
|
488
|
+
* [1 word checksum (if 'PX20') $ssss]
|
489
|
+
* 1 longword efficiency $eeeeeeee
|
490
|
+
* X longwords crunched file $cccccccc,$cccccccc,...
|
491
|
+
* 1 longword decrunch info 'decrlen' << 8 | '8 bits other info'
|
492
|
+
*/
|
493
|
+
|
494
|
+
SDL_memcpy(tmp,&lpMemFile[dwMemLength-4],4);
|
495
|
+
dwDstLen = (tmp[0]<<16) | (tmp[1]<<8) | tmp[2];
|
496
|
+
skip = tmp[3];
|
497
|
+
if (skip > 32) return 0;
|
498
|
+
|
499
|
+
/* original pp20 only support efficiency
|
500
|
+
* from 9 9 9 9 up to 9 10 12 13, afaik,
|
501
|
+
* but the xfd detection code says this...
|
502
|
+
*
|
503
|
+
* move.l 4(a0),d0
|
504
|
+
* cmp.b #9,d0
|
505
|
+
* blo.b .Exit
|
506
|
+
* and.l #$f0f0f0f0,d0
|
507
|
+
* bne.s .Exit
|
508
|
+
*/
|
509
|
+
SDL_memcpy(tmp,&lpMemFile[4],4);
|
510
|
+
if ((tmp[0] < 9) || (tmp[0] & 0xf0)) return FALSE;
|
511
|
+
if ((tmp[1] < 9) || (tmp[1] & 0xf0)) return FALSE;
|
512
|
+
if ((tmp[2] < 9) || (tmp[2] & 0xf0)) return FALSE;
|
513
|
+
if ((tmp[3] < 9) || (tmp[3] & 0xf0)) return FALSE;
|
514
|
+
|
515
|
+
if ((dwDstLen < 512) || (dwDstLen > 0x400000) || (dwDstLen > 16*dwMemLength))
|
516
|
+
return FALSE;
|
517
|
+
if ((pBuffer = (LPBYTE)SDL_malloc(dwDstLen)) == NULL)
|
518
|
+
return FALSE;
|
519
|
+
|
520
|
+
if (!ppDecrunch(lpMemFile+8, pBuffer, tmp, dwMemLength-12, dwDstLen, skip)) {
|
521
|
+
SDL_free(pBuffer);
|
522
|
+
return FALSE;
|
523
|
+
}
|
524
|
+
|
378
525
|
*ppMemFile = pBuffer;
|
379
526
|
*pdwMemLength = dwDstLen;
|
380
527
|
return TRUE;
|
381
528
|
}
|
382
|
-
|