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