public override void AnalyzeImage(IBitmapCore image)
        {
            int points = 100;                   // TODO: Make option

            ToneStageOperationParameters pm = (ToneStageOperationParameters)Parameters;

            if (pm.AutoDarkTone)
            {
                mAnalyzedDarkTone = image.FindDarkTone(
                    pm.LightTone,
                    pm.Edge,
                    pm.Softness,
                    pm.AutoDarkCenter,
                    pm.AutoDarkRadius,
                    points);
                toneselectorwidget1.SelectedDarkTone       = mAnalyzedDarkTone;
                toneselectorwidget1.DarkToneSelectorSymbol = ToneSelectorSymbol.Dot;
            }
            if (pm.AutoLightTone)
            {
                mAnalyzedLightTone = image.FindLightTone(
                    pm.DarkTone,
                    pm.Edge,
                    pm.Softness,
                    pm.AutoLightCenter,
                    pm.AutoLightRadius,
                    points);
                toneselectorwidget1.SelectedLightTone       = mAnalyzedLightTone;
                toneselectorwidget1.LightToneSelectorSymbol = ToneSelectorSymbol.Dot;
            }
        }
        public override bool ReportMouseButton(int x, int y, int width, int height, uint button_id, bool is_down)
        {
            if (width == 0 || height == 0)
            {
                return(false);
            }

            if (is_down)
            {
                mIsMouseDown = true;
                mButtonDown  = button_id;
                mScrCenter   = new Point(x, y);
                mScrSide     = new Point(x + 1, y + 1);
            }
            else
            {
                // Setting the Parameters
                if (mButtonDown == 1 /* left */)
                {
                    ToneStageOperationParameters pms = (ToneStageOperationParameters)Parameters;

                    pms.AutoDarkCenter = new Point(mScrCenter.X / width, mScrCenter.Y / height);
                    pms.AutoDarkRadius = Point.Distance(mScrCenter, mScrSide) * 2 / (width + height);
                    pms.AutoDarkTone   = true;
                    toneselectorwidget1.DarkToneSelectorSymbol = ToneSelectorSymbol.None;
                }
                else if (mButtonDown == 3 /* right */)
                {
                    ToneStageOperationParameters pms = (ToneStageOperationParameters)Parameters;

                    pms.AutoLightCenter = new Point(mScrCenter.X / width, mScrCenter.Y / height);
                    pms.AutoLightRadius = Point.Distance(mScrCenter, mScrSide) * 2 / (width + height);
                    pms.AutoLightTone   = true;
                    toneselectorwidget1.LightToneSelectorSymbol = ToneSelectorSymbol.None;
                }

                mIsMouseDown = false;
                mScrCenter   = null; mScrSide = null;
            }
            return(true);
        }
        public override void DrawEditor(IBitmapView view)
        {
            Gdk.Drawable  target             = ((FloatPixmapViewWidget)view).GdkWindow;
            Gdk.Rectangle image_position     = ((FloatPixmapViewWidget)view).CurrentImagePosition;
            ToneStageOperationParameters pms = (ToneStageOperationParameters)Parameters;


            Gdk.GC gc = new Gdk.GC(target);

            gc.Function = Gdk.Function.Copy;

            if (pms.AutoDarkTone)
            {
                // Drawing dark selection
                Point scrDarkCenter = new Point(image_position.X + (int)(pms.AutoDarkCenter.X * view.Image.Width),
                                                image_position.Y + (int)(pms.AutoDarkCenter.Y * view.Image.Height));
                double scrDarkRadius = pms.AutoDarkRadius * (view.Image.Width + view.Image.Height) / 2;

                using (Cairo.Context cc = Gdk.CairoHelper.Create(target))
                {
                    cc.LineCap  = Cairo.LineCap.Round;
                    cc.LineJoin = Cairo.LineJoin.Round;

                    cc.Color = new Cairo.Color(1, 1, 1, 0.3);

                    cc.LineWidth = 3;
                    cc.Arc(scrDarkCenter.X, scrDarkCenter.Y, scrDarkRadius, 0, 2 * Math.PI);
                    cc.ClosePath();
                    cc.Stroke();

                    cc.Color = new Cairo.Color(0, 0, 0, 1);

                    cc.LineWidth = 1;
                    cc.SetDash(new double[] { 3, 3 }, 0);
                    cc.Arc(scrDarkCenter.X, scrDarkCenter.Y, scrDarkRadius, 0, 2 * Math.PI);
                    cc.ClosePath();
                    cc.Stroke();
                }
            }

            if (pms.AutoLightTone)
            {
                // Drawing light selection
                Point scrLightCenter = new Point(image_position.X + (int)(pms.AutoLightCenter.X * view.Image.Width),
                                                 image_position.Y + (int)(pms.AutoLightCenter.Y * view.Image.Height));
                double scrLightRadius = pms.AutoLightRadius * (view.Image.Width + view.Image.Height) / 2;

                using (Cairo.Context cc = Gdk.CairoHelper.Create(target))
                {
                    cc.LineCap  = Cairo.LineCap.Round;
                    cc.LineJoin = Cairo.LineJoin.Round;

                    cc.Color = new Cairo.Color(0, 0, 0, 0.3);

                    cc.LineWidth = 3;
                    cc.Arc(scrLightCenter.X, scrLightCenter.Y, scrLightRadius, 0, 2 * Math.PI);
                    cc.ClosePath();
                    cc.Stroke();

                    cc.Color = new Cairo.Color(1, 1, 1, 1);

                    cc.LineWidth = 1;
                    cc.SetDash(new double[] { 3, 3 }, 0);
                    cc.Arc(scrLightCenter.X, scrLightCenter.Y, scrLightRadius, 0, 2 * Math.PI);
                    cc.ClosePath();
                    cc.Stroke();
                }
            }
        }