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..a3dd5cf --- /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 := 4 + } +} + 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/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) { 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); } } 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); } }