Andreik Posted October 9, 2010 Posted October 9, 2010 (edited) I tried to write this function in autoit but I`m a bit confused about emptyStack(),push() and pop() functions. I know that exists this function in array udf but here seems to be different. For example how can I write this in autoit: if(!push(x, y)) return; This is the full code: expandcollapse popupvoid floodFillScanlineStack(int x, int y, int newColor, int oldColor) { if(oldColor == newColor) return; emptyStack(); int y1; bool spanLeft, spanRight; if(!push(x, y)) return; while(pop(x, y)) { y1 = y; while(y1 >= 0 && screenBuffer[x][y1] == oldColor) y1--; y1++; spanLeft = spanRight = 0; while(y1 < h && screenBuffer[x][y1] == oldColor ) { screenBuffer[x][y1] = newColor; if(!spanLeft && x > 0 && screenBuffer[x - 1][y1] == oldColor) { if(!push(x - 1, y1)) return; spanLeft = 1; } else if(spanLeft && x > 0 && screenBuffer[x - 1][y1] != oldColor) { spanLeft = 0; } if(!spanRight && x < w - 1 && screenBuffer[x + 1][y1] == oldColor) { if(!push(x + 1, y1)) return; spanRight = 1; } else if(spanRight && x < w - 1 && screenBuffer[x + 1][y1] != oldColor) { spanRight = 0; } y1++; } } } Edited October 9, 2010 by Andreik
Richard Robertson Posted October 9, 2010 Posted October 9, 2010 Considering we have no idea where those functions came from, how can we help you?
Mat Posted October 9, 2010 Posted October 9, 2010 If you can get the definition for 'screenBuffer' then it would make life a lot easier (and 'h' as well while you're there) I think that push adds a new item to screenBuffer, with the given x and y... Not sure though, as then it wants it as a color. emptyStack just resets the screenBuffer I think. This is what I get sans pop and push. I guessed that screenBuffer is not anything like what I have it here as... But ah well. expandcollapse popupGlobal $screenBuffer[1][1] Func floodFillScanlineStack($x, $y, $newColor, $oldColor) If $oldColor == $newColor Then Return emptyStack() Local $y1 Local $spanLeft, $spanRight If Not push($x, $y) Then Return While pop($x, $y) $y1 = $y While ($y1 >= 0) And ($screenBuffer[$x][$y1] == $oldColor) $y1 -= 1 WEnd $y1 += 1 $spanLeft = 0 $spanRight = 0 While ($y1 < $h) And ($screenBuffer[$x][$y1] == $oldColor) $screenBuffer[$x][$y1] = $newColor; If (Not $spanLeft) And ($x > 0) And ($screenBuffer[$x - 1][$y1] == $oldColor) Then If Not push($x - 1, $y1) Then Return $spanLeft = 1 ElseIf ($spanLeft) And ($x > 0) And ($screenBuffer[$x - 1][$y1] <> $oldColor) Then $spanLeft = 0 EndIf If (Not $spanRight) And ($x < $w - 1) And ($screenBuffer[$x + 1][$y1] == $oldColor) Then If Not push($x + 1, $y1) Then Return $spanRight = 1 ElseIf ($spanRight) And ($x < $w - 1) And ($screenBuffer[$x + 1][$y1] <> $oldColor) Then $spanRight = 0 EndIf $y1 += 1 WEnd WEnd EndFunc ;==>floodFillScanlineStack ; Reset the global array Func emptyStack() ReDim $screenBuffer[1][1] $screenBuffer[0][0] = 0 EndFunc Mat AutoIt Project Listing
Andreik Posted October 9, 2010 Author Posted October 9, 2010 I forgot from where I get there code but after a quick search on google I got this: http://www.student.kuleuven.be/~m0216922/CG/files/floodfill.cpp So the missing part is this: bool pop(int &x, int &y) { if(stackPointer > 0) { int p = stack[stackPointer]; x = p / h; y = p % h; stackPointer--; return 1; } else { return 0; } } bool push(int x, int y) { if(stackPointer < stackSize - 1) { stackPointer++; stack[stackPointer] = h * x + y; return 1; } else { return 0; } } void emptyStack() { int x, y; while(pop(x, y)); } Now make more sense, I think I know how to write this is autoit.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now