From 4a49b39159b11278341cc26ba051a0f595ac43f8 Mon Sep 17 00:00:00 2001 From: Luna Date: Mon, 22 Jul 2019 22:15:06 -0300 Subject: [PATCH 1/4] make magickSave edit Image.curpath --- src/magick.zig | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/src/magick.zig b/src/magick.zig index 0c770f7..e75fd3d 100644 --- a/src/magick.zig +++ b/src/magick.zig @@ -45,35 +45,36 @@ fn magickLoad(image: *Image) !MagickContext { return mctx; } -fn magickSave(image: *Image, mctx: *MagickContext) !void { - var tmpnam = try images.temporaryName(image.allocator); - defer image.allocator.free(tmpnam); +fn magickSave(image: *Image, wand: *mc.MagickWand) !void { + const allocator = image.allocator; - var c_tmpnam = try std.cstr.addNullByte(image.allocator, tmpnam); - defer image.allocator.free(c_tmpnam); + var tmpnam = try images.temporaryName(allocator); + var c_tmpnam = try std.cstr.addNullByte(allocator, tmpnam); + defer allocator.free(c_tmpnam); - std.debug.warn( - "\tmagick: saving from '{}' to '{}'\n", - image.curpath, - c_tmpnam, - ); + std.debug.warn("\tmagick: saving to '{}'..", c_tmpnam); - if (mc.MagickWriteImage(mctx.wand, c_tmpnam.ptr) != 1) + _ = mc.MagickDisplayImage(wand, c":0"); + + if (mc.MagickWriteImage(wand, c_tmpnam.ptr) != 1) return error.MagickWriteFail; + + image.curpath = tmpnam; + std.debug.warn("OK\n"); } pub fn runRotate(image: *Image) !void { var mctx = try magickLoad(image); defer mctx.deinit(); - var bg = mc.NewPixelWand().?; + var bg = mc.NewPixelWand(); defer mc.DestroyPixelWand(bg); - if (mc.PixelSetColor(bg, c"#ffffff") != 1) + if (mc.PixelSetColor(bg, c"#000000") != 1) return error.PixelSetColorFail; - if (mc.MagickRotateImage(mctx.wand, bg, 30) != 1) + if (mc.MagickRotateImage(mctx.wand, bg, f64(30)) != 1) return error.RotateFail; - try magickSave(image, &mctx); + try magickSave(image, mctx.wand); } From f9aa226d9e391cdc9029d8fb9743d65eabfea263 Mon Sep 17 00:00:00 2001 From: Luna Date: Mon, 22 Jul 2019 22:22:01 -0300 Subject: [PATCH 3/4] add proper arguments to rotate cmd --- examples/rotate.scri | 2 +- src/magick.zig | 10 +++++----- src/runner.zig | 17 ++++++++++++++--- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/examples/rotate.scri b/examples/rotate.scri index 0b934c6..acde24d 100644 --- a/examples/rotate.scri +++ b/examples/rotate.scri @@ -1,3 +1,3 @@ load :0; -rotate 30; +rotate 30 #ff00ff; quicksave; diff --git a/src/magick.zig b/src/magick.zig index e75fd3d..7effc94 100644 --- a/src/magick.zig +++ b/src/magick.zig @@ -54,8 +54,6 @@ fn magickSave(image: *Image, wand: *mc.MagickWand) !void { std.debug.warn("\tmagick: saving to '{}'..", c_tmpnam); - _ = mc.MagickDisplayImage(wand, c":0"); - if (mc.MagickWriteImage(wand, c_tmpnam.ptr) != 1) return error.MagickWriteFail; @@ -63,17 +61,19 @@ fn magickSave(image: *Image, wand: *mc.MagickWand) !void { std.debug.warn("OK\n"); } -pub fn runRotate(image: *Image) !void { +/// Rotate the given image. +/// bgfill must point to a null-terminated string. +pub fn runRotate(image: *Image, deg: f32, bgfill: []const u8) !void { var mctx = try magickLoad(image); defer mctx.deinit(); var bg = mc.NewPixelWand(); defer mc.DestroyPixelWand(bg); - if (mc.PixelSetColor(bg, c"#000000") != 1) + if (mc.PixelSetColor(bg, bgfill.ptr) != 1) return error.PixelSetColorFail; - if (mc.MagickRotateImage(mctx.wand, bg, f64(30)) != 1) + if (mc.MagickRotateImage(mctx.wand, bg, deg) != 1) return error.RotateFail; try magickSave(image, mctx.wand); diff --git a/src/runner.zig b/src/runner.zig index 2eeb5f7..f669e9e 100644 --- a/src/runner.zig +++ b/src/runner.zig @@ -258,9 +258,16 @@ pub const Runner = struct { try image.runCustomPlugin(custom.WildNoise, pos, map); } - fn rotateCmd(self: *Runner) !void { + fn rotateCmd( + self: *Runner, + deg: f32, + bgfill: []const u8, + ) !void { var image = try self.getImage(); - try magick.runRotate(image); + var c_bgfill = try std.cstr.addNullByte(self.allocator, bgfill); + defer self.allocator.free(c_bgfill); + + try magick.runRotate(image, deg, c_bgfill); } fn runCommand(self: *Runner, cmd: *lang.Command) !void { @@ -424,7 +431,11 @@ pub const Runner = struct { try self.wildNoiseCmd(pos, &map); }, - .Rotate => try self.rotateCmd(), + .Rotate => blk: { + const deg = try cmd.floatArgAt(0); + const bgfill = try cmd.argAt(1); + try self.rotateCmd(deg, bgfill); + }, else => blk: { std.debug.warn("Unsupported command: {}\n", cmd.command); From c128960451ef24511d55f5332ed5fa7afc01e1e6 Mon Sep 17 00:00:00 2001 From: Luna Date: Mon, 22 Jul 2019 22:27:00 -0300 Subject: [PATCH 4/4] add rotate command to docs --- doc/README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/README.md b/doc/README.md index d03424b..3620102 100644 --- a/doc/README.md +++ b/doc/README.md @@ -159,9 +159,11 @@ Parameters: - `repeat_bytes`, Amount of bytes to preload with random data and repeat throughout the image slice -## TODO `echo split index delay` +## `rotate deg bgfill` -Run an echo filter on the given loaded file. +Rotate the image by `deg` degrees, filling the resulting triangles with `bgfill`. + +`bgfill` is a hex string, e.g `#000000`. ## `quicksave`