Fix index_series implementation (still incomplete) default tip
authorThibaut Girka <thib@sitedethib.com>
Wed Feb 23 16:19:11 2011 +0100 (15 months ago)
changeset 68043d5db57474
parent 67 419761c8d9b9
Fix index_series implementation (still incomplete)
scn2k/scn2k_textimpl.cc
     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)