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` 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 0c770f7..7effc94 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) + 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 { +/// 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().?; + var bg = mc.NewPixelWand(); defer mc.DestroyPixelWand(bg); - if (mc.PixelSetColor(bg, c"#ffffff") != 1) + if (mc.PixelSetColor(bg, bgfill.ptr) != 1) return error.PixelSetColorFail; - if (mc.MagickRotateImage(mctx.wand, bg, 30) != 1) + if (mc.MagickRotateImage(mctx.wand, bg, deg) != 1) return error.RotateFail; - try magickSave(image, &mctx); + 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);