From 94f557d3114f929a85bd29dbb2716c60f3163633 Mon Sep 17 00:00:00 2001 From: Creeper Lv Date: Fri, 16 Jan 2026 20:14:18 +1100 Subject: [PATCH] Added find and load bitmap feature in PrimitiveDrawingCore. Added a PixImage element. --- Progrart.Core/Graphics/PixImage.cs | 135 ++++++++++++++++++ .../JSExecution/ProgrartConversion.cs | 16 +++ Progrart.Core/JSExecution/ProgrartExecutor.cs | 5 +- Progrart.Core/PrimitiveDrawingCore.cs | 18 +++ Progrart.Core/RenderContext.cs | 4 + 5 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 Progrart.Core/Graphics/PixImage.cs diff --git a/Progrart.Core/Graphics/PixImage.cs b/Progrart.Core/Graphics/PixImage.cs new file mode 100644 index 0000000..d5fbf1c --- /dev/null +++ b/Progrart.Core/Graphics/PixImage.cs @@ -0,0 +1,135 @@ +using Jint; +using Jint.Native; +using Progrart.Core.JSExecution; +using SkiaSharp; + +namespace Progrart.Core.Graphics +{ + public class PixImage : BaseElement + { + + float StrokeWidth; + SKPoint Start; + SKPoint Size; + SKColorF Color; + SKRect sourceRect; + bool useClip = false; + bool IsStroke; + string? imgFile = null; + SKShader? shader = null; + public override void SetupProperties(Engine engine) + { + base.SetupProperties(engine); + if (__object != null) + { + { + JsObject point = new JsObject(engine); + point.Set("x", 0); + point.Set("y", 0); + __object.Set("Position", point); + } + { + JsObject point = new JsObject(engine); + point.Set("x", 0); + point.Set("y", 0); + point.Set("w", 0); + point.Set("h", 0); + __object.Set("Clip", point); + } + __object.Set("StrokeWidth", 1); + __object.Set("IsStroke", true); + __object.Set("UseClip", false); + __object.Set("Source", ""); + __object.Set("Color", ProgrartFunctions.color(engine, 1, 1, 1, 1)); + { + JsObject point = new JsObject(engine); + point.Set("x", 0); + point.Set("y", 0); + __object.Set("Size", point); + } + + } + + } + public override void LoadProperties() + { + if (__object is not null) + { + StrokeWidth = (float)__object.Get("StrokeWidth").AsNumber(); + IsStroke = (bool)__object.Get("IsStroke").AsBoolean(); + useClip = (bool)__object.Get("UseClip").AsBoolean(); + { + if (__object.Get("Position") is JsObject Start) + { + this.Start = ProgrartConversion.ObtainSKPointFromJsObject(Start); + } + } + { + if (__object.Get("Size") is JsObject End) + { + this.Size = ProgrartConversion.ObtainSKPointFromJsObject(End); + } + } + { + if (__object.Get("Clip") is JsObject End) + { + this.sourceRect = ProgrartConversion.ObtainSKRectFromJsObject_XYWH_Style(End); + } + } + { + if (__object.Get("Color") is JsObject Color) + { + this.Color = ProgrartConversion.ObtainSKColorFFromJsObject(Color); + } + } + + if (__object.Get("Shader") is JsObject shaderObj) + shader = ProgrartConversion.ObtainFromJsObject(shaderObj); + + if (__object.Get("Source") is JsString source) + this.imgFile = source.AsString(); + } + } + public override void Render(RenderContext context) + { + base.Render(context); + LoadProperties(); + SKPoint FinalStartPos = context.TranslatePoint(Start); + SKPoint Size = context.TranslatePoint(this.Size); + if (imgFile == null) return; + var bitmap = context.GetBitmap(imgFile); + if (bitmap == null) + { + return; + } + SKRect dest = new(FinalStartPos.X, FinalStartPos.Y, FinalStartPos.X + Size.X, FinalStartPos.Y + Size.Y); + if (useClip) + { + context.canvas.DrawBitmap(bitmap, sourceRect, dest, + new SKPaint() + { + ColorF = Color, + StrokeWidth = context.TranslateSize(StrokeWidth), + Shader = shader, + IsStroke = IsStroke, + IsAntialias = true + } + ); + } + else + { + context.canvas.DrawBitmap(bitmap, new SKRect(0, 0, bitmap.Width, bitmap.Height), + dest, + new SKPaint() + { + ColorF = Color, + StrokeWidth = context.TranslateSize(StrokeWidth), + Shader = shader, + IsStroke = IsStroke, + IsAntialias = true + } + ); + } + } + } +} diff --git a/Progrart.Core/JSExecution/ProgrartConversion.cs b/Progrart.Core/JSExecution/ProgrartConversion.cs index d5babbd..158fa2e 100644 --- a/Progrart.Core/JSExecution/ProgrartConversion.cs +++ b/Progrart.Core/JSExecution/ProgrartConversion.cs @@ -14,6 +14,22 @@ namespace Progrart.Core.JSExecution { return new SKPoint((float)jsObject.Get("x").AsNumber(), (float)jsObject.Get("y").AsNumber()); } + public static SKRect ObtainSKRectFromJsObject(JsObject jsObject) + { + return new SKRect((float)jsObject.Get("x").AsNumber(), + (float)jsObject.Get("y").AsNumber(), + (float)jsObject.Get("w").AsNumber(), + (float)jsObject.Get("h").AsNumber() + ); + } + public static SKRect ObtainSKRectFromJsObject_XYWH_Style(JsObject jsObject) + { + float x = (float)jsObject.Get("x").AsNumber(); + float y = (float)jsObject.Get("y").AsNumber(); + float w = (float)jsObject.Get("w").AsNumber(); + float h = (float)jsObject.Get("h").AsNumber(); + return new SKRect(x, y, x + w, y + h); + } 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 3bc20c4..484751a 100644 --- a/Progrart.Core/JSExecution/ProgrartExecutor.cs +++ b/Progrart.Core/JSExecution/ProgrartExecutor.cs @@ -61,7 +61,9 @@ namespace Progrart.Core.JSExecution engine.Engine.SetValue("path", path); engine.Engine.SetValue("path_element", path_element); engine.Engine.SetValue("circle", circle); - engine.Engine.SetValue("color4", color4); + engine.Engine.SetValue("circle", circle); + engine.Engine.SetValue("piximage", piximage); + engine.Engine.SetValue("piximg", piximage); engine.Engine.SetValue("color3", color3); engine.Engine.SetValue("text", text); engine.Engine.SetValue("color_hex", color_hex); @@ -124,6 +126,7 @@ namespace Progrart.Core.JSExecution { return ProgrartFunctions.CreateVisualRoot(this); } + public JsObject piximage() => ProgrartFunctions.CreateElement(this); public JsObject line() => ProgrartFunctions.CreateElement(this); public JsObject rectangle() => ProgrartFunctions.CreateElement(this); public JsObject roundrect() => ProgrartFunctions.CreateElement(this); diff --git a/Progrart.Core/PrimitiveDrawingCore.cs b/Progrart.Core/PrimitiveDrawingCore.cs index 54f53dd..c657a6f 100644 --- a/Progrart.Core/PrimitiveDrawingCore.cs +++ b/Progrart.Core/PrimitiveDrawingCore.cs @@ -14,6 +14,24 @@ namespace Progrart.Core public SKCanvas canvas { get; } internal IStorageProvider StorageProvider; Dictionary Fonts = new Dictionary(); + Dictionary Bitmaps = new Dictionary(); + public SKBitmap? GetBitmap(string sourceFile) + { + if(Bitmaps.ContainsKey(sourceFile))return Bitmaps[sourceFile]; + else + { + var task = StorageProvider.TryOpenRead(sourceFile); + task.Wait(); + using var stream = task.Result; + if (stream != null) + { + SKBitmap bitmap = SKBitmap.Decode(stream); + Bitmaps[sourceFile] = bitmap; + return bitmap; + } + return null; + } + } public SKTypeface? GetFont(string fontName) { if (Fonts.ContainsKey(fontName)) diff --git a/Progrart.Core/RenderContext.cs b/Progrart.Core/RenderContext.cs index cbf7132..da920cf 100644 --- a/Progrart.Core/RenderContext.cs +++ b/Progrart.Core/RenderContext.cs @@ -14,6 +14,10 @@ namespace Progrart.Core { this.DrawingCore = core; } + public SKBitmap? GetBitmap(string sourceFile) + { + return DrawingCore.GetBitmap(sourceFile); + } public SKTypeface? GetFont(string fontName) { return DrawingCore.GetFont(fontName);