Fix Normal-Selective-Area fills filling partially painted objects

This commit is contained in:
manongjohn 2021-07-29 12:44:20 -04:00
parent b9ea823143
commit a1a9695f57

View file

@ -48,7 +48,7 @@ inline TPoint nearestInkNotDiagonal(const TRasterCM32P &r, const TPoint &p) {
void fillRow(const TRasterCM32P &r, const TPoint &p, int &xa, int &xb, void fillRow(const TRasterCM32P &r, const TPoint &p, int &xa, int &xb,
int paint, TPalette *palette, TTileSaverCM32 *saver, int paint, TPalette *palette, TTileSaverCM32 *saver,
bool prevailing = true) { bool prevailing = true, bool emptyOnly = false) {
int tone, oldtone; int tone, oldtone;
TPixelCM32 *pix, *pix0, *limit, *tmp_limit; TPixelCM32 *pix, *pix0, *limit, *tmp_limit;
@ -62,6 +62,7 @@ void fillRow(const TRasterCM32P &r, const TPoint &p, int &xa, int &xb,
tone = oldtone; tone = oldtone;
for (; pix <= limit; pix++) { for (; pix <= limit; pix++) {
if (pix->getPaint() == paint) break; if (pix->getPaint() == paint) break;
if (emptyOnly && pix->getPaint() != 0) break;
tone = pix->getTone(); tone = pix->getTone();
if (tone == 0) break; if (tone == 0) break;
// prevent fill area from protruding behind the colored line // prevent fill area from protruding behind the colored line
@ -112,6 +113,7 @@ void fillRow(const TRasterCM32P &r, const TPoint &p, int &xa, int &xb,
tone = oldtone; tone = oldtone;
for (pix--; pix >= limit; pix--) { for (pix--; pix >= limit; pix--) {
if (pix->getPaint() == paint) break; if (pix->getPaint() == paint) break;
if (emptyOnly && pix->getPaint() != 0) break;
tone = pix->getTone(); tone = pix->getTone();
if (tone == 0) break; if (tone == 0) break;
// prevent fill area from protruding behind the colored line // prevent fill area from protruding behind the colored line
@ -444,7 +446,7 @@ bool fill(const TRasterCM32P &r, const FillParameters &params,
std::stack<FillSeed> seeds; std::stack<FillSeed> seeds;
fillRow(tempRaster, p, xa, xb, paint, params.m_palette, saver, fillRow(tempRaster, p, xa, xb, paint, params.m_palette, saver,
params.m_prevailing); params.m_prevailing, params.m_emptyOnly);
seeds.push(FillSeed(xa, xb, y, 1)); seeds.push(FillSeed(xa, xb, y, 1));
seeds.push(FillSeed(xa, xb, y, -1)); seeds.push(FillSeed(xa, xb, y, -1));
// Set the ink on gaps that were used to 4095 // Set the ink on gaps that were used to 4095
@ -482,11 +484,12 @@ bool fill(const TRasterCM32P &r, const FillParameters &params,
tone = threshTone(*pix, fillDepth); tone = threshTone(*pix, fillDepth);
// the last condition is added in order to prevent fill area from // the last condition is added in order to prevent fill area from
// protruding behind the colored line // protruding behind the colored line
if (pix->getPaint() != paint && tone <= oldtone && tone != 0 && if (pix->getPaint() != paint &&
(pix->getPaint() != pix->getInk() || (!params.m_emptyOnly || pix->getPaint() == 0) && tone <= oldtone &&
pix->getPaint() == paintAtClickedPos)) { tone != 0 && (pix->getPaint() != pix->getInk() ||
pix->getPaint() == paintAtClickedPos)) {
fillRow(tempRaster, TPoint(x, y), xc, xd, paint, params.m_palette, fillRow(tempRaster, TPoint(x, y), xc, xd, paint, params.m_palette,
saver, params.m_prevailing); saver, params.m_prevailing, params.m_emptyOnly);
// Set the ink on gaps that were used to 4095 // Set the ink on gaps that were used to 4095
{ {
TPixelCM32 *tempPix = tempRaster->pixels(0); TPixelCM32 *tempPix = tempRaster->pixels(0);