gosu 1.1.1.1 → 1.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (219) 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 +63 -107
  140. data/include/Gosu/Font.hpp +44 -48
  141. data/include/Gosu/Fwd.hpp +1 -1
  142. data/include/Gosu/Graphics.hpp +64 -75
  143. data/include/Gosu/GraphicsBase.hpp +32 -39
  144. data/include/Gosu/Image.hpp +56 -62
  145. data/include/Gosu/ImageData.hpp +23 -27
  146. data/include/Gosu/Inspection.hpp +1 -4
  147. data/include/Gosu/Math.hpp +4 -16
  148. data/include/Gosu/Platform.hpp +1 -51
  149. data/include/Gosu/Text.hpp +37 -40
  150. data/include/Gosu/TextInput.hpp +34 -40
  151. data/include/Gosu/Utility.hpp +10 -8
  152. data/include/Gosu/Version.hpp +1 -1
  153. data/include/Gosu/Window.hpp +73 -70
  154. data/lib/SDL2.dll +0 -0
  155. data/lib/gosu/compat.rb +28 -37
  156. data/lib/gosu/swig_patches.rb +31 -3
  157. data/lib/gosu.rb +2 -2
  158. data/lib64/SDL2.dll +0 -0
  159. data/rdoc/gosu.rb +9 -1
  160. data/src/Audio.cpp +88 -86
  161. data/src/AudioFile.hpp +6 -6
  162. data/src/AudioFileAudioToolbox.cpp +1 -1
  163. data/src/AudioFileSDLSound.cpp +1 -1
  164. data/src/AudioImpl.hpp +5 -5
  165. data/src/Bitmap.cpp +13 -13
  166. data/src/BitmapIO.cpp +0 -20
  167. data/src/BlockAllocator.cpp +2 -1
  168. data/src/Channel.cpp +22 -20
  169. data/src/Color.cpp +62 -55
  170. data/src/EmptyImageData.hpp +16 -18
  171. data/src/FileUnix.cpp +1 -1
  172. data/src/FileWin.cpp +1 -1
  173. data/src/Font.cpp +52 -57
  174. data/src/GosuViewController.cpp +2 -0
  175. data/src/Graphics.cpp +135 -143
  176. data/src/Image.cpp +42 -42
  177. data/src/Input.cpp +1 -1
  178. data/src/InputUIKit.cpp +1 -1
  179. data/src/LargeImageData.cpp +120 -113
  180. data/src/LargeImageData.hpp +18 -16
  181. data/src/Log.hpp +6 -6
  182. data/src/Macro.cpp +35 -37
  183. data/src/Macro.hpp +11 -11
  184. data/src/Math.cpp +8 -1
  185. data/src/RenderState.hpp +5 -5
  186. data/src/Resolution.cpp +12 -7
  187. data/src/RubyGosu.cxx +471 -502
  188. data/src/RubyGosu.h +3 -2
  189. data/src/TexChunk.cpp +50 -41
  190. data/src/TexChunk.hpp +22 -22
  191. data/src/Text.cpp +58 -59
  192. data/src/TextBuilder.cpp +60 -57
  193. data/src/TextBuilder.hpp +20 -20
  194. data/src/TextInput.cpp +127 -135
  195. data/src/TrueTypeFont.cpp +108 -108
  196. data/src/TrueTypeFont.hpp +39 -38
  197. data/src/TrueTypeFontApple.cpp +27 -23
  198. data/src/TrueTypeFontUnix.cpp +21 -26
  199. data/src/TrueTypeFontWin.cpp +30 -30
  200. data/src/Utility.cpp +82 -23
  201. data/src/WinUtility.hpp +2 -1
  202. data/src/Window.cpp +103 -86
  203. data/src/WindowUIKit.cpp +48 -51
  204. metadata +8 -20
  205. data/dependencies/SDL/include/SDL_config_os2.h +0 -188
  206. data/dependencies/SDL_sound/libmodplug/load_abc.c +0 -4725
  207. data/dependencies/SDL_sound/libmodplug/load_mid.c +0 -1405
  208. data/dependencies/SDL_sound/libmodplug/load_pat.c +0 -1143
  209. data/dependencies/SDL_sound/libmodplug/load_pat.h +0 -25
  210. data/dependencies/al_soft/AL/alext.h +0 -585
  211. data/dependencies/al_soft/AL/efx-creative.h +0 -3
  212. data/dependencies/al_soft/AL/efx-presets.h +0 -402
  213. data/dependencies/al_soft/AL/efx.h +0 -762
  214. data/dependencies/al_soft/x64/libOpenAL32.dll.a +0 -0
  215. data/dependencies/al_soft/x86/libOpenAL32.dll.a +0 -0
  216. data/lib/OpenAL32.dll +0 -0
  217. data/lib64/OpenAL32.dll +0 -0
  218. data/src/UtilityApple.cpp +0 -16
  219. data/src/UtilityWin.cpp +0 -17
@@ -9,27 +9,14 @@
9
9
 
10
10
  #include "libmodplug.h"
11
11
 
12
+ static const
12
13
  BYTE autovibit2xm[8] =
13
14
  { 0, 3, 1, 4, 2, 0, 0, 0 };
14
15
 
15
- BYTE autovibxm2it[8] =
16
- { 0, 2, 4, 1, 3, 0, 0, 0 };
17
-
18
16
  //////////////////////////////////////////////////////////
19
17
  // Impulse Tracker IT file support
20
18
 
21
- // for conversion of XM samples
22
- extern WORD XMPeriodTable[96+8];
23
- extern UINT XMLinearTable[768];
24
-
25
- static inline UINT ConvertVolParam(UINT value)
26
- //--------------------------------------------
27
- {
28
- return (value > 9) ? 9 : value;
29
- }
30
-
31
-
32
- BOOL CSoundFile_ITInstrToMPT(const void *p, INSTRUMENTHEADER *penv, UINT trkvers)
19
+ static BOOL ITInstrToMPT(const void *p, INSTRUMENTHEADER *penv, UINT trkvers)
33
20
  //--------------------------------------------------------------------------------
34
21
  {
35
22
  if (trkvers < 0x0200)
@@ -155,12 +142,13 @@ BOOL CSoundFile_ReadIT(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLengt
155
142
  DWORD inspos[MAX_INSTRUMENTS];
156
143
  DWORD smppos[MAX_SAMPLES];
157
144
  DWORD patpos[MAX_PATTERNS];
158
- BYTE chnmask[64], channels_used[64];
145
+ BYTE chnmask[64];//, channels_used[64]
159
146
  MODCOMMAND lastvalue[64];
147
+ UINT j;
160
148
 
161
149
  if ((!lpStream) || (dwMemLength < sizeof(ITFILEHEADER))) return FALSE;
162
150
  ITFILEHEADER pifh;
163
- SDL_memcpy(&pifh, lpStream, sizeof (pifh));
151
+ SDL_memcpy(&pifh, lpStream, sizeof(pifh));
164
152
 
165
153
  pifh.id = bswapLE32(pifh.id);
166
154
  pifh.reserved1 = bswapLE16(pifh.reserved1);
@@ -218,9 +206,8 @@ BOOL CSoundFile_ReadIT(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLengt
218
206
  if (inspossize > MAX_INSTRUMENTS) inspossize = MAX_INSTRUMENTS;
219
207
  inspossize <<= 2;
220
208
  SDL_memcpy(inspos, lpStream+dwMemPos, inspossize);
221
- for (UINT j=0; j < (inspossize>>2); j++)
222
- {
223
- inspos[j] = bswapLE32(inspos[j]);
209
+ for (j=0; j < (inspossize>>2); j++) {
210
+ inspos[j] = bswapLE32(inspos[j]);
224
211
  }
225
212
  dwMemPos += pifh.insnum * 4;
226
213
  // Reading Samples Offsets
@@ -229,9 +216,8 @@ BOOL CSoundFile_ReadIT(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLengt
229
216
  if (smppossize > MAX_SAMPLES) smppossize = MAX_SAMPLES;
230
217
  smppossize <<= 2;
231
218
  SDL_memcpy(smppos, lpStream+dwMemPos, smppossize);
232
- for (UINT j=0; j < (smppossize>>2); j++)
233
- {
234
- smppos[j] = bswapLE32(smppos[j]);
219
+ for (j=0; j < (smppossize>>2); j++) {
220
+ smppos[j] = bswapLE32(smppos[j]);
235
221
  }
236
222
  dwMemPos += pifh.smpnum * 4;
237
223
  // Reading Patterns Offsets
@@ -240,9 +226,8 @@ BOOL CSoundFile_ReadIT(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLengt
240
226
  if (patpossize > MAX_PATTERNS) patpossize = MAX_PATTERNS;
241
227
  patpossize <<= 2;
242
228
  SDL_memcpy(patpos, lpStream+dwMemPos, patpossize);
243
- for (UINT j=0; j < (patpossize>>2); j++)
244
- {
245
- patpos[j] = bswapLE32(patpos[j]);
229
+ for (j=0; j < (patpossize>>2); j++) {
230
+ patpos[j] = bswapLE32(patpos[j]);
246
231
  }
247
232
  dwMemPos += pifh.patnum * 4;
248
233
  // Reading IT Extra Info
@@ -286,6 +271,8 @@ BOOL CSoundFile_ReadIT(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLengt
286
271
  dwMemPos += 8;
287
272
  if ((dwMemPos + len <= dwMemLength) && (len <= 64*MAX_CHANNELNAME))
288
273
  {
274
+ const UINT n = len / MAX_CHANNELNAME;
275
+ if (n > _this->m_nChannels) _this->m_nChannels = n;
289
276
  dwMemPos += len;
290
277
  }
291
278
  }
@@ -346,13 +333,13 @@ BOOL CSoundFile_ReadIT(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLengt
346
333
  if (_this->m_nInstruments >= MAX_INSTRUMENTS) _this->m_nInstruments = MAX_INSTRUMENTS-1;
347
334
  for (UINT nins=0; nins<_this->m_nInstruments; nins++)
348
335
  {
349
- if ((inspos[nins] > 0) && (inspos[nins] < dwMemLength - sizeof(ITOLDINSTRUMENT)))
336
+ if ((inspos[nins] > 0) && dwMemLength > sizeof(ITOLDINSTRUMENT) &&
337
+ (inspos[nins] < dwMemLength - sizeof(ITOLDINSTRUMENT)))
350
338
  {
351
- INSTRUMENTHEADER *penv = (INSTRUMENTHEADER *) SDL_malloc(sizeof (INSTRUMENTHEADER));
339
+ INSTRUMENTHEADER *penv = (INSTRUMENTHEADER *) SDL_calloc(1, sizeof (INSTRUMENTHEADER));
352
340
  if (!penv) continue;
353
341
  _this->Headers[nins+1] = penv;
354
- SDL_memset(penv, 0, sizeof(INSTRUMENTHEADER));
355
- CSoundFile_ITInstrToMPT(lpStream + inspos[nins], penv, pifh.cmwt);
342
+ ITInstrToMPT(lpStream + inspos[nins], penv, pifh.cmwt);
356
343
  }
357
344
  }
358
345
  // Reading Samples
@@ -361,7 +348,7 @@ BOOL CSoundFile_ReadIT(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLengt
361
348
  for (UINT nsmp=0; nsmp<pifh.smpnum; nsmp++) if ((smppos[nsmp]) && (smppos[nsmp] <= dwMemLength - sizeof(ITSAMPLESTRUCT)))
362
349
  {
363
350
  ITSAMPLESTRUCT pis;
364
- SDL_memcpy(&pis, lpStream+smppos[nsmp], sizeof (pis));
351
+ SDL_memcpy(&pis, lpStream+smppos[nsmp], sizeof (pis));
365
352
  pis.id = bswapLE32(pis.id);
366
353
  pis.length = bswapLE32(pis.length);
367
354
  pis.loopbegin = bswapLE32(pis.loopbegin);
@@ -487,7 +474,7 @@ BOOL CSoundFile_ReadIT(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLengt
487
474
  if (note < 0x80) note++;
488
475
  m[ch].note = note;
489
476
  lastvalue[ch].note = note;
490
- channels_used[ch] = TRUE;
477
+ // channels_used[ch] = TRUE;
491
478
  }
492
479
  }
493
480
  if (chnmask[ch] & 2)
@@ -567,19 +554,28 @@ BOOL CSoundFile_ReadIT(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLengt
567
554
  //////////////////////////////////////////////////////////////////////////////
568
555
  // IT 2.14 compression
569
556
 
570
- static DWORD ITReadBits(DWORD *bitbuf, UINT *bitnum, LPBYTE *_ibuf, CHAR n)
557
+ static DWORD ITReadBits(DWORD *bitbuf, UINT *bitnum, LPBYTE *_ibuf, LPBYTE ibufend, CHAR n)
571
558
  //-----------------------------------------------------------------
572
559
  {
573
- LPBYTE ibuf = *_ibuf;
560
+ LPBYTE ibuf = *_ibuf;
574
561
  DWORD retval = 0;
575
562
  UINT i = n;
576
563
 
564
+ // explicit if read 0 bits, then return 0
565
+ if (i == 0)
566
+ return(0);
567
+
577
568
  if (n > 0)
578
569
  {
579
570
  do
580
571
  {
581
572
  if (!*bitnum)
582
573
  {
574
+ if (ibuf >= ibufend)
575
+ {
576
+ *_ibuf = ibuf;
577
+ return 0;
578
+ }
583
579
  *bitbuf = *ibuf++;
584
580
  *bitnum = 8;
585
581
  }
@@ -591,7 +587,7 @@ static DWORD ITReadBits(DWORD *bitbuf, UINT *bitnum, LPBYTE *_ibuf, CHAR n)
591
587
  } while (i);
592
588
  i = n;
593
589
  }
594
- *_ibuf = ibuf;
590
+ *_ibuf = ibuf;
595
591
  return (retval >> (32-i));
596
592
  }
597
593
 
@@ -601,7 +597,8 @@ void ITUnpack8Bit(signed char *pSample, DWORD dwLen, LPBYTE lpMemFile, DWORD dwM
601
597
  {
602
598
  signed char *pDst = pSample;
603
599
  LPBYTE pSrc = lpMemFile;
604
- DWORD wHdr = 0;
600
+ LPBYTE pStop = lpMemFile + dwMemLength;
601
+ // DWORD wHdr = 0;
605
602
  DWORD wCount = 0;
606
603
  DWORD bitbuf = 0;
607
604
  UINT bitnum = 0;
@@ -612,7 +609,7 @@ void ITUnpack8Bit(signed char *pSample, DWORD dwLen, LPBYTE lpMemFile, DWORD dwM
612
609
  if (!wCount)
613
610
  {
614
611
  wCount = 0x8000;
615
- wHdr = bswapLE16(*((LPWORD)pSrc));
612
+ // wHdr = bswapLE16(*((LPWORD)pSrc));
616
613
  pSrc += 2;
617
614
  bLeft = 9;
618
615
  bTemp = bTemp2 = 0;
@@ -624,13 +621,13 @@ void ITUnpack8Bit(signed char *pSample, DWORD dwLen, LPBYTE lpMemFile, DWORD dwM
624
621
  DWORD dwPos = 0;
625
622
  do
626
623
  {
627
- WORD wBits = (WORD)ITReadBits(&bitbuf, &bitnum, &pSrc, bLeft);
624
+ WORD wBits = (WORD)ITReadBits(&bitbuf, &bitnum, &pSrc, pStop, bLeft);
628
625
  if (bLeft < 7)
629
626
  {
630
627
  DWORD i = 1 << (bLeft-1);
631
628
  DWORD j = wBits & 0xFFFF;
632
629
  if (i != j) goto UnpackByte;
633
- wBits = (WORD)(ITReadBits(&bitbuf, &bitnum, &pSrc, 3) + 1) & 0xFF;
630
+ wBits = (WORD)(ITReadBits(&bitbuf, &bitnum, &pSrc, pStop, 3) + 1) & 0xFF;
634
631
  bLeft = ((BYTE)wBits < bLeft) ? (BYTE)wBits : (BYTE)((wBits+1) & 0xFF);
635
632
  goto Next;
636
633
  }
@@ -668,7 +665,7 @@ void ITUnpack8Bit(signed char *pSample, DWORD dwLen, LPBYTE lpMemFile, DWORD dwM
668
665
  SkipByte:
669
666
  dwPos++;
670
667
  Next:
671
- if (pSrc >= lpMemFile+dwMemLength+1) return;
668
+ if (pSrc >= pStop + 1) return;
672
669
  } while (dwPos < d);
673
670
  // Move On
674
671
  wCount -= d;
@@ -683,7 +680,8 @@ void ITUnpack16Bit(signed char *pSample, DWORD dwLen, LPBYTE lpMemFile, DWORD dw
683
680
  {
684
681
  signed short *pDst = (signed short *)pSample;
685
682
  LPBYTE pSrc = lpMemFile;
686
- DWORD wHdr = 0;
683
+ LPBYTE pStop = lpMemFile + dwMemLength;
684
+ // DWORD wHdr = 0;
687
685
  DWORD wCount = 0;
688
686
  DWORD bitbuf = 0;
689
687
  UINT bitnum = 0;
@@ -695,7 +693,7 @@ void ITUnpack16Bit(signed char *pSample, DWORD dwLen, LPBYTE lpMemFile, DWORD dw
695
693
  if (!wCount)
696
694
  {
697
695
  wCount = 0x4000;
698
- wHdr = bswapLE16(*((LPWORD)pSrc));
696
+ // wHdr = bswapLE16(*((LPWORD)pSrc));
699
697
  pSrc += 2;
700
698
  bLeft = 17;
701
699
  wTemp = wTemp2 = 0;
@@ -707,13 +705,13 @@ void ITUnpack16Bit(signed char *pSample, DWORD dwLen, LPBYTE lpMemFile, DWORD dw
707
705
  DWORD dwPos = 0;
708
706
  do
709
707
  {
710
- DWORD dwBits = ITReadBits(&bitbuf, &bitnum, &pSrc, bLeft);
708
+ DWORD dwBits = ITReadBits(&bitbuf, &bitnum, &pSrc, pStop, bLeft);
711
709
  if (bLeft < 7)
712
710
  {
713
711
  DWORD i = 1 << (bLeft-1);
714
712
  DWORD j = dwBits;
715
713
  if (i != j) goto UnpackByte;
716
- dwBits = ITReadBits(&bitbuf, &bitnum, &pSrc, 4) + 1;
714
+ dwBits = ITReadBits(&bitbuf, &bitnum, &pSrc, pStop, 4) + 1;
717
715
  bLeft = ((BYTE)(dwBits & 0xFF) < bLeft) ? (BYTE)(dwBits & 0xFF) : (BYTE)((dwBits+1) & 0xFF);
718
716
  goto Next;
719
717
  }
@@ -751,13 +749,13 @@ void ITUnpack16Bit(signed char *pSample, DWORD dwLen, LPBYTE lpMemFile, DWORD dw
751
749
  SkipByte:
752
750
  dwPos++;
753
751
  Next:
754
- if (pSrc >= lpMemFile+dwMemLength+1) return;
752
+ if (pSrc >= pStop + 1) return;
755
753
  } while (dwPos < d);
756
754
  // Move On
757
755
  wCount -= d;
758
756
  dwLen -= d;
759
757
  pDst += d;
760
- if (pSrc >= lpMemFile+dwMemLength) break;
758
+ if (pSrc >= pStop) break;
761
759
  }
762
760
  }
763
761
 
@@ -770,7 +768,6 @@ UINT CSoundFile_LoadMixPlugins(CSoundFile *_this, const void *pData, UINT nLen)
770
768
  while (nPos+8 < nLen)
771
769
  {
772
770
  DWORD nPluginSize;
773
- UINT nPlugin;
774
771
 
775
772
  nPluginSize = bswapLE32(*(DWORD *)(p+nPos+4));
776
773
  if (nPluginSize > nLen-nPos-8) break;;
@@ -787,10 +784,9 @@ UINT CSoundFile_LoadMixPlugins(CSoundFile *_this, const void *pData, UINT nLen)
787
784
  {
788
785
  break;
789
786
  }
790
- // took out the (otherwise unused) plugin loading code here. --ryan.
787
+ // took out the (otherwise unused) plugin loading code here. --ryan.
791
788
  }
792
789
  nPos += nPluginSize + 8;
793
790
  }
794
791
  return nPos;
795
792
  }
796
-
@@ -39,7 +39,7 @@ typedef struct MDLPATTERNDATA
39
39
  } MDLPATTERNDATA;
40
40
 
41
41
 
42
- void ConvertMDLCommand(MODCOMMAND *m, UINT eff, UINT data)
42
+ static void ConvertMDLCommand(MODCOMMAND *m, UINT eff, UINT data)
43
43
  //--------------------------------------------------------
44
44
  {
45
45
  UINT command = 0, param = data;
@@ -88,19 +88,12 @@ void ConvertMDLCommand(MODCOMMAND *m, UINT eff, UINT data)
88
88
  }
89
89
 
90
90
 
91
- void UnpackMDLTrack(MODCOMMAND *pat, UINT nChannels, UINT nRows, UINT nTrack, const BYTE *lpTracks)
91
+ static void UnpackMDLTrack(MODCOMMAND *pat, UINT nChannels, UINT nRows, UINT nTrack, const BYTE *lpTracks, UINT len)
92
92
  //-------------------------------------------------------------------------------------------------
93
93
  {
94
94
  MODCOMMAND cmd, *m = pat;
95
- UINT len = *((WORD *)lpTracks);
96
95
  UINT pos = 0, row = 0, i;
97
- lpTracks += 2;
98
- for (UINT ntrk=1; ntrk<nTrack; ntrk++)
99
- {
100
- lpTracks += len;
101
- len = *((WORD *)lpTracks);
102
- lpTracks += 2;
103
- }
96
+
104
97
  cmd.note = cmd.instr = 0;
105
98
  cmd.volcmd = cmd.vol = 0;
106
99
  cmd.command = cmd.param = 0;
@@ -172,14 +165,12 @@ void UnpackMDLTrack(MODCOMMAND *pat, UINT nChannels, UINT nRows, UINT nTrack, co
172
165
  }
173
166
 
174
167
 
175
-
176
168
  BOOL CSoundFile_ReadMDL(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLength)
177
169
  //---------------------------------------------------------------
178
170
  {
179
171
  DWORD dwMemPos, dwPos, blocklen, dwTrackPos;
180
172
  const MDLSONGHEADER *pmsh = (const MDLSONGHEADER *)lpStream;
181
173
  const MDLINFOBLOCK *pmib;
182
- const MDLPATTERNDATA *pmpd;
183
174
  UINT i,j, norders = 0, npatterns = 0, ntracks = 0;
184
175
  UINT ninstruments = 0, nsamples = 0;
185
176
  WORD block;
@@ -192,6 +183,7 @@ BOOL CSoundFile_ReadMDL(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
192
183
 
193
184
  if ((!lpStream) || (dwMemLength < 1024)) return FALSE;
194
185
  if ((pmsh->id != 0x4C444D44) || ((pmsh->version & 0xF0) > 0x10)) return FALSE;
186
+ const UINT hdrLen = (pmsh->version>0)? 59 : 57;
195
187
  SDL_memset(patterntracks, 0, sizeof(patterntracks));
196
188
  SDL_memset(smpinfo, 0, sizeof(smpinfo));
197
189
  SDL_memset(insvolenv, 0, sizeof(insvolenv));
@@ -203,10 +195,11 @@ BOOL CSoundFile_ReadMDL(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
203
195
  _this->m_nSamples = _this->m_nInstruments = 0;
204
196
  while (dwMemPos+6 < dwMemLength)
205
197
  {
206
- block = *((WORD *)(lpStream+dwMemPos));
207
- blocklen = *((DWORD *)(lpStream+dwMemPos+2));
198
+ const BYTE *pp = lpStream + dwMemPos;
199
+ block = pp[0] | (pp[1] << 8);
200
+ blocklen = pp[2] | (pp[3] << 8) | (pp[4] << 16) | (pp[5] << 24);
208
201
  dwMemPos += 6;
209
- if (dwMemPos + blocklen > dwMemLength)
202
+ if (blocklen > dwMemLength - dwMemPos)
210
203
  {
211
204
  if (dwMemPos == 11) return FALSE;
212
205
  break;
@@ -215,9 +208,10 @@ BOOL CSoundFile_ReadMDL(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
215
208
  {
216
209
  // IN: infoblock
217
210
  case 0x4E49:
218
- pmib = (MDLINFOBLOCK *)(lpStream+dwMemPos);
211
+ pmib = (const MDLINFOBLOCK *)(lpStream+dwMemPos);
219
212
  norders = pmib->norders;
220
213
  if (norders > MAX_ORDERS) norders = MAX_ORDERS;
214
+ if (blocklen < sizeof(MDLINFOBLOCK) + norders - sizeof(pmib->seq)) return FALSE;
221
215
  _this->m_nRestartPos = pmib->repeatpos;
222
216
  _this->m_nDefaultGlobalVolume = pmib->globalvol;
223
217
  _this->m_nDefaultTempo = pmib->tempo;
@@ -244,29 +238,41 @@ BOOL CSoundFile_ReadMDL(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
244
238
  dwPos = dwMemPos + 1;
245
239
  for (i=0; i<npatterns; i++)
246
240
  {
247
- if (dwPos+18 >= dwMemLength) break;
248
- pmpd = (MDLPATTERNDATA *)(lpStream + dwPos);
249
- if (pmpd->channels > 32) break;
250
- _this->PatternSize[i] = pmpd->lastrow+1;
251
- if (_this->m_nChannels < pmpd->channels) _this->m_nChannels = pmpd->channels;
252
- dwPos += 18 + 2*pmpd->channels;
253
- for (j=0; j<pmpd->channels; j++)
241
+ const BYTE *data;
242
+ UINT ch;
243
+ if (pmsh->version == 0) {
244
+ if (_this->m_nChannels < 32) _this->m_nChannels = 32;
245
+ ch = 32;
246
+ } else {
247
+ if (dwPos+18 >= dwMemLength) break;
248
+ const MDLPATTERNDATA *pmpd = (const MDLPATTERNDATA *)(lpStream + dwPos);
249
+ if (pmpd->channels > 32) break;
250
+ _this->PatternSize[i] = pmpd->lastrow+1;
251
+ if (_this->m_nChannels < pmpd->channels) _this->m_nChannels = pmpd->channels;
252
+ ch = pmpd->channels;
253
+ }
254
+
255
+ if (2 * ch >= dwMemLength - dwPos) break;
256
+ data = lpStream + dwPos;
257
+ dwPos += 2 * ch;
258
+ for (j=0; j<ch && j<_this->m_nChannels; j++, data+=2)
254
259
  {
255
- patterntracks[i*32+j] = pmpd->data[j];
260
+ patterntracks[i*32+j] = data[0] | (data[1] << 8);
256
261
  }
257
262
  }
258
263
  break;
259
264
  // TR: Track Data
260
265
  case 0x5254:
261
266
  if (dwTrackPos) break;
262
- ntracks = *((WORD *)(lpStream+dwMemPos));
267
+ pp = lpStream + dwMemPos;
268
+ ntracks = pp[0] | (pp[1] << 8);
263
269
  dwTrackPos = dwMemPos+2;
264
270
  break;
265
271
  // II: Instruments
266
272
  case 0x4949:
267
273
  ninstruments = lpStream[dwMemPos];
268
274
  dwPos = dwMemPos+1;
269
- for (i=0; i<ninstruments; i++)
275
+ for (i=0; dwPos+34<dwMemLength && i<ninstruments; i++)
270
276
  {
271
277
  UINT nins = lpStream[dwPos];
272
278
  if ((nins >= MAX_INSTRUMENTS) || (!nins)) break;
@@ -274,11 +280,11 @@ BOOL CSoundFile_ReadMDL(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
274
280
  if (!_this->Headers[nins])
275
281
  {
276
282
  UINT note = 12;
277
- if ((_this->Headers[nins] = (INSTRUMENTHEADER *) SDL_malloc(sizeof (INSTRUMENTHEADER))) == NULL) break;
283
+ if ((_this->Headers[nins] = (INSTRUMENTHEADER *) SDL_calloc(1, sizeof (INSTRUMENTHEADER))) == NULL) break;
278
284
  INSTRUMENTHEADER *penv = _this->Headers[nins];
279
- SDL_memset(penv, 0, sizeof(INSTRUMENTHEADER));
280
285
  penv->nGlobalVol = 64;
281
286
  penv->nPPC = 5*12;
287
+ if (34 + 14u*lpStream[dwPos+1] > dwMemLength - dwPos) break;
282
288
  for (j=0; j<lpStream[dwPos+1]; j++)
283
289
  {
284
290
  const BYTE *ps = lpStream+dwPos+34+14*j;
@@ -318,50 +324,56 @@ BOOL CSoundFile_ReadMDL(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
318
324
  }
319
325
  for (j=1; j<=_this->m_nInstruments; j++) if (!_this->Headers[j])
320
326
  {
321
- _this->Headers[j] = (INSTRUMENTHEADER *) SDL_malloc(sizeof (INSTRUMENTHEADER));
322
- if (_this->Headers[j]) SDL_memset(_this->Headers[j], 0, sizeof(INSTRUMENTHEADER));
327
+ _this->Headers[j] = (INSTRUMENTHEADER *) SDL_calloc(1, sizeof (INSTRUMENTHEADER));
323
328
  }
324
329
  break;
325
330
  // VE: Volume Envelope
326
331
  case 0x4556:
327
- if ((nvolenv = lpStream[dwMemPos]) == 0) break;
328
- if (dwMemPos + nvolenv*32 + 1 <= dwMemLength) pvolenv = lpStream + dwMemPos + 1;
332
+ if (nvolenv || (nvolenv = lpStream[dwMemPos]) == 0) break;
333
+ if (dwMemPos + nvolenv*33 + 1 <= dwMemLength) pvolenv = lpStream + dwMemPos + 1;
329
334
  break;
330
335
  // PE: Panning Envelope
331
336
  case 0x4550:
332
- if ((npanenv = lpStream[dwMemPos]) == 0) break;
333
- if (dwMemPos + npanenv*32 + 1 <= dwMemLength) ppanenv = lpStream + dwMemPos + 1;
337
+ if (npanenv || (npanenv = lpStream[dwMemPos]) == 0) break;
338
+ if (dwMemPos + npanenv*33 + 1 <= dwMemLength) ppanenv = lpStream + dwMemPos + 1;
334
339
  break;
335
340
  // FE: Pitch Envelope
336
341
  case 0x4546:
337
- if ((npitchenv = lpStream[dwMemPos]) == 0) break;
338
- if (dwMemPos + npitchenv*32 + 1 <= dwMemLength) ppitchenv = lpStream + dwMemPos + 1;
342
+ if (npitchenv || (npitchenv = lpStream[dwMemPos]) == 0) break;
343
+ if (dwMemPos + npitchenv*33 + 1 <= dwMemLength) ppitchenv = lpStream + dwMemPos + 1;
339
344
  break;
340
345
  // IS: Sample Infoblock
341
346
  case 0x5349:
342
347
  nsamples = lpStream[dwMemPos];
348
+ i = blocklen / hdrLen;
349
+ if (i< nsamples) nsamples = i;
343
350
  dwPos = dwMemPos+1;
344
- for (i=0; i<nsamples; i++, dwPos += 59)
351
+ for (i=0; i<nsamples; i++, dwPos += hdrLen)
345
352
  {
346
353
  UINT nins = lpStream[dwPos];
347
354
  if ((nins >= MAX_SAMPLES) || (!nins)) continue;
348
355
  if (_this->m_nSamples < nins) _this->m_nSamples = nins;
349
356
  MODINSTRUMENT *pins = &_this->Ins[nins];
350
- pins->nC4Speed = *((DWORD *)(lpStream+dwPos+41));
351
- pins->nLength = *((DWORD *)(lpStream+dwPos+45));
352
- pins->nLoopStart = *((DWORD *)(lpStream+dwPos+49));
353
- pins->nLoopEnd = pins->nLoopStart + *((DWORD *)(lpStream+dwPos+53));
357
+ pp = lpStream + dwPos + 41;
358
+ pins->nC4Speed = pp[0] | (pp[1] << 8); pp += 2;
359
+ if (pmsh->version > 0) {
360
+ pins->nC4Speed |= (pp[0] << 16) | (pp[1] << 24); pp += 2;
361
+ }
362
+ pins->nLength = pp[0] | (pp[1] << 8) | (pp[2] << 16) | (pp[3] << 24); pp += 4;
363
+ pins->nLoopStart = pp[0] | (pp[1] << 8) | (pp[2] << 16) | (pp[3] << 24); pp += 4;
364
+ pins->nLoopEnd = pins->nLoopStart + (pp[0] | (pp[1] << 8) | (pp[2] << 16) | (pp[3] << 24));
354
365
  if (pins->nLoopEnd > pins->nLoopStart) pins->uFlags |= CHN_LOOP;
355
366
  pins->nGlobalVol = 64;
356
- if (lpStream[dwPos+58] & 0x01)
367
+ if (pmsh->version == 0) pins->nVolume = pp[4];
368
+ if (lpStream[dwPos+hdrLen-1] & 0x01)
357
369
  {
358
370
  pins->uFlags |= CHN_16BIT;
359
371
  pins->nLength >>= 1;
360
372
  pins->nLoopStart >>= 1;
361
373
  pins->nLoopEnd >>= 1;
362
374
  }
363
- if (lpStream[dwPos+58] & 0x02) pins->uFlags |= CHN_PINGPONGLOOP;
364
- smpinfo[nins] = (lpStream[dwPos+58] >> 2) & 3;
375
+ if (lpStream[dwPos+hdrLen-1] & 0x02) pins->uFlags |= CHN_PINGPONGLOOP;
376
+ smpinfo[nins] = (lpStream[dwPos+hdrLen-1] >> 2) & 3;
365
377
  }
366
378
  break;
367
379
  // SA: Sample Data
@@ -371,17 +383,18 @@ BOOL CSoundFile_ReadMDL(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
371
383
  {
372
384
  MODINSTRUMENT *pins = &_this->Ins[i];
373
385
  UINT flags = (pins->uFlags & CHN_16BIT) ? RS_PCM16S : RS_PCM8S;
386
+ pp = lpStream + dwPos;
374
387
  if (!smpinfo[i])
375
388
  {
376
- dwPos += CSoundFile_ReadSample(_this, pins, flags, (LPSTR)(lpStream+dwPos), dwMemLength - dwPos);
389
+ dwPos += CSoundFile_ReadSample(_this, pins, flags, (LPCSTR)pp, dwMemLength - dwPos);
377
390
  } else
378
391
  {
379
- DWORD dwLen = *((DWORD *)(lpStream+dwPos));
392
+ DWORD dwLen = pp[0] | (pp[1] << 8) | (pp[2] << 16) | (pp[3] << 24); pp += 4;
380
393
  dwPos += 4;
381
- if ((dwLen < dwMemLength) && (dwLen <= dwMemLength - dwPos) && (dwLen > 4))
394
+ if ((dwLen <= dwMemLength) && (dwPos <= dwMemLength - dwLen) && (dwLen > 4))
382
395
  {
383
396
  flags = (pins->uFlags & CHN_16BIT) ? RS_MDL16 : RS_MDL8;
384
- CSoundFile_ReadSample(_this, pins, flags, (LPSTR)(lpStream+dwPos), dwLen);
397
+ CSoundFile_ReadSample(_this, pins, flags, (LPCSTR)pp, dwLen);
385
398
  }
386
399
  dwPos += dwLen;
387
400
  }
@@ -398,8 +411,24 @@ BOOL CSoundFile_ReadMDL(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
398
411
  if ((_this->Patterns[ipat] = CSoundFile_AllocatePattern(_this->PatternSize[ipat], _this->m_nChannels)) == NULL) break;
399
412
  for (UINT chn=0; chn<_this->m_nChannels; chn++) if ((patterntracks[ipat*32+chn]) && (patterntracks[ipat*32+chn] <= ntracks))
400
413
  {
414
+ const BYTE *lpTracks = lpStream + dwTrackPos;
415
+ UINT len = lpTracks[0] | (lpTracks[1] << 8);
416
+ if (len < dwMemLength-dwTrackPos) {
401
417
  MODCOMMAND *m = _this->Patterns[ipat] + chn;
402
- UnpackMDLTrack(m, _this->m_nChannels, _this->PatternSize[ipat], patterntracks[ipat*32+chn], lpStream+dwTrackPos);
418
+ UINT nTrack = patterntracks[ipat*32+chn];
419
+
420
+ lpTracks += 2;
421
+ for (UINT ntrk=1; ntrk<nTrack && lpTracks + 1 < (dwMemLength + lpStream - len); ntrk++)
422
+ {
423
+ lpTracks += len;
424
+ len = lpTracks[0] | (lpTracks[1] << 8);
425
+ lpTracks += 2;
426
+ }
427
+
428
+ if ( len > dwMemLength - (lpTracks - lpStream) ) len = 0;
429
+
430
+ UnpackMDLTrack(m, _this->m_nChannels, _this->PatternSize[ipat], nTrack, lpTracks, len);
431
+ }
403
432
  }
404
433
  }
405
434
  }
@@ -472,7 +501,7 @@ BOOL CSoundFile_ReadMDL(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
472
501
  WORD MDLReadBits(DWORD *bitbuf, UINT *bitnum, LPBYTE *_ibuf, CHAR n)
473
502
  //-----------------------------------------------------------------
474
503
  {
475
- LPBYTE ibuf = *_ibuf;
504
+ LPBYTE ibuf = *_ibuf;
476
505
  const WORD v = (WORD)(*bitbuf & ((1 << n) - 1) );
477
506
  *bitbuf >>= n;
478
507
  *bitnum -= n;
@@ -481,8 +510,6 @@ WORD MDLReadBits(DWORD *bitbuf, UINT *bitnum, LPBYTE *_ibuf, CHAR n)
481
510
  *bitbuf |= (((DWORD)(*ibuf++)) << *bitnum);
482
511
  *bitnum += 8;
483
512
  }
484
- *_ibuf = ibuf;
513
+ *_ibuf = ibuf;
485
514
  return v;
486
515
  }
487
-
488
-
@@ -93,7 +93,7 @@ typedef struct tagMMD0SAMPLE
93
93
  typedef struct tagMMDSAMPLEHEADER
94
94
  {
95
95
  DWORD length; // length of *one* *unpacked* channel in *bytes*
96
- WORD type;
96
+ WORD type;
97
97
  // if non-negative
98
98
  // bits 0-3 reserved for multi-octave instruments, not supported on the PC
99
99
  // 0x10: 16 bit (otherwise 8 bit)
@@ -165,7 +165,7 @@ typedef struct tagMMD2SONGHEADER
165
165
  BYTE numsamples; // # of samples (max 63)
166
166
  } MMD2SONGHEADER;
167
167
 
168
- // For MMD0 the note information is held in 3 bytes, byte0, byte1, byte2. For reference we
168
+ // For MMD0 the note information is held in 3 bytes, byte0, byte1, byte2. For reference we
169
169
  // number the bits in each byte 0..7, where 0 is the low bit.
170
170
  // The note is held as bits 5..0 of byte0
171
171
  // The instrument is encoded in 6 bits, bits 7 and 6 of byte0 and bits 7,6,5,4 of byte1
@@ -238,7 +238,7 @@ typedef struct tagMMD0EXP
238
238
  DWORD annotxt;
239
239
  DWORD annolen;
240
240
  DWORD iinfo; // Instrument names
241
- WORD i_ext_entries;
241
+ WORD i_ext_entries;
242
242
  WORD i_ext_entrsz;
243
243
  DWORD jumpmask;
244
244
  DWORD rgbtable;
@@ -576,11 +576,12 @@ BOOL CSoundFile_ReadMed(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
576
576
  }
577
577
  UINT pseq = 0;
578
578
 
579
- if ((playseqtable) && (playseqtable < dwMemLength) && (nplayseq*4 < dwMemLength - playseqtable))
579
+ if ((playseqtable) && (playseqtable < dwMemLength) && (nplayseq*4 + 4 < dwMemLength - playseqtable))
580
580
  {
581
581
  pseq = bswapBE32(((LPDWORD)(lpStream+playseqtable))[nplayseq]);
582
582
  }
583
- if ((pseq) && (pseq < dwMemLength - sizeof(MMD2PLAYSEQ)))
583
+ if ((pseq) && dwMemLength > sizeof(MMD2PLAYSEQ) &&
584
+ (pseq < dwMemLength - sizeof(MMD2PLAYSEQ)))
584
585
  {
585
586
  const MMD2PLAYSEQ *pmps = (MMD2PLAYSEQ *)(lpStream + pseq);
586
587
  UINT n = bswapBE16(pmps->length);
@@ -623,10 +624,11 @@ BOOL CSoundFile_ReadMed(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
623
624
  UINT len = bswapBE32(psdh->length);
624
625
  if ((len > MAX_SAMPLE_LENGTH) || (dwPos + len + 6 > dwMemLength)) len = 0;
625
626
  UINT flags = RS_PCM8S, stype = bswapBE16(psdh->type);
626
- LPSTR psdata = (LPSTR)(lpStream + dwPos + 6);
627
+ dwPos += 6;
627
628
  if (stype & 0x80)
628
629
  {
629
- psdata += (stype & 0x20) ? 14 : 6;
630
+ dwPos += (stype & 0x20) ? 14 : 6;
631
+ if (dwPos >= dwMemLength) continue;
630
632
  } else
631
633
  {
632
634
  if (stype & 0x10)
@@ -641,11 +643,12 @@ BOOL CSoundFile_ReadMed(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
641
643
  if (stype & 0x20) len /= 2;
642
644
  }
643
645
  _this->Ins[iSmp+1].nLength = len;
644
- CSoundFile_ReadSample(_this, &_this->Ins[iSmp+1], flags, psdata, dwMemLength - dwPos - 6);
646
+ CSoundFile_ReadSample(_this, &_this->Ins[iSmp+1], flags, (const char *)(lpStream + dwPos), dwMemLength - dwPos);
645
647
  }
646
648
  // Reading patterns (blocks)
647
649
  if (wNumBlocks > MAX_PATTERNS) wNumBlocks = MAX_PATTERNS;
648
- if ((!dwBlockArr) || (dwBlockArr > dwMemLength - 4*wNumBlocks)) return TRUE;
650
+ if ((!dwBlockArr) || (dwMemLength < 4*wNumBlocks) ||
651
+ (dwBlockArr > dwMemLength - 4*wNumBlocks)) return TRUE;
649
652
  pdwTable = (LPDWORD)(lpStream + dwBlockArr);
650
653
  playtransp += (version == '3') ? 24 : 48;
651
654
  for (UINT iBlk=0; iBlk<wNumBlocks; iBlk++)
@@ -701,9 +704,15 @@ BOOL CSoundFile_ReadMed(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
701
704
  {
702
705
  DWORD nameofs = bswapBE32(pbi->blockname);
703
706
  UINT namelen = bswapBE32(pbi->blocknamelen);
704
- if ((nameofs < dwMemLength) && (namelen < dwMemLength + nameofs))
707
+ if ((namelen < dwMemLength) && (nameofs < dwMemLength - namelen))
705
708
  {
706
- CSoundFile_SetPatternName(_this, iBlk, (LPCSTR)(lpStream+nameofs));
709
+ // SetPatternName expects a nul-terminated string.
710
+ char blockname[MAX_PATTERNNAME];
711
+ if (namelen >= MAX_PATTERNNAME) namelen = MAX_PATTERNNAME - 1;
712
+ SDL_memcpy(blockname, lpStream + nameofs, namelen);
713
+ blockname[namelen] = '\0';
714
+
715
+ CSoundFile_SetPatternName(_this, iBlk, blockname);
707
716
  }
708
717
  }
709
718
  if (pbi->cmdexttable)
@@ -754,4 +763,3 @@ BOOL CSoundFile_ReadMed(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
754
763
  }
755
764
  return TRUE;
756
765
  }
757
-