aboutsummaryrefslogtreecommitdiffstats
path: root/rd/magick.c
diff options
context:
space:
mode:
Diffstat (limited to 'rd/magick.c')
-rw-r--r--rd/magick.c85
1 files changed, 85 insertions, 0 deletions
diff --git a/rd/magick.c b/rd/magick.c
new file mode 100644
index 0000000..f17e5e3
--- /dev/null
+++ b/rd/magick.c
@@ -0,0 +1,85 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <magick/api.h>
+
+#include "loader.h"
+#include "viewer.h"
+
+extern char *binary;
+
+static int first = 1;
+static ExceptionInfo exception;
+
+struct magick_state {
+ ImageInfo *image_info;
+ Image *image;
+};
+
+static void*
+magick_init(FILE *fp, char *filename, int *width, int *height)
+{
+ struct magick_state *h;
+
+ /* libmagick wants a filename */
+ fclose(fp);
+
+ if (first) {
+ /* init library first time */
+ MagickIncarnate(binary);
+ GetExceptionInfo(&exception);
+ first = 0;
+ }
+
+ h = malloc(sizeof(*h));
+ memset(h,0,sizeof(*h));
+
+ h->image_info=CloneImageInfo(NULL);
+ strcpy(h->image_info->filename,filename);
+ h->image = ReadImage(h->image_info,&exception);
+ if (NULL == h->image) {
+ MagickError(exception.severity,exception.reason,exception.description);
+ goto oops;
+ }
+
+ *width = h->image->rows;
+ *height = h->image->columns;
+ return h;
+
+ oops:
+ if (h->image)
+ DestroyImage(h->image);
+ if (h->image_info)
+ DestroyImageInfo(h->image_info);
+ free(h);
+ return NULL;
+}
+
+static void
+magick_read(unsigned char *dst, int line, void *data)
+{
+ struct magick_state *h = data;
+ DispatchImage (h->image,0,line,h->image->columns, 1,
+ "RGB", 0, data);
+}
+
+static void
+magick_done(void *data)
+{
+ struct magick_state *h = data;
+
+ DestroyImageInfo(h->image_info);
+ DestroyImage(h->image);
+ free(h);
+}
+
+static struct ida_loader magick_loader = {
+ name: "libmagick",
+ init: magick_init,
+ read: magick_read,
+ done: magick_done,
+};
+
+static void __init init_rd(void)
+{
+ load_register(&magick_loader);
+}