[gimp/gimp-2-10] app: make visited into single-level allocated array.



commit 95bbb2625269e43eeb67b4bbbad1e898cfe3ba30
Author: Jehan <jehan girinstud io>
Date:   Wed Oct 17 15:04:30 2018 +0200

    app: make visited into single-level allocated array.
    
    (cherry picked from commit f19181dcf8043946ecfa31400023216bc78bdbd0)

 app/core/gimplineart.c | 104 ++++++++++++++++++++++++-------------------------
 1 file changed, 52 insertions(+), 52 deletions(-)
---
diff --git a/app/core/gimplineart.c b/app/core/gimplineart.c
index 4bedae193a..81bcaa7506 100644
--- a/app/core/gimplineart.c
+++ b/app/core/gimplineart.c
@@ -459,6 +459,7 @@ gimp_lineart_close (GeglBuffer          *line_art,
       point++;
     }
 
+  g_hash_table_destroy (visited);
   g_array_free (keypoints, TRUE);
   g_object_unref (strokes);
   g_free (normals);
@@ -941,32 +942,32 @@ gimp_lineart_denoise (GeglBuffer *buffer,
                       int         minimum_area)
 {
   /* Keep connected regions with significant area. */
-  GQueue   *q = g_queue_new ();
   GArray   *region;
-  gint      width  = gegl_buffer_get_width (buffer);
-  gint      height = gegl_buffer_get_height (buffer);
-  gboolean  visited[width][height];
+  GQueue   *q       = g_queue_new ();
+  gint      width   = gegl_buffer_get_width (buffer);
+  gint      height  = gegl_buffer_get_height (buffer);
+  gboolean *visited = g_new0 (gboolean, width * height);
+  gint      x, y;
 
-  memset (visited, 0, sizeof (gboolean) * width * height);
   region = g_array_sized_new (TRUE, TRUE, sizeof (Pixel *), minimum_area);
 
-  for (int y = 0; y < height; ++y)
-    for (int x = 0; x < width; ++x)
+  for (y = 0; y < height; ++y)
+    for (x = 0; x < width; ++x)
       {
         guchar has_stroke;
 
         gegl_buffer_sample (buffer, x, y, NULL, &has_stroke, NULL,
                             GEGL_SAMPLER_NEAREST, GEGL_ABYSS_NONE);
-        if (has_stroke && ! visited[x][y])
+        if (has_stroke && ! visited[x + y * width])
           {
             Pixel *p = g_new (Pixel, 1);
-            int    regionSize = 0;
+            gint   regionSize = 0;
 
             p->x = x;
             p->y = y;
 
             g_queue_push_tail (q, p);
-            visited[x][y] = TRUE;
+            visited[x + y * width] = TRUE;
 
             while (! g_queue_is_empty (q))
               {
@@ -980,14 +981,14 @@ gimp_lineart_denoise (GeglBuffer *buffer,
                   {
                     gegl_buffer_sample (buffer, p2x, p2y, NULL, &has_stroke, NULL,
                                         GEGL_SAMPLER_NEAREST, GEGL_ABYSS_NONE);
-                    if (has_stroke && ! visited[p2x][p2y])
+                    if (has_stroke && ! visited[p2x + p2y * width])
                       {
                         Pixel *p2 = g_new (Pixel, 1);
 
                         p2->x = p2x;
                         p2->y = p2y;
                         g_queue_push_tail (q, p2);
-                        visited[p2x][p2y] = TRUE;
+                        visited[p2x +p2y * width] = TRUE;
                       }
                   }
                 p2x = p->x - 1;
@@ -996,14 +997,14 @@ gimp_lineart_denoise (GeglBuffer *buffer,
                   {
                     gegl_buffer_sample (buffer, p2x, p2y, NULL, &has_stroke, NULL,
                                         GEGL_SAMPLER_NEAREST, GEGL_ABYSS_NONE);
-                    if (has_stroke && ! visited[p2x][p2y])
+                    if (has_stroke && ! visited[p2x + p2y * width])
                       {
                         Pixel *p2 = g_new (Pixel, 1);
 
                         p2->x = p2x;
                         p2->y = p2y;
                         g_queue_push_tail (q, p2);
-                        visited[p2x][p2y] = TRUE;
+                        visited[p2x + p2y * width] = TRUE;
                       }
                   }
                 p2x = p->x;
@@ -1012,14 +1013,14 @@ gimp_lineart_denoise (GeglBuffer *buffer,
                   {
                     gegl_buffer_sample (buffer, p2x, p2y, NULL, &has_stroke, NULL,
                                         GEGL_SAMPLER_NEAREST, GEGL_ABYSS_NONE);
-                    if (has_stroke && ! visited[p2x][p2y])
+                    if (has_stroke && ! visited[p2x + p2y * width])
                       {
                         Pixel *p2 = g_new (Pixel, 1);
 
                         p2->x = p2x;
                         p2->y = p2y;
                         g_queue_push_tail (q, p2);
-                        visited[p2x][p2y] = TRUE;
+                        visited[p2x + p2y * width] = TRUE;
                       }
                   }
                 p2x = p->x;
@@ -1028,14 +1029,14 @@ gimp_lineart_denoise (GeglBuffer *buffer,
                   {
                     gegl_buffer_sample (buffer, p2x, p2y, NULL, &has_stroke, NULL,
                                         GEGL_SAMPLER_NEAREST, GEGL_ABYSS_NONE);
-                    if (has_stroke && ! visited[p2x][p2y])
+                    if (has_stroke && ! visited[p2x + p2y * width])
                       {
                         Pixel *p2 = g_new (Pixel, 1);
 
                         p2->x = p2x;
                         p2->y = p2y;
                         g_queue_push_tail (q, p2);
-                        visited[p2x][p2y] = TRUE;
+                        visited[p2x + p2y * width] = TRUE;
                       }
                   }
                 p2x = p->x + 1;
@@ -1044,14 +1045,14 @@ gimp_lineart_denoise (GeglBuffer *buffer,
                   {
                     gegl_buffer_sample (buffer, p2x, p2y, NULL, &has_stroke, NULL,
                                         GEGL_SAMPLER_NEAREST, GEGL_ABYSS_NONE);
-                    if (has_stroke && ! visited[p2x][p2y])
+                    if (has_stroke && ! visited[p2x + p2y * width])
                       {
                         Pixel *p2 = g_new (Pixel, 1);
 
                         p2->x = p2x;
                         p2->y = p2y;
                         g_queue_push_tail (q, p2);
-                        visited[p2x][p2y] = TRUE;
+                        visited[p2x + p2y * width] = TRUE;
                       }
                   }
                 p2x = p->x - 1;
@@ -1060,14 +1061,14 @@ gimp_lineart_denoise (GeglBuffer *buffer,
                   {
                     gegl_buffer_sample (buffer, p2x, p2y, NULL, &has_stroke, NULL,
                                         GEGL_SAMPLER_NEAREST, GEGL_ABYSS_NONE);
-                    if (has_stroke && ! visited[p2x][p2y])
+                    if (has_stroke && ! visited[p2x + p2y * width])
                       {
                         Pixel *p2 = g_new (Pixel, 1);
 
                         p2->x = p2x;
                         p2->y = p2y;
                         g_queue_push_tail (q, p2);
-                        visited[p2x][p2y] = TRUE;
+                        visited[p2x + p2y * width] = TRUE;
                       }
                   }
                 p2x = p->x - 1;
@@ -1076,14 +1077,14 @@ gimp_lineart_denoise (GeglBuffer *buffer,
                   {
                     gegl_buffer_sample (buffer, p2x, p2y, NULL, &has_stroke, NULL,
                                         GEGL_SAMPLER_NEAREST, GEGL_ABYSS_NONE);
-                    if (has_stroke && ! visited[p2x][p2y])
+                    if (has_stroke && ! visited[p2x + p2y * width])
                       {
                         Pixel *p2 = g_new (Pixel, 1);
 
                         p2->x = p2x;
                         p2->y = p2y;
                         g_queue_push_tail (q, p2);
-                        visited[p2x][p2y] = TRUE;
+                        visited[p2x + p2y * width] = TRUE;
                       }
                   }
                 p2x = p->x + 1;
@@ -1092,14 +1093,14 @@ gimp_lineart_denoise (GeglBuffer *buffer,
                   {
                     gegl_buffer_sample (buffer, p2x, p2y, NULL, &has_stroke, NULL,
                                         GEGL_SAMPLER_NEAREST, GEGL_ABYSS_NONE);
-                    if (has_stroke && ! visited[p2x][p2y])
+                    if (has_stroke && ! visited[p2x + p2y * width])
                       {
                         Pixel *p2 = g_new (Pixel, 1);
 
                         p2->x = p2x;
                         p2->y = p2y;
                         g_queue_push_tail (q, p2);
-                        visited[p2x][p2y] = TRUE;
+                        visited[p2x + p2y * width] = TRUE;
                       }
                   }
 
@@ -1126,6 +1127,7 @@ gimp_lineart_denoise (GeglBuffer *buffer,
       }
   g_array_free (region, TRUE);
   g_queue_free_full (q, g_free);
+  g_free (visited);
 }
 
 static void
@@ -1168,27 +1170,25 @@ gimp_lineart_curvature_extremums (gfloat **curvatures,
                                   gint     width,
                                   gint     height)
 {
+  gboolean *visited = g_new0 (gboolean, width * height);
+  GQueue   *q       = g_queue_new ();
   GArray   *max_positions;
-  GQueue   *q = g_queue_new ();
-  gboolean  visited[width][height];
 
-  memset (visited, 0, sizeof (gboolean) * width * height);
   max_positions = g_array_new (FALSE, TRUE, sizeof (Pixel));
 
   for (int y = 0; y < height; ++y)
     for (int x = 0; x < width; ++x)
       {
-        if ((curvatures[x][y] > 0.0) && ! visited[x][y])
+        if ((curvatures[x][y] > 0.0) && ! visited[x + y * width])
           {
-            Pixel   *p = g_new (Pixel, 1);
-            Pixel    max_curvature_pixel = gimp_vector2_new (-1.0, -1.0);
-            gfloat   max_curvature = 0.0f;
-            size_t   count = 0;
+            Pixel  *p = g_new (Pixel, 1);
+            Pixel   max_curvature_pixel = gimp_vector2_new (-1.0, -1.0);
+            gfloat  max_curvature = 0.0f;
 
             p->x = x;
             p->y = y;
             g_queue_push_tail (q, p);
-            visited[x][y] = TRUE;
+            visited[x + y * width] = TRUE;
 
             while (! g_queue_is_empty (q))
               {
@@ -1199,7 +1199,6 @@ gimp_lineart_curvature_extremums (gfloat **curvatures,
                 p = (Pixel *) g_queue_pop_head (q);
                 c = curvatures[(gint) p->x][(gint) p->y];
 
-                ++count;
                 curvatures[(gint) p->x][(gint) p->y] = 0.0f;
 
                 p2x = (gint) p->x + 1;
@@ -1207,14 +1206,14 @@ gimp_lineart_curvature_extremums (gfloat **curvatures,
                 if (p2x >= 0 && p2x < width    &&
                     p2y >= 0 && p2y < height   &&
                     curvatures[p2x][p2y] > 0.0 &&
-                    ! visited[p2x][p2y])
+                    ! visited[p2x + p2y * width])
                   {
                     Pixel *p2 = g_new (Pixel, 1);
 
                     p2->x = p2x;
                     p2->y = p2y;
                     g_queue_push_tail (q, p2);
-                    visited[p2x][p2y] = TRUE;
+                    visited[p2x + p2y * width] = TRUE;
                   }
 
                 p2x = p->x - 1;
@@ -1222,14 +1221,14 @@ gimp_lineart_curvature_extremums (gfloat **curvatures,
                 if (p2x >= 0 && p2x < width    &&
                     p2y >= 0 && p2y < height   &&
                     curvatures[p2x][p2y] > 0.0 &&
-                    ! visited[p2x][p2y])
+                    ! visited[p2x + p2y * width])
                   {
                     Pixel *p2 = g_new (Pixel, 1);
 
                     p2->x = p2x;
                     p2->y = p2y;
                     g_queue_push_tail (q, p2);
-                    visited[p2x][p2y] = TRUE;
+                    visited[p2x + p2y * width] = TRUE;
                   }
 
                 p2x = p->x;
@@ -1237,14 +1236,14 @@ gimp_lineart_curvature_extremums (gfloat **curvatures,
                 if (p2x >= 0 && p2x < width    &&
                     p2y >= 0 && p2y < height   &&
                     curvatures[p2x][p2y] > 0.0 &&
-                    ! visited[p2x][p2y])
+                    ! visited[p2x + p2y * width])
                   {
                     Pixel *p2 = g_new (Pixel, 1);
 
                     p2->x = p2x;
                     p2->y = p2y;
                     g_queue_push_tail (q, p2);
-                    visited[p2x][p2y] = TRUE;
+                    visited[p2x + p2y * width] = TRUE;
                   }
 
                 p2x = p->x;
@@ -1252,14 +1251,14 @@ gimp_lineart_curvature_extremums (gfloat **curvatures,
                 if (p2x >= 0 && p2x < width    &&
                     p2y >= 0 && p2y < height   &&
                     curvatures[p2x][p2y] > 0.0 &&
-                    ! visited[p2x][p2y])
+                    ! visited[p2x + p2y * width])
                   {
                     Pixel *p2 = g_new (Pixel, 1);
 
                     p2->x = p2x;
                     p2->y = p2y;
                     g_queue_push_tail (q, p2);
-                    visited[p2x][p2y] = TRUE;
+                    visited[p2x + p2y * width] = TRUE;
                   }
 
                 p2x = p->x + 1;
@@ -1267,14 +1266,14 @@ gimp_lineart_curvature_extremums (gfloat **curvatures,
                 if (p2x >= 0 && p2x < width    &&
                     p2y >= 0 && p2y < height   &&
                     curvatures[p2x][p2y] > 0.0 &&
-                    ! visited[p2x][p2y])
+                    ! visited[p2x + p2y * width])
                   {
                     Pixel *p2 = g_new (Pixel, 1);
 
                     p2->x = p2x;
                     p2->y = p2y;
                     g_queue_push_tail (q, p2);
-                    visited[p2x][p2y] = TRUE;
+                    visited[p2x + p2y * width] = TRUE;
                   }
 
                 p2x = p->x - 1;
@@ -1282,14 +1281,14 @@ gimp_lineart_curvature_extremums (gfloat **curvatures,
                 if (p2x >= 0 && p2x < width    &&
                     p2y >= 0 && p2y < height   &&
                     curvatures[p2x][p2y] > 0.0 &&
-                    ! visited[p2x][p2y])
+                    ! visited[p2x + p2y * width])
                   {
                     Pixel *p2 = g_new (Pixel, 1);
 
                     p2->x = p2x;
                     p2->y = p2y;
                     g_queue_push_tail (q, p2);
-                    visited[p2x][p2y] = TRUE;
+                    visited[p2x + p2y * width] = TRUE;
                   }
 
                 p2x = p->x - 1;
@@ -1297,14 +1296,14 @@ gimp_lineart_curvature_extremums (gfloat **curvatures,
                 if (p2x >= 0 && p2x < width    &&
                     p2y >= 0 && p2y < height   &&
                     curvatures[p2x][p2y] > 0.0 &&
-                    ! visited[p2x][p2y])
+                    ! visited[p2x + p2y * width])
                   {
                     Pixel *p2 = g_new (Pixel, 1);
 
                     p2->x = p2x;
                     p2->y = p2y;
                     g_queue_push_tail (q, p2);
-                    visited[p2x][p2y] = TRUE;
+                    visited[p2x + p2y * width] = TRUE;
                   }
 
                 p2x = p->x + 1;
@@ -1312,14 +1311,14 @@ gimp_lineart_curvature_extremums (gfloat **curvatures,
                 if (p2x >= 0 && p2x < width    &&
                     p2y >= 0 && p2y < height   &&
                     curvatures[p2x][p2y] > 0.0 &&
-                    ! visited[p2x][p2y])
+                    ! visited[p2x + p2y * width])
                   {
                     Pixel *p2 = g_new (Pixel, 1);
 
                     p2->x = p2x;
                     p2->y = p2y;
                     g_queue_push_tail (q, p2);
-                    visited[p2x][p2y] = TRUE;
+                    visited[p2x + p2y * width] = TRUE;
                   }
 
                 if (c > max_curvature)
@@ -1334,6 +1333,7 @@ gimp_lineart_curvature_extremums (gfloat **curvatures,
           }
       }
   g_queue_free_full (q, g_free);
+  g_free (visited);
 
   return max_positions;
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]