Inheritance: ChannelCurveOp, ICloneable
		protected override void OnBeginRender (ISurface src, ISurface dst, Rectangle roi)
		{
			var histogram = new HistogramRgb ();
			histogram.UpdateHistogram (src, src.Bounds);

			op = histogram.MakeLevelsAuto ();
		}
        public object Clone()
        {
            LevelOp copy = new LevelOp(colorInLow, colorInHigh, (float[])gamma.Clone(), colorOutLow, colorOutHigh);

            copy.CurveB = (byte[])this.CurveB.Clone();
            copy.CurveG = (byte[])this.CurveG.Clone();
            copy.CurveR = (byte[])this.CurveR.Clone();

            return(copy);
        }
		public void SetFromLeveledHistogram (HistogramRgb inputHistogram, LevelOp upo)
		{
			if (inputHistogram == null || upo == null) {
				return;
			}

			Clear ();

			float[] before = new float[3];
			float[] slopes = new float[3];

			for (int c = 0; c < 3; c++) {
				long[] channelHistogramOutput = histogram[c];
				long[] channelHistogramInput = inputHistogram.histogram[c];

				for (int v = 0; v <= 255; v++) {
					ColorBgra after = ColorBgra.FromBgr ((byte)v, (byte)v, (byte)v);

					upo.UnApply (after, before, slopes);

					if (after[c] > upo.ColorOutHigh[c]
					    || after[c] < upo.ColorOutLow[c]
					    || (int)Math.Floor (before[c]) < 0
					    || (int)Math.Ceiling (before[c]) > 255
					    || float.IsNaN (before[c])) {
						channelHistogramOutput[v] = 0;
					} else if (before[c] <= upo.ColorInLow[c]) {
						channelHistogramOutput[v] = 0;

						for (int i = 0; i <= upo.ColorInLow[c]; i++) {
							channelHistogramOutput[v] += channelHistogramInput[i];
						}
					} else if (before[c] >= upo.ColorInHigh[c]) {
						channelHistogramOutput[v] = 0;

						for (int i = upo.ColorInHigh[c]; i < 256; i++) {
							channelHistogramOutput[v] += channelHistogramInput[i];
						}
					} else {
						channelHistogramOutput[v] = (int)(slopes[c] * Utility.Lerp (
						    channelHistogramInput[(int)Math.Floor (before[c])],
						    channelHistogramInput[(int)Math.Ceiling (before[c])],
						    before[c] - Math.Floor (before[c])));
					}
				}
			}

			OnHistogramUpdated ();
		}
		public object Clone ()
		{
			LevelOp copy = new LevelOp (colorInLow, colorInHigh, (float[])gamma.Clone (), colorOutLow, colorOutHigh);

			copy.CurveB = (byte[])this.CurveB.Clone ();
			copy.CurveG = (byte[])this.CurveG.Clone ();
			copy.CurveR = (byte[])this.CurveR.Clone ();

			return copy;
		}