From e43fce622699897c23aeb7527894e39290171924 Mon Sep 17 00:00:00 2001 From: hexaredecimal Date: Sat, 9 Aug 2025 13:57:11 +0200 Subject: [PATCH 1/4] piccode: Adds more functions to the modules --- piccode/context/ctx.pics | 2 +- piccode/filters/filter.pics | 5 ++ piccode/filters/metal/brushMetal.pics | 8 +++ piccode/image/image.pics | 17 +++++ piccode/pen/draw.pics | 3 + .../PiccodeBrushedMetalFilterModule.java | 8 +-- .../editor/nativemods/PiccodeImageModule.java | 56 ++++++++++++++++ .../editor/nativemods/PiccodePenModule.java | 65 +++++++++++++++++++ 8 files changed, 159 insertions(+), 5 deletions(-) create mode 100644 piccode/filters/filter.pics create mode 100644 piccode/filters/metal/brushMetal.pics create mode 100644 piccode/image/image.pics diff --git a/piccode/context/ctx.pics b/piccode/context/ctx.pics index 302b808..72e3ce3 100644 --- a/piccode/context/ctx.pics +++ b/piccode/context/ctx.pics @@ -35,5 +35,5 @@ Context :: module { // // Returns: // - (Unit) Nothing - drop :: (ctx) = pic_nat_gfx_(ctx) + drop :: (ctx) = pic_nat_gfx_drop(ctx) } diff --git a/piccode/filters/filter.pics b/piccode/filters/filter.pics new file mode 100644 index 0000000..244eced --- /dev/null +++ b/piccode/filters/filter.pics @@ -0,0 +1,5 @@ + +Filter :: module { + apply :: (filter, image) = pic_nat_filter_apply(filter, image) +} + diff --git a/piccode/filters/metal/brushMetal.pics b/piccode/filters/metal/brushMetal.pics new file mode 100644 index 0000000..4a846a5 --- /dev/null +++ b/piccode/filters/metal/brushMetal.pics @@ -0,0 +1,8 @@ + + +BrushMetal :: module { + new :: () = pic_nat_brush_metal_new() + radius :: (filter, radius) = pic_nat_brush_metal_set_rad(filter, radius) + amount :: (filter, radius) = pic_nat_brush_metal_set_amount(filter, radius) + shine :: (filter, radius) = pic_nat_brush_metal_set_shine(filter, radius) +} diff --git a/piccode/image/image.pics b/piccode/image/image.pics new file mode 100644 index 0000000..0bd05f5 --- /dev/null +++ b/piccode/image/image.pics @@ -0,0 +1,17 @@ + +Image :: module { + new :: (w, h) = pic_nat_image_new(w, h) + newWithType :: (w, h, type) = pic_nat_image_new_typed(w, h, type) + getContext :: (img) = pic_nat_image_get_context(img) + fromPath :: (path) = pic_nat_image_new_from_path(path) + + resize :: (img, w, h) = pic_nat_image_resize(img, w, h) + + Type :: module { + RGB := 1 + ARGB := 2 + ARGB_PRE := 3 + BGR := 1 + } +} + diff --git a/piccode/pen/draw.pics b/piccode/pen/draw.pics index 7f14334..4e9e1fa 100644 --- a/piccode/pen/draw.pics +++ b/piccode/pen/draw.pics @@ -59,5 +59,8 @@ Pen :: module { // - (Reference) A modified context with the rendered element. drawOval :: (ctx, x, y, w, h) = pic_nat_draw_oval(ctx, x, y, w, h) + drawImage :: (ctx, image, x, y) = pic_nat_draw_image(ctx, image, x, y) + + drawText :: (ctx, text, x, y) = pic_nat_draw_text(ctx, text, x, y) } diff --git a/src/main/java/org/editor/nativemods/PiccodeBrushedMetalFilterModule.java b/src/main/java/org/editor/nativemods/PiccodeBrushedMetalFilterModule.java index f0e0843..5b46f25 100644 --- a/src/main/java/org/editor/nativemods/PiccodeBrushedMetalFilterModule.java +++ b/src/main/java/org/editor/nativemods/PiccodeBrushedMetalFilterModule.java @@ -74,9 +74,9 @@ public static void addFunctions() { } var filter = (BrushedMetalFilter) _filter_object; - var _amount = (int) (double) ((PiccodeNumber) amount).raw(); + var _amount = (float) (double) ((PiccodeNumber) amount).raw(); - filter.setRadius(_amount); + filter.setAmount(_amount); return new PiccodeReference(_filter_object); }, null); @@ -100,9 +100,9 @@ public static void addFunctions() { } var filter = (BrushedMetalFilter) _filter_object; - var _shine = (int) (double) ((PiccodeNumber) shine).raw(); + var _shine = (float) (double) ((PiccodeNumber) shine).raw(); - filter.setRadius(_shine); + filter.setShine(_shine); return new PiccodeReference(_filter_object); }, null); diff --git a/src/main/java/org/editor/nativemods/PiccodeImageModule.java b/src/main/java/org/editor/nativemods/PiccodeImageModule.java index e40654f..3d895ce 100644 --- a/src/main/java/org/editor/nativemods/PiccodeImageModule.java +++ b/src/main/java/org/editor/nativemods/PiccodeImageModule.java @@ -2,10 +2,15 @@ import java.awt.Color; import java.awt.Graphics2D; +import java.awt.Image; import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; import java.util.HashMap; import java.util.List; +import javax.imageio.ImageIO; import org.editor.CanvasFrame; +import org.editor.icons.ImageLoader; import org.piccode.rt.Context; import org.piccode.rt.PiccodeException; import org.piccode.rt.PiccodeNumber; @@ -66,6 +71,57 @@ public static void addFunctions() { return new PiccodeReference(image); }, null); + NativeFunctionFactory.create("image_new_from_path", List.of("path"), (args, namedArgs, frame) -> { + var path = namedArgs.get("path"); + + var ctx = frame == null ? + Context.top + : Context.getContextAt(frame); + var caller = ctx.getTopFrame().caller; + + PiccodeValue.verifyType(caller, path, Type.STRING); + + try { + BufferedImage image = ImageIO.read(new File(path.raw().toString())); + return new PiccodeReference(image); + } catch (IOException ex) { + var def = (BufferedImage) ImageLoader.getImage(-1); + return new PiccodeReference(def); + } + }, null); + + NativeFunctionFactory.create("image_resize", List.of("img" ,"w", "h"), (args, namedArgs, frame) -> { + var img = namedArgs.get("img"); + var w = namedArgs.get("w"); + var h = namedArgs.get("h"); + + var ctx = frame == null ? + Context.top + : Context.getContextAt(frame); + var caller = ctx.getTopFrame().caller; + + PiccodeValue.verifyType(caller, img, Type.REFERENCE); + PiccodeValue.verifyType(caller, w, Type.NUMBER); + PiccodeValue.verifyType(caller, h, Type.NUMBER); + + var _buffered_image = ((PiccodeReference)img).deref(); + + if (!(_buffered_image instanceof BufferedImage)) { + throw new PiccodeException(caller.file, caller.line, caller.column, "Expected a buffer image. Found " + _buffered_image); + } + + var bufferedmage = (BufferedImage) _buffered_image; + + var _w = (int) (double) ((PiccodeNumber) w).raw(); + var _h = (int) (double) ((PiccodeNumber) h).raw(); + + Image resultingImage = bufferedmage.getScaledInstance(_w, _h, Image.SCALE_DEFAULT); + BufferedImage outputImage = new BufferedImage(_w, _h, BufferedImage.TYPE_INT_RGB); + outputImage.getGraphics().drawImage(resultingImage, 0, 0, null); + + return new PiccodeReference(outputImage); + }, null); + NativeFunctionFactory.create("image_get_context", List.of("img"), (args, namedArgs, frame) -> { var img = namedArgs.get("img"); diff --git a/src/main/java/org/editor/nativemods/PiccodePenModule.java b/src/main/java/org/editor/nativemods/PiccodePenModule.java index 11107c0..7c91b5e 100644 --- a/src/main/java/org/editor/nativemods/PiccodePenModule.java +++ b/src/main/java/org/editor/nativemods/PiccodePenModule.java @@ -2,6 +2,7 @@ import java.awt.Color; import java.awt.Graphics2D; +import java.awt.image.BufferedImage; import java.util.HashMap; import java.util.List; import org.editor.CanvasFrame; @@ -165,6 +166,70 @@ public static void addFunctions() { gfx.drawOval(_x, _y, _w, _h); return obj; }, null); + + NativeFunctionFactory.create("draw_image", List.of("ctx", "img", "x", "y"), (args, namedArgs, frame) -> { + var _ctx = namedArgs.get("ctx"); + var _img = namedArgs.get("img"); + var x = namedArgs.get("x"); + var y = namedArgs.get("y"); + + var ctx = frame == null ? + Context.top + : Context.getContextAt(frame); + var caller = ctx.getTopFrame().caller; + + PiccodeValue.verifyType(caller, _ctx, Type.REFERENCE); + PiccodeValue.verifyType(caller, _img, Type.REFERENCE); + PiccodeValue.verifyType(caller, x, Type.NUMBER); + PiccodeValue.verifyType(caller, y, Type.NUMBER); + + var obj = (PiccodeReference) _ctx; + var imgObj = (PiccodeReference) _img; + var _gfx = obj.deref(); + var _image = imgObj.deref(); + if (!(_gfx instanceof Graphics2D)) { + throw new PiccodeException(caller.file, caller.line, caller.column, "Context is not a correct object. Expected Graphics2D"); + } + if (!(_image instanceof BufferedImage)) { + throw new PiccodeException(caller.file, caller.line, caller.column, "Image in not a correct object. Expected a BufferedImage but found" + _image); + } + + var gfx = (Graphics2D) _gfx; + var img = (BufferedImage) _image; + var _x = (int) (double) ((PiccodeNumber) x).raw(); + var _y = (int) (double) ((PiccodeNumber) y).raw(); + + gfx.drawImage(img, _x, _y, null); + return obj; + }, null); + NativeFunctionFactory.create("draw_text", List.of("ctx", "text", "x", "y"), (args, namedArgs, frame) -> { + var _ctx = namedArgs.get("ctx"); + var _text = namedArgs.get("text"); + var x = namedArgs.get("x"); + var y = namedArgs.get("y"); + + var ctx = frame == null ? + Context.top + : Context.getContextAt(frame); + var caller = ctx.getTopFrame().caller; + + PiccodeValue.verifyType(caller, _ctx, Type.REFERENCE); + PiccodeValue.verifyType(caller, _text, Type.STRING); + PiccodeValue.verifyType(caller, x, Type.NUMBER); + PiccodeValue.verifyType(caller, y, Type.NUMBER); + + var obj = (PiccodeReference) _ctx; + var _gfx = obj.deref(); + if (!(_gfx instanceof Graphics2D)) { + throw new PiccodeException(caller.file, caller.line, caller.column, "Context is not a correct object. Expected Graphics2D"); + } + var gfx = (Graphics2D) _gfx; + var _x = (int) (double) ((PiccodeNumber) x).raw(); + var _y = (int) (double) ((PiccodeNumber) y).raw(); + + gfx.drawString(_text.toString(), _x, _y); + return obj; + }, null); } } From 0d3fe2eb89d29ac5bb8778ae94b43cb91663eaa9 Mon Sep 17 00:00:00 2001 From: hexaredecimal Date: Sat, 9 Aug 2025 13:57:48 +0200 Subject: [PATCH 2/4] events: Clear the output window on each compile --- src/main/java/org/editor/events/AccessEvents.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/editor/events/AccessEvents.java b/src/main/java/org/editor/events/AccessEvents.java index 41503e0..2a2e46d 100644 --- a/src/main/java/org/editor/events/AccessEvents.java +++ b/src/main/java/org/editor/events/AccessEvents.java @@ -29,8 +29,9 @@ public static void compileAndRender(ActionEvent e) { var file = ed.file.toString(); var code = ed.textArea.getText(); - CanvasFrame.the().compile(() -> Compiler.compile(file, code)); + AccessFrame.msgs.setText(""); AccessFrame.writeSuccess("Compilation started: "); + CanvasFrame.the().compile(() -> Compiler.compile(file, code)); } public static void compile(ActionEvent e) { From b3754e40ca3badb0fce73f7c3e64ac71df956575 Mon Sep 17 00:00:00 2001 From: hexaredecimal Date: Sat, 9 Aug 2025 13:58:20 +0200 Subject: [PATCH 3/4] Piccode: Register the new modules --- src/main/java/org/piccode/piccode/Piccode.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/org/piccode/piccode/Piccode.java b/src/main/java/org/piccode/piccode/Piccode.java index ba34188..3b03ee6 100644 --- a/src/main/java/org/piccode/piccode/Piccode.java +++ b/src/main/java/org/piccode/piccode/Piccode.java @@ -2,7 +2,10 @@ import org.editor.AccessFrame; import org.editor.EditorWindow; +import org.editor.nativemods.PiccodeBrushedMetalFilterModule; +import org.editor.nativemods.PiccodeFilterModule; import org.editor.nativemods.PiccodeGfxModule; +import org.editor.nativemods.PiccodeImageModule; import org.editor.nativemods.PiccodePenModule; import org.piccode.backend.Compiler; import org.piccode.piccodescript.ErrorAsciiKind; @@ -24,5 +27,8 @@ public static void main(String[] args) { private static void initializeNativeAppModules() { Compiler.addNativeFunctions(PiccodeGfxModule::addFunctions); Compiler.addNativeFunctions(PiccodePenModule::addFunctions); + Compiler.addNativeFunctions(PiccodeBrushedMetalFilterModule::addFunctions); + Compiler.addNativeFunctions(PiccodeFilterModule::addFunctions); + Compiler.addNativeFunctions(PiccodeImageModule::addFunctions); } } From dc03ae2d1c77c115a7614f52427821f2f896807d Mon Sep 17 00:00:00 2001 From: Mfanakagama <51314855+hexaredecimal@users.noreply.github.com> Date: Sat, 9 Aug 2025 14:21:31 +0200 Subject: [PATCH 4/4] Update piccode/image/image.pics Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- piccode/image/image.pics | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/piccode/image/image.pics b/piccode/image/image.pics index 0bd05f5..a3dd5cf 100644 --- a/piccode/image/image.pics +++ b/piccode/image/image.pics @@ -8,10 +8,10 @@ Image :: module { resize :: (img, w, h) = pic_nat_image_resize(img, w, h) Type :: module { - RGB := 1 + RGB := 1 ARGB := 2 ARGB_PRE := 3 - BGR := 1 + BGR := 4 } }