gosu 1.3.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (204) hide show
  1. checksums.yaml +4 -4
  2. data/dependencies/SDL/include/SDL.h +108 -14
  3. data/dependencies/SDL/include/SDL_assert.h +81 -50
  4. data/dependencies/SDL/include/SDL_atomic.h +135 -35
  5. data/dependencies/SDL/include/SDL_audio.h +960 -355
  6. data/dependencies/SDL/include/SDL_bits.h +11 -6
  7. data/dependencies/SDL/include/SDL_blendmode.h +91 -14
  8. data/dependencies/SDL/include/SDL_clipboard.h +30 -7
  9. data/dependencies/SDL/include/SDL_config.h +277 -27
  10. data/dependencies/SDL/include/SDL_config_android.h +13 -38
  11. data/dependencies/SDL/include/SDL_config_iphoneos.h +21 -62
  12. data/dependencies/SDL/include/SDL_config_macosx.h +23 -92
  13. data/dependencies/SDL/include/SDL_config_minimal.h +1 -4
  14. data/dependencies/SDL/include/SDL_config_pandora.h +15 -22
  15. data/dependencies/SDL/include/SDL_config_psp.h +16 -37
  16. data/dependencies/SDL/include/SDL_config_windows.h +28 -91
  17. data/dependencies/SDL/include/SDL_config_winrt.h +33 -61
  18. data/dependencies/SDL/include/SDL_config_wiz.h +28 -56
  19. data/dependencies/SDL/include/SDL_copying.h +1 -1
  20. data/dependencies/SDL/include/SDL_cpuinfo.h +331 -71
  21. data/dependencies/SDL/include/SDL_egl.h +906 -280
  22. data/dependencies/SDL/include/SDL_endian.h +101 -47
  23. data/dependencies/SDL/include/SDL_error.h +70 -19
  24. data/dependencies/SDL/include/SDL_events.h +387 -79
  25. data/dependencies/SDL/include/SDL_filesystem.h +73 -64
  26. data/dependencies/SDL/include/SDL_gamecontroller.h +585 -125
  27. data/dependencies/SDL/include/SDL_gesture.h +36 -6
  28. data/dependencies/SDL/include/SDL_haptic.h +304 -210
  29. data/dependencies/SDL/include/SDL_hidapi.h +451 -0
  30. data/dependencies/SDL/include/SDL_hints.h +1286 -897
  31. data/dependencies/SDL/include/SDL_joystick.h +577 -130
  32. data/dependencies/SDL/include/SDL_keyboard.h +162 -63
  33. data/dependencies/SDL/include/SDL_keycode.h +7 -5
  34. data/dependencies/SDL/include/SDL_loadso.h +42 -8
  35. data/dependencies/SDL/include/SDL_locale.h +34 -32
  36. data/dependencies/SDL/include/SDL_log.h +212 -19
  37. data/dependencies/SDL/include/SDL_main.h +72 -17
  38. data/dependencies/SDL/include/SDL_messagebox.h +70 -23
  39. data/dependencies/SDL/include/SDL_metal.h +27 -32
  40. data/dependencies/SDL/include/SDL_misc.h +19 -15
  41. data/dependencies/SDL/include/SDL_mouse.h +262 -110
  42. data/dependencies/SDL/include/SDL_mutex.h +286 -66
  43. data/dependencies/SDL/include/SDL_name.h +1 -1
  44. data/dependencies/SDL/include/SDL_opengl.h +1 -1
  45. data/dependencies/SDL/include/SDL_opengles.h +1 -1
  46. data/dependencies/SDL/include/SDL_opengles2.h +2 -2
  47. data/dependencies/SDL/include/SDL_pixels.h +199 -34
  48. data/dependencies/SDL/include/SDL_platform.h +39 -2
  49. data/dependencies/SDL/include/SDL_power.h +23 -10
  50. data/dependencies/SDL/include/SDL_quit.h +1 -1
  51. data/dependencies/SDL/include/SDL_rect.h +78 -28
  52. data/dependencies/SDL/include/SDL_render.h +1204 -472
  53. data/dependencies/SDL/include/SDL_revision.h +2 -2
  54. data/dependencies/SDL/include/SDL_rwops.h +605 -33
  55. data/dependencies/SDL/include/SDL_scancode.h +1 -1
  56. data/dependencies/SDL/include/SDL_sensor.h +76 -42
  57. data/dependencies/SDL/include/SDL_shape.h +38 -27
  58. data/dependencies/SDL/include/SDL_stdinc.h +96 -24
  59. data/dependencies/SDL/include/SDL_surface.h +571 -139
  60. data/dependencies/SDL/include/SDL_system.h +339 -101
  61. data/dependencies/SDL/include/SDL_syswm.h +50 -20
  62. data/dependencies/SDL/include/SDL_test.h +1 -1
  63. data/dependencies/SDL/include/SDL_test_assert.h +2 -2
  64. data/dependencies/SDL/include/SDL_test_common.h +23 -6
  65. data/dependencies/SDL/include/SDL_test_compare.h +1 -1
  66. data/dependencies/SDL/include/SDL_test_crc32.h +1 -1
  67. data/dependencies/SDL/include/SDL_test_font.h +3 -3
  68. data/dependencies/SDL/include/SDL_test_fuzzer.h +28 -26
  69. data/dependencies/SDL/include/SDL_test_harness.h +6 -6
  70. data/dependencies/SDL/include/SDL_test_images.h +1 -1
  71. data/dependencies/SDL/include/SDL_test_log.h +1 -1
  72. data/dependencies/SDL/include/SDL_test_md5.h +1 -1
  73. data/dependencies/SDL/include/SDL_test_memory.h +1 -1
  74. data/dependencies/SDL/include/SDL_test_random.h +2 -2
  75. data/dependencies/SDL/include/SDL_thread.h +226 -128
  76. data/dependencies/SDL/include/SDL_timer.h +129 -22
  77. data/dependencies/SDL/include/SDL_touch.h +48 -8
  78. data/dependencies/SDL/include/SDL_types.h +1 -1
  79. data/dependencies/SDL/include/SDL_version.h +72 -46
  80. data/dependencies/SDL/include/SDL_video.h +1266 -460
  81. data/dependencies/SDL/include/SDL_vulkan.h +100 -161
  82. data/dependencies/SDL/include/begin_code.h +22 -1
  83. data/dependencies/SDL/include/close_code.h +1 -1
  84. data/dependencies/SDL/lib/x64/libSDL2.dll.a +0 -0
  85. data/dependencies/SDL/lib/x86/libSDL2.dll.a +0 -0
  86. data/dependencies/SDL_sound/SDL_sound.c +83 -7
  87. data/dependencies/SDL_sound/SDL_sound.h +4 -4
  88. data/dependencies/SDL_sound/SDL_sound_aiff.c +9 -12
  89. data/dependencies/SDL_sound/SDL_sound_au.c +7 -7
  90. data/dependencies/SDL_sound/SDL_sound_coreaudio.c +3 -3
  91. data/dependencies/SDL_sound/SDL_sound_flac.c +1 -1
  92. data/dependencies/SDL_sound/SDL_sound_internal.h +17 -10
  93. data/dependencies/SDL_sound/SDL_sound_modplug.c +25 -27
  94. data/dependencies/SDL_sound/SDL_sound_mp3.c +5 -17
  95. data/dependencies/SDL_sound/SDL_sound_raw.c +11 -11
  96. data/dependencies/SDL_sound/SDL_sound_shn.c +8 -7
  97. data/dependencies/SDL_sound/SDL_sound_voc.c +6 -4
  98. data/dependencies/SDL_sound/SDL_sound_vorbis.c +6 -11
  99. data/dependencies/SDL_sound/SDL_sound_wav.c +35 -29
  100. data/dependencies/SDL_sound/dr_flac.h +618 -220
  101. data/dependencies/SDL_sound/dr_mp3.h +263 -94
  102. data/dependencies/SDL_sound/libmodplug/fastmix.c +58 -64
  103. data/dependencies/SDL_sound/libmodplug/libmodplug.h +25 -103
  104. data/dependencies/SDL_sound/libmodplug/load_669.c +14 -17
  105. data/dependencies/SDL_sound/libmodplug/load_amf.c +11 -7
  106. data/dependencies/SDL_sound/libmodplug/load_ams.c +65 -22
  107. data/dependencies/SDL_sound/libmodplug/load_dbm.c +8 -4
  108. data/dependencies/SDL_sound/libmodplug/load_dmf.c +55 -25
  109. data/dependencies/SDL_sound/libmodplug/load_far.c +9 -13
  110. data/dependencies/SDL_sound/libmodplug/load_gdm.c +448 -0
  111. data/dependencies/SDL_sound/libmodplug/load_it.c +45 -49
  112. data/dependencies/SDL_sound/libmodplug/load_mdl.c +80 -53
  113. data/dependencies/SDL_sound/libmodplug/load_med.c +20 -12
  114. data/dependencies/SDL_sound/libmodplug/load_mod.c +40 -15
  115. data/dependencies/SDL_sound/libmodplug/load_mt2.c +29 -17
  116. data/dependencies/SDL_sound/libmodplug/load_okt.c +12 -8
  117. data/dependencies/SDL_sound/libmodplug/load_psm.c +101 -78
  118. data/dependencies/SDL_sound/libmodplug/load_ptm.c +18 -17
  119. data/dependencies/SDL_sound/libmodplug/load_s3m.c +9 -7
  120. data/dependencies/SDL_sound/libmodplug/load_stm.c +3 -2
  121. data/dependencies/SDL_sound/libmodplug/load_ult.c +2 -2
  122. data/dependencies/SDL_sound/libmodplug/load_umx.c +315 -35
  123. data/dependencies/SDL_sound/libmodplug/load_xm.c +25 -21
  124. data/dependencies/SDL_sound/libmodplug/mmcmp.c +295 -149
  125. data/dependencies/SDL_sound/libmodplug/modplug.c +7 -123
  126. data/dependencies/SDL_sound/libmodplug/modplug.h +32 -29
  127. data/dependencies/SDL_sound/libmodplug/snd_dsp.c +0 -1
  128. data/dependencies/SDL_sound/libmodplug/snd_flt.c +2 -2
  129. data/dependencies/SDL_sound/libmodplug/snd_fx.c +24 -18
  130. data/dependencies/SDL_sound/libmodplug/sndfile.c +55 -156
  131. data/dependencies/SDL_sound/libmodplug/sndmix.c +7 -12
  132. data/dependencies/SDL_sound/libmodplug/tables.h +10 -15
  133. data/dependencies/SDL_sound/stb_vorbis.h +508 -325
  134. data/dependencies/{al_soft → mojoAL}/AL/al.h +38 -30
  135. data/dependencies/{al_soft → mojoAL}/AL/alc.h +27 -56
  136. data/dependencies/mojoAL/mojoal.c +4594 -0
  137. data/ext/gosu/extconf.rb +29 -30
  138. data/include/Gosu/Audio.hpp +70 -85
  139. data/include/Gosu/Color.hpp +19 -11
  140. data/include/Gosu/Font.hpp +40 -44
  141. data/include/Gosu/Graphics.hpp +58 -71
  142. data/include/Gosu/GraphicsBase.hpp +26 -33
  143. data/include/Gosu/Image.hpp +56 -62
  144. data/include/Gosu/ImageData.hpp +23 -27
  145. data/include/Gosu/Inspection.hpp +1 -4
  146. data/include/Gosu/TextInput.hpp +34 -40
  147. data/include/Gosu/Version.hpp +1 -1
  148. data/include/Gosu/Window.hpp +71 -70
  149. data/lib/SDL2.dll +0 -0
  150. data/lib/gosu/compat.rb +24 -37
  151. data/lib/gosu.rb +2 -2
  152. data/lib64/SDL2.dll +0 -0
  153. data/src/Audio.cpp +86 -86
  154. data/src/AudioFile.hpp +6 -6
  155. data/src/AudioFileAudioToolbox.cpp +1 -1
  156. data/src/AudioFileSDLSound.cpp +1 -1
  157. data/src/AudioImpl.hpp +5 -5
  158. data/src/BitmapIO.cpp +0 -20
  159. data/src/BlockAllocator.cpp +2 -1
  160. data/src/Channel.cpp +22 -20
  161. data/src/Color.cpp +12 -9
  162. data/src/EmptyImageData.hpp +15 -17
  163. data/src/FileUnix.cpp +1 -1
  164. data/src/FileWin.cpp +1 -1
  165. data/src/Font.cpp +48 -53
  166. data/src/Graphics.cpp +135 -143
  167. data/src/Image.cpp +41 -42
  168. data/src/Input.cpp +1 -1
  169. data/src/InputUIKit.cpp +1 -1
  170. data/src/LargeImageData.cpp +108 -101
  171. data/src/LargeImageData.hpp +17 -15
  172. data/src/Log.hpp +6 -6
  173. data/src/Macro.cpp +35 -37
  174. data/src/Macro.hpp +11 -11
  175. data/src/Math.cpp +8 -1
  176. data/src/Resolution.cpp +12 -7
  177. data/src/RubyGosu.cxx +5 -5
  178. data/src/TexChunk.cpp +50 -41
  179. data/src/TexChunk.hpp +22 -22
  180. data/src/Text.cpp +37 -37
  181. data/src/TextBuilder.cpp +60 -57
  182. data/src/TextBuilder.hpp +20 -20
  183. data/src/TextInput.cpp +127 -135
  184. data/src/TrueTypeFont.cpp +107 -107
  185. data/src/TrueTypeFont.hpp +39 -38
  186. data/src/TrueTypeFontApple.cpp +19 -22
  187. data/src/TrueTypeFontUnix.cpp +21 -26
  188. data/src/TrueTypeFontWin.cpp +30 -30
  189. data/src/Window.cpp +95 -86
  190. data/src/WindowUIKit.cpp +46 -49
  191. metadata +7 -17
  192. data/dependencies/SDL/include/SDL_config_os2.h +0 -188
  193. data/dependencies/SDL_sound/libmodplug/load_abc.c +0 -4725
  194. data/dependencies/SDL_sound/libmodplug/load_mid.c +0 -1405
  195. data/dependencies/SDL_sound/libmodplug/load_pat.c +0 -1143
  196. data/dependencies/SDL_sound/libmodplug/load_pat.h +0 -25
  197. data/dependencies/al_soft/AL/alext.h +0 -585
  198. data/dependencies/al_soft/AL/efx-creative.h +0 -3
  199. data/dependencies/al_soft/AL/efx-presets.h +0 -402
  200. data/dependencies/al_soft/AL/efx.h +0 -762
  201. data/dependencies/al_soft/x64/libOpenAL32.dll.a +0 -0
  202. data/dependencies/al_soft/x86/libOpenAL32.dll.a +0 -0
  203. data/lib/OpenAL32.dll +0 -0
  204. 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
- DWORD id_ziRC; // "ziRC"
15
- DWORD id_ONia; // "ONia"
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 *_this, UINT nBits)
63
- //---------------------------------------
69
+ static DWORD MMCMPBITBUFFER_GetBits(MMCMPBITBUFFER *bbuf, UINT nBits)
64
70
  {
65
71
  DWORD d;
66
72
  if (!nBits) return 0;
67
- while (_this->bitcount < 24)
73
+ while (bbuf->bitcount < 24)
68
74
  {
69
- _this->bitbuffer |= ((_this->pSrc < _this->pEnd) ? *_this->pSrc++ : 0) << _this->bitcount;
70
- _this->bitcount += 8;
75
+ bbuf->bitbuffer |= ((bbuf->pSrc < bbuf->pEnd) ? *bbuf->pSrc++ : 0) << bbuf->bitcount;
76
+ bbuf->bitcount += 8;
71
77
  }
72
- d = _this->bitbuffer & ((1 << nBits) - 1);
73
- _this->bitbuffer >>= nBits;
74
- _this->bitcount -= nBits;
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 = *pdwMemLength;
105
- LPCBYTE lpMemFile = *ppMemFile;
106
- LPBYTE pBuffer;
107
- LPMMCMPFILEHEADER pmfh = (LPMMCMPFILEHEADER)(lpMemFile);
108
- LPMMCMPHEADER pmmh = (LPMMCMPHEADER)(lpMemFile+10);
109
- LPDWORD pblk_table;
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
- if ((dwMemLength < 256) || (!pmfh) || (pmfh->id_ziRC != 0x4352697A) || (pmfh->id_ONia != 0x61694e4f) || (pmfh->hdrsize < 14)
117
- || (!pmmh->nblocks) || (pmmh->filesize < 16) || (pmmh->filesize > 0x8000000)
118
- || (pmmh->blktable >= dwMemLength) || (pmmh->blktable + 4*pmmh->nblocks > dwMemLength)) return FALSE;
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)GlobalAllocPtr(GHND, (dwFileSize + 31) & ~15)) == NULL) return FALSE;
121
- pblk_table = (LPDWORD)(lpMemFile+pmmh->blktable);
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
- LPMMCMPBLOCK pblk = (LPMMCMPBLOCK)(lpMemFile+dwMemPos);
126
- LPMMCMPSUBBLOCK psubblk = (LPMMCMPSUBBLOCK)(lpMemFile+dwMemPos+20);
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
- if ((dwMemPos + 20 >= dwMemLength) || (dwMemPos + 20 + pblk->sub_blk*8 >= dwMemLength)) break;
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
- for (UINT i=0; i<pblk->sub_blk; i++)
134
- {
135
- if ((psubblk->unpk_pos >= dwFileSize) ||
136
- (psubblk->unpk_size >= dwFileSize) ||
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
- psubblk++;
224
+ if (++i == pblk->sub_blk) break;
225
+ SDL_memcpy(tmp1+20,lpMemFile+dwSubPos+i*8,8);
226
+ swap_subblock(psubblk);
141
227
  }
142
- } else
143
- // Data is 16-bit packed
144
- if (pblk->flags & MMCMP_16BIT && pblk->num_bits < 16)
145
- {
228
+ }
229
+ else if (pblk->flags & MMCMP_16BIT)
230
+ { /* Data is 16-bit packed */
146
231
  MMCMPBITBUFFER bb;
147
- LPWORD pDest = (LPWORD)(pBuffer + psubblk->unpk_pos);
148
- DWORD dwSize = psubblk->unpk_size >> 1;
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 (subblk < pblk->sub_blk)
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[dwPos++] = (WORD)newval;
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
- dwSize = psubblk[subblk].unpk_size >> 1;
202
- pDest = (LPWORD)(pBuffer + psubblk[subblk].unpk_pos);
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
- } else if (pblk->num_bits < 8)
206
- // Data is 8-bit packed
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 (subblk < pblk->sub_blk)
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
- dwSize = psubblk[subblk].unpk_size;
262
- pDest = pBuffer + psubblk[subblk].unpk_pos;
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
- // PowerPack PP20 Unpacker
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
- static ULONG PPBITBUFFER_GetBits(PPBITBUFFER *_this, UINT n)
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
- ULONG result = 0;
293
-
294
- for (UINT i=0; i<n; i++)
295
- {
296
- if (!_this->bitcount)
297
- {
298
- _this->bitcount = 8;
299
- if (_this->pSrc != _this->pStart) _this->pSrc--;
300
- _this->bitbuffer = *_this->pSrc;
301
- }
302
- result = (result<<1) | (_this->bitbuffer&1);
303
- _this->bitbuffer >>= 1;
304
- _this->bitcount--;
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
- VOID PP20_DoUnpack(const BYTE *pSrc, UINT nSrcLen, BYTE *pDst, UINT nDstLen)
311
- {
312
- PPBITBUFFER BitBuffer;
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) || (*(DWORD *)lpMemFile != 0x30325050)) return FALSE;
373
- dwDstLen = (lpMemFile[dwMemLength-4]<<16) | (lpMemFile[dwMemLength-3]<<8) | (lpMemFile[dwMemLength-2]);
374
- //Log("PP20 detected: Packed length=%d, Unpacked length=%d\n", dwMemLength, dwDstLen);
375
- if ((dwDstLen < 512) || (dwDstLen > 0x400000) || (dwDstLen > 16*dwMemLength)) return FALSE;
376
- if ((pBuffer = (LPBYTE)GlobalAllocPtr(GHND, (dwDstLen + 31) & ~15)) == NULL) return FALSE;
377
- PP20_DoUnpack(lpMemFile+4, dwMemLength-4, pBuffer, dwDstLen);
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
-