2
2
Copyright (c) 1993-2008, Cognitive Technologies
5
����������� ��������� ��������������� � ������������� ��� � ���� ��������� ����,
6
��� � � �������� �����, � ����������� ��� ���, ��� ���������� ��������� �������:
8
* ��� ��������� ��������������� ��������� ���� ������ ���������� ���������
9
���� ����������� �� ��������� �����, ���� ������ ������� � �����������
11
* ��� ��������� ��������������� ��������� ���� � ������������ �/��� �
12
������ ����������, ������������ ��� ���������������, ������ �����������
13
��������� ���� ���������� �� ��������� �����, ���� ������ ������� �
14
����������� ����� �� ��������.
15
* �� �������� Cognitive Technologies, �� ����� �� ����������� �� �����
16
���� ������������ � �������� �������� ��������� �/��� �����������
17
���������, ���������� �� ���� ��, ��� ���������������� �����������
20
��� ��������� ������������� ����������� ��������� ���� �/��� ������� ������ "���
21
��� ����" ��� ������-���� ���� ��������, ���������� ���� ��� ���������������,
22
������� �������� ������������ �������� � ����������� ��� ���������� ����, �� ��
23
������������� ���. �� �������� ��������� ���� � �� ���� ������ ����, �������
24
����� �������� �/��� �������� �������������� ���������, �� � ���� ������ ��
25
��Ѩ� ���������������, ������� ����� �����, ���������, ����������� ���
26
������������� ������, ��������� � �������������� ��� ���������� ����������
27
������������� ������������� ��������� (������� ������ ������, ��� ������,
28
������� ���������, ��� ������ �/��� ������ �������, ���������� ��-�� ��������
29
������� ��� �/��� ������ ��������� �������� ��������� � ������� �����������,
30
�� �� ������������� ����� ��������), �� �� ������������� ���, ���� ���� �����
31
�������� ��� ������ ���� ���� �������� � ����������� ����� ������� � ������.
5
Разрешается повторное распространение и использование как в виде исходного кода,
6
так и в двоичной форме, с изменениями или без, при соблюдении следующих условий:
8
* При повторном распространении исходного кода должны оставаться указанное
9
выше уведомление об авторском праве, этот список условий и последующий
11
* При повторном распространении двоичного кода в документации и/или в
12
других материалах, поставляемых при распространении, должны сохраняться
13
указанная выше информация об авторском праве, этот список условий и
14
последующий отказ от гарантий.
15
* Ни название Cognitive Technologies, ни имена ее сотрудников не могут
16
быть использованы в качестве средства поддержки и/или продвижения
17
продуктов, основанных на этом ПО, без предварительного письменного
20
ЭТА ПРОГРАММА ПРЕДОСТАВЛЕНА ВЛАДЕЛЬЦАМИ АВТОРСКИХ ПРАВ И/ИЛИ ДРУГИМИ ЛИЦАМИ "КАК
21
ОНА ЕСТЬ" БЕЗ КАКОГО-ЛИБО ВИДА ГАРАНТИЙ, ВЫРАЖЕННЫХ ЯВНО ИЛИ ПОДРАЗУМЕВАЕМЫХ,
22
ВКЛЮЧАЯ ГАРАНТИИ КОММЕРЧЕСКОЙ ЦЕННОСТИ И ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ, НО НЕ
23
ОГРАНИЧИВАЯСЬ ИМИ. НИ ВЛАДЕЛЕЦ АВТОРСКИХ ПРАВ И НИ ОДНО ДРУГОЕ ЛИЦО, КОТОРОЕ
24
МОЖЕТ ИЗМЕНЯТЬ И/ИЛИ ПОВТОРНО РАСПРОСТРАНЯТЬ ПРОГРАММУ, НИ В КОЕМ СЛУЧАЕ НЕ
25
НЕСЁТ ОТВЕТСТВЕННОСТИ, ВКЛЮЧАЯ ЛЮБЫЕ ОБЩИЕ, СЛУЧАЙНЫЕ, СПЕЦИАЛЬНЫЕ ИЛИ
26
ПОСЛЕДОВАВШИЕ УБЫТКИ, СВЯЗАННЫЕ С ИСПОЛЬЗОВАНИЕМ ИЛИ ПОНЕСЕННЫЕ ВСЛЕДСТВИЕ
27
НЕВОЗМОЖНОСТИ ИСПОЛЬЗОВАНИЯ ПРОГРАММЫ (ВКЛЮЧАЯ ПОТЕРИ ДАННЫХ, ИЛИ ДАННЫЕ,
28
СТАВШИЕ НЕГОДНЫМИ, ИЛИ УБЫТКИ И/ИЛИ ПОТЕРИ ДОХОДОВ, ПОНЕСЕННЫЕ ИЗ-ЗА ДЕЙСТВИЙ
29
ТРЕТЬИХ ЛИЦ И/ИЛИ ОТКАЗА ПРОГРАММЫ РАБОТАТЬ СОВМЕСТНО С ДРУГИМИ ПРОГРАММАМИ,
30
НО НЕ ОГРАНИЧИВАЯСЬ ЭТИМИ СЛУЧАЯМИ), НО НЕ ОГРАНИЧИВАЯСЬ ИМИ, ДАЖЕ ЕСЛИ ТАКОЙ
31
ВЛАДЕЛЕЦ ИЛИ ДРУГОЕ ЛИЦО БЫЛИ ИЗВЕЩЕНЫ О ВОЗМОЖНОСТИ ТАКИХ УБЫТКОВ И ПОТЕРЬ.
33
33
Redistribution and use in source and binary forms, with or without modification,
34
34
are permitted provided that the following conditions are met:
59
59
#include <string.h>
62
static BYTE pen_over_b2[8]={ 0,0,20,80,120,200,220,240 };
63
static INT x_beg, y_beg, delta_x, delta_y;
65
static BYTE pen_for_convex[6] = { 0, 32, 48, 64, 128, 240 };
62
static uchar pen_over_b2[8]={ 0,0,20,80,120,200,220,240 };
63
static int16_t x_beg, y_beg, delta_x, delta_y;
64
static int16_t orient;
65
static uchar pen_for_convex[6] = { 0, 32, 48, 64, 128, 240 };
222
222
/*************************************/
223
223
void make_left_max()
224
{ INT i; BYTE *pfun, sb, nb;
224
{ int16_t i; uchar *pfun, sb, nb;
225
225
if (leftfl & 1) return;
229
229
for (i=0, pfun=l_abr; i< fullh/3; i++,pfun++)
231
if (lmin1 > *pfun) { lmin1 = *pfun; lxmin11=(BYTE)i; }
232
if (lmin1 == *pfun) lxmin12=(BYTE)i;
231
if (lmin1 > *pfun) { lmin1 = *pfun; lxmin11=(uchar)i; }
232
if (lmin1 == *pfun) lxmin12=(uchar)i;
234
234
for (i=fullh-i, pfun=&l_abr[i]; i<fullh; i++,pfun++)
236
if (lmin2 > *pfun) { lmin2 = *pfun; lxmin21=(BYTE)i; }
237
if (lmin2 == *pfun) lxmin22=(BYTE)i;
236
if (lmin2 > *pfun) { lmin2 = *pfun; lxmin21=(uchar)i; }
237
if (lmin2 == *pfun) lxmin22=(uchar)i;
240
240
ljmp=0; lnmid=255;
243
243
if (linh[i] < lnmid) lnmid=linh[i];
245
if (lmax < nb) { lmax=nb; lxmax1=(BYTE)i; }
246
if (lmax == nb) lxmax2=(BYTE)i;
247
if ((nb > sb) && (ljmp==0)) { ljmp=1; ljmp1=(BYTE)i; } // 1st right jump
248
if ((nb < sb) && (ljmp > 0)) { ljmp=2; ljmp2=(BYTE)i; } // last left jump
245
if (lmax < nb) { lmax=nb; lxmax1=(uchar)i; }
246
if (lmax == nb) lxmax2=(uchar)i;
247
if ((nb > sb) && (ljmp==0)) { ljmp=1; ljmp1=(uchar)i; } // 1st right jump
248
if ((nb < sb) && (ljmp > 0)) { ljmp=2; ljmp2=(uchar)i; } // last left jump
252
252
void make_right_max()
254
INT i; BYTE *pfun, sb, nb;
254
int16_t i; uchar *pfun, sb, nb;
255
255
if (rightfl & 1) return;
259
259
for (i=0, pfun=r_abr; i< fullh/3; i++,pfun++)
261
if (rmin1 > *pfun) { rmin1 = *pfun; rxmin11=(BYTE)i; }
262
if (rmin1 == *pfun) rxmin12=(BYTE)i;
261
if (rmin1 > *pfun) { rmin1 = *pfun; rxmin11=(uchar)i; }
262
if (rmin1 == *pfun) rxmin12=(uchar)i;
264
264
for (i=fullh-i, pfun=&r_abr[i]; i<fullh; i++,pfun++)
266
if (rmin2 > *pfun) { rmin2 = *pfun; rxmin21=(BYTE)i; }
267
if (rmin2 == *pfun) rxmin22=(BYTE)i;
266
if (rmin2 > *pfun) { rmin2 = *pfun; rxmin21=(uchar)i; }
267
if (rmin2 == *pfun) rxmin22=(uchar)i;
271
271
for (i=rxmin12, pfun=&r_abr[i], sb=*pfun; i<rxmin21; i++, pfun++,sb=nb)
274
if (rmax < nb) { rmax=nb; rxmax1=(BYTE)i; }
275
if (rmax == nb) rxmax2=(BYTE)i;
276
if ((nb > sb) && (rjmp==0)) { rjmp=1; rjmp1=(BYTE)i; } // 1st left jump
277
if ((nb < sb) && (rjmp > 0)) { rjmp=2; rjmp2=(BYTE)i; } // last right jump
274
if (rmax < nb) { rmax=nb; rxmax1=(uchar)i; }
275
if (rmax == nb) rxmax2=(uchar)i;
276
if ((nb > sb) && (rjmp==0)) { rjmp=1; rjmp1=(uchar)i; } // 1st left jump
277
if ((nb < sb) && (rjmp > 0)) { rjmp=2; rjmp2=(uchar)i; } // last right jump
281
281
void make_top_max()
282
{ int16_t i; uchar *pfun;
283
283
if (topfl & 1) return;
287
287
for (i=0, pfun=top; i< fullw/3; i++,pfun++)
289
if (tmin1 > *pfun) { tmin1 = *pfun; txmin11=(BYTE)i; }
290
if (tmin1 == *pfun) txmin12=(BYTE)i;
289
if (tmin1 > *pfun) { tmin1 = *pfun; txmin11=(uchar)i; }
290
if (tmin1 == *pfun) txmin12=(uchar)i;
292
292
for (i=fullw-i; i<fullw; i++,pfun++)
294
if (tmin2 > *pfun) { tmin2 = *pfun; txmin21=(BYTE)i; }
295
if (tmin2 == *pfun) txmin22=(BYTE)i;
294
if (tmin2 > *pfun) { tmin2 = *pfun; txmin21=(uchar)i; }
295
if (tmin2 == *pfun) txmin22=(uchar)i;
298
298
for (i=txmin12, pfun=&top[i]; i<txmin21; i++, pfun++)
300
if (tmax < *pfun) { tmax=*pfun; txmax1=(BYTE)i; }
301
if (tmax == *pfun) txmax2=(BYTE)i;
300
if (tmax < *pfun) { tmax=*pfun; txmax1=(uchar)i; }
301
if (tmax == *pfun) txmax2=(uchar)i;
306
306
void make_bot_max()
307
{ int16_t i; uchar *pfun;
308
308
if (botfl & 1) return;
312
312
for (i=0, pfun=bot; i< fullw/3; i++,pfun++)
314
if (bmin1 > *pfun) { bmin1 = *pfun; bxmin11=(BYTE)i; }
315
if (bmin1 == *pfun) bxmin12=(BYTE)i;
314
if (bmin1 > *pfun) { bmin1 = *pfun; bxmin11=(uchar)i; }
315
if (bmin1 == *pfun) bxmin12=(uchar)i;
317
317
for (i=fullw-i; i<fullw; i++,pfun++)
319
if (bmin2 > *pfun) { bmin2 = *pfun; bxmin21=(BYTE)i; }
320
if (bmin2 == *pfun) bxmin22=(BYTE)i;
319
if (bmin2 > *pfun) { bmin2 = *pfun; bxmin21=(uchar)i; }
320
if (bmin2 == *pfun) bxmin22=(uchar)i;
323
323
for (i=bxmin12, pfun=&bot[i]; i<bxmin21; i++, pfun++)
325
if (bmax < *pfun) { bmax=*pfun; bxmax1=(BYTE)i; }
326
if (bmax == *pfun) bxmax2=(BYTE)i;
325
if (bmax < *pfun) { bmax=*pfun; bxmax1=(uchar)i; }
326
if (bmax == *pfun) bxmax2=(uchar)i;
330
330
void make_inter_white_histo()
334
334
histo_max_value = 0;
335
335
memset( histo, 0, 128 );
435
435
tresh = fullw/10;
438
fl = monotonous_decrease( l_abr, 1, (BYTE)(fullh - (fullh/4)), &j, tresh );
438
fl = monotonous_decrease( l_abr, 1, (uchar)(fullh - (fullh/4)), &j, tresh );
439
439
if ( fl == NOT_FOUND_MON_DECR )
441
441
if ( top[fullw -1] > 3 )
443
fl = monotonous_increase( r_abr, top[fullw -1], (BYTE)(fullh - 1), &j, 0 );
443
fl = monotonous_increase( r_abr, top[fullw -1], (uchar)(fullh - 1), &j, 0 );
444
444
if ( fl != NOT_FOUND_MON_INCR )
446
fl = monotonous_increase( r_abr, (BYTE)(j + 2), (BYTE)(fullh - 1), <ail, 0 );
446
fl = monotonous_increase( r_abr, (uchar)(j + 2), (uchar)(fullh - 1), <ail, 0 );
447
447
if ( fl == FOUND_MON_INCR )
455
455
#define PNL_ROUND_RBC 10 // Round abris at right bottom corner
458
INT fl, i1, i2, i3, i4, j1, j2, j3, j4;
458
int16_t fl, i1, i2, i3, i4, j1, j2, j3, j4;
460
460
make_right_max();
461
461
i1=fullh-1; i2=i1-1; i3=i2-1; i4=i3-1;
727
void get_max_min ( PBYTE func, BYTE from, BYTE to,
728
PBYTE fmax, PBYTE fmin, PBYTE x_fmax, PBYTE x_fmin )
727
void get_max_min ( puchar func, uchar from, uchar to,
728
puchar fmax, puchar fmin, puchar x_fmax, puchar x_fmin )
732
732
for ( i=from, *fmax=0, *fmin=255; i < to; i++ )
733
733
// find extremum onto interval (from, to) of the func:
742
BYTE constancy_vally_lth (PBYTE func, BYTE from, BYTE to, BYTE tresh)
742
uchar constancy_vally_lth (puchar func, uchar from, uchar to, uchar tresh)
744
BYTE i, cvlth, fl, beg, end;
744
uchar i, cvlth, fl, beg, end;
746
746
cvlth = 0; fl = 0; beg = 0; end = 0;
747
747
for ( i = from + 1; i < to - 1; i++, fl = 0 )
778
BYTE monotonous_decrease
779
( PBYTE func, BYTE from, BYTE to, PBYTE last_decr, BYTE tresh)
778
uchar monotonous_decrease
779
( puchar func, uchar from, uchar to, puchar last_decr, uchar tresh)
782
BYTE ret_code, smooth_sum, i;
782
uchar ret_code, smooth_sum, i;
784
784
ret_code = FOUND_MON_DECR;
785
785
for ( smooth_sum = 0, i = from; i < to - 1; i++ )
802
BYTE monotonous_increase
803
( PBYTE func, BYTE from, BYTE to, PBYTE last_incr, BYTE tresh)
802
uchar monotonous_increase
803
( puchar func, uchar from, uchar to, puchar last_incr, uchar tresh)
806
BYTE ret_code, smooth_sum, i;
806
uchar ret_code, smooth_sum, i;
808
808
ret_code = FOUND_MON_INCR;
809
809
for ( smooth_sum = 0, i = from; i < to - 1; i++ )