From 460cc8edd9a6f110e03e7c335e8496ddc3af4100 Mon Sep 17 00:00:00 2001 From: Creeper Lv Date: Fri, 26 Dec 2025 22:49:47 +1100 Subject: [PATCH] Working on some basic data conversions. --- Progrart.Core/Graphics/Line.cs | 12 ++- .../JSExecution/ProgrartConversion.cs | 98 ++++++++++++++++++- .../JSExecution/ProgrartFunctions.cs | 14 --- Progrart.Core/RenderContext.cs | 5 + Progrart/Pages/ProgrartEditorPage.axaml.cs | 9 +- 5 files changed, 117 insertions(+), 21 deletions(-) diff --git a/Progrart.Core/Graphics/Line.cs b/Progrart.Core/Graphics/Line.cs index db58be1..15749c3 100644 --- a/Progrart.Core/Graphics/Line.cs +++ b/Progrart.Core/Graphics/Line.cs @@ -16,6 +16,7 @@ namespace Progrart.Core.Graphics float ColorG; float ColorB; float ColorA; + SKShader? shader = null; public override void SetupProperties(Engine engine) { base.SetupProperties(engine); @@ -58,6 +59,9 @@ namespace Progrart.Core.Graphics EndY = (float)End.Get("y").AsNumber(); } } + + if (__object.Get("Shader") is JsObject shaderObj) + shader = ProgrartConversion.ObtainFromJsObject(shaderObj); } } public override void Render(RenderContext context) @@ -65,12 +69,12 @@ namespace Progrart.Core.Graphics base.Render(context); context.DrawingCore.canvas.DrawLine( context.TranslatePoint((float)StartX, (float)StartY), - context.TranslatePoint((float)StartX, (float)StartY), - new SkiaSharp.SKPaint() + context.TranslatePoint((float)EndX, (float)EndY), + new SKPaint() { - ColorF = new SkiaSharp.SKColorF(ColorR, ColorG, ColorB, ColorA), + ColorF = new SKColorF(ColorR, ColorG, ColorB, ColorA), StrokeWidth = Size, - + Shader = shader } ); diff --git a/Progrart.Core/JSExecution/ProgrartConversion.cs b/Progrart.Core/JSExecution/ProgrartConversion.cs index b30ef0b..4516931 100644 --- a/Progrart.Core/JSExecution/ProgrartConversion.cs +++ b/Progrart.Core/JSExecution/ProgrartConversion.cs @@ -1,4 +1,6 @@ -using Jint.Native; +using Jint; +using Jint.Native; +using Progrart.Core.Graphics; using SkiaSharp; using System; using System.Collections.Generic; @@ -8,8 +10,102 @@ namespace Progrart.Core.JSExecution { public static class ProgrartConversion { + public static SKColorF ObtainSKColorFFromJsObject(JsObject jsObject) + { + var r = (float)jsObject.Get("r").AsNumber(); + var g = (float)jsObject.Get("g").AsNumber(); + var b = (float)jsObject.Get("b").AsNumber(); + float a = 1; + if (jsObject.TryGetValue("a", out var a_str)) + { + a = (float)a_str.AsNumber(); + } + return new SKColorF(r, g, b, a); + } public static SKShader? ObtainFromJsObject(JsObject jsObject) { + var type_str = jsObject.Get("Type").AsString(); + if (Enum.TryParse(type_str, out var type)) + { + switch (type) + { + case ShaderType.LinearGradient: + { + var sx = (float)jsObject.Get("Start").Get("x").AsNumber(); + var sy = (float)jsObject.Get("Start").Get("y").AsNumber(); + var ex = (float)jsObject.Get("End").Get("x").AsNumber(); + var ey = (float)jsObject.Get("End").Get("y").AsNumber(); + SKColor C0 = SKColors.Black; + SKColor C1 = SKColors.White; + float p0 = 0; + float p1 = 1; + if (jsObject.Get("Colors") is JsArray color_array) + { + if (color_array[0] is JsObject c0) + if (color_array[1] is JsObject c1) + { + + C0 = (SKColor)ObtainSKColorFFromJsObject(c0); + C1 = (SKColor)ObtainSKColorFFromJsObject(c1); + + } + } + if (jsObject.Get("Positions") is JsArray pos_array) + { + if (pos_array[0] is JsNumber P0) + if (pos_array[1] is JsNumber P1) + { + p0 = (float)P0.AsNumber(); + p1 = (float)P1.AsNumber(); + } + } + var TileMode_str = jsObject.Get("TileMode").AsString(); + if (Enum.TryParse(TileMode_str, out var SKShaderTileMode)) + return SKShader.CreateLinearGradient(new SKPoint(sx, sy), new SKPoint(ex, ey), + [C0, C1], [p0, p1], SKShaderTileMode); + } + break; + case ShaderType.RadialGradient: + { + var sx = (float)jsObject.Get("Center").Get("x").AsNumber(); + var sy = (float)jsObject.Get("Center").Get("y").AsNumber(); + var radius = (float)jsObject.Get("Radius").AsNumber(); + SKColor C0 = SKColors.Black; + SKColor C1 = SKColors.White; + float p0 = 0; + float p1 = 1; + if (jsObject.Get("Colors") is JsArray color_array) + { + if (color_array[0] is JsObject c0) + if (color_array[1] is JsObject c1) + { + + C0 = (SKColor)ObtainSKColorFFromJsObject(c0); + C1 = (SKColor)ObtainSKColorFFromJsObject(c1); + + } + } + if (jsObject.Get("Positions") is JsArray pos_array) + { + if (pos_array[0] is JsNumber P0) + if (pos_array[1] is JsNumber P1) + { + p0 = (float)P0.AsNumber(); + p1 = (float)P1.AsNumber(); + } + } + var TileMode_str = jsObject.Get("TileMode").AsString(); + if (Enum.TryParse(TileMode_str, out var SKShaderTileMode)) + return SKShader.CreateRadialGradient(new SKPoint(sx, sy), radius, + [C0, C1], [p0, p1], SKShaderTileMode); + } + break; + case ShaderType.Picture: + break; + default: + break; + } + } return null; } } diff --git a/Progrart.Core/JSExecution/ProgrartFunctions.cs b/Progrart.Core/JSExecution/ProgrartFunctions.cs index a7c9177..a0cdb5b 100644 --- a/Progrart.Core/JSExecution/ProgrartFunctions.cs +++ b/Progrart.Core/JSExecution/ProgrartFunctions.cs @@ -53,13 +53,6 @@ namespace Progrart.Core.JSExecution ] )); } - { - obj.Set("Colors", new JsArray(engine, [ - color(engine, 1, 1, 1, 1) , - color(engine, 1, 1, 1, 1) - ] - )); - } { obj.Set("Positions", new JsArray(engine, new[] { new JsNumber(0), new JsNumber(1) })); } @@ -84,13 +77,6 @@ namespace Progrart.Core.JSExecution ] )); } - { - obj.Set("Colors", new JsArray(engine, [ - color(engine, 1, 1, 1, 1) , - color(engine, 1, 1, 1, 1) - ] - )); - } { obj.Set("Positions", new JsArray(engine, new[] { new JsNumber(0), new JsNumber(1) })); } diff --git a/Progrart.Core/RenderContext.cs b/Progrart.Core/RenderContext.cs index 692910e..beadb5f 100644 --- a/Progrart.Core/RenderContext.cs +++ b/Progrart.Core/RenderContext.cs @@ -35,6 +35,11 @@ namespace Progrart.Core info = new SKImageInfo(W, H); surface = SKSurface.Create(info); canvas = surface.Canvas; + + } + public SKData ToData() + { + return surface.Snapshot().Encode(SKEncodedImageFormat.Png, 100); } public void Dispose() { diff --git a/Progrart/Pages/ProgrartEditorPage.axaml.cs b/Progrart/Pages/ProgrartEditorPage.axaml.cs index c2969a3..51542b9 100644 --- a/Progrart/Pages/ProgrartEditorPage.axaml.cs +++ b/Progrart/Pages/ProgrartEditorPage.axaml.cs @@ -1,6 +1,7 @@ using Avalonia; using Avalonia.Controls; using Avalonia.Markup.Xaml; +using Avalonia.Media.Imaging; using Avalonia.Platform.Storage; using Avalonia.Threading; using Progrart.Controls.TabSystem; @@ -39,8 +40,12 @@ public partial class ProgrartEditorPage : UserControl, ITabPage, IEditorPage using ProgrartExecutor executor = new ProgrartExecutor(); try { - executor.RenderImage(100, CodeEditor.Text, new ExecuteArguments()); - + var result = executor.RenderImage(100, CodeEditor.Text, new ExecuteArguments()); + var data = result.DrawingCore.ToData(); + using MemoryStream stream = new MemoryStream(); + data.SaveTo(stream); + Bitmap image = new Bitmap(stream); + PreviewImage.SetImage(image); } catch (System.Exception e) {