614 unsigned int **out_bmp_array = CreateBmpBuffer(
wid_,
hgt_, 0);
615 if (out_bmp_array ==
NULL) {
616 fprintf(stderr,
"Cube ERROR (Bmp8::FindConComps): could not allocate "
622 ConComp **concomp_array =
NULL;
629 int alloc_concomp_cnt = 0;
632 const int nbr_cnt = 4;
635 int x_del[nbr_cnt] = {-1, 0, 1, -1},
636 y_del[nbr_cnt] = {-1, -1, -1, 0};
639 for (y = 0; y <
hgt_; y++) {
640 for (x = 0; x <
wid_; x++) {
643 int master_concomp_id = 0;
644 ConComp *master_concomp =
NULL;
647 for (
int nbr = 0; nbr < nbr_cnt; nbr++) {
648 x_nbr = x + x_del[nbr];
649 y_nbr = y + y_del[nbr];
651 if (x_nbr < 0 || y_nbr < 0 || x_nbr >= wid_ || y_nbr >= hgt_) {
658 concomp_id = out_bmp_array[y_nbr][x_nbr];
661 if (concomp_id < 1 || concomp_id > alloc_concomp_cnt) {
662 fprintf(stderr,
"Cube ERROR (Bmp8::FindConComps): illegal "
663 "connected component id: %d\n", concomp_id);
664 FreeBmpBuffer(out_bmp_array);
665 delete []concomp_array;
671 if (master_concomp !=
NULL && concomp_id != master_concomp_id) {
673 ConCompPt *pt_ptr = concomp_array[concomp_id - 1]->Head();
674 while (pt_ptr !=
NULL) {
675 out_bmp_array[pt_ptr->y()][pt_ptr->x()] = master_concomp_id;
676 pt_ptr = pt_ptr->Next();
680 if (!master_concomp->Merge(concomp_array[concomp_id - 1])) {
681 fprintf(stderr,
"Cube ERROR (Bmp8::FindConComps): could not "
682 "merge connected component: %d\n", concomp_id);
683 FreeBmpBuffer(out_bmp_array);
684 delete []concomp_array;
689 delete concomp_array[concomp_id - 1];
690 concomp_array[concomp_id - 1] =
NULL;
693 master_concomp_id = concomp_id;
694 master_concomp = concomp_array[master_concomp_id - 1];
696 out_bmp_array[y][x] = master_concomp_id;
698 if (!master_concomp->Add(x, y)) {
699 fprintf(stderr,
"Cube ERROR (Bmp8::FindConComps): could not "
700 "add connected component (%d,%d)\n", x, y);
701 FreeBmpBuffer(out_bmp_array);
702 delete []concomp_array;
710 if (master_concomp ==
NULL) {
711 master_concomp =
new ConComp();
712 if (master_concomp ==
NULL || master_concomp->Add(x, y) ==
false) {
713 fprintf(stderr,
"Cube ERROR (Bmp8::FindConComps): could not "
714 "allocate or add a connected component\n");
715 FreeBmpBuffer(out_bmp_array);
716 delete []concomp_array;
722 ConComp **temp_con_comp =
724 if (temp_con_comp ==
NULL) {
725 fprintf(stderr,
"Cube ERROR (Bmp8::FindConComps): could not "
726 "extend array of connected components\n");
727 FreeBmpBuffer(out_bmp_array);
728 delete []concomp_array;
732 if (alloc_concomp_cnt > 0) {
733 memcpy(temp_con_comp, concomp_array,
734 alloc_concomp_cnt *
sizeof(*concomp_array));
736 delete []concomp_array;
739 concomp_array = temp_con_comp;
742 concomp_array[alloc_concomp_cnt++] = master_concomp;
743 out_bmp_array[y][x] = alloc_concomp_cnt;
750 FreeBmpBuffer(out_bmp_array);
752 if (alloc_concomp_cnt > 0 && concomp_array !=
NULL) {
756 ConComp *concomp =
NULL;
758 for (
int concomp_idx = 0; concomp_idx < alloc_concomp_cnt; concomp_idx++) {
759 concomp = concomp_array[concomp_idx];
762 if (concomp !=
NULL) {
764 if (concomp->PtCnt() > min_size) {
765 concomp->SetLeftMost(
true);
766 concomp->SetRightMost(
true);
767 concomp->SetID((*concomp_cnt));
768 concomp_array[(*concomp_cnt)++] = concomp;
776 return concomp_array;
static const int kConCompAllocChunk
unsigned char ** line_buff_