Mercurial > mplayer.hg
diff libass/ass_library.c @ 30200:48d020c5ceca
Update internal libass copy to commit 8db4a5
author | greg |
---|---|
date | Fri, 08 Jan 2010 18:35:44 +0000 |
parents | 0f1b5b68af32 |
children | ac6e48baa03d |
line wrap: on
line diff
--- a/libass/ass_library.c Fri Jan 08 18:19:10 2010 +0000 +++ b/libass/ass_library.c Fri Jan 08 18:35:44 2010 +0000 @@ -1,5 +1,3 @@ -// -*- c-basic-offset: 8; indent-tabs-mode: t -*- -// vim:ts=8:sw=8:noet:ai: /* * Copyright (C) 2006 Evgeniy Stepanov <eugeni.stepanov@gmail.com> * @@ -24,92 +22,126 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <stdarg.h> #include "ass.h" #include "ass_library.h" - +#include "ass_utils.h" -ass_library_t* ass_library_init(void) +static void ass_msg_handler(int level, const char *fmt, va_list va, void *data) { - return calloc(1, sizeof(ass_library_t)); + if (level > MSGL_INFO) + return; + fprintf(stderr, "[ass] "); + vfprintf(stderr, fmt, va); + fprintf(stderr, "\n"); } -void ass_library_done(ass_library_t* priv) +ASS_Library *ass_library_init(void) { - if (priv) { - ass_set_fonts_dir(priv, NULL); - ass_set_style_overrides(priv, NULL); - ass_clear_fonts(priv); - free(priv); - } + ASS_Library* lib = calloc(1, sizeof(*lib)); + lib->msg_callback = ass_msg_handler; + + return lib; } -void ass_set_fonts_dir(ass_library_t* priv, const char* fonts_dir) +void ass_library_done(ASS_Library *priv) { - if (priv->fonts_dir) - free(priv->fonts_dir); - - priv->fonts_dir = fonts_dir ? strdup(fonts_dir) : 0; + if (priv) { + ass_set_fonts_dir(priv, NULL); + ass_set_style_overrides(priv, NULL); + ass_clear_fonts(priv); + free(priv); + } } -void ass_set_extract_fonts(ass_library_t* priv, int extract) +void ass_set_fonts_dir(ASS_Library *priv, const char *fonts_dir) { - priv->extract_fonts = !!extract; + if (priv->fonts_dir) + free(priv->fonts_dir); + + priv->fonts_dir = fonts_dir ? strdup(fonts_dir) : 0; +} + +void ass_set_extract_fonts(ASS_Library *priv, int extract) +{ + priv->extract_fonts = !!extract; } -void ass_set_style_overrides(ass_library_t* priv, char** list) +void ass_set_style_overrides(ASS_Library *priv, char **list) { - char** p; - char** q; - int cnt; + char **p; + char **q; + int cnt; - if (priv->style_overrides) { - for (p = priv->style_overrides; *p; ++p) - free(*p); - free(priv->style_overrides); - } + if (priv->style_overrides) { + for (p = priv->style_overrides; *p; ++p) + free(*p); + free(priv->style_overrides); + } - if (!list) return; - - for (p = list, cnt = 0; *p; ++p, ++cnt) {} + if (!list) + return; - priv->style_overrides = malloc((cnt + 1) * sizeof(char*)); - for (p = list, q = priv->style_overrides; *p; ++p, ++q) - *q = strdup(*p); - priv->style_overrides[cnt] = NULL; + for (p = list, cnt = 0; *p; ++p, ++cnt) { + } + + priv->style_overrides = malloc((cnt + 1) * sizeof(char *)); + for (p = list, q = priv->style_overrides; *p; ++p, ++q) + *q = strdup(*p); + priv->style_overrides[cnt] = NULL; } static void grow_array(void **array, int nelem, size_t elsize) { - if (!(nelem & 31)) - *array = realloc(*array, (nelem + 32) * elsize); + if (!(nelem & 31)) + *array = realloc(*array, (nelem + 32) * elsize); +} + +void ass_add_font(ASS_Library *priv, char *name, char *data, int size) +{ + int idx = priv->num_fontdata; + if (!name || !data || !size) + return; + grow_array((void **) &priv->fontdata, priv->num_fontdata, + sizeof(*priv->fontdata)); + + priv->fontdata[idx].name = strdup(name); + + priv->fontdata[idx].data = malloc(size); + memcpy(priv->fontdata[idx].data, data, size); + + priv->fontdata[idx].size = size; + + priv->num_fontdata++; } -void ass_add_font(ass_library_t* priv, char* name, char* data, int size) +void ass_clear_fonts(ASS_Library *priv) { - int idx = priv->num_fontdata; - if (!name || !data || !size) - return; - grow_array((void**)&priv->fontdata, priv->num_fontdata, sizeof(*priv->fontdata)); - - priv->fontdata[idx].name = strdup(name); - - priv->fontdata[idx].data = malloc(size); - memcpy(priv->fontdata[idx].data, data, size); - - priv->fontdata[idx].size = size; - - priv->num_fontdata ++; + int i; + for (i = 0; i < priv->num_fontdata; ++i) { + free(priv->fontdata[i].name); + free(priv->fontdata[i].data); + } + free(priv->fontdata); + priv->fontdata = NULL; + priv->num_fontdata = 0; } -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 *priv, + void (*msg_cb)(int, const char *, va_list, void *), + void *data) { - int i; - for (i = 0; i < priv->num_fontdata; ++i) { - free(priv->fontdata[i].name); - free(priv->fontdata[i].data); - } - free(priv->fontdata); - priv->fontdata = NULL; - priv->num_fontdata = 0; + if (msg_cb) { + priv->msg_callback = msg_cb; + priv->msg_callback_data = data; + } }