Working on some basic data conversions.

This commit is contained in:
Creeper Lv
2025-12-26 22:49:47 +11:00
parent bdeeda44c3
commit 460cc8edd9
5 changed files with 117 additions and 21 deletions

View File

@@ -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
}
);

View File

@@ -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<ShaderType>(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<SKShaderTileMode>(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<SKShaderTileMode>(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;
}
}

View File

@@ -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) }));
}

View File

@@ -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()
{

View File

@@ -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)
{