BOOL8 PIXROW::extend( //image array IMAGELINE *imlines, BOX &imbox, PIXROW *prev, //for prev blob PIXROW *next, //for next blob INT16 foreground_colour) { INT16 i; INT16 x_offset = imbox.left (); INT16 limit; INT16 left_limit; INT16 right_limit; UINT8 *pixels = NULL; UINT8 *pixels_below = NULL; //row below current UINT8 *pixels_above = NULL; //row above current BOOL8 changed = FALSE; pixels_above = imlines[0].pixels; for (i = 0; i < row_count; i++) { pixels_below = pixels; pixels = pixels_above; if (i < (row_count - 1)) pixels_above = imlines[i + 1].pixels; else pixels_above = NULL; /* Extend Left by one pixel*/ if (prev == NULL || prev->max[i] < prev->min[i]) limit = imbox.left (); else limit = prev->max[i] + 1; if ((min[i] <= max[i]) && (min[i] > limit) && (pixels[min[i] - 1 - x_offset] == foreground_colour)) { min[i]--; changed = TRUE; } /* Extend Right by one pixel*/ if (next == NULL || next->min[i] > next->max[i]) limit = imbox.right () - 1;//-1 to index inside pix else limit = next->min[i] - 1; if ((min[i] <= max[i]) && (max[i] < limit) && (pixels[max[i] + 1 - x_offset] == foreground_colour)) { max[i]++; changed = TRUE; } /* Extend down by one row */ if (pixels_below != NULL) { if (min[i] < min[i - 1]) { //row goes left of row below if (prev == NULL || prev->max[i - 1] < prev->min[i - 1]) left_limit = min[i]; else left_limit = LARGEST (min[i], prev->max[i - 1] + 1); } else left_limit = min[i - 1]; if (max[i] > max[i - 1]) { //row goes right of row below if (next == NULL || next->min[i - 1] > next->max[i - 1]) right_limit = max[i]; else right_limit = SMALLEST (max[i], next->min[i - 1] - 1); } else right_limit = max[i - 1]; while ((left_limit <= right_limit) && (pixels_below[left_limit - x_offset] != foreground_colour)) left_limit++; //find black extremity if ((left_limit <= right_limit) && (left_limit < min[i - 1])) { min[i - 1] = left_limit; //widen left if poss changed = TRUE; } while ((left_limit <= right_limit) && (pixels_below[right_limit - x_offset] != foreground_colour)) right_limit--; //find black extremity if ((left_limit <= right_limit) && (right_limit > max[i - 1])) { max[i - 1] = right_limit;//widen right if poss changed = TRUE; } } /* Extend up by one row */ if (pixels_above != NULL) { if (min[i] < min[i + 1]) { //row goes left of row above if (prev == NULL || prev->min[i + 1] > prev->max[i + 1]) left_limit = min[i]; else left_limit = LARGEST (min[i], prev->max[i + 1] + 1); } else left_limit = min[i + 1]; if (max[i] > max[i + 1]) { //row goes right of row above if (next == NULL || next->min[i + 1] > next->max[i + 1]) right_limit = max[i]; else right_limit = SMALLEST (max[i], next->min[i + 1] - 1); } else right_limit = max[i + 1]; while ((left_limit <= right_limit) && (pixels_above[left_limit - x_offset] != foreground_colour)) left_limit++; //find black extremity if ((left_limit <= right_limit) && (left_limit < min[i + 1])) { min[i + 1] = left_limit; //widen left if poss changed = TRUE; } while ((left_limit <= right_limit) && (pixels_above[right_limit - x_offset] != foreground_colour)) right_limit--; //find black extremity if ((left_limit <= right_limit) && (right_limit > max[i + 1])) { max[i + 1] = right_limit;//widen right if poss changed = TRUE; } } } return changed; }
int main() { printf("Largest 4,10,17,29 is %d",LARGEST(4,10,17,29)); return 0; }