public void TestDisposal() { var plotModel = (IPlotModel)ShowCases.CreateNormalDistributionModel(); ((PlotModel)plotModel).DefaultFont = "Arial"; plotModel.Update(true); string ExportToBitmap(string fileName, SkiaRenderContext context) { using var bitmap = new SKBitmap(800, 600); using var canvas = new SKCanvas(bitmap); context.SkCanvas = canvas; canvas.Clear(SKColors.White); plotModel.Render(context, new OxyRect(0, 0, 800, 600)); var path = Path.Combine(this.outputDirectory, fileName + ".png"); using var fileStream = File.OpenWrite(path); using var skStream = new SKManagedWStream(fileStream); bitmap.Encode(skStream, SKEncodedImageFormat.Png, 0); return(path); } using var renderContext = new SkiaRenderContext() { RenderTarget = RenderTarget.PixelGraphic }; var path1 = ExportToBitmap("export1", renderContext); string path2; using (var renderContext2 = new SkiaRenderContext() { RenderTarget = RenderTarget.PixelGraphic }) { path2 = ExportToBitmap("export2", renderContext2); } var path3 = ExportToBitmap("export3", renderContext); PngAssert.AreEqual(path1, path2, null, null); PngAssert.AreEqual(path1, path3, null, null); }
/// <inheritdoc/> public void Export(IPlotModel model, Stream stream) { using var skStream = new SKManagedWStream(stream); using var canvas = SKSvgCanvas.Create(new SKRect(0, 0, Width, Height), skStream); if (!model.Background.IsInvisible()) { canvas.Clear(model.Background.ToSKColor()); } // SVG export does not work with UseTextShaping=true. However SVG does text shaping by itself anyway, so we can just disable it using var context = new SkiaRenderContext { RenderTarget = RenderTarget.VectorGraphic, SkCanvas = canvas, UseTextShaping = false, DpiScale = Dpi / 96 }; //use fake dpi to scale, looks much better! model.Update(true); model.Render(context, new OxyRect(0, 0, Width / context.DpiScale, Height / context.DpiScale)); }