aboutsummaryrefslogtreecommitdiff
path: root/src/backend_librsvg.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend_librsvg.c')
-rw-r--r--src/backend_librsvg.c116
1 files changed, 21 insertions, 95 deletions
diff --git a/src/backend_librsvg.c b/src/backend_librsvg.c
index ff27477..9023b10 100644
--- a/src/backend_librsvg.c
+++ b/src/backend_librsvg.c
@@ -1,12 +1,12 @@
#include "backend.h"
+#include "image.h"
#include "source.h"
+#include "source_private.h"
-#include <assert.h>
+#include <librsvg/rsvg.h>
#include <stdlib.h>
#include <string.h>
-#include <librsvg/rsvg.h>
-
/* Some systems like GNU/Hurd don't define PATH_MAX */
#ifndef PATH_MAX
#define PATH_MAX 4096
@@ -15,85 +15,40 @@
struct private {
void *data;
size_t len;
+ char path[PATH_MAX+8];
};
-static void source_free(struct imv_source *src)
-{
- pthread_mutex_lock(&src->busy);
- free(src->name);
- src->name = NULL;
-
- struct private *private = src->private;
- free(private);
- src->private = NULL;
-
- pthread_mutex_unlock(&src->busy);
- pthread_mutex_destroy(&src->busy);
- free(src);
-}
-
-static void report_error(struct imv_source *src)
+static void free_private(void *raw_private)
{
- assert(src->callback);
-
- struct imv_source_message msg;
- msg.source = src;
- msg.user_data = src->user_data;
- msg.image = NULL;
- msg.error = "Internal error";
-
- pthread_mutex_unlock(&src->busy);
- src->callback(&msg);
+ free(raw_private);
}
-static void send_svg(struct imv_source *src, RsvgHandle *handle)
+static void load_image(void *raw_private, struct imv_image **image, int *frametime)
{
- assert(src->callback);
+ *image = NULL;
+ *frametime = 0;
- struct imv_source_message msg;
- msg.source = src;
- msg.user_data = src->user_data;
- msg.image = imv_image_create_from_svg(handle);
- msg.frametime = 0;
- msg.error = NULL;
-
- pthread_mutex_unlock(&src->busy);
- src->callback(&msg);
-}
-
-static void *load_image(struct imv_source *src)
-{
- /* Don't run if this source is already active */
- if (pthread_mutex_trylock(&src->busy)) {
- return NULL;
- }
+ struct private *private = raw_private;
RsvgHandle *handle = NULL;
GError *error = NULL;
- struct private *private = src->private;
if (private->data) {
handle = rsvg_handle_new_from_data(private->data, private->len, &error);
} else {
- char path[PATH_MAX+8];
- snprintf(path, sizeof path, "file://%s", src->name);
- handle = rsvg_handle_new_from_file(path, &error);
+ handle = rsvg_handle_new_from_file(private->path, &error);
}
- if (!handle) {
- report_error(src);
- return NULL;
+ if (handle) {
+ *image = imv_image_create_from_svg(handle);
}
-
- RsvgDimensionData dim;
- rsvg_handle_get_dimensions(handle, &dim);
- src->width = dim.width;
- src->height = dim.height;
-
- send_svg(src, handle);
- return NULL;
}
+static const struct imv_source_vtable vtable = {
+ .load_first_frame = load_image,
+ .free = free_private
+};
+
static enum backend_result open_path(const char *path, struct imv_source **src)
{
/* Look for an <SVG> tag near the start of the file */
@@ -113,23 +68,9 @@ static enum backend_result open_path(const char *path, struct imv_source **src)
struct private *private = malloc(sizeof *private);
private->data = NULL;
private->len = 0;
+ snprintf(private->path, sizeof private->path, "file://%s", path);
- struct imv_source *source = calloc(1, sizeof *source);
- source->name = strdup(path);
-
- source->width = 1024;
- source->height = 1024;
- source->num_frames = 1;
- source->next_frame = 1;
- pthread_mutex_init(&source->busy, NULL);
- source->load_first_frame = &load_image;
- source->load_next_frame = NULL;
- source->free = &source_free;
- source->callback = NULL;
- source->user_data = NULL;
- source->private = private;
-
- *src = source;
+ *src = imv_source_create(&vtable, private);
return BACKEND_SUCCESS;
}
@@ -151,22 +92,7 @@ static enum backend_result open_memory(void *data, size_t len, struct imv_source
private->data = data;
private->len = len;
- struct imv_source *source = calloc(1, sizeof *source);
- source->name = strdup("-");
-
- source->width = 1024;
- source->height = 1024;
- source->num_frames = 1;
- source->next_frame = 1;
- pthread_mutex_init(&source->busy, NULL);
- source->load_first_frame = &load_image;
- source->load_next_frame = NULL;
- source->free = &source_free;
- source->callback = NULL;
- source->user_data = NULL;
- source->private = private;
-
- *src = source;
+ *src = imv_source_create(&vtable, private);
return BACKEND_SUCCESS;
}