public static async Task <string> GenerateImageFractalFan(
            [ActivityTrigger]
            FractalInput input,
            [SignalR(HubName = "carlintveld")] IAsyncCollector <SignalRMessage> signalRMessages,
            ILogger log)
        {
            if (signalRMessages != null)
            {
                await signalRMessages.AddAsync(new SignalRMessage
                {
                    Target    = "FanoutEvent",
                    Arguments = new object[] { "started", input.imageIndex, $"{input.instance}/{input.name}" }
                });

                await signalRMessages.FlushAsync();
            }

            SKData data = CreateFractalImageData(input);

            await CreateBlob($"{input.instance}/{input.name}.png", data);

            if (signalRMessages != null)
            {
                await signalRMessages.AddAsync(new SignalRMessage
                {
                    Target    = "FanoutEvent",
                    Arguments = new object[] { "finished", input.imageIndex, $"{input.instance}/{input.name}" }
                });

                await signalRMessages.FlushAsync();
            }

            return($"Finished - {input.name}");
        }
        public static string GetSequenceNumber([ActivityTrigger] FractalInput input, ILogger log)
        {
            string connectionString            = System.Environment.GetEnvironmentVariable("AzureStorageConnectionString", EnvironmentVariableTarget.Process);
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
            var client = storageAccount.CreateCloudTableClient();
            var table  = client.GetTableReference("Sequence");

            table.CreateIfNotExistsAsync();
            // var t = new TableEntity()
            var op = TableOperation.Insert(null);

            return("1");
        }
        private static SKData CreateFractalImageData(FractalInput input)
        {
            FractalInit initdata = InitData(0, 0, input.zoom);

            // Create a surface.
            var info = new SKImageInfo(initdata.width, initdata.height, SKImageInfo.PlatformColorType, SKAlphaType.Unpremul);

            //using (var surface = SKSurface.Create(info))
            {
                var mandelbrot = new FractalMandelbrot(initdata);
                var bytes      = mandelbrot.compute();

                // the the canvas and properties
                //var canvas = surface.Canvas;

                //for (int y = 0; y < initdata.height; y++)
                //{
                //    for (int x = 0; x < initdata.width; x++)
                //    {
                //        int index = 4 * (x + y * initdata.width);
                //        canvas.DrawPoint(new SKPoint(x, y), new SKColor(bytes[index + 2], bytes[index + 1], bytes[index]));
                //    }
                //}

                // Optimization taken from https://github.com/mono/SkiaSharp/issues/416
                // create an empty bitmap
                var bitmap = new SKBitmap();
                // pin the managed array so that the GC doesn't move it
                var gcHandle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
                // install the pixels with the color type of the pixel data
                bitmap.InstallPixels(info, gcHandle.AddrOfPinnedObject(), info.RowBytes, delegate { gcHandle.Free(); }, null);

                //using (var image = surface.Snapshot())
                using (var image = SKImage.FromBitmap(bitmap))
                {
                    SKData data = image.Encode(SKEncodedImageFormat.Png, 100);
                    return(data);
                }
            }
        }