changeset 46:31bfa78dba15

Clean up and fix the flood fill functions.
author Matti Hamalainen <ccr@tnsp.org>
date Wed, 04 Jul 2018 17:34:22 +0300
parents 9b77ed046003
children 706bfe438e6f
files draw_smart.pde mpui.js
diffstat 2 files changed, 176 insertions(+), 154 deletions(-) [+]
line wrap: on
line diff
--- a/draw_smart.pde	Wed Jul 04 17:30:46 2018 +0300
+++ b/draw_smart.pde	Wed Jul 04 17:34:22 2018 +0300
@@ -35,103 +35,19 @@
                 }
             }
         }
-    }
-}
-
-
-void floodfill_mc(int xx, int yy, int mou) {
-    int x, y, molox, ax, ay, valid, okay, par, npar;
-    npar = 0;
-    par = 0;
-    molox = 1;
-
-    for (x = 0; x < X; x++) {
-        for (y = 0; y < Y; y++) {
-            g_fillmap[1024 + x + y * X] = 0;
-        }
-    }
-
-    if (g_multic == 1 || g_hzoomer == 2) molox = 2;
-    if (molox == 2) {
-        xx = chop2(xx);
-    }
-    if (mou == LEFT) {
-        par = g_farge;
-        npar = getmultic(xx, yy, 0);
-    }
-    if (mou == RIGHT) {
-        par = g_backg;
-        npar = getmultic(xx, yy, 0);
-    }
-
-    g_fillmap[1024 + xx + yy * X] = byte(100);
-    if (molox == 2) g_fillmap[1024 + xx + yy * X + 1] = byte(0);
-    valid = 0;
-    okay = 0;
-
-    while (okay == 0) {
-
-        valid = 0;
-
-        for (x = 0; x < X; x = x + molox) {
-            for (y = 0; y < Y; y++) {
-                ax = int(g_fillmap[1024 + x + y * X]);
-                if (ax >= 100 && ax <= 199) {
-                    valid = 1;
-                    if (y > 0) {
-                        if (getmultic(x, y - 1, 0) == npar && g_fillmap[1024 + x + (y - 1) * X] == 0) {
-                            g_fillmap[1024 + x + (y - 1) * X] = byte(100);
-                            if (molox == 2) {
-                                g_fillmap[1024 + x + (y - 1) * X + 1] = byte(0);
-                            }
-                            valid = 1;
-                        }
-                    }
-                    if (x > 0) {
-                        if (getmultic(x - molox, y, 0) == npar && g_fillmap[1024 + (x - molox) + (y) * X] == 0) {
-                            g_fillmap[1024 + (x - molox) + y * X] = byte(100);
-                            if (molox == 2) {
-                                g_fillmap[1024 + (x - molox) + y * X + 1] = byte(0);
-                            }
-                            valid = 1;
-                        }
-                    }
-                    if (x < X - 2) {
-                        if (getmultic(x + molox, y, 0) == npar && g_fillmap[1024 + (x + molox) + (y) * X] == 0) {
-                            g_fillmap[1024 + (x + molox) + y * X] = byte(100);
-                            if (molox == 2) {
-                                g_fillmap[1024 + (x + molox) + y * X + 1] = byte(0);
-                            }
-                            valid = 1;
-                        }
-                    }
-                    if (y < Y - 1) {
-                        if (getmultic(x, y + 1, 0) == npar && g_fillmap[1024 + x + (y + 1) * X] == 0) {
-                            g_fillmap[1024 + x + (y + 1) * X] = byte(100);
-                            if (molox == 2) {
-                                g_fillmap[1024 + x + (y + 1) * X + 1] = byte(0);
-                            }
-                            valid = 1;
-                        }
-                    }
-
-                    g_fillmap[1024 + x + y * X] = byte(200);
-                    if (molox == 2) g_fillmap[1024 + x + y * X + 1] = byte(0);
-                }
+        pat = 0;
+        for (y0 = 0; y0 <= ymax; y0++) {
+            for (x0 = 0; x0 <= 7; x0++) {
+                ad = 1024 + (xx * 8) + (yy * X * mulu) + x0 + y0 * X;
+                pat = pat + int(g_map[ad]);
             }
         }
-
-        if (valid == 0) okay = 1;
-
-    }
-
-    for (x = 0; x < X; x = x + molox) {
-        for (y = 0; y < Y; y++) {
-            if (int(g_fillmap[1024 + x + y * X]) >= 200) {
-                g_farge = par;
-                mkaveri(x, y, par, 0);
-                makepoint(x, y);
-                g_farge = g_ofarge;
+        if (pat == mat || pat == 0) {
+            for (y0 = 0; y0 <= ymax; y0++) {
+                fad = 65536 + xx + (yy * mulu + y0) * MX;
+                bad = fad + (MX * MY * 8);
+                if (pat == 0) g_map[fad] = g_map[bad];
+                if (pat == mat) g_map[bad] = g_map[fad];
             }
         }
     }
@@ -191,76 +107,183 @@
 }
 
 
-void floodfill_iq(int xx, int yy, int mou) {
-    int x, y, ax, ay, valid, okay, par, npar;
-    npar = 0;
+void floodfill_init(int xx, int yy)
+{
+    for (x = 0; x < X; x++)
+    for (y = 0; y < Y; y++)
+        g_fillmap[1024 + x + y * X] = byte(0);
+
+    g_fillmap[1024 + xx + yy * X] = byte(100);
+}
+
+
+bool floodfill_mc_plop(int npar, int molox, int xc, int yc)
+{
+    int ad = 1024 + xc + yc * X;
+
+    if (getmultic(xc, yc, 0) == npar &&
+        g_fillmap[ad] == 0)
+    {
+        g_fillmap[ad] = byte(100);
+        if (molox == 2)
+            g_fillmap[ad + 1] = byte(0);
+
+        return true;
+    }
+    else
+        return false;
+}
+
+
+void floodfill_mc(int xx, int yy, int mou) {
+    int x, y, molox, ax, valid, okay, par, npar, zad;
     par = 0;
-    if (mou == LEFT) par = g_farge;
-    if (mou == RIGHT) par = g_backg;
-    if (getabsa(xx, yy, 0) == par) return;
-    consistency();
-    npar = getabsa(xx, yy, 0);
-    prepare_char(xx, yy, npar);
-    for (x = 0; x < X; x++) {
-        for (y = 0; y < Y; y++) {
-            g_fillmap[1024 + x + y * X] = 0;
-        }
+
+    if (g_multic == 1 || g_hzoomer == 2)
+    {
+        molox = 2;
+        xx = chop2(xx);
     }
-    g_fillmap[1024 + xx + yy * X] = byte(100);
+    else
+        molox = 1;
+
+    if (mou == LEFT)
+        par = g_farge;
+    else
+    if (mou == RIGHT)
+        par = g_backg;
+
+    npar = getmultic(xx, yy, 0);
+    if (npar == par)
+        return;
+
+    floodfill_init(xx, yy);
+
     valid = 0;
     okay = 0;
-    while (okay == 0) {
+    while (okay == 0)
+    {
         valid = 0;
-
-        for (x = 0; x < X; x++) {
-            for (y = 0; y < Y; y++) {
-                ax = int(g_fillmap[1024 + x + y * X]);
-                if (ax == 100) {
+        for (y = 0; y < Y; y++)
+        for (x = 0; x < X; x += molox)
+        {
+            zad = 1024 + x + y * X;
+            ax = int(g_fillmap[zad]);
+            if (ax >= 100 && ax <= 199)
+            {
+                valid = 1;
+                if (y > 0 && floodfill_mc_plop(npar, molox, x, y - 1))
                     valid = 1;
-                    if (y > 0) {
-                        if (getabsa(x, y - 1, 0) == npar && g_fillmap[1024 + x + (y - 1) * X] == 0) {
-                            prepare_char(x, y - 1, npar);
-                            g_fillmap[1024 + x + (y - 1) * X] = byte(100);
-                            valid = 1;
-                        }
-                    }
-                    if (x > 0) {
-                        if (getabsa(x - 1, y, 0) == npar && g_fillmap[1024 + (x - 1) + y * X] == 0) {
-                            prepare_char(x - 1, y, npar);
-                            g_fillmap[1024 + (x - 1) + y * X] = byte(100);
-                            valid = 1;
-                        }
-                    }
-                    if (x < X - 1) {
-                        if (getabsa(x + 1, y, 0) == npar && g_fillmap[1024 + (x + 1) + y * X] == 0) {
-                            prepare_char(x + 1, y, npar);
-                            g_fillmap[1024 + (x + 1) + y * X] = byte(100);
-                            valid = 1;
-                        }
-                    }
-                    if (y < Y - 1) {
-                        if (getabsa(x, y + 1, 0) == npar && g_fillmap[1024 + x + (y + 1) * X] == 0) {
-                            prepare_char(x, y + 1, npar);
-                            g_fillmap[1024 + x + (y + 1) * X] = byte(100);
-                            valid = 1;
-                        }
-                    }
-                    g_fillmap[1024 + x + y * X] = byte(200);
-                }
+
+                if (x > molox && floodfill_mc_plop(npar, molox, x - molox, y))
+                    valid = 1;
+
+                if (x < X - 1 - molox && floodfill_mc_plop(npar, molox, x + molox, y))
+                    valid = 1;
+
+                if (y < Y - 1 && floodfill_mc_plop(npar, molox, x, y + 1))
+                    valid = 1;
+
+                g_fillmap[zad] = byte(200);
+                if (molox == 2)
+                    g_fillmap[zad + 1] = byte(0);
             }
         }
-        if (valid == 0) okay = 1;
+
+        if (valid == 0)
+            okay = 1;
     }
 
-    for (x = 0; x < X; x++) {
-        for (y = 0; y < Y; y++) {
-            ax = int(g_fillmap[1024 + x + y * X]);
-            if (ax == 200) {
-                g_farge = par;
-                makepoint(x, y);
-                g_fillmap[1024 + x + y * X] = 0;
+    for (y = 0; y < Y; y++)
+    for (x = 0; x < X; x += molox)
+    {
+        if (g_fillmap[1024 + x + y * X] == byte(200))
+        {
+            g_farge = par;
+            mkaveri(x, y, par, 0);
+            makepoint(x, y);
+        }
+    }
+    g_farge = g_ofarge;
+}
+
+
+bool floodfill_iq_plop(int npar, int xc, int yc)
+{
+    int ad = 1024 + xc + yc * X;
+
+    if (getabsa(xc, yc, 0) == npar &&
+        g_fillmap[ad] == 0)
+    {
+        prepare_char(xc, yc, npar);
+        g_fillmap[ad] = byte(100);
+        return true;
+    }
+    else
+        return false;
+}
+
+
+void floodfill_iq(int xx, int yy, int mou)
+{
+    int x, y, ax, ay, valid, okay, par, npar, zad;
+    par = 0;
+
+    if (mou == LEFT)
+        par = g_farge;
+    else
+    if (mou == RIGHT)
+        par = g_backg;
+
+    npar = getabsa(xx, yy, 0);
+    if (npar == par)
+        return;
+
+    // Do consistency chec, then get the NEW color under xx,yy
+    consistency();
+    prepare_char(xx, yy, npar);
+    floodfill_init(xx, yy);
+
+    valid = 0;
+    okay = 0;
+    while (okay == 0)
+    {
+        valid = 0;
+        for (y = 0; y < Y; y++)
+        for (x = 0; x < X; x++)
+        {
+            zad = 1024 + x + y * X;
+            ax = int(g_fillmap[zad]);
+            if (ax == 100)
+            {
+                valid = 1;
+                if (y > 0 && floodfill_iq_plop(npar, x, y - 1))
+                    valid = 1;
+
+                if (x > 0 && floodfill_iq_plop(npar, x - 1, y))
+                    valid = 1;
+
+                if (x < X - 1 && floodfill_iq_plop(npar, x + 1, y))
+                    valid = 1;
+
+                if (y < Y - 1 && floodfill_iq_plop(npar, x, y + 1))
+                    valid = 1;
+
+                g_fillmap[zad] = byte(200);
             }
         }
+        if (valid == 0)
+            okay = 1;
+    }
+
+    for (y = 0; y < Y; y++)
+    for (x = 0; x < X; x++)
+    {
+        if (g_fillmap[1024 + x + y * X] == byte(200))
+        {
+            g_farge = par;
+            makepoint(x, y);
+        }
     }
     g_farge = g_ofarge;
 }
--- a/mpui.js	Wed Jul 04 17:30:46 2018 +0300
+++ b/mpui.js	Wed Jul 04 17:34:22 2018 +0300
@@ -110,7 +110,6 @@
   "<li>Native Multipaint save/load</li>"+
   "<li>Source / PRG import/export</li>"+
   "<li>PNG/JPEG import/export</li>"+
-  "<li>Flood fill tool</li>"+
   "<li> .. there may be bugs.</li>"+
   "</ul>"+
   "<p><b>NOTICE!</b> When loading/importing, you click on the load icon (or press key) and a HTML file selector button will appear "+