scritcher/src/magick.zig

61 lines
1.5 KiB
Zig
Raw Normal View History

2019-07-22 22:28:55 +00:00
// imagemagick plugins
const std = @import("std");
const images = @import("image.zig");
const Image = images.Image;
2019-07-22 23:32:50 +00:00
const mc = @cImport({
@cInclude("MagickWand/MagickWand.h");
});
pub const MagickContext = struct {
wand: *mc.MagickWand,
pub fn init() !MagickContext {
mc.MagickWandGenesis();
var wand = mc.NewMagickWand();
if (wand == null) return error.WandCreateFail;
return MagickContext{
.wand = wand.?,
};
}
pub fn deinit(self: *MagickContext) void {
_ = mc.DestroyMagickWand(self.wand);
mc.MagickWandTerminus();
}
pub fn doErr(self: *MagickContext) !void {
return error.WandError;
}
};
2019-07-22 22:28:55 +00:00
pub fn runRotate(image: *Image) !void {
2019-07-22 23:32:50 +00:00
mc.MagickWandGenesis();
var mctx = try MagickContext.init();
defer mctx.deinit();
errdefer mctx.deinit();
var status: mc.MagickBooleanType = undefined;
var curpath = try std.cstr.addNullByte(image.allocator, image.curpath);
defer image.allocator.free(curpath);
status = mc.MagickReadImage(mctx.wand, curpath.ptr);
if (status == .MagickFalse) try mctx.doErr();
// TODO run rotate here
var tmpnam = try images.temporaryName(image.allocator);
defer image.allocator.free(tmpnam);
var c_tmpnam = try std.cstr.addNullByte(image.allocator, tmpnam);
defer image.allocator.free(c_tmpnam);
status = mc.MagickWriteImages(mctx.wand, c_tmpnam.ptr, .MagickTrue);
if (status == .MagickFalse) try mctx.doErr();
2019-07-22 22:28:55 +00:00
}