public void Save(Stream stream, PageContainerViewModel container) { using var wstream = new SKManagedWStream(stream); using var canvas = SKSvgCanvas.Create(SKRect.Create(0, 0, (int)container.Template.Width, (int)container.Template.Height), stream); _presenter.Render(canvas, _renderer, null, container, 0, 0); }
private void UpdateSvg() { bool exportPresenter = _previewWindow.svgExport.IsChecked == true; bool showPrintable = _previewWindow.svgPrintable.IsChecked == true; Task.Factory.StartNew(() => { try { IImageCache ic = _projectEditor.Project; var container = _projectEditor.Project.CurrentContainer; var renderer = new SkiaRenderer(true, 96.0); if (!showPrintable) { renderer.State.DrawShapeState.Flags = ShapeStateFlags.Printable; } renderer.State.ImageCache = _projectEditor.Project; var presenter = exportPresenter ? (ContainerPresenter)new ExportPresenter() : (ContainerPresenter)new EditorPresenter(); using (var ms = new MemoryStream()) { using (var stream = new SKManagedWStream(ms)) { using (var writer = new SKXmlStreamWriter(stream)) using (var canvas = SKSvgCanvas.Create(SKRect.Create(0, 0, (int)container.Width, (int)container.Height), writer)) { presenter.Render(canvas, renderer, container, 0, 0); } stream.Flush(); } var svg = Encoding.ASCII.GetString(ms.GetBuffer(), 0, (int)ms.Length); Dispatcher.Invoke(() => { _previewWindow.svgText.Text = svg; }); } } catch (Exception) { } }); }
private async Task <byte[]> GenerateDiagram(CommandContext ctx, IEnumerable <IGrouping <long, Slavereports> > groupedReports, TimeSpan timespan) { if (groupedReports.Count() > 5) { throw new ArgumentOutOfRangeException("Maximum allowed number of users in a diagram is 5"); } const int ImageWidth = 1024; const int ImageHeight = 800; const int DiagramSpacingLeft = 90; // Spacing on the left of the Y line const int DiagramSpacingBottom = 120; // Spacing below the X line SKBitmap bmp = new SKBitmap(ImageWidth, ImageHeight); using SKCanvas canvas = new SKCanvas(bmp); // Set black background canvas.Clear(new SKColor(47, 49, 54)); // Create all colors and strokes needed later on SKPaint diagramPaint = new SKPaint() { Color = new SKColor(200, 200, 230), StrokeWidth = 3, IsAntialias = true, }; SKPaint diagramPaintThicc = new SKPaint() { Color = new SKColor(200, 200, 230), StrokeWidth = 6, IsAntialias = true }; SKPaint textPaint = new SKPaint() { Color = new SKColor(200, 200, 230), TextSize = 18f, TextAlign = SKTextAlign.Center, IsAntialias = true, IsEmbeddedBitmapText = true }; SKPaint leftTextPaint = new SKPaint() { Color = new SKColor(200, 200, 230), TextSize = 18f, TextAlign = SKTextAlign.Right, IsAntialias = true, IsEmbeddedBitmapText = true }; // Draw X and Y lines canvas.DrawLine(new SKPoint(DiagramSpacingLeft, 0), new SKPoint(DiagramSpacingLeft, ImageHeight), diagramPaint); canvas.DrawLine(new SKPoint(0, ImageHeight - DiagramSpacingBottom), new SKPoint(ImageWidth, ImageHeight - DiagramSpacingBottom), diagramPaint); const int rows = 8; // max and min time of all reports var maxTime = groupedReports.Max(g => g.Max(r => r.TimeSpan)); var minTime = groupedReports.Min(g => g.Min(r => r.TimeSpan)); var timeDiff = TimeSpan.FromTicks(maxTime - minTime); var individualTime = TimeSpan.FromTicks(maxTime / rows); var individualRowSpacing = Convert.ToInt32((ImageHeight - DiagramSpacingBottom * 1.4f) / rows); var individualColumnSpacing = Convert.ToInt32((ImageWidth - DiagramSpacingLeft * 1.4f) / (timespan.TotalDays + 1)); for (int i = 1; i <= rows; i++) { var y = ImageHeight - DiagramSpacingBottom - individualRowSpacing * i; canvas.DrawLine(new SKPoint(DiagramSpacingLeft - 10, y), new SKPoint(DiagramSpacingLeft + 10, y), diagramPaintThicc); canvas.DrawText((individualTime * i).ToString("hh\\:mm\\:ss"), new SKPoint(DiagramSpacingLeft - 10, y - 10), leftTextPaint); } var xLineHeight = ImageHeight - DiagramSpacingBottom; for (int i = 1; i <= timespan.TotalDays + 2; i++) { var x = DiagramSpacingLeft + individualColumnSpacing * i; canvas.DrawLine(new SKPoint(x, xLineHeight - 10), new SKPoint(x, xLineHeight + 10), diagramPaintThicc); canvas.DrawText((DateTime.Now - timespan + TimeSpan.FromDays(1) + TimeSpan.FromDays(i - 1)).ToString("dd.MM."), new SKPoint(x, xLineHeight + 30), textPaint); } // Create a color for each user SKColor[] userColors = new SKColor[] { new SKColor(36, 123, 160), new SKColor(112, 193, 179), new SKColor(178, 219, 191), new SKColor(243, 255, 189), new SKColor(225, 22, 84) }; for (int i = 0; i < groupedReports.Count(); i++) { var group = groupedReports.ElementAt(i); var color = userColors[i]; var colorBright = new SKColor((byte)(color.Red + 100 > 255 ? 255 : color.Red + 100), (byte)(color.Green + 100 > 255 ? 255 : color.Green + 100), (byte)(color.Blue + 100 > 255 ? 255 : color.Blue + 100)); var paint = new SKPaint() { Color = color, StrokeWidth = 3, TextSize = 18f, TextAlign = SKTextAlign.Center, IsAntialias = true, IsEmbeddedBitmapText = true }; var paintBright = new SKPaint() { Color = colorBright, StrokeWidth = 3, TextSize = 18f, TextAlign = SKTextAlign.Center, IsAntialias = true, IsEmbeddedBitmapText = true }; SKPoint lastCoord = SKPoint.Empty; var user = await ctx.Client.GetUserAsync(Convert.ToUInt64(group.Key)); var spacePerUser = (ImageWidth - DiagramSpacingLeft) / 5; // Get the avatar HttpClient httpClient = new HttpClient(); var userImgResponse = await httpClient.GetAsync(user.AvatarUrl); // Only add the user avatar if it can be downloaded if (userImgResponse.IsSuccessStatusCode) { DiscordMember member = null; try { member = await ctx.Channel.Guild.GetMemberAsync(user.Id); } catch (Exception) { } var antialiasedPaint = new SKPaint() { IsAntialias = true }; textPaint.GetFontMetrics(out SKFontMetrics metrics); var textSpacing = Convert.ToInt32(metrics.XMax + (metrics.XMax / 4)); var x = DiagramSpacingLeft + 5 + spacePerUser * i; var y = ImageHeight - DiagramSpacingBottom + textSpacing; var fullSpace = DiagramSpacingBottom - textSpacing < spacePerUser ? DiagramSpacingBottom : spacePerUser; var halfSpace = fullSpace / 2; var left = halfSpace / 4 * 1; var top = halfSpace / 4 * 1; var size = halfSpace / 4 * 3; var baseBmp = new SKBitmap(spacePerUser, fullSpace - Convert.ToInt32(textSpacing)); var baseCanvas = new SKCanvas(baseBmp); baseCanvas.Clear(color); var userImgBmp = SKBitmap.Decode(await userImgResponse.Content.ReadAsStreamAsync()); var clippedBmp = new SKBitmap(userImgBmp.Width, userImgBmp.Height); SKCanvas userImgCanvas = new SKCanvas(clippedBmp); userImgCanvas.ClipRoundRect(new SKRoundRect(new SKRect(0, 0, userImgBmp.Width, userImgBmp.Height), 100, 100)); userImgCanvas.DrawBitmap(userImgBmp, 0, 0, antialiasedPaint); userImgCanvas.Flush(); baseCanvas.DrawBitmap(clippedBmp, new SKRect(left, top, left + size, top + size), antialiasedPaint); SKPaint namePaint = new SKPaint() { Color = new SKColor(47, 49, 54), TextAlign = SKTextAlign.Left, TextSize = 18, IsAntialias = true, IsEmbeddedBitmapText = true, }; DrawTextArea(baseCanvas, namePaint, left * 2 + size, top * 2, spacePerUser - left * 2 + size, 15, member?.Nickname ?? user.Username); canvas.DrawBitmap(baseBmp, new SKPoint(x, y), antialiasedPaint); } foreach (var report in group) { var minDate = (DateTime.Now - timespan).Date; var maxDate = (DateTime.Now + TimeSpan.FromDays(1)).Date; var totalSpace = individualColumnSpacing * (timespan.TotalDays + 1); var percentPointPerTick = (float)totalSpace / (maxDate - minDate).Ticks; var x = DiagramSpacingLeft + (percentPointPerTick * (report.TimeOfReport - minDate).Ticks); //Subtract the time of the report from the mindate, to get the time relative from the beginning of the graph. multiply by percentagepoint of a tick on the graph. add spacing, var y = ImageHeight - DiagramSpacingBottom - ((ImageHeight - (DiagramSpacingBottom * 1.4f)) / Convert.ToSingle(maxTime) * report.TimeSpan); var coord = new SKPoint(x, y); canvas.DrawCircle(coord, 8, paint); canvas.DrawText(TimeSpan.FromTicks(report.TimeSpan).ToString(), new SKPoint(coord.X, coord.Y - 10), paintBright); //canvas.DrawText(report.TimeOfReport.ToString(), new SKPoint(coord.X, coord.Y + 15), paintBright); if (lastCoord != SKPoint.Empty) { canvas.DrawLine(lastCoord, coord, paint); } lastCoord = coord; } } using var ms = new MemoryStream(); using SKManagedWStream skStream = new SKManagedWStream(ms); if (SKPixmap.Encode(skStream, bmp, SKEncodedImageFormat.Png, 100)) { return(ms.ToArray()); } return(Array.Empty <byte>()); }
public byte[] Generate(string content, BarcodeType type, int?width, int?height, int?margin, bool?pure) { ZXing.BarcodeFormat barcodeFormat; switch (type) { case BarcodeType.AZTEC: barcodeFormat = ZXing.BarcodeFormat.AZTEC; break; case BarcodeType.CODABAR: barcodeFormat = ZXing.BarcodeFormat.CODABAR; break; case BarcodeType.CODE_39: barcodeFormat = ZXing.BarcodeFormat.CODE_39; break; case BarcodeType.CODE_93: barcodeFormat = ZXing.BarcodeFormat.CODE_93; break; case BarcodeType.CODE_128: barcodeFormat = ZXing.BarcodeFormat.CODE_128; break; case BarcodeType.DATA_MATRIX: barcodeFormat = ZXing.BarcodeFormat.DATA_MATRIX; break; case BarcodeType.EAN_8: barcodeFormat = ZXing.BarcodeFormat.EAN_8; break; case BarcodeType.EAN_13: barcodeFormat = ZXing.BarcodeFormat.EAN_13; break; case BarcodeType.ITF: barcodeFormat = ZXing.BarcodeFormat.ITF; break; case BarcodeType.MAXICODE: barcodeFormat = ZXing.BarcodeFormat.MAXICODE; break; case BarcodeType.PDF_417: barcodeFormat = ZXing.BarcodeFormat.PDF_417; break; case BarcodeType.QR_CODE: barcodeFormat = ZXing.BarcodeFormat.QR_CODE; break; case BarcodeType.RSS_14: barcodeFormat = ZXing.BarcodeFormat.RSS_14; break; case BarcodeType.RSS_EXPANDED: barcodeFormat = ZXing.BarcodeFormat.RSS_EXPANDED; break; case BarcodeType.UPC_A: barcodeFormat = ZXing.BarcodeFormat.UPC_A; break; case BarcodeType.UPC_E: barcodeFormat = ZXing.BarcodeFormat.UPC_E; break; case BarcodeType.UPC_EAN_EXTENSION: barcodeFormat = ZXing.BarcodeFormat.UPC_EAN_EXTENSION; break; case BarcodeType.MSI: barcodeFormat = ZXing.BarcodeFormat.MSI; break; case BarcodeType.PLESSEY: barcodeFormat = ZXing.BarcodeFormat.PLESSEY; break; case BarcodeType.IMB: barcodeFormat = ZXing.BarcodeFormat.IMB; break; default: throw new ArgumentException(); } var barcodeWriter = new ZXing.SkiaSharp.BarcodeWriter { Format = barcodeFormat, }; if (width.HasValue || height.HasValue || margin.HasValue) { barcodeWriter.Options = new EncodingOptions(); if (width.HasValue) { barcodeWriter.Options.Width = width.Value; } if (height.HasValue) { barcodeWriter.Options.Height = height.Value; } if (margin.HasValue) { barcodeWriter.Options.Margin = margin.Value; } if (pure.HasValue) { barcodeWriter.Options.PureBarcode = pure.Value; } } using (var image = barcodeWriter.Write(content)) { using (var memStream = new MemoryStream()) { using (var wstream = new SKManagedWStream(memStream)) { if (image.Encode(wstream, SKEncodedImageFormat.Png, 100)) { return(memStream.ToArray()); } return(null); } } } }
async void OnCanvasViewTapped(object sender, EventArgs e) { List <string> scenes = new List <string>(); string action = await DisplayActionSheet("What to do?", null, null, "Load Scene", "Save Scene", "Delete Scene", "Render Scene"); if (action == "Load Scene") { var sceneDescs = db.Table <SceneDescription>(); foreach (var item in sceneDescs) { scenes.Add(item.sceneName); } string whatToLoad = await DisplayActionSheet("Which scene to load?", null, null, scenes.ToArray()); if (whatToLoad != null) { sc.LoadScene(whatToLoad); sc.SetMainCamera(GetCameraFromEntry()); LoadShapesIntoOC(); LoadLightsIntoOC(); } } else if (action == "Save Scene") { string sceneName = await DisplayPromptAsync("Save Scene", "Scene name:"); sc.SaveScene(sceneName); } else if (action == "Delete Scene") { var sceneDescs = db.Table <SceneDescription>(); foreach (var item in sceneDescs) { scenes.Add(item.sceneName); } string whatToDelete = await DisplayActionSheet("Which scene to load?", null, null, scenes.ToArray()); if (whatToDelete != null) { sc.DeleteScene(whatToDelete); } } else if (action == "Render Scene") { bigImage = new SKBitmap(1024, 1024); sc.mainCamera.finishedRendering = false; sc.mainCamera.Render(bigImage); Toast.MakeText(Android.App.Application.Context, "Rendering, please wait! (it may take a loooong time)", ToastLength.Long).Show(); while (!sc.mainCamera.finishedRendering) { Console.WriteLine("still busy"); await Task.Delay(25); } try { using (MemoryStream ms = new MemoryStream()) { using (SKManagedWStream wstream = new SKManagedWStream(ms)) { bigImage.Encode(wstream, SKEncodedImageFormat.Png, 100); byte[] data = ms.ToArray(); var status = await CrossPermissions.Current.CheckPermissionStatusAsync <StoragePermission>(); if (status != Plugin.Permissions.Abstractions.PermissionStatus.Granted) { await CrossPermissions.Current.ShouldShowRequestPermissionRationaleAsync(Plugin.Permissions.Abstractions.Permission.Storage); status = await CrossPermissions.Current.RequestPermissionAsync <StoragePermission>(); } if (status == Plugin.Permissions.Abstractions.PermissionStatus.Granted) { string filename = DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".png"; if (!Directory.Exists(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath + "/DCIM/xTracer")) { Directory.CreateDirectory(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath + "/DCIM/xTracer"); } if (File.Exists(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath + "/DCIM/xTracer/" + filename)) { File.Delete(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath + "/DCIM/xTracer/" + filename); } using (var stream = File.Create(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath + "/DCIM/xTracer/" + filename)) { stream.Write(data, 0, data.Length); Toast.MakeText(Android.App.Application.Context, "Finished rendering!, saved to " + Android.OS.Environment.ExternalStorageDirectory.AbsolutePath + "/DCIM/xTracer/" + filename, ToastLength.Long).Show(); } } } } } catch (Exception) { throw; } } }
private async void ImageButton_Clicked_2(object sender, EventArgs e) { if (loading.Count == 0) { isRunning = true; string fileName = await DisplayPromptAsync("Save", "What would you like the file name to be?", "OK", "Cancel", "File Name"); //Gives option to save file with a custom name on photo gallery if (fileName != null && fileName != "" && fileName != "Cancel" && fileName != "OK") { option = await DisplayActionSheet("Quality", null, null, "Custom", "Max High", "Ultra High", "High", "Medium", "Low", "Very Low"); Option_Check(); cancel = false; canvasImage.IsVisible = true; canvasImageFast.IsVisible = false; loading.Add("Loading . . . "); double ri; double ci; double l; string downloadMacro; string downloadMicro; if (AdvancedModes.createAdvanced) { downloadMacro = AdvancedModes.macroInput; downloadMicro = AdvancedModes.microInput; ri = AdvancedModes.realInput; ci = AdvancedModes.complexInput; l = AdvancedModes.lengthInput; } else { downloadMacro = selectedColor; downloadMicro = selecterColorMicro; if (item <= 12) { ri = varList1[item]; ci = varList2[item]; l = varList3[item]; } else { ri = SavedFractals[item - 13].SavedReal; ci = SavedFractals[item - 13].SavedComplex; l = SavedFractals[item - 13].SavedLength; } } //Making 2x2 array with size height export and width export Complex complix; Pixel[,] picture = new Pixel[heightExport, widthExport]; int a; int b; //Setting format to Jpeg SKEncodedImageFormat imageFormat = SKEncodedImageFormat.Jpeg; int quality = 100; //For loop with calculations, every column calulated between loading changes //i goes up by the length value to make proportional for (double i = ri * heightExport; i < (ri + l) * heightExport; i += l) { if (cancel) { break; } Loading(); for (double j = ci * widthExport; j < (ci + l) * widthExport; j += l) { if (cancel) { break; } //setting shift of and position a = (int)((i - ri * heightExport) / l); b = (int)((j - ci * widthExport) / l); complix = new Complex((i - (14 * heightExport / 20.0)) / (widthExport / 3.0), (j - (widthExport / 2.0)) / (heightExport / 3.0 * widthExport / heightExport)); int onoff = (int)(Iterate(complix) * 255); updatePixelInputs(downloadMacro, downloadMicro, onoff); picture[a, b] = new Pixel(intInput1, intInput2, intInput3); //Sets individual pixels if (picture[a, b] == null) { picture[a, b] = new Pixel(0, 0, 0); SKColor colorPixelNull = new SKColor((byte)picture[a, b].GetRed(), (byte)picture[a, b].GetGreen(), (byte)picture[a, b].GetBlue()); bitmap.SetPixel(a, b, colorPixelNull); } else { SKColor colorPixel = new SKColor((byte)picture[a, b].GetRed(), (byte)picture[a, b].GetGreen(), (byte)picture[a, b].GetBlue()); bitmap.SetPixel(a, b, colorPixel); } } //Saves image every column using (MemoryStream memStream = new MemoryStream()) using (SKManagedWStream wstream = new SKManagedWStream(memStream)) { bitmap.Encode(wstream, imageFormat, quality); byte[] data = memStream.ToArray(); if (data != null && data.Length != 0) { await DependencyService.Get <IPhotoLibrary>(). SavePhotoAsync(data, "SaveFileFormats", fileName + ".Jpeg"); } } } cancel = false; } heightExport = (int)(Settings.QualityOptions[0].Quality); widthExport = (int)(Settings.QualityOptions[0].Quality); if (loading.Count != 0) { loading.RemoveAt(0); } isRunning = false; } }
public async void GenerateMandelbrotZoom(double ri, double ci, double l, string macroColor, string microColor) { if (loading.Count == 0) { isRunning = true; cancel = false; canvasImage.IsVisible = false; loading.Add("Loading . . . "); bitmapFast = new SKBitmap(widthExport, heightExport, true); canvasImageFast.IsVisible = true; cancel = false; //Making 2x2 array with size height export and width export Complex complix; Pixel[,] picture = new Pixel[widthExport, heightExport]; int a; int b; //Setting format to Jpeg SKEncodedImageFormat imageFormat = SKEncodedImageFormat.Jpeg; int quality = 100; //For loop with calculations, every column calulated between loading changes //i goes up by the length value to make proportional for (double i = ri * widthExport; i < (ri + l) * widthExport; i += l) { if (cancel) { break; } for (double j = ci * heightExport; j < (ci + l) * heightExport; j += l) { if (cancel) { break; } //setting shift of and position a = (int)((i - ri * widthExport) / l); b = (int)((j - ci * heightExport) / l); complix = new Complex((i - (14 * heightExport / 20.0)) / (widthExport / 3.0), (j - (widthExport / 2.0)) / (heightExport / 3.0 * widthExport / heightExport)); int onoff = (int)(Iterate(complix) * 255); updatePixelInputs(macroColor, microColor, onoff); picture[a, b] = new Pixel(intInput1, intInput2, intInput3); //Sets individual pixels if (picture[a, b] == null) { picture[a, b] = new Pixel(0, 0, 0); SKColor colorPixelNull = new SKColor((byte)picture[a, b].GetRed(), (byte)picture[a, b].GetGreen(), (byte)picture[a, b].GetBlue()); bitmapFast.SetPixel(a, b, colorPixelNull); } else { SKColor colorPixel = new SKColor((byte)picture[a, b].GetRed(), (byte)picture[a, b].GetGreen(), (byte)picture[a, b].GetBlue()); bitmapFast.SetPixel(a, b, colorPixel); } } //Saves image every column using (MemoryStream memStream = new MemoryStream()) using (SKManagedWStream wstream = new SKManagedWStream(memStream)) { bitmapFast.Encode(wstream, imageFormat, quality); byte[] data = memStream.ToArray(); if (data != null && data.Length != 0) { string fileName = null; await DependencyService.Get <IPhotoLibrary>(). SavePhotoAsync(data, "SaveFileFormats", fileName + ".Jpeg"); } } Loading(); } loading.RemoveAt(0); isRunning = false; } }
public byte[] DrawAreaAtSize(ImageStats stats, List <CompletePaintOp> paintOps) { //This is the new core drawing function. Once the paint operations have been created, I just draw them here. //baseline image data stuff SKBitmap bitmap = new SKBitmap(stats.imageSizeX, stats.imageSizeY, SKColorType.Rgba8888, SKAlphaType.Premul); SKCanvas canvas = new SKCanvas(bitmap); canvas.Clear(eraser.Color); canvas.Scale(1, -1, stats.imageSizeX / 2, stats.imageSizeY / 2); SKPaint paint = new SKPaint(); foreach (var w in paintOps.OrderByDescending(p => p.paintOp.LayerId).ThenByDescending(p => p.areaSize)) { paint = cachedPaints[w.paintOp.Id]; //SetPaintForTPP(w.paintOp); // w.paintOp.paint; if (w.paintOp.FromTag) //FromTag is for when you are saving color data directly to each element, instead of tying it to a styleset. { paint.Color = SKColor.Parse(w.tagValue); } if (w.paintOp.Randomize) //To randomize the color on every Draw call. { paint.Color = new SKColor((byte)r.Next(0, 255), (byte)r.Next(0, 255), (byte)r.Next(0, 255), 99); } paint.StrokeWidth = (float)w.lineWidthPixels; var path = new SKPath(); switch (w.elementGeometry.GeometryType) { case "Polygon": var p = w.elementGeometry as Polygon; //if (p.Envelope.Length < (stats.degreesPerPixelX * 4)) //This poly's perimeter is too small to draw //continue; path.AddPoly(PolygonToSKPoints(p.ExteriorRing, stats.area, stats.degreesPerPixelX, stats.degreesPerPixelY)); foreach (var ir in p.Holes) { //if (ir.Envelope.Length < (w.lineWidth * 4)) //This poly's perimeter is less than 2x2 pixels in size. //continue; path.AddPoly(PolygonToSKPoints(ir, stats.area, stats.degreesPerPixelX, stats.degreesPerPixelY)); } canvas.DrawPath(path, paint); break; case "MultiPolygon": foreach (var p2 in ((MultiPolygon)w.elementGeometry).Geometries) { //if (p2.Envelope.Length < (stats.degreesPerPixelX * 4)) //This poly's perimeter is too small to draw //continue; var p2p = p2 as Polygon; path.AddPoly(PolygonToSKPoints(p2p.ExteriorRing, stats.area, stats.degreesPerPixelX, stats.degreesPerPixelY)); foreach (var ir in p2p.Holes) { //if (ir.Envelope.Length < (stats.degreesPerPixelX * 4)) //This poly's perimeter is too small to draw // continue; path.AddPoly(PolygonToSKPoints(ir, stats.area, stats.degreesPerPixelX, stats.degreesPerPixelY)); } canvas.DrawPath(path, paint); } break; case "LineString": var firstPoint = w.elementGeometry.Coordinates.First(); var lastPoint = w.elementGeometry.Coordinates.Last(); var points = PolygonToSKPoints(w.elementGeometry, stats.area, stats.degreesPerPixelX, stats.degreesPerPixelY); if (firstPoint.Equals(lastPoint)) { //This is a closed shape. Check to see if it's supposed to be filled in. if (paint.Style == SKPaintStyle.Fill) { path.AddPoly(points); canvas.DrawPath(path, paint); continue; } } //if (w.lineWidth < 1) //Don't draw lines we can't see. //continue; for (var line = 0; line < points.Length - 1; line++) { canvas.DrawLine(points[line], points[line + 1], paint); } break; case "MultiLineString": //if (w.lineWidth < 1) //Don't draw lines we can't see. //continue; foreach (var p3 in ((MultiLineString)w.elementGeometry).Geometries) { var points2 = PolygonToSKPoints(p3, stats.area, stats.degreesPerPixelX, stats.degreesPerPixelY); for (var line = 0; line < points2.Length - 1; line++) { canvas.DrawLine(points2[line], points2[line + 1], paint); } } break; case "Point": var convertedPoint = PolygonToSKPoints(w.elementGeometry, stats.area, stats.degreesPerPixelX, stats.degreesPerPixelY); //If this type has an icon, use it. Otherwise draw a circle in that type's color. if (!string.IsNullOrEmpty(w.paintOp.FileName)) { SKBitmap icon = SKBitmap.Decode(TagParser.cachedBitmaps[w.paintOp.FileName]); //TODO optimize by making icons in Initialize. canvas.DrawBitmap(icon, convertedPoint[0]); } else { var circleRadius = (float)(ConstantValues.resolutionCell10 / stats.degreesPerPixelX / 2); //I want points to be drawn as 1 Cell10 in diameter. canvas.DrawCircle(convertedPoint[0], circleRadius, paint); //TODO re-add outline paint to this DLL not TagParser. //canvas.DrawCircle(convertedPoint[0], circleRadius, TagParser.outlinePaint); } break; default: Log.WriteLog("Unknown geometry type found, not drawn."); break; } } //} var ms = new MemoryStream(); var skms = new SKManagedWStream(ms); bitmap.Encode(skms, SKEncodedImageFormat.Png, 100); var results = ms.ToArray(); skms.Dispose(); ms.Close(); ms.Dispose(); return(results); }