summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGrigori Goronzy <greg@blackbox>2009-07-12 08:01:23 +0200
committerGrigori Goronzy <greg@blackbox>2009-07-12 08:02:52 +0200
commit71fc0fbbf34110050bda200d25eb230b8b044324 (patch)
tree15cc23637cf7a1c461244cfcc3f2c4bf98ab31ca
parentd3cd5b0148d64ae0f6e288e69b09acfe639fdcce (diff)
downloadlibass-71fc0fbbf34110050bda200d25eb230b8b044324.tar.bz2
libass-71fc0fbbf34110050bda200d25eb230b8b044324.tar.xz
Allow passing user data to callback
It is often useful or necessary to pass custom data to a callback. Add an argument to the callback registering function to pass a void pointer object to the callback each time it is called.
-rw-r--r--libass/ass.h3
-rw-r--r--libass/ass_library.c12
-rw-r--r--libass/ass_library.h3
-rw-r--r--libass/ass_utils.c2
-rw-r--r--test/test.c4
5 files changed, 16 insertions, 8 deletions
diff --git a/libass/ass.h b/libass/ass.h
index e0160d6..0a03ec2 100644
--- a/libass/ass.h
+++ b/libass/ass.h
@@ -71,7 +71,8 @@ void ass_set_style_overrides(ass_library_t *priv, char **list);
void ass_process_force_style(ass_track_t *track);
void ass_set_message_cb(ass_library_t *priv,
- void (*msg_cb)(int, char *, va_list *));
+ void (*msg_cb)(int, char *, va_list *, void *),
+ void *data);
/**
* \brief initialize the renderer
diff --git a/libass/ass_library.c b/libass/ass_library.c
index 2a8f5b2..9b6da02 100644
--- a/libass/ass_library.c
+++ b/libass/ass_library.c
@@ -28,7 +28,7 @@
#include "ass_library.h"
#include "ass_utils.h"
-static void ass_msg_handler(int level, char *fmt, va_list *va)
+static void ass_msg_handler(int level, char *fmt, va_list *va, void *data)
{
if (level > MSGL_INFO)
return;
@@ -132,11 +132,17 @@ void ass_clear_fonts(ass_library_t *priv)
* Register a message callback function with libass. Without setting one,
* a default handler is used which prints everything with MSGL_INFO or
* higher to the standard output.
+ *
+ * \param msg_cb the callback function
+ * \param data additional data that will be passed to the callback
*/
void ass_set_message_cb(ass_library_t *priv,
- void (*msg_cb)(int, char *, va_list *))
+ void (*msg_cb)(int, char *, va_list *, void *),
+ void *data)
{
- if (msg_cb)
+ if (msg_cb) {
priv->msg_callback = msg_cb;
+ priv->msg_callback_data = data;
+ }
}
diff --git a/libass/ass_library.h b/libass/ass_library.h
index a73dd6c..85b0842 100644
--- a/libass/ass_library.h
+++ b/libass/ass_library.h
@@ -36,7 +36,8 @@ struct ass_library_s {
ass_fontdata_t *fontdata;
int num_fontdata;
- void (*msg_callback)(int, char *, va_list *);
+ void (*msg_callback)(int, char *, va_list *, void *);
+ void *msg_callback_data;
};
#endif /* LIBASS_LIBRARY_H */
diff --git a/libass/ass_utils.c b/libass/ass_utils.c
index 0592d33..56ca0ef 100644
--- a/libass/ass_utils.c
+++ b/libass/ass_utils.c
@@ -126,7 +126,7 @@ void ass_msg(ass_library_t *priv, int lvl, char *fmt, ...)
{
va_list va;
va_start(va, fmt);
- priv->msg_callback(lvl, fmt, &va);
+ priv->msg_callback(lvl, fmt, &va, priv->msg_callback_data);
va_end(va);
}
diff --git a/test/test.c b/test/test.c
index 47b7f29..8c7b602 100644
--- a/test/test.c
+++ b/test/test.c
@@ -12,7 +12,7 @@ typedef struct image_s {
ass_library_t *ass_library;
ass_renderer_t *ass_renderer;
-void msg_callback(int level, char *fmt, va_list * va)
+void msg_callback(int level, char *fmt, va_list * va, void *data)
{
if (level > 6)
return;
@@ -81,7 +81,7 @@ static void init(int frame_w, int frame_h)
ass_set_fonts_dir(ass_library, "");
ass_set_extract_fonts(ass_library, 0);
ass_set_style_overrides(ass_library, NULL);
- ass_set_message_cb(ass_library, msg_callback);
+ ass_set_message_cb(ass_library, msg_callback, NULL);
ass_renderer = ass_renderer_init(ass_library);
if (!ass_renderer) {