1.1 --- a/scn2k/scn2k_textimpl.cc Wed Feb 23 01:48:51 2011 +0100
1.2 +++ b/scn2k/scn2k_textimpl.cc Wed Feb 23 16:19:11 2011 +0100
1.3 @@ -407,29 +407,41 @@
1.4 //
1.5 if (cmd.args.size() >= 7)
1.6 {
1.7 - int val = cmd.args[0].value;
1.8 - int offset = cmd.args[1].value;
1.9 - int r_min = cmd.args[2].value;
1.10 - int v_min = cmd.args[3].value;
1.11 - int v_max = cmd.args[4].value;
1.12 - int r_max = cmd.args[5].value;
1.13 - int mode = cmd.args[6].value;
1.14 - // rldev : mode == 1,3 : 'acceralating curve', 2,3: 'decelerating curve'
1.15 - // 複数の引数リスト(r_minからmodeまでのリスト)もつこともあり、その場合は
1.16 - // "cancel out in some way" らしい
1.17 - if (mode == 1 || mode == 3)
1.18 - val += offset;
1.19 - else if (mode == 2 || mode == 4)
1.20 - val -= offset;
1.21 -if (cmd.args.size() != 7)
1.22 - fprintf(stderr,"\n%d/%d: cmd 01-04:0320 : XXXX NOT SUPPORTED LIST : DOUBLE RANGE CONVERSION! XXXXXXXXXXX\n",cmd.scn,cmd.pos);
1.23 - if (val < v_min)
1.24 - val = v_min;
1.25 - if (val > v_max)
1.26 - val = v_max;
1.27 - val = (r_max-r_min)*(val-v_min)/(v_max-v_min) + r_min;
1.28 + int i, val;
1.29 + int x, startval;
1.30 + int start, end, endval, mode;
1.31 +
1.32 + //TODO: why index and offset, and not x?
1.33 + x = cmd.args[0].value + cmd.args[1].value;
1.34 + startval = cmd.args[2].value;
1.35 + start = end = 0;
1.36 + val = endval = startval;
1.37 + for (i=3; i < cmd.args.size(); i += 4)
1.38 + {
1.39 + startval = endval;
1.40 + start = cmd.args[i].value;
1.41 + end = cmd.args[i + 1].value;
1.42 + endval = cmd.args[i + 2].value;
1.43 + int mode = cmd.args[i + 3].value;
1.44 + if (start <= x && x <= end)
1.45 + {
1.46 + // rldev : mode == 1,3 : 'acceralating curve', 2,3: 'decelerating curve'
1.47 + // 複数の引数リスト(r_minからmodeまでのリスト)もつこともあり、その場合は
1.48 + // "cancel out in some way" らしい
1.49 + // Assume mode 0, as we only know of it
1.50 + // TODO: find out how other mode works (exp/log?)
1.51 + // TODO: "When two ranges overlap, they appear to cancel out in some way"
1.52 + val = startval + (endval - startval) * (x - start) / (end - start);
1.53 + }
1.54 + }
1.55 + if (i != cmd.args.size())
1.56 + fprintf(stderr, "\n%d/%d: cmd 01-04:0320 : WARNING: %d unconsumed arguments\n", cmd.scn, cmd.pos, cmd.args.size() - i);
1.57 + if (x > end)
1.58 + x = endval;
1.59 cmd.SetSysvar(val);
1.60 }
1.61 + else
1.62 + fprintf(stderr, "\n%d/%d: cmd 01-04:0320 : Not enough arguments?!\n", cmd.scn, cmd.pos);
1.63 }
1.64
1.65 void Text::impl_constrain(Cmd& cmd)