📄 filescan.c
字号:
{
p_img_line = get_raw_img_line(p_scd->p_raw_ptr, p_scd->img_line_size, 1);
tx_bits_mem(p_scd->p_nnext_line, p_scd->x_size, p_img_line, p_scd->back_ground);
}
p_scd->current_line = 0;
if ((p_scd->p_polylines_list = ll_create_list()) == NULL)
{
free(p_scd->v_open);
free(p_scd->p_lines);
free_image(&p_scd->imgd);
free(p_scd);
return (NULL);
}
if ((p_scd->pp_gating_polylines = (link_list_hdr **) malloc((p_scd->x_size + 2) *
sizeof(link_list_hdr *))) == NULL)
{
ll_purge_list(p_scd->p_polylines_list);
free(p_scd->v_open);
free(p_scd->p_lines);
free_image(&p_scd->imgd);
free(p_scd);
return (NULL);
}
for (ii = 0; ii < (p_scd->x_size + 2); ii++)
p_scd->pp_gating_polylines[ii] = ll_create_list();
if ((p_scd->fp_poly = fopen(poly_file_name, "wt")) == NULL)
{
for (ii = 0; ii < (p_scd->x_size + 2); ii++)
if (p_scd->pp_gating_polylines[ii] != NULL)
ll_purge_list(p_scd->pp_gating_polylines[ii]);
free(p_scd->pp_gating_polylines);
ll_purge_list(p_scd->p_polylines_list);
free(p_scd->v_open);
free(p_scd->p_lines);
free_image(&p_scd->imgd);
free(p_scd);
return (NULL);
}
p_scd->number_of_polylines = 0;
return (p_scd);
}
/* OK */
static int free_scan_data(scan_data * p_scd)
{
if (p_scd->p_polylines_list != NULL)
flush_all_polylines(p_scd);
if (p_scd->fp_poly != NULL)
fclose(p_scd->fp_poly), p_scd->fp_poly = NULL;
if (p_scd->v_open != NULL)
free(p_scd->v_open), p_scd->v_open = NULL;
if (p_scd->p_lines != NULL)
free(p_scd->p_lines), p_scd->p_lines = NULL;
if (p_scd->pp_gating_polylines != NULL)
{
int ii;
for (ii = 0; ii < (p_scd->x_size + 2); ii++)
if (p_scd->pp_gating_polylines[ii] != NULL)
ll_empty_free_list(p_scd->pp_gating_polylines[ii]),
p_scd->pp_gating_polylines[ii] = NULL;
free(p_scd->pp_gating_polylines), p_scd->pp_gating_polylines = NULL;
}
free_image(&p_scd->imgd);
free(p_scd);
return (TRUE);
}
/* OK */
static int add_poly_gate(scan_data * p_scd, int gate, polyline * p_polyline)
{
link_list_hdr *p_gating_poly_list;
if ((gate < 0) || (gate >= (p_scd->x_size + 2)))
return (FALSE);
p_gating_poly_list = p_scd->pp_gating_polylines[gate];
ll_set_list_currpntr(p_gating_poly_list, TG_HEAD);
do
{
polyline *p_curr_polyline;
if ((p_curr_polyline = (polyline *) ll_get_list_data(p_gating_poly_list)) == NULL)
break;
if (p_curr_polyline == p_polyline)
return (TRUE);
if (p_curr_polyline == DELETED_POLYLINE)
{
ll_set_list_data(p_gating_poly_list, p_polyline);
return (TRUE);
}
} while (ll_set_list_currpntr(p_gating_poly_list, TG_AFTER) == TG_AFTER);
return (ll_add_list_item(p_gating_poly_list, TG_HEAD, p_polyline, 0));
}
/* OK */
static int remove_poly_gate(scan_data * p_scd, int gate, polyline * p_polyline)
{
link_list_hdr *p_gating_poly_list;
if ((gate < 0) || (gate >= (p_scd->x_size + 2)))
return (FALSE);
p_gating_poly_list = p_scd->pp_gating_polylines[gate];
ll_set_list_currpntr(p_gating_poly_list, TG_HEAD);
do
{
polyline *p_curr_polyline;
if ((p_curr_polyline = (polyline *) ll_get_list_data(p_gating_poly_list)) == NULL)
break;
if (p_curr_polyline == p_polyline)
ll_set_list_data(p_gating_poly_list, DELETED_POLYLINE);
} while (ll_set_list_currpntr(p_gating_poly_list, TG_AFTER) == TG_AFTER);
return (TRUE);
}
/* OK */
static int try_to_join_polylines(scan_data * p_scd, polyline * p_owner_polyline,
img_point * p_join_pnt, int pnt_location)
{
link_list_hdr *p_gating_poly_list = p_scd->pp_gating_polylines[p_join_pnt->x];
ll_set_list_currpntr(p_gating_poly_list, TG_HEAD);
do
{
polyline *p_polyline;
if ((p_polyline = (polyline *) ll_get_list_data(p_gating_poly_list)) == NULL)
break;
if ((p_polyline == p_owner_polyline) || (p_polyline == DELETED_POLYLINE))
continue;
if ((pnt_location == TG_HEAD) && same_point(&p_polyline->pnt1, p_join_pnt))
{
remove_poly_gate(p_scd, p_owner_polyline->pnt0.x, p_owner_polyline);
if (!transfer_polyline_points(p_owner_polyline, p_polyline, TG_HEAD, -1))
return (FALSE);
add_poly_gate(p_scd, p_owner_polyline->pnt0.x, p_owner_polyline);
remove_poly_gate(p_scd, p_polyline->pnt0.x, p_polyline);
remove_poly_gate(p_scd, p_polyline->pnt1.x, p_polyline);
remove_polyline(p_scd, p_polyline);
return (TRUE);
}
if ((pnt_location == TG_TAIL) && same_point(&p_polyline->pnt0, p_join_pnt))
{
remove_poly_gate(p_scd, p_owner_polyline->pnt1.x, p_owner_polyline);
if (!transfer_polyline_points(p_owner_polyline, p_polyline, TG_TAIL, +1))
return (FALSE);
add_poly_gate(p_scd, p_owner_polyline->pnt1.x, p_owner_polyline);
remove_poly_gate(p_scd, p_polyline->pnt0.x, p_polyline);
remove_poly_gate(p_scd, p_polyline->pnt1.x, p_polyline);
remove_polyline(p_scd, p_polyline);
return (TRUE);
}
} while (ll_set_list_currpntr(p_gating_poly_list, TG_AFTER) == TG_AFTER);
return (FALSE);
}
/* OK */
static int add_line(scan_data * p_scd, img_point * p_img_pnt0,
img_point * p_img_pnt1)
{
ins_polyline iply;
if (get_insert_info(p_scd, p_img_pnt0, p_img_pnt1, &iply))
{
if (!add_point_in_poly(iply.p_polyline, &iply.pnt, iply.insert_location))
return (FALSE);
switch (line_type(p_img_pnt0, p_img_pnt1))
{
case (HORIZONTAL_LINE):
remove_poly_gate(p_scd, iply.link_pnt.x, iply.p_polyline);
add_poly_gate(p_scd, iply.pnt.x, iply.p_polyline);
break;
case (VERTICAL_LINE):
break;
}
try_to_join_polylines(p_scd, iply.p_polyline, &iply.pnt, iply.insert_location);
return (TRUE);
}
return (create_new_polyline(p_scd, p_img_pnt0, p_img_pnt1));
}
/* OK */
static int get_insert_link(link_list_hdr * p_gating_poly_list,
img_point * p_img_pnt0, img_point * p_img_pnt1,
ins_polyline * p_iply)
{
ll_set_list_currpntr(p_gating_poly_list, TG_HEAD);
do
{
polyline *p_polyline;
if ((p_polyline = (polyline *) ll_get_list_data(p_gating_poly_list)) == NULL)
break;
if (p_polyline == DELETED_POLYLINE)
continue;
if (same_point(&p_polyline->pnt1, p_img_pnt0))
{
if (same_point(&p_polyline->pnt0, p_img_pnt1))
{
if ((p_img_pnt1->x > p_img_pnt0->x) || (p_img_pnt1->y > p_img_pnt0->y))
{
p_iply->p_polyline = p_polyline;
p_iply->insert_location = TG_TAIL;
p_iply->link_pnt = *p_img_pnt0;
p_iply->pnt = *p_img_pnt1;
}
else
{
p_iply->p_polyline = p_polyline;
p_iply->insert_location = TG_HEAD;
p_iply->link_pnt = *p_img_pnt1;
p_iply->pnt = *p_img_pnt0;
}
return (TRUE);
}
else
{
p_iply->p_polyline = p_polyline;
p_iply->insert_location = TG_TAIL;
p_iply->link_pnt = *p_img_pnt0;
p_iply->pnt = *p_img_pnt1;
return (TRUE);
}
}
else
{
if (same_point(&p_polyline->pnt0, p_img_pnt1))
{
p_iply->p_polyline = p_polyline;
p_iply->insert_location = TG_HEAD;
p_iply->link_pnt = *p_img_pnt1;
p_iply->pnt = *p_img_pnt0;
return (TRUE);
}
}
} while (ll_set_list_currpntr(p_gating_poly_list, TG_AFTER) == TG_AFTER);
return (FALSE);
}
/* OK */
static int get_insert_info(scan_data * p_scd, img_point * p_img_pnt0,
img_point * p_img_pnt1, ins_polyline * p_iply)
{
link_list_hdr *p_gating_poly_list0 = p_scd->pp_gating_polylines[p_img_pnt0->x],
*p_gating_poly_list1 = p_scd->pp_gating_polylines[p_img_pnt1->x];
p_iply->p_polyline = NULL;
if (get_insert_link(p_gating_poly_list0, p_img_pnt0, p_img_pnt1, p_iply))
return (TRUE);
return ((p_gating_poly_list0 != p_gating_poly_list1) ?
get_insert_link(p_gating_poly_list1, p_img_pnt0, p_img_pnt1, p_iply) : FALSE);
}
/* OK */
static int create_new_polyline(scan_data * p_scd, img_point * p_img_pnt0,
img_point * p_img_pnt1)
{
polyline *p_polyline;
if ((p_polyline = (polyline *) malloc(sizeof(polyline))) == NULL)
return (FALSE);
if ((p_polyline->p_poly_list = ll_create_list()) == NULL)
{
free(p_polyline);
return (FALSE);
}
p_polyline->pnt0 = p_polyline->last_pnt1 = p_polyline->prev_pnt1 = *p_img_pnt0;
p_polyline->pnt1 = p_polyline->last_pnt0 = p_polyline->prev_pnt0 = *p_img_pnt1;
if (!ll_add_list_data(p_polyline->p_poly_list, TG_HEAD, &p_polyline->pnt0))
{
ll_empty_free_list(p_polyline->p_poly_list);
free(p_polyline);
return (FALSE);
}
if (!ll_add_list_data(p_polyline->p_poly_list, TG_TAIL, &p_polyline->pnt1))
{
ll_empty_free_list(p_polyline->p_poly_list);
free(p_polyline);
return (FALSE);
}
if (!ll_add_list_item(p_scd->p_polylines_list, TG_HEAD, p_polyline, 1))
{
ll_empty_free_list(p_polyline->p_poly_list);
free(p_polyline);
return (FALSE);
}
switch (line_type(p_img_pnt0, p_img_pnt1))
{
case (HORIZONTAL_LINE):
add_poly_gate(p_scd, p_img_pnt0->x, p_polyline);
add_poly_gate(p_scd, p_img_pnt1->x, p_polyline);
break;
case (VERTICAL_LINE):
add_poly_gate(p_scd, p_img_pnt0->x, p_polyline);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -