diff --git a/Progrart.Core/Graphics/Line.cs b/Progrart.Core/Graphics/Line.cs index 15749c3..3e74c70 100644 --- a/Progrart.Core/Graphics/Line.cs +++ b/Progrart.Core/Graphics/Line.cs @@ -2,20 +2,16 @@ using Jint.Native; using Progrart.Core.JSExecution; using SkiaSharp; +using System.Diagnostics; namespace Progrart.Core.Graphics { public class Line : BaseElement { float Size; - float StartX; - float StartY; - float EndX; - float EndY; - float ColorR; - float ColorG; - float ColorB; - float ColorA; + SKPoint Start; + SKPoint End; + SKColorF Color; SKShader? shader = null; public override void SetupProperties(Engine engine) { @@ -48,15 +44,19 @@ namespace Progrart.Core.Graphics { if (__object.Get("Start") is JsObject Start) { - StartX = (float)Start.Get("x").AsNumber(); - StartY = (float)Start.Get("y").AsNumber(); + this.Start = ProgrartConversion.ObtainSKPointFromJsObject(Start); } } { if (__object.Get("End") is JsObject End) { - EndX = (float)End.Get("x").AsNumber(); - EndY = (float)End.Get("y").AsNumber(); + this.End = ProgrartConversion.ObtainSKPointFromJsObject(End); + } + } + { + if (__object.Get("Color") is JsObject Color) + { + this.Color = ProgrartConversion.ObtainSKColorFFromJsObject(Color); } } @@ -67,17 +67,20 @@ namespace Progrart.Core.Graphics public override void Render(RenderContext context) { base.Render(context); + LoadProperties(); + SKPoint FinalStartPos = context.TranslatePoint(Start); + SKPoint FinalEndPos = context.TranslatePoint(End); + Trace.WriteLine($"Draw Line from {FinalStartPos} to {FinalEndPos} using {Color} with size of {Size}."); context.DrawingCore.canvas.DrawLine( - context.TranslatePoint((float)StartX, (float)StartY), - context.TranslatePoint((float)EndX, (float)EndY), + FinalStartPos, + FinalEndPos, new SKPaint() { - ColorF = new SKColorF(ColorR, ColorG, ColorB, ColorA), + ColorF = Color, StrokeWidth = Size, Shader = shader } ); - } } } diff --git a/Progrart.Core/Graphics/Rectangle.cs b/Progrart.Core/Graphics/Rectangle.cs new file mode 100644 index 0000000..1a9aeee --- /dev/null +++ b/Progrart.Core/Graphics/Rectangle.cs @@ -0,0 +1,7 @@ +namespace Progrart.Core.Graphics +{ + public class Rectangle : BaseElement + { + + } +} diff --git a/Progrart.Core/Graphics/VisualRoot.cs b/Progrart.Core/Graphics/VisualRoot.cs index c8531f3..9c9ee77 100644 --- a/Progrart.Core/Graphics/VisualRoot.cs +++ b/Progrart.Core/Graphics/VisualRoot.cs @@ -5,6 +5,14 @@ namespace Progrart.Core.Graphics { public class ImageRoot : BaseElement { + public override void Render(RenderContext context) + { + base.Render(context); + foreach (var item in Children) + { + item.Render(context); + } + } } public class VisualRoot : BaseElement { @@ -18,11 +26,13 @@ namespace Progrart.Core.Graphics { context.canvas.Translate(tx, ty); context.canvas.RotateDegrees(rotate, context.DrawingCore.Width / 2, context.DrawingCore.Height / 2); - context.canvas.Scale(scale, scale, context.DrawingCore.Width / 2, context.DrawingCore.Height / 2); + if (scale != 1) + context.canvas.Scale(scale, scale, context.DrawingCore.Width / 2, context.DrawingCore.Height / 2); } void Untransform(RenderContext context) { - context.canvas.Scale(scale, scale, context.DrawingCore.Width / 2, context.DrawingCore.Height / 2); + if (scale != 1) + context.canvas.Scale(1 / scale, 1 / scale, context.DrawingCore.Width / 2, context.DrawingCore.Height / 2); context.canvas.RotateDegrees(rotate, context.DrawingCore.Width / 2, context.DrawingCore.Height / 2); context.canvas.Translate(-tx, -ty); } @@ -41,7 +51,7 @@ namespace Progrart.Core.Graphics scale = (float)__object.Get("scale").AsNumber(); } { - scale = (float)__object.Get("rotation").AsNumber(); + rotate = (float)__object.Get("rotation").AsNumber(); } w = (float)__object.Get("width").AsNumber(); h = (float)__object.Get("height").AsNumber(); diff --git a/Progrart.Core/JSExecution/ProgrartConversion.cs b/Progrart.Core/JSExecution/ProgrartConversion.cs index 4516931..d5babbd 100644 --- a/Progrart.Core/JSExecution/ProgrartConversion.cs +++ b/Progrart.Core/JSExecution/ProgrartConversion.cs @@ -10,6 +10,10 @@ namespace Progrart.Core.JSExecution { public static class ProgrartConversion { + public static SKPoint ObtainSKPointFromJsObject(JsObject jsObject) + { + return new SKPoint((float)jsObject.Get("x").AsNumber(), (float)jsObject.Get("y").AsNumber()); + } public static SKColorF ObtainSKColorFFromJsObject(JsObject jsObject) { var r = (float)jsObject.Get("r").AsNumber(); diff --git a/Progrart.Core/JSExecution/ProgrartExecutor.cs b/Progrart.Core/JSExecution/ProgrartExecutor.cs index 6d3226a..4e3fbfd 100644 --- a/Progrart.Core/JSExecution/ProgrartExecutor.cs +++ b/Progrart.Core/JSExecution/ProgrartExecutor.cs @@ -1,6 +1,7 @@ using Jint; using Jint.Native; using Jint.Native.Function; +using Jint.Native.Json; using Progrart.Core.Graphics; using System.Diagnostics; using System.Text.Json; @@ -62,28 +63,26 @@ namespace Progrart.Core.JSExecution } public RenderContext RenderImage(int Scale, string script, ExecuteArguments arguments) { - int width = 1; - int height = 1; - foreach (var item in arguments.data) - { - engine.Engine.SetValue(item.Key, item.Value); - } + float width = 1; + float height = 1; + engine.Symbols = arguments.data; + engine.Execute(script); if (engine.Engine.GetValue("Width") is JsNumber js_width) { - width = (int)(js_width.AsNumber()); + width = (float)(js_width.AsNumber()); } if (engine.Engine.GetValue("Height") is JsNumber js_height) { - height = (int)(js_height.AsNumber()); + height = (float)(js_height.AsNumber()); } - RenderContext renderContext = new RenderContext(width * Scale, width * Scale); + RenderContext renderContext = new RenderContext((int)(width * Scale), (int)(width * Scale)); ImageRoot imageRoot = new ImageRoot(); - engine.Execute(script); var img = engine.Engine.Call("main"); if (ObjectPool[$"{img.Get("id")}"] is BaseElement element) imageRoot.Add(element); imageRoot.Render(renderContext); + renderContext.canvas.Flush(); return renderContext; } public string RegisterObject(object obj) @@ -92,8 +91,8 @@ namespace Progrart.Core.JSExecution ObjectPool[v] = obj; return v; } - public JsObject linear_gradient()=>ProgrartFunctions.linear_gradient(engine.Engine); - public JsObject radial_gradient()=>ProgrartFunctions.radial_gradient(engine.Engine); + public JsObject linear_gradient() => ProgrartFunctions.linear_gradient(engine.Engine); + public JsObject radial_gradient() => ProgrartFunctions.radial_gradient(engine.Engine); public void Dispose() { engine.Dispose(); diff --git a/Progrart.Core/JSExecution/ProgrartFunctions.cs b/Progrart.Core/JSExecution/ProgrartFunctions.cs index a0cdb5b..4517bcd 100644 --- a/Progrart.Core/JSExecution/ProgrartFunctions.cs +++ b/Progrart.Core/JSExecution/ProgrartFunctions.cs @@ -112,10 +112,10 @@ namespace Progrart.Core.JSExecution } public static JsObject CreateLine(ProgrartExecutor executor) { - Line root = new(); - var obj = WrapObject(executor, executor.RegisterObject(root)); - root.__object = obj; - root.SetupProperties(executor.engine.Engine); + Line element = new(); + var obj = WrapObject(executor, executor.RegisterObject(element)); + element.__object = obj; + element.SetupProperties(executor.engine.Engine); return obj; } } diff --git a/Progrart.Core/RenderContext.cs b/Progrart.Core/RenderContext.cs index beadb5f..84cbb21 100644 --- a/Progrart.Core/RenderContext.cs +++ b/Progrart.Core/RenderContext.cs @@ -1,4 +1,5 @@ using SkiaSharp; +using System.Diagnostics; namespace Progrart.Core { @@ -15,6 +16,10 @@ namespace Progrart.Core { return new SKPoint(x * DrawingCore.Width, y * DrawingCore.Height); } + public SKPoint TranslatePoint(SKPoint point) + { + return TranslatePoint(point.X, point.Y); + } public RenderContext(int W, int H) { DrawingCore = new PrimitiveDrawingCore(W, H); @@ -32,10 +37,11 @@ namespace Progrart.Core { Width = W; Height = H; + Trace.WriteLine($"Createing Surface as: {W} x {H}"); info = new SKImageInfo(W, H); surface = SKSurface.Create(info); canvas = surface.Canvas; - + canvas.Clear(); } public SKData ToData() { diff --git a/Progrart/Pages/ProgrartEditorPage.axaml.cs b/Progrart/Pages/ProgrartEditorPage.axaml.cs index 51542b9..a092f1c 100644 --- a/Progrart/Pages/ProgrartEditorPage.axaml.cs +++ b/Progrart/Pages/ProgrartEditorPage.axaml.cs @@ -40,11 +40,25 @@ public partial class ProgrartEditorPage : UserControl, ITabPage, IEditorPage using ProgrartExecutor executor = new ProgrartExecutor(); try { - var result = executor.RenderImage(100, CodeEditor.Text, new ExecuteArguments()); + int Scale = 1024; + if (args is not null) + { + if (args.data.TryGetValue("Scale", out var scale)) + { + if (!int.TryParse(scale, out Scale)) Scale = 1024; + } + } + var result = executor.RenderImage(1024, CodeEditor.Text, args ?? new ExecuteArguments()); var data = result.DrawingCore.ToData(); - using MemoryStream stream = new MemoryStream(); - data.SaveTo(stream); - Bitmap image = new Bitmap(stream); + var imgFile = Path.GetTempFileName(); + Trace.WriteLine($"Generated to:{imgFile}"); + using (var stream = File.OpenWrite(imgFile)) + { + data.SaveTo(stream); + stream.Flush(); + stream.Close(); + } + Bitmap image = new Bitmap(imgFile); PreviewImage.SetImage(image); } catch (System.Exception e) @@ -84,6 +98,18 @@ public partial class ProgrartEditorPage : UserControl, ITabPage, IEditorPage public void Save() { + if (file is not null) + { + string content = CodeEditor.Text; + Task.Run(async () => + { + using var stream = await file.OpenWriteAsync(); + stream.SetLength(0); + using var sw = new StreamWriter(stream); + await sw.WriteAsync(content); + await sw.FlushAsync(); + }); + } } public void SetHost(TabHost host) diff --git a/Progrart/Views/MainView.axaml b/Progrart/Views/MainView.axaml index efeb358..af69ecb 100644 --- a/Progrart/Views/MainView.axaml +++ b/Progrart/Views/MainView.axaml @@ -116,7 +116,7 @@ -