# HG changeset patch # User Thibaut Girka # Date 1298474351 -3600 # Node ID 043d5db574740d3cebc6690b126e0791ec165938 # Parent 419761c8d9b977335e1fc5e9b111725d7b503ff6 Fix index_series implementation (still incomplete) diff --git a/scn2k/scn2k_textimpl.cc b/scn2k/scn2k_textimpl.cc --- a/scn2k/scn2k_textimpl.cc +++ b/scn2k/scn2k_textimpl.cc @@ -407,29 +407,41 @@ void Text::impl_index_series(Cmd& cmd) // if (cmd.args.size() >= 7) { - int val = cmd.args[0].value; - int offset = cmd.args[1].value; - int r_min = cmd.args[2].value; - int v_min = cmd.args[3].value; - int v_max = cmd.args[4].value; - int r_max = cmd.args[5].value; - int mode = cmd.args[6].value; - // rldev : mode == 1,3 : 'acceralating curve', 2,3: 'decelerating curve' - // 複数の引数リスト(r_minからmodeまでのリスト)もつこともあり、その場合は - // "cancel out in some way" らしい - if (mode == 1 || mode == 3) - val += offset; - else if (mode == 2 || mode == 4) - val -= offset; -if (cmd.args.size() != 7) - fprintf(stderr,"\n%d/%d: cmd 01-04:0320 : XXXX NOT SUPPORTED LIST : DOUBLE RANGE CONVERSION! XXXXXXXXXXX\n",cmd.scn,cmd.pos); - if (val < v_min) - val = v_min; - if (val > v_max) - val = v_max; - val = (r_max-r_min)*(val-v_min)/(v_max-v_min) + r_min; + int i, val; + int x, startval; + int start, end, endval, mode; + + //TODO: why index and offset, and not x? + x = cmd.args[0].value + cmd.args[1].value; + startval = cmd.args[2].value; + start = end = 0; + val = endval = startval; + for (i=3; i < cmd.args.size(); i += 4) + { + startval = endval; + start = cmd.args[i].value; + end = cmd.args[i + 1].value; + endval = cmd.args[i + 2].value; + int mode = cmd.args[i + 3].value; + if (start <= x && x <= end) + { + // rldev : mode == 1,3 : 'acceralating curve', 2,3: 'decelerating curve' + // 複数の引数リスト(r_minからmodeまでのリスト)もつこともあり、その場合は + // "cancel out in some way" らしい + // Assume mode 0, as we only know of it + // TODO: find out how other mode works (exp/log?) + // TODO: "When two ranges overlap, they appear to cancel out in some way" + val = startval + (endval - startval) * (x - start) / (end - start); + } + } + if (i != cmd.args.size()) + fprintf(stderr, "\n%d/%d: cmd 01-04:0320 : WARNING: %d unconsumed arguments\n", cmd.scn, cmd.pos, cmd.args.size() - i); + if (x > end) + x = endval; cmd.SetSysvar(val); } + else + fprintf(stderr, "\n%d/%d: cmd 01-04:0320 : Not enough arguments?!\n", cmd.scn, cmd.pos); } void Text::impl_constrain(Cmd& cmd)