# HG changeset patch # User Matti Hamalainen # Date 1530714862 -10800 # Node ID 31bfa78dba15ff3851712ff1ff436673b9c482bf # Parent 9b77ed046003b1e727d4a8269b8c2d1eca49a2a6 Clean up and fix the flood fill functions. diff -r 9b77ed046003 -r 31bfa78dba15 draw_smart.pde --- 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; } diff -r 9b77ed046003 -r 31bfa78dba15 mpui.js --- 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 @@ "
  • Native Multipaint save/load
  • "+ "
  • Source / PRG import/export
  • "+ "
  • PNG/JPEG import/export
  • "+ - "
  • Flood fill tool
  • "+ "
  • .. there may be bugs.
  • "+ ""+ "

    NOTICE! When loading/importing, you click on the load icon (or press key) and a HTML file selector button will appear "+