[Bf-blender-cvs] [cdeda1fa6ce] master: Fix T68272: Annotations segment fault when use Simplify option

Antonio Vazquez noreply at git.blender.org
Mon Aug 5 20:52:21 CEST 2019


Commit: cdeda1fa6ceac749c8fdc39412f0bf605cfcd007
Author: Antonio Vazquez
Date:   Mon Aug 5 20:52:00 2019 +0200
Branches: master
https://developer.blender.org/rBcdeda1fa6ceac749c8fdc39412f0bf605cfcd007

Fix T68272: Annotations segment fault when use Simplify option

This error was introduced with the array dynamic system for very long stroke.

Now, instead to use a custom code for simplify annotations, it uses the standard simplify BKE function more robust and with better results.

The factor of 0.15f has been set fixed after testing a good result value.

===================================================================

M	source/blender/editors/gpencil/annotate_paint.c

===================================================================

diff --git a/source/blender/editors/gpencil/annotate_paint.c b/source/blender/editors/gpencil/annotate_paint.c
index e59e5d6a878..89a0281882f 100644
--- a/source/blender/editors/gpencil/annotate_paint.c
+++ b/source/blender/editors/gpencil/annotate_paint.c
@@ -561,87 +561,6 @@ static short gp_stroke_addpoint(tGPsdata *p, const float mval[2], float pressure
   return GP_STROKEADD_INVALID;
 }
 
-/* simplify a stroke (in buffer) before storing it
- * - applies a reverse Chaikin filter
- * - code adapted from etch-a-ton branch
- */
-static void gp_stroke_simplify(tGPsdata *p)
-{
-  bGPdata *gpd = p->gpd;
-  tGPspoint *old_points = (tGPspoint *)gpd->runtime.sbuffer;
-  short num_points = gpd->runtime.sbuffer_used;
-  short flag = gpd->runtime.sbuffer_sflag;
-  short i, j;
-
-  /* only simplify if simplification is enabled, and we're not doing a straight line */
-  if (!(U.gp_settings & GP_PAINT_DOSIMPLIFY) || (p->paintmode == GP_PAINTMODE_DRAW_STRAIGHT)) {
-    return;
-  }
-
-  /* don't simplify if less than 4 points in buffer */
-  if ((num_points <= 4) || (old_points == NULL)) {
-    return;
-  }
-
-  /* clear buffer (but don't free mem yet) so that we can write to it
-   * - firstly set sbuffer to NULL, so a new one is allocated
-   * - secondly, reset flag after, as it gets cleared auto
-   */
-  gpd->runtime.sbuffer = NULL;
-  gp_session_validatebuffer(p);
-  gpd->runtime.sbuffer_sflag = flag;
-
-/* macro used in loop to get position of new point
- * - used due to the mixture of datatypes in use here
- */
-#define GP_SIMPLIFY_AVPOINT(offs, sfac) \
-  { \
-    co[0] += (float)(old_points[offs].x * sfac); \
-    co[1] += (float)(old_points[offs].y * sfac); \
-    pressure += old_points[offs].pressure * sfac; \
-    time += old_points[offs].time * sfac; \
-  } \
-  (void)0
-
-  /* XXX Here too, do not lose start and end points! */
-  gp_stroke_addpoint(
-      p, &old_points->x, old_points->pressure, p->inittime + (double)old_points->time);
-  for (i = 0, j = 0; i < num_points; i++) {
-    if (i - j == 3) {
-      float co[2], pressure, time;
-      float mco[2];
-
-      /* initialize values */
-      co[0] = 0.0f;
-      co[1] = 0.0f;
-      pressure = 0.0f;
-      time = 0.0f;
-
-      /* using macro, calculate new point */
-      GP_SIMPLIFY_AVPOINT(j, -0.25f);
-      GP_SIMPLIFY_AVPOINT(j + 1, 0.75f);
-      GP_SIMPLIFY_AVPOINT(j + 2, 0.75f);
-      GP_SIMPLIFY_AVPOINT(j + 3, -0.25f);
-
-      /* set values for adding */
-      mco[0] = co[0];
-      mco[1] = co[1];
-
-      /* ignore return values on this... assume to be ok for now */
-      gp_stroke_addpoint(p, mco, pressure, p->inittime + (double)time);
-
-      j += 2;
-    }
-  }
-  gp_stroke_addpoint(p,
-                     &old_points[num_points - 1].x,
-                     old_points[num_points - 1].pressure,
-                     p->inittime + (double)old_points[num_points - 1].time);
-
-  /* free old buffer */
-  MEM_freeN(old_points);
-}
-
 /* make a new stroke from the buffer data */
 static void gp_stroke_newfrombuffer(tGPsdata *p)
 {
@@ -839,6 +758,11 @@ static void gp_stroke_newfrombuffer(tGPsdata *p)
     }
   }
 
+  /* Simplify stroke */
+  if ((U.gp_settings & GP_PAINT_DOSIMPLIFY) || (p->paintmode != GP_PAINTMODE_DRAW_STRAIGHT)) {
+    BKE_gpencil_simplify_stroke(gps, 0.15f);
+  }
+
   /* add stroke to frame */
   BLI_addtail(&p->gpf->strokes, gps);
   gp_stroke_added_enable(p);
@@ -1466,9 +1390,6 @@ static void gp_paint_strokeend(tGPsdata *p)
 
   /* check if doing eraser or not */
   if ((p->gpd->runtime.sbuffer_sflag & GP_STROKE_ERASER) == 0) {
-    /* simplify stroke before transferring? */
-    gp_stroke_simplify(p);
-
     /* transfer stroke to frame */
     gp_stroke_newfrombuffer(p);
   }



More information about the Bf-blender-cvs mailing list