Working on some basic data conversions.
This commit is contained in:
@@ -16,6 +16,7 @@ namespace Progrart.Core.Graphics
|
|||||||
float ColorG;
|
float ColorG;
|
||||||
float ColorB;
|
float ColorB;
|
||||||
float ColorA;
|
float ColorA;
|
||||||
|
SKShader? shader = null;
|
||||||
public override void SetupProperties(Engine engine)
|
public override void SetupProperties(Engine engine)
|
||||||
{
|
{
|
||||||
base.SetupProperties(engine);
|
base.SetupProperties(engine);
|
||||||
@@ -58,6 +59,9 @@ namespace Progrart.Core.Graphics
|
|||||||
EndY = (float)End.Get("y").AsNumber();
|
EndY = (float)End.Get("y").AsNumber();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (__object.Get("Shader") is JsObject shaderObj)
|
||||||
|
shader = ProgrartConversion.ObtainFromJsObject(shaderObj);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public override void Render(RenderContext context)
|
public override void Render(RenderContext context)
|
||||||
@@ -65,12 +69,12 @@ namespace Progrart.Core.Graphics
|
|||||||
base.Render(context);
|
base.Render(context);
|
||||||
context.DrawingCore.canvas.DrawLine(
|
context.DrawingCore.canvas.DrawLine(
|
||||||
context.TranslatePoint((float)StartX, (float)StartY),
|
context.TranslatePoint((float)StartX, (float)StartY),
|
||||||
context.TranslatePoint((float)StartX, (float)StartY),
|
context.TranslatePoint((float)EndX, (float)EndY),
|
||||||
new SkiaSharp.SKPaint()
|
new SKPaint()
|
||||||
{
|
{
|
||||||
ColorF = new SkiaSharp.SKColorF(ColorR, ColorG, ColorB, ColorA),
|
ColorF = new SKColorF(ColorR, ColorG, ColorB, ColorA),
|
||||||
StrokeWidth = Size,
|
StrokeWidth = Size,
|
||||||
|
Shader = shader
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
using Jint.Native;
|
using Jint;
|
||||||
|
using Jint.Native;
|
||||||
|
using Progrart.Core.Graphics;
|
||||||
using SkiaSharp;
|
using SkiaSharp;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@@ -8,8 +10,102 @@ namespace Progrart.Core.JSExecution
|
|||||||
{
|
{
|
||||||
public static class ProgrartConversion
|
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)
|
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;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) }));
|
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) }));
|
obj.Set("Positions", new JsArray(engine, new[] { new JsNumber(0), new JsNumber(1) }));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,6 +35,11 @@ namespace Progrart.Core
|
|||||||
info = new SKImageInfo(W, H);
|
info = new SKImageInfo(W, H);
|
||||||
surface = SKSurface.Create(info);
|
surface = SKSurface.Create(info);
|
||||||
canvas = surface.Canvas;
|
canvas = surface.Canvas;
|
||||||
|
|
||||||
|
}
|
||||||
|
public SKData ToData()
|
||||||
|
{
|
||||||
|
return surface.Snapshot().Encode(SKEncodedImageFormat.Png, 100);
|
||||||
}
|
}
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
using Avalonia;
|
using Avalonia;
|
||||||
using Avalonia.Controls;
|
using Avalonia.Controls;
|
||||||
using Avalonia.Markup.Xaml;
|
using Avalonia.Markup.Xaml;
|
||||||
|
using Avalonia.Media.Imaging;
|
||||||
using Avalonia.Platform.Storage;
|
using Avalonia.Platform.Storage;
|
||||||
using Avalonia.Threading;
|
using Avalonia.Threading;
|
||||||
using Progrart.Controls.TabSystem;
|
using Progrart.Controls.TabSystem;
|
||||||
@@ -39,8 +40,12 @@ public partial class ProgrartEditorPage : UserControl, ITabPage, IEditorPage
|
|||||||
using ProgrartExecutor executor = new ProgrartExecutor();
|
using ProgrartExecutor executor = new ProgrartExecutor();
|
||||||
try
|
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)
|
catch (System.Exception e)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user