private UnaryPixelOp MakeUop (SortedList<int, int>[] controlPoints, ColorTransferMode mode)
{
UnaryPixelOp op;
byte[][] transferCurves;
int entries;
switch (mode) {
case ColorTransferMode.Rgb:
var cc = new ChannelCurveOp ();
transferCurves = new byte[][] { cc.CurveR, cc.CurveG, cc.CurveB };
entries = 256;
op = cc;
break;
case ColorTransferMode.Luminosity:
var lc = new LuminosityCurveOp ();
transferCurves = new byte[][] { lc.Curve };
entries = 256;
op = lc;
break;
default:
throw new InvalidEnumArgumentException ();
}
int channels = transferCurves.Length;
for (int channel = 0; channel < channels; channel++) {
var channelControlPoints = controlPoints[channel];
var xa = channelControlPoints.Keys;
var ya = channelControlPoints.Values;
SplineInterpolator interpolator = new SplineInterpolator ();
int length = channelControlPoints.Count;
for (int i = 0; i < length; i++) {
interpolator.Add (xa[i], ya[i]);
}
for (int i = 0; i < entries; i++) {
transferCurves[channel][i] = Utility.ClampToByte (interpolator.Interpolate (i));
}
}
return op;
}
#endregion