Deutsch   English   Français   Italiano  
<ut4020$2s8ov$1@dont-email.me>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: Malcolm McLean <malcolm.arthur.mclean@gmail.com>
Newsgroups: comp.lang.c
Subject: Re: filling area by color atack safety
Date: Sat, 16 Mar 2024 11:33:20 +0000
Organization: A noiseless patient Spider
Lines: 61
Message-ID: <ut4020$2s8ov$1@dont-email.me>
References: <ut3669$21eur$1@i2pn2.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Sat, 16 Mar 2024 11:33:20 -0000 (UTC)
Injection-Info: dont-email.me; posting-host="0ac9f1a8c1dfcfccfb5694c886ca1efb";
	logging-data="3023647"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX18wlXCiM5M0atzSqvJj6Pmf5jKXsgE77Oo="
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:Rgti+mMJ6G1smajQ+3M93NkFZzk=
In-Reply-To: <ut3669$21eur$1@i2pn2.org>
Content-Language: en-GB
Bytes: 3373

On 16/03/2024 04:11, fir wrote:
> i was writing simple editor (something like paint but more custom for my 
> eventual needs) for big pixel (low resolution) drawing
> 
> it showed in a minute i need a click for changing given drawed area of
> of one color into another color (becouse if no someone would need to do 
> it  by hand pixel by pixel and the need to change color of given element 
> is very common)
> 
> there is very simple method of doing it - i men i click in given color 
> pixel then replace it by my color and call the same function on adjacent 
> 4 pixels (only need check if it is in screen at all and if the color to 
> change is that initial color
> 
> int RecolorizePixelAndAdjacentOnes(int x, int y, unsigned old_color, 
> unsigned new_color)
> {
>    if(old_color == new_color) return 0;
> 
>    if(XYIsInScreen( x,  y))
>    if(GetPixelUnsafe(x,y)==old_color)
>    {
>      SetPixelSafe(x,y,new_color);
>      RecolorizePixelAndAdjacentOnes(x+1, y,  old_color, new_color);
>      RecolorizePixelAndAdjacentOnes(x-1, y,  old_color, new_color);
>      RecolorizePixelAndAdjacentOnes(x, y-1,  old_color, new_color);
>      RecolorizePixelAndAdjacentOnes(x, y+1,  old_color, new_color);
>      return 1;
>    }
> 
>    return 0;
> }
> 
> it work but im not quite sure how to estimate the safety of this  - 
> incidentally as i said i use this editor to low res graphics  like 
> 200x200 pixels or less, and it is only a toll of private use,
> yet i got no time to work on it more than 1-2-3 days i guess but still
> 
> is there maybe simple way to improve it?
 >
This is a cheap and cheerful fllod fill. And it's easy to get right and 
shouldn't afall over. But but makes an awful not of unnecessary calls, 
and on a small system and large image might even blow the stack.

Recursion make programs harder to reason about and prove correct.

So a real flood fill doesn't work like that. You use a queue and put the 
pixels to be filled into that, and trace lines.

And here's some code I wrote a while ago. Use that as a pattern. But not 
sure how well it works. Haven't used it for a long time.

https://github.com/MalcolmMcLean/binaryimagelibrary/blob/master/drawbinary.c




-- 
Check out Basic Algorithms and my other books:
https://www.lulu.com/spotlight/bgy1mm