BOOL BfxPixelOpPseudo::FloodSearch(INT32 x, INT32 y, INT32 MinimumArea, INT32 FloodArray[BFX_PSEUDOFLOODSIZE][2], INT32 * FloodTop) { if (IsInRegion(x,y)) { WriteOriginalPixel(x, y, Colour^1); // make it out of the region FloodArray[*FloodTop][0]=x; FloodArray[(*FloodTop)++][1]=y; // save coordinate so we can restore value later if (*FloodTop>=MinimumArea) return TRUE; if (!FloodSearch(x-1, y-1, MinimumArea, FloodArray, FloodTop)) return FALSE; if (*FloodTop>=MinimumArea) return TRUE; if (!FloodSearch(x , y-1, MinimumArea, FloodArray, FloodTop)) return FALSE; if (*FloodTop>=MinimumArea) return TRUE; if (!FloodSearch(x+1, y-1, MinimumArea, FloodArray, FloodTop)) return FALSE; if (*FloodTop>=MinimumArea) return TRUE; if (!FloodSearch(x-1, y , MinimumArea, FloodArray, FloodTop)) return FALSE; if (*FloodTop>=MinimumArea) return TRUE; if (!FloodSearch(x+1, y , MinimumArea, FloodArray, FloodTop)) return FALSE; if (*FloodTop>=MinimumArea) return TRUE; if (!FloodSearch(x-1, y+1, MinimumArea, FloodArray, FloodTop)) return FALSE; if (*FloodTop>=MinimumArea) return TRUE; if (!FloodSearch(x , y+1, MinimumArea, FloodArray, FloodTop)) return FALSE; if (*FloodTop>=MinimumArea) return TRUE; if (!FloodSearch(x+1, y+1, MinimumArea, FloodArray, FloodTop)) return FALSE; } return TRUE; }
GUIKeyboard::Key* GUIKeyboard::HitTestKey(int x, int y) { if (!IsInRegion(x, y)) return NULL; int rely = y - mRenderY; int relx = x - mRenderX; Layout& lay = layouts[currentLayout - 1]; // Find the correct row int row; for (row = 0; row < MAX_KEYBOARD_ROWS; ++row) { if (lay.row_end_y[row] > rely) break; } if (row == MAX_KEYBOARD_ROWS) return NULL; // Find the correct key (column) int col; int x1 = 0; for (col = 0; col < MAX_KEYBOARD_KEYS; ++col) { Key& key = lay.keys[row][col]; if (x1 <= relx && relx < key.end_x && key.key != 0) { // This is the key that was pressed! return &key; } x1 = key.end_x; } return NULL; }
BOOL BfxPixelOpPseudo::CheckMinimumArea(INT32 MinimumArea, INT32 InitialX, INT32 InitialY, BOOL * FoundRegion) { // This is a bodge currently *FoundRegion = FALSE; if (IsInRegion(InitialX, InitialY)) { if (MinimumArea>BFX_PSEUDOFLOODSIZE-1) MinimumArea=BFX_PSEUDOFLOODSIZE-1; INT32 FloodArray[BFX_PSEUDOFLOODSIZE][2]; INT32 FloodTop=0; if (!FloodSearch(InitialX, InitialY, MinimumArea, FloodArray, &FloodTop)) return FALSE; *FoundRegion = (FloodTop >= MinimumArea); for (INT32 n=0; n<FloodTop; n++) WriteOriginalPixel(FloodArray[n][0], FloodArray[n][1], Colour); } return TRUE; }
BOOL BfxPixelOp32::FloodSearch(INT32 x, INT32 y, INT32 MinimumArea) { if (IsCached(x,y) // We've been here before || GetCacheMarks()>=MinimumArea) // We've got enough return TRUE; if (IsInRegion(x,y)) { if (!( FloodSearch(x-1, y-1, MinimumArea) && FloodSearch(x , y-1, MinimumArea) && FloodSearch(x+1, y-1, MinimumArea) && FloodSearch(x-1, y , MinimumArea) && FloodSearch(x+1, y , MinimumArea) && FloodSearch(x-1, y+1, MinimumArea) && FloodSearch(x , y+1, MinimumArea) && FloodSearch(x+1, y+1, MinimumArea) && TRUE)) return TRUE; } return TRUE; }