ft2-clone

Fasttracker 2 clone
Log | Files | Refs | README | LICENSE

commit 00e1d902b0391ce80e40e42071abcf6a95314ff8
parent d5b304816fbd5df3153be0518b6490d69aee5de1
Author: Olav Sørensen <olav.sorensen@live.no>
Date:   Thu,  3 Aug 2023 22:41:52 +0200

Fix heavily bugged "pattern expand" routine

Diffstat:
Msrc/ft2_pattern_ed.c | 32+++++++++++++-------------------
1 file changed, 13 insertions(+), 19 deletions(-)

diff --git a/src/ft2_pattern_ed.c b/src/ft2_pattern_ed.c @@ -23,7 +23,6 @@ #include "ft2_bmp.h" #include "ft2_structs.h" -pattMark_t pattMark; // globalized // for pattern marking w/ keyboard static int8_t lastChMark; @@ -42,6 +41,10 @@ static const uint16_t iSwitchExtX[4] = { 221, 262, 303, 344 }; static int32_t lastMouseX, lastMouseY; static int32_t last_TimeH, last_TimeM, last_TimeS; +static note_t tmpPattern[MAX_CHANNELS * MAX_PATT_LEN]; + +pattMark_t pattMark; // globalized + bool allocatePattern(uint16_t pattNum) // for tracker use only, not in loader! { const bool audioWasntLocked = !audio.locked; @@ -2704,21 +2707,20 @@ void shrinkPattern(void) note_t *p = pattern[editor.editPattern]; if (p != NULL) { - const int32_t length = numRows >> 1; - for (int32_t i = 0; i < length; i++) + for (int32_t i = 0; i < numRows / 2; i++) { for (int32_t j = 0; j < MAX_CHANNELS; j++) p[(i * MAX_CHANNELS) + j] = p[((i*2) * MAX_CHANNELS) + j]; } } - patternNumRows[editor.editPattern] >>= 1; + patternNumRows[editor.editPattern] /= 2; numRows = patternNumRows[editor.editPattern]; if (song.pattNum == editor.editPattern) song.currNumRows = numRows; - song.row >>= 1; + song.row /= 2; if (song.row >= numRows) song.row = numRows-1; @@ -2734,7 +2736,7 @@ void shrinkPattern(void) void expandPattern(void) { int16_t numRows = patternNumRows[editor.editPattern]; - if (numRows > 128) + if (numRows > MAX_PATT_LEN/2) { okBox(0, "System message", "Pattern is too long to be expanded."); } @@ -2744,24 +2746,16 @@ void expandPattern(void) if (pattern[editor.editPattern] != NULL) { - note_t *tmpPtn = (note_t *)malloc((numRows * 2) * TRACK_WIDTH); - if (tmpPtn == NULL) - { - unlockMixerCallback(); - okBox(0, "System message", "Not enough memory!"); - return; - } - + note_t *p = pattern[editor.editPattern]; + memcpy(tmpPattern, p, numRows * TRACK_WIDTH); + for (int32_t i = 0; i < numRows; i++) { for (int32_t j = 0; j < MAX_CHANNELS; j++) - tmpPtn[((i * 2) * MAX_CHANNELS) + j] = pattern[editor.editPattern][(i * MAX_CHANNELS) + j]; + p[((i * 2) * MAX_CHANNELS) + j] = tmpPattern[(i * MAX_CHANNELS) + j]; - memset(&tmpPtn[((i * 2) + 1) * MAX_CHANNELS], 0, TRACK_WIDTH); + memset(&p[((i * 2) + 1) * MAX_CHANNELS], 0, TRACK_WIDTH); } - - free(pattern[editor.editPattern]); - pattern[editor.editPattern] = tmpPtn; } patternNumRows[editor.editPattern] *= 2;