]> granicus.if.org Git - libass/commitdiff
Simplify drawing text assignment
authorOleg Oshmyan <chortos@inbox.lv>
Thu, 29 May 2014 23:15:03 +0000 (00:15 +0100)
committerOleg Oshmyan <chortos@inbox.lv>
Fri, 6 Jun 2014 14:10:07 +0000 (15:10 +0100)
libass/ass_drawing.c
libass/ass_drawing.h
libass/ass_parse.c
libass/ass_render.c

index a5938c543d65c5786e65423a5783d5d7a93f4588..7837e2799677c1a0ff8469ec324b87feb5a4c879 100644 (file)
@@ -335,8 +335,6 @@ ASS_Drawing *ass_drawing_new(ASS_Library *lib, FT_Library ftlib)
     ASS_Drawing *drawing;
 
     drawing = calloc(1, sizeof(*drawing));
-    drawing->text = calloc(1, DRAWING_INITIAL_SIZE);
-    drawing->size = DRAWING_INITIAL_SIZE;
     drawing->cbox.xMin = drawing->cbox.yMin = INT_MAX;
     drawing->cbox.xMax = drawing->cbox.yMax = INT_MIN;
     drawing->ftlibrary = ftlib;
@@ -367,31 +365,14 @@ void ass_drawing_free(ASS_Drawing* drawing)
 }
 
 /*
- * \brief Add one ASCII character to the drawing text buffer
+ * \brief Copy an ASCII string to the drawing text buffer
  */
-void ass_drawing_add_char(ASS_Drawing* drawing, char symbol)
+void ass_drawing_set_text(ASS_Drawing* drawing, char *str, size_t len)
 {
-    drawing->text[drawing->i++] = symbol;
-    drawing->text[drawing->i] = 0;
-
-    if (drawing->i + 1 >= drawing->size) {
-        drawing->size *= 2;
-        drawing->text = realloc(drawing->text, drawing->size);
-    }
-}
-
-/*
- * \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;
+    free(drawing->text);
+    drawing->text = malloc(len + 1);
+    memcpy(drawing->text, str, len);
+    drawing->text[len] = 0;
 }
 
 /*
index a6c91868dad97fe858232a95e02ea482eaf2c0ae..62010ebb0a8e15125f9149993cef70c6e44bfa86 100644 (file)
@@ -24,8 +24,6 @@
 
 #include "ass.h"
 
-#define DRAWING_INITIAL_SIZE 256
-
 typedef enum {
     TOKEN_MOVE,
     TOKEN_MOVE_NC,
@@ -46,7 +44,6 @@ typedef struct ass_drawing_token {
 
 typedef struct {
     char *text; // drawing string
-    int i;      // text index
     int scale;  // scale (1-64) for subpixel accuracy
     double pbo; // drawing will be shifted in y direction by this amount
     double scale_x;     // FontScaleX
@@ -60,7 +57,6 @@ typedef struct {
     // private
     FT_Library ftlibrary;   // needed for font ops
     ASS_Library *library;
-    int size;           // current buffer size
     ASS_DrawingToken *tokens;    // tokenized drawing
     int max_points;     // current maximum size
     int max_contours;
@@ -71,8 +67,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_set_text(ASS_Drawing* drawing, char *str, size_t n);
 void ass_drawing_hash(ASS_Drawing* drawing);
 FT_Outline *ass_drawing_parse(ASS_Drawing *drawing, int raw_mode);
 
index afba8a74cc70f7c50f1f69e97db59d7a7dbd0542..2e74842d2b6b21fad41c53d8deb1b189be52b8fc 100644 (file)
@@ -256,7 +256,7 @@ static int parse_vector_clip(ASS_Renderer *render_priv,
     drawing->scale_x = render_priv->font_scale_x * render_priv->font_scale;
     drawing->scale_y = render_priv->font_scale;
     text = args[nargs - 1];
-    ass_drawing_add_chars(drawing, text.start, text.end - text.start);
+    ass_drawing_set_text(drawing, text.start, text.end - text.start);
 
     return 1;
 }
index 0544930e50b064721793141c87f658b0032d07b8..419dc7b94691d378149bafa28889a7b4add94079 100644 (file)
@@ -1934,7 +1934,7 @@ ass_render_event(ASS_Renderer *render_priv, ASS_Event *event,
                     q++;
                 while ((*q != '{') && (*q != 0))
                     q++;
-                ass_drawing_add_chars(drawing, p, q - p);
+                ass_drawing_set_text(drawing, p, q - p);
                 code = 0xfffc; // object replacement character
                 p = q;
                 break;
@@ -1961,7 +1961,7 @@ ass_render_event(ASS_Renderer *render_priv, ASS_Event *event,
         memset(info, 0, sizeof(GlyphInfo));
 
         // Parse drawing
-        if (drawing->i) {
+        if (drawing->text) {
             drawing->scale_x = render_priv->state.scale_x *
                                      render_priv->font_scale;
             drawing->scale_y = render_priv->state.scale_y *