Click here to Skip to main content
Rate this: bad
good
Please Sign up or sign in to vote.
See more: C Java
Hey I am trying to render some fonts on the screen. Actually I have done that.
Now what I am trying is to fill the characters i.e. fill the bounded regions.
 
The only thing I have is a 2-d buffer which stores information for each pixel i.e. it is set if the pixel is to be illuminated otherwise it contains '0'.
 
I cant think of a logic to fill the bounded regions using this.
This is what I tried but it failed as it cant recognize the horizontal lines.
 
for(int p=0 ; p<401 ; ++p){
            for(int q=0 ; q<401 ; ++q){
                if( buffer[p][q] == 1 ){
                    ++q ;
                    while (buffer[p][q] == 0){
                          buffer[p][q]  = 1 ;
                          ++q ;
                    }
                }
            }
        }
Posted 15-Jul-11 2:37am
Edited 15-Jul-11 3:20am
v2
Comments
R. Erasmus at 15-Jul-11 9:53am
   
This piece of code is prone to having bugs....
incrementing q will cause array out of bounds exception when q = 400 if buffer size contains 401 elements.
Loop is also way to complex... Its better to use functions that devides the program up into simpler segments. Its a testing nightmare.
Rate this: bad
good
Please Sign up or sign in to vote.

Solution 1

Why don't you have a look at Flood Fill algorithm[^] at Wikipedia?
  Permalink  
Comments
Espen Harlinn at 15-Jul-11 8:13am
   
Right :)
Member 8086596 at 15-Jul-11 8:17am
   
That's entirely different thing i guess. I don't have any idea about the behaviour of the edges or you can say the bounded regions. I only have the pixel info in the 2-d buffer , but for standard flood fill algorithm i need to know the coordinates of corners.
CPallini at 15-Jul-11 8:23am
   
I guess your guess is wrong. Please read carefully the linked page.
Member 8086596 at 15-Jul-11 8:28am
   
Suppose i have rendered "ABC" on the canvas. Firstly i dont have start node to start with , secondly, even if I get the start node by scanning the buffer[][] that would become very inefficient in case the text is lenghty coz i have to find the start node for each and every character.
CPallini at 15-Jul-11 8:34am
   
Could you please post one (or more) image(s)?
Member 8086596 at 15-Jul-11 8:37am
   
Sorry I am new to this forums world . How am I supposed to post images?
CPallini at 15-Jul-11 8:44am
   
You may upload the image (on a free image hosting service) and then post the link here.
BTW cannot you use different colors for the initiali printout of the characters (I mean, for instance, given "AKA", 'A'<->1, 'K'<->2, 'A'<->3 , this way internal pixels are bounded by external pixels having the same value)?
Member 8086596 at 15-Jul-11 8:55am
   
I can do that I guess. But hows that gonna help ? I still will have to find the Start node for each character.
Actually I am rendering the fonts from SVG file on the mobile device. So i have to make it as efficient as possible. So I am looking for the way in which i can fill all the bounded regions by just scanning the buffer[][] once.
CPallini at 15-Jul-11 9:00am
   
It helps because, otherwise, you cannot recognize horizontal lines (if I got you: you cannot distingush 'inside' from 'outside'. Having different colors helps: a blank pixel between a 1-pixel and a 2-pixel is 'outside').
Member 8086596 at 15-Jul-11 9:26am
   
here is the image
http://www.freeimagehosting.net/image.php?fcfe295ea5.png
 
I need to fill the "BOTS".
Member 8086596 at 15-Jul-11 8:56am
   
I dont have access to the image now. Will do that later.
Rate this: bad
good
Please Sign up or sign in to vote.

Solution 4

Search for "fill polygon" or "scanline fill algorithm".
 
It is a scan-line problem. If you can draw the font outline, then you can also store the points in a Y/X sorted list. If you did not draw the outline, then you can scan it to create the list.
 
[y1][x1], [y1][x2], [y1][x3], [y1][x4], ...
[y2][x1], [y2][x2], [y2][x3], [y2][x4]...
...
 
x1 => far left
x2 => first right
x3 => next left
x4 => next right
...
 
[y1][x1] line to [y1][x2] no line [y1][x3] line to [y1][x4]
 
I just wrote the following - so it has not been tested. But it should give you an idea of how a scan-line fill works.
 
struct MyPoint {
	int x, y;
};
// Fill horizontal lines between points in given point list
// - does not draw on outline (border)
void FillBetweens(MyPoint* list, size_t list_size)
{
	// assumes list is sorted from top to bottom and left to right
	int current_y = 0;
	for (size_t i=0; i<list_size-1; ++i)
	{
		if( list[i].y != current_y )
			current_y = list[i].y; // or ++current_y (depends on your choices)
		if( list[i+1].y == current_y )
		{
			// your horizontal line drawing function (y,x1,x2)
			// - assumes drawing between end points
			draw_betweens(list[i].y, list[i].x, list[i+1].x);
			++i;
		}
		// else we skip single point lines
	}
}
  Permalink  
v2
Comments
Member 8086596 at 15-Jul-11 13:28pm
   
that means for characters like "C" which have a curve I need to get the cordinates corresponding to each pixel.
John R. Shaw at 15-Jul-11 13:58pm
   
Basically - you do need to create a scan-line list to use the normal method - which relies on knowing the coordinates of the edges.
 
Example line to fill:
[0][0] = 1, ..., [0][10] = 1, [0][11] = 1, [0][12] = 1
 
in MyPoint list that would be
list[0] = {0,0}; // left
list[1] = {0,10}; // right
 
In this case we do not want [0][11] or [0][12] in our list.
 
The method you are currently using would work, but resembles a flood fill. May be a look at the diagrams in my QuickFill article at codeproject would give you a better idea.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

  Print Answers RSS
0 CHill60 210
1 Sergey Alexandrovich Kryukov 200
2 Peter Leow 170
3 Richard Deeming 166
4 Zoltán Zörgő 135
0 Sergey Alexandrovich Kryukov 9,278
1 OriginalGriff 6,806
2 Peter Leow 4,432
3 Zoltán Zörgő 3,944
4 Richard MacCutchan 2,782


Advertise | Privacy | Mobile
Web01 | 2.8.150129.1 | Last Updated 15 Jul 2011
Copyright © CodeProject, 1999-2015
All Rights Reserved. Terms of Service
Layout: fixed | fluid

CodeProject, 503-250 Ferrand Drive Toronto Ontario, M3C 3G8 Canada +1 416-849-8900 x 100