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:
81
81
/* results compare abris-arrays with curves and vert lines */
82
82
/* -1 - non compare, 0 - not similar, 1 - similar */
83
static INT flag_abris_curve_left, flag_abris_curve_right,
83
static int16_t flag_abris_curve_left, flag_abris_curve_right,
84
84
flag_abris_line_left, flag_abris_line_right;
86
static INT comp_is_bullet(cell *c );
86
static int16_t comp_is_bullet(cell *c );
87
87
static void init_bullet_functions(void);
88
static BOOL comp_is_triangle(BYTE left[],BYTE right[],INT h,INT w);
89
static BOOL comp_is_rectangle(BYTE left[],BYTE right[],INT h);
90
static BOOL comp_is_ellipse(BYTE left[],BYTE right[],INT n,INT w);
91
static BOOL abris_line(BYTE fun[],INT n, INT denominator);
92
static INT place_fun_limit(BYTE fun[],INT n);
93
static INT place_fun(BYTE fun[],INT n);
94
static INT limit_place(BYTE left[],BYTE right[],INT h);
95
static void find_abris(cell *c,INT wid,BYTE left[],BYTE right[]);
96
static INT one_line_in_comp(cell *c);
97
static BOOL comp_glue(cell *c);
98
static BOOL comp_projections_overlay(cell *c1, cell *c2);
99
static INT context_next(cell *c);
100
static INT context_prev(cell *c);
101
static BOOL context_bullet(cell *c);
102
static INT conv_size_capital_let(BYTE let,INT wide);
88
static Bool comp_is_triangle(uchar left[],uchar right[],int16_t h,int16_t w);
89
static Bool comp_is_rectangle(uchar left[],uchar right[],int16_t h);
90
static Bool comp_is_ellipse(uchar left[],uchar right[],int16_t n,int16_t w);
91
static Bool abris_line(uchar fun[],int16_t n, int16_t denominator);
92
static int16_t place_fun_limit(uchar fun[],int16_t n);
93
static int16_t place_fun(uchar fun[],int16_t n);
94
static int16_t limit_place(uchar left[],uchar right[],int16_t h);
95
static void find_abris(cell *c,int16_t wid,uchar left[],uchar right[]);
96
static int16_t one_line_in_comp(cell *c);
97
static Bool comp_glue(cell *c);
98
static Bool comp_projections_overlay(cell *c1, cell *c2);
99
static int16_t context_next(cell *c);
100
static int16_t context_prev(cell *c);
101
static Bool context_bullet(cell *c);
102
static int16_t conv_size_capital_let(uchar let,int16_t wide);
104
static BOOL comp_is_star5(cell *c);
105
static BOOL pit(BYTE fun[],INT h);
106
static BOOL concave_line(BYTE fun[],INT h);
107
static BOOL ray_head_and_hands(BYTE left[],BYTE right[],INT h);
108
static BOOL ray_head_and_feets(cell *c);
104
static Bool comp_is_star5(cell *c);
105
static Bool pit(uchar fun[],int16_t h);
106
static Bool concave_line(uchar fun[],int16_t h);
107
static Bool ray_head_and_hands(uchar left[],uchar right[],int16_t h);
108
static Bool ray_head_and_feets(cell *c);
110
110
#define NON_BULLET 0
111
111
#define BAD_RECTANGLE 1
117
117
#define BAD_CODE 126
118
118
#define CODE_BULLET liga_bull
121
121
#define INC_FAX( val ) \
122
122
if( fax1x2 ) val += 2;
123
123
#define DEC_FAX( val ) \
124
124
if( fax1x2 ) val -= 2;
126
126
/* is letter bullet ? */
127
INT chkbullet( BYTE let )
127
int16_t chkbullet( uchar let )
129
129
return( let==liga_bull);
133
/* ��� new_vers (file S_TOOLS.C) */
134
/* ��� comp_is_bullet */
136
/* � ��� comp_projections_overlay */
137
/* ��� one_line_in_comp */
138
/* ��� context_bullet */
139
/* � ��� context_prev �Ŀ */
140
/* � ��� context_netx �Ĵ */
141
/* � ��� conv_size_capital_let */
143
/* ��� filtr_bullet (file S_TOOLS.C) */
144
/* ��� limit_place */
145
/* ��� get_b_lines (A.Leman) */
146
/* ��� init_bullet_functions */
147
/* ��� comp_is_rectangle �������Ŀ */
148
/* ��� comp_is_ellipse ��Ŀ � */
149
/* ��� comp_is_triangle Ŀ � � */
150
/* � abris_curve ����� � */
151
/* ��� abris_line ���������� */
133
/* ГДД new_vers (file S_TOOLS.C) */
134
/* АДД comp_is_bullet */
136
/* і АДД comp_projections_overlay */
137
/* ГДД one_line_in_comp */
138
/* ГДД context_bullet */
139
/* і ГДД context_prev ДДї */
140
/* і АДД context_netx ДДґ */
141
/* і АДД conv_size_capital_let */
143
/* ГДД filtr_bullet (file S_TOOLS.C) */
144
/* ГДД limit_place */
145
/* ГДД get_b_lines (A.Leman) */
146
/* ГДД init_bullet_functions */
147
/* ГДД comp_is_rectangle ДДДДДДДДї */
148
/* ГДД comp_is_ellipse ДДДї і */
149
/* АДД comp_is_triangle Дї і і */
150
/* і abris_curve ДДБДЩ і */
151
/* АДД abris_line ДДДДДДДДДЩ */
154
/* ��� new_vers (file S_TOOLS.C) */
155
/* ��� comp_is_star5 */
157
/* � ��� comp_proections_overlay */
159
/* ��� ray_head_and_feets */
160
/* ��� ray_head_and_hands */
162
/* ��� find_minimum (file S_TOOLS.C) */
163
/* ��� concave_line */
154
/* ГДД new_vers (file S_TOOLS.C) */
155
/* АДД comp_is_star5 */
157
/* і АДД comp_proections_overlay */
159
/* ГДД ray_head_and_feets */
160
/* АДД ray_head_and_hands */
162
/* ГДД find_minimum (file S_TOOLS.C) */
163
/* АДД concave_line */
166
166
/* for any cell in string-list set bullet code if */
167
167
/* similar RECTANGLE,ELLIPSE,TRIANGLE */
225
static INT comp_is_bullet(cell *c)
225
static int16_t comp_is_bullet(cell *c)
228
BYTE left[LIMIT_HEIGHT],right[LIMIT_HEIGHT];
229
INT height=c->h, width=c->w;
230
BOOL i1=FALSE, i2=FALSE, i3=FALSE;
231
INT place_limit, place=(height-2)*width;
228
uchar left[LIMIT_HEIGHT],right[LIMIT_HEIGHT];
229
int16_t height=c->h, width=c->w;
230
Bool i1=FALSE, i2=FALSE, i3=FALSE;
231
int16_t place_limit, place=(height-2)*width;
233
INT center_bl,center_bul,top,bot;
233
int16_t center_bl,center_bul,top,bot;
235
235
if( height<6 || width<6 ) return(0); /* no bullet : small c_comp */
236
236
if( comp_glue(c)==TRUE ) return(0); /* no bullet : c_comp glue */
435
static BOOL comp_projections_overlay(cell *c1, cell *c2)
435
static Bool comp_projections_overlay(cell *c1, cell *c2)
437
INT b1 = c1->col, b2 = c2->col;
438
INT e1 = b1 + c1->w, e2 = b2 + c2->w;
437
int16_t b1 = c1->col, b2 = c2->col;
438
int16_t e1 = b1 + c1->w, e2 = b2 + c2->w;
439
439
if( b1<=b2 && b2<=e1 )return(TRUE);
440
440
if( b2<=b1 && b1<=e2 )return(TRUE);
444
static BOOL comp_is_ellipse(BYTE left[],BYTE right[],INT h,INT w)
444
static Bool comp_is_ellipse(uchar left[],uchar right[],int16_t h,int16_t w)
446
446
if( flag_abris_curve_left<0 )
447
447
flag_abris_curve_left = abris_curve(left,h,w);
480
480
/* limit_place : sum of limit points in box (size h*w) */
481
481
/* left(right) - array left(right) abris */
482
static INT limit_place(BYTE left[],BYTE right[],INT h)
482
static int16_t limit_place(uchar left[],uchar right[],int16_t h)
484
484
return ( place_fun_limit(left,h) + place_fun_limit(right,h) ) ;
487
static INT place_fun_limit(BYTE fun[],INT n )
487
static int16_t place_fun_limit(uchar fun[],int16_t n )
489
INT i,s,vert_line=1,nn=(n-2)>>1; /* nn-1/2 heigh of c_comp */
489
int16_t i,s,vert_line=1,nn=(n-2)>>1; /* nn-1/2 heigh of c_comp */
490
490
for(s=0,i=1;i<n-1;i++) /* first and last lines skipped */
504
static INT place_fun(BYTE fun[],INT n)
504
static int16_t place_fun(uchar fun[],int16_t n)
507
507
for(s=i=0;i<n;i++)
512
BOOL abris_curve(BYTE fun[],INT n,INT w)
512
Bool abris_curve(uchar fun[],int16_t n,int16_t w)
514
BYTE i=n>>2,minim,ff,fo,imin;
514
uchar i=n>>2,minim,ff,fo,imin;
516
minim = (BYTE)find_minimum( fun, n, &imin );
516
minim = (uchar)find_minimum( fun, n, &imin );
518
518
if( imin<i || imin>(n-i) )
519
519
return(FALSE) ; /* max of fun belong [n/4, 3n/4] */
566
566
memset(fill, 0, max_h-- );
568
568
num_int = 0; /* number of rows with 1 interval */
569
for (line=(lnhead *)((PCHAR)(c->env)+c->env->lines+sizeof(INT));
570
(ll=line->lth)>0; line=(lnhead *)((PCHAR)line+ll))
569
for (line=(lnhead *)((pchar)(c->env)+c->env->lines+sizeof(int16_t));
570
(ll=line->lth)>0; line=(lnhead *)((pchar)line+ll))
571
571
#ifdef INTERSEPTOR
574
for( h=line->h,i=0, inter=(interval *)((PCHAR)line+sizeof(lnhead));
574
for( h=line->h,i=0, inter=(interval *)((pchar)line+sizeof(lnhead));
575
575
i<h;i++,inter++) /* one line */
577
577
ind = line->row + i; /* skipped first and last lines */
593
593
return( num_int==max_h-1 ); /* TRUE if all rows good, else FALSE */
596
static void find_abris(cell *c,INT wid,BYTE left[],BYTE right[])
596
static void find_abris(cell *c,int16_t wid,uchar left[],uchar right[])
603
for (line=(lnhead *)((PCHAR)(c->env)+c->env->lines+sizeof(INT));
604
(ll=line->lth)>0; line=(lnhead *)((PCHAR)line+ll))
605
if( (h=(BYTE)line->h)>1 ) /* long line */
606
for( i=0, inter=(interval *)((PCHAR)line+sizeof(lnhead));i<h;i++,inter++)
603
for (line=(lnhead *)((pchar)(c->env)+c->env->lines+sizeof(int16_t));
604
(ll=line->lth)>0; line=(lnhead *)((pchar)line+ll))
605
if( (h=(uchar)line->h)>1 ) /* long line */
606
for( i=0, inter=(interval *)((pchar)line+sizeof(lnhead));i<h;i++,inter++)
608
608
r= wid - inter->e; /* current interval */
609
609
l = inter->e - inter->l;
654
static BOOL ray_head_and_hands(BYTE left[],BYTE right[],INT h)
654
static Bool ray_head_and_hands(uchar left[],uchar right[],int16_t h)
656
656
return pit(left,h) & pit(right,h) ;
659
static BOOL ray_head_and_feets(cell *c )
659
static Bool ray_head_and_feets(cell *c )
661
BYTE work[LIMIT_HEIGHT]; /* number of intervals in row */
663
INT h_c=height/5; /* height of ray */
664
INT skip_h = height - h_c;
661
uchar work[LIMIT_HEIGHT]; /* number of intervals in row */
663
int16_t h_c=height/5; /* height of ray */
664
int16_t skip_h = height - h_c;
669
669
memset(work, 0, height);
671
for (line=(lnhead *)((PCHAR)(c->env)+c->env->lines+sizeof(INT));
672
(ll=line->lth)>0; line=(lnhead *)((PCHAR)line+ll))
671
for (line=(lnhead *)((pchar)(c->env)+c->env->lines+sizeof(int16_t));
672
(ll=line->lth)>0; line=(lnhead *)((pchar)line+ll))
673
673
if( (h=line->h)>0 ) /* long line */
674
for( i=0, inter=(interval *)((PCHAR)line+sizeof(lnhead));
674
for( i=0, inter=(interval *)((pchar)line+sizeof(lnhead));
676
676
work[line->row+i] ++;
712
712
if( imin<h/4 || imin>(h*3)/4 )
713
713
return( FALSE ); /* too heigh or too low ray */
715
return( concave_line( fun, (INT)(imin+1) ) ); /* concave upper area */
715
return( concave_line( fun, (int16_t)(imin+1) ) ); /* concave upper area */
718
718
/* fun[0] = upper point of head; fun[n-1] = limits point of hand-ray */
719
static BOOL concave_line(BYTE fun[],INT n)
719
static Bool concave_line(uchar fun[],int16_t n)
721
INT st = (fun[0]+fun[n-1])*n/2; /* place of trapeze */
722
INT sf = place_fun(fun,n); /* integral of function */
721
int16_t st = (fun[0]+fun[n-1])*n/2; /* place of trapeze */
722
int16_t sf = place_fun(fun,n); /* integral of function */
723
723
return( (n<5 || fax1x2)? (sf >= st) : (sf > st) ); /* fun is up convexity */