From 0908a56be261915f9155e771bca6593645418da8 Mon Sep 17 00:00:00 2001 From: Oleg Oshmyan Date: Sun, 18 May 2014 00:31:14 +0100 Subject: Introduce ass_drawing_add_chars for adding a whole string at once --- libass/ass_drawing.c | 14 ++++++++++++++ libass/ass_drawing.h | 1 + libass/ass_parse.c | 7 +++---- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/libass/ass_drawing.c b/libass/ass_drawing.c index 258ea30..a5938c5 100644 --- a/libass/ass_drawing.c +++ b/libass/ass_drawing.c @@ -380,6 +380,20 @@ void ass_drawing_add_char(ASS_Drawing* drawing, char symbol) } } +/* + * \brief Add an ASCII string to the drawing text buffer + */ +void ass_drawing_add_chars(ASS_Drawing* drawing, char *str, int n) +{ + if (drawing->i + n + 1 >= drawing->size) { + drawing->size = drawing->i + n + 1; + drawing->text = realloc(drawing->text, drawing->size); + } + + memcpy(drawing->text + drawing->i, str, n); + drawing->text[drawing->i += n] = 0; +} + /* * \brief Create a hashcode for the drawing * XXX: To avoid collisions a better hash algorithm might be useful. diff --git a/libass/ass_drawing.h b/libass/ass_drawing.h index b17d7e3..a6c9186 100644 --- a/libass/ass_drawing.h +++ b/libass/ass_drawing.h @@ -72,6 +72,7 @@ typedef struct { ASS_Drawing *ass_drawing_new(ASS_Library *lib, FT_Library ftlib); void ass_drawing_free(ASS_Drawing* drawing); void ass_drawing_add_char(ASS_Drawing* drawing, char symbol); +void ass_drawing_add_chars(ASS_Drawing* drawing, char *str, int n); void ass_drawing_hash(ASS_Drawing* drawing); FT_Outline *ass_drawing_parse(ASS_Drawing *drawing, int raw_mode); diff --git a/libass/ass_parse.c b/libass/ass_parse.c index adab0e6..a62cea6 100644 --- a/libass/ass_parse.c +++ b/libass/ass_parse.c @@ -241,7 +241,7 @@ static int parse_vector_clip(ASS_Renderer *render_priv, int scale = 1; int res = 0; ASS_Drawing *drawing = render_priv->state.clip_drawing; - char *p; + struct arg text; if (nargs != 1 && nargs != 2) return 0; @@ -255,9 +255,8 @@ static int parse_vector_clip(ASS_Renderer *render_priv, drawing->scale = scale; drawing->scale_x = render_priv->font_scale_x * render_priv->font_scale; drawing->scale_y = render_priv->font_scale; - p = args[nargs - 1].start; - while (p < args[nargs - 1].end) - ass_drawing_add_char(drawing, *p++); + text = args[nargs - 1]; + ass_drawing_add_chars(drawing, text.start, text.end - text.start); return 1; } -- cgit v1.2.3