lol, i kinda went and made changes where i thought it would be appropriate to implement the check… I should have waited abit too see if you responded before it did it
Well, here are my changes, however it seems that there is no measureable difference… i may have done something wrong…
class LineSegStack {
private static final int elementSize = 7;
private static final int xOff = 0-elementSize;
private static final int yOff = 1-elementSize;
private static final int leftOff = 2-elementSize;
private static final int rightOff = 3-elementSize;
private static final int prevLeftOff = 4-elementSize;
private static final int prevRightOff = 5-elementSize;
private static final int fromTopOff = 6-elementSize;
int[] data;
int size = 0;
int offset;
public LineSegStack() {
data= new int[1024*elementSize];
offset=0;
}
public void push(int left, int right, int y,int fromTop) {
if (offset == data.length) {
int[] temp = new int[2*data.length];
System.arraycopy(data, 0, temp, 0, data.length);
data = temp;
}
if (offset>0)
{
offset+=elementSize;
data[offset+leftOff] = left;
data[offset+prevLeftOff] = data[offset+prevLeftOff-elementSize];
data[offset+rightOff] = right;
data[offset+prevRightOff] =data[offset+prevRightOff-elementSize];
data[offset+xOff] = left;
data[offset+yOff] = y;
data[offset+fromTopOff]=fromTop;
}
else
{
offset+=elementSize;
data[offset+leftOff] = left;
data[offset+prevLeftOff] = 0;
data[offset+rightOff] = right;
data[offset+prevRightOff] =0;
data[offset+xOff] = left;
data[offset+yOff] = y;
data[offset+fromTopOff]=fromTop;
}
size++;
}
public void pop(LineSeg s) {
s.x = data[offset+xOff];
s.y = data[offset+yOff];
s.left = data[offset+leftOff];
s.right = data[offset+rightOff];
s.prevLeft= data[offset+prevLeftOff];
s.prevRight= data[offset+prevRightOff];
s.fromTop= data[offset+fromTopOff];
offset -= elementSize;
size--;
}
}
class LineSeg {
int left, right, x, y, doneTop,prevLeft,prevRight,fromTop;
LineSeg(int left, int right, int y) {
this.left = left;
this.right = right;
this.x = left;
this.y = y;
}
}
public void linearFloodFill1(int startx,int starty,int width, int height,boolean[][] pixelsChecked,byte[][] frame,LineSegStack stack ) {
//LineSegStack stack = new LineSegStack();
LineSeg nextLine = new LineSeg(0, 0, 0);
int fcount=0;
java.util.Random r=new java.util.Random((startx+starty)*(starty-startx));
int RColour = r.nextInt(240);
int GColour = r.nextInt(240);
int BColour = r.nextInt(240);
int fromTop=0;
int y,right;
boolean topChecked[];
boolean botChecked[];
addLineSegToStack(startx, starty,width,height,frame,pixelsChecked,fcount,RColour,GColour,BColour,stack,fromTop);
while (stack.size > 0) {
stack.pop(nextLine);
y = nextLine.y;
right = nextLine.right;
fromTop=0;
if (y>0) {
fromTop=1;
// fill the line above this line
//int topLine[] = image[y-1];
topChecked = pixelsChecked[y-1];
// did we come from there?
if (nextLine.fromTop==1) {
// check on the left side of where we come from
int min = Math.min(nextLine.prevLeft, right);
for (int x=nextLine.left; x<=min; x++) {
if (!topChecked[x]) {
x = addLineSegToStack(x, y-1,width,height,frame,pixelsChecked,fcount,RColour,GColour,BColour,stack,fromTop);
}
}
// check on the right side of where we come from
for (int x=Math.max(nextLine.prevRight, nextLine.left); x<=right; x++) {
if (!topChecked[x]) {
x = addLineSegToStack(x, y-1,width,height,frame,pixelsChecked,fcount,RColour,GColour,BColour,stack,fromTop);
}
}
} else {
// did not come from this side: check the whole line
for (int x=nextLine.left; x<=right; x++) {
if (!topChecked[x]) {
x = addLineSegToStack(x, y-1,width,height,frame,pixelsChecked,fcount,RColour,GColour,BColour,stack,fromTop);
}
}
}
}
/
if (y<height-1) {
fromTop=2;
//int botLine[] = image[y+1];
botChecked = pixelsChecked[y+1];
for (int x=nextLine.left; x<=right; x++) {
if ( !botChecked[x]) {
x = addLineSegToStack(x, y+1,width,height,frame,pixelsChecked,fcount,RColour,GColour,BColour,stack,fromTop);
}
}
}
}
}
private int addLineSegToStack(int x, int y,int width, int height, byte[][] frame, boolean pixelsChecked[][],int fcount,int RColour, int GColour,int BColour,LineSegStack stack,int fromTop)
{
//int line[] = image[y];
boolean checked[] = pixelsChecked[y];
int left=x;
do {
fcount++;
frame[y*width+left][0]=(byte) (RColour+(fcount%15));
frame[y*width+left][1]=(byte) (GColour+(fcount%15));
frame[y*width+left][2]=(byte) (BColour+(fcount%15));
checked[left] = true;
left--;
} while (left>=0 && !checked[left]);
left++;
int right=x;
do {
fcount++;
frame[y*width+right][0]=(byte) (RColour+(fcount%15));
frame[y*width+right][1]=(byte) (GColour+(fcount%15));
frame[y*width+right][2]=(byte) (BColour+(fcount%15));
checked[right] = true;
right++;
} while (right<width && !checked[right]);
right--;
stack.push(left, right, y,fromTop);
return right;
}
by comparing our two codes, it looks like we are effectivly doing the same thing.