GaussianBlur2.cs
//
// This code is part of GrapeCity Documents for Imaging samples.
// Copyright (c) GrapeCity, Inc. All rights reserved.
//
using System;
using System.IO;
using System.Drawing;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using GrapeCity.Documents.Drawing;
using GrapeCity.Documents.Text;
using GrapeCity.Documents.Imaging;
using GCTEXT = GrapeCity.Documents.Text;
using GCDRAW = GrapeCity.Documents.Drawing;
using GcImagingWeb.Samples.Common;

namespace GcImagingWeb.Samples
{
    // This example uses the GaussianBlurEffect to draw semi-transparent colored circles ('filters'),
    // blurring the portion of the image behind them.
    public class GaussianBlur2
    {
        public GcBitmap GenerateImage(Size pixelSize, float dpi, bool opaque, string[] sampleParams = null)
        {
            var colors = new Color[]
            {
                Color.Fuchsia,
                Color.Orange,
                Color.Black,
                Color.Blue,
                Color.Red,
                Color.Yellow,
                Color.White,
                Color.Green,
                Color.CornflowerBlue
            };
            colors.Shuffle();

            var imagePath = Path.Combine("Resources", "ImagesBis", "bahamas.jpg");
            var bmp = new GcBitmap(imagePath);

            int xx = bmp.PixelWidth / 3;
            int yy = bmp.PixelHeight / 3;
            int maxr = Math.Min(xx / 2, yy / 2);
            var rnd = Util.NewRandom();

            using var bmpBk = bmp.Clone();

            // Apply blur to a copy of the original bitmap:
            bmpBk.ApplyEffect(GaussianBlurEffect.Get(24, GaussianBlurBorderMode.RepeatEdge));

            using var g = bmp.CreateGraphics();
            var renderer = g.Renderer;
            for (int i = 0; i < 9; i++)
            {
                int r = rnd.Next(maxr / 3, maxr);
                var center = new PointF(rnd.Next(r, xx - r) + i % 3 * xx + 1, rnd.Next(r, yy - r) + i / 3 * yy + 1);
                var rect = new RectangleF(center.X - r, center.Y - r, r + r, r + r);
                var color = colors[i];

                // Use the blurred background to fill circles:
                renderer.BackgroundBitmap = bmpBk;
                g.FillEllipse(rect, Color.FromArgb(96, color));

                // Draw borders normally to hide the artifacts:
                renderer.BackgroundBitmap = null;
                g.DrawEllipse(rect, new GCDRAW.Pen(color, 2));
            }

            return bmp;
        }
    }
}