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:
85
85
#define INCLINE_FACTOR 2048
86
86
#define RELY_LET 220
87
#define V_SIZE 10000 //����. ������ �������� �� ���������
88
#define USER_FRAG CPAGE_BLOCK_USER //��������, ���������� �������������
89
#define UNCERTAIN_FRAG CPAGE_BLOCK_UNCERTAIN //�������������� (������� ��� ������)
91
#define MAX_KEG 127 //������������ ������ ����� � ��������
92
#define KEG_PAGE 10 //������������ ����� ������ �� ��������
93
#define FRAG_PAGE MaxHorLines*MaxVerLines //������������ ����� ���������� �� ��������, ������� ������ ������
94
#define BIG_FRAG_PAGE FRAG_PAGE //������������ ����� ���������� �� ��������
95
//#define BIG_FRAG_PAGE 50 //������������ ����� ���������� �� ��������
96
#define LINE_PAGE FRAG_PAGE //������������ ����� ����� �� ��������
98
typedef Word16 KegStat[MAX_KEG+2];
87
#define V_SIZE 10000 //макс. размер страницы по вертикали
88
#define USER_FRAG CPAGE_BLOCK_USER //фрагмент, помеченный пользователем
89
#define UNCERTAIN_FRAG CPAGE_BLOCK_UNCERTAIN //неопределенный (хороший или плохой)
91
#define MAX_KEG 127 //максимальный размер кегля в пикселах
92
#define KEG_PAGE 10 //максимальное число кеглей на странице
93
#define FRAG_PAGE MaxHorLines*MaxVerLines //максимальное число фрагментов на странице, включая ячейки таблиц
94
#define BIG_FRAG_PAGE FRAG_PAGE //максимальное число фрагментов на странице
95
//#define BIG_FRAG_PAGE 50 //максимальное число фрагментов на странице
96
#define LINE_PAGE FRAG_PAGE //максимальное число строк на странице
98
typedef uint16_t KegStat[MAX_KEG+2];
100
100
typedef struct tagKegTabElement
102
Int8 keg0; //���� keg0>0, �� ��� ������� ������������ ��������,
103
Int8 keg1; // ����� -keg0 � -keg1 - ��������� �������� ����
102
char keg0; //если keg0>0, то это надежно определенное значение,
103
char keg1; // иначе -keg0 и -keg1 - возможные значения кегл
106
106
typedef KegTabElement KegTab[MAX_KEG+1];
108
typedef struct tagPageWord //����� �� ��������
108
typedef struct tagPageWord //слово на странице
110
Int32 fragment; //����� ���������
111
Int32 line; //����� ������ � ���������
112
Int32 word; //����� ����� � ������
113
CSTR_rast beg,end; //������ ������ � ��������� �� ������
110
int32_t fragment; //номер фрагмента
111
int32_t line; //номер строки в фрагменте
112
int32_t word; //номер слова в строке
113
CSTR_rast beg,end; //растры начала и следующий за концом
116
typedef struct tagFontStat //��� ����������� ���������� �� ���������
116
typedef struct tagFontStat //для определения серифности во фрагменте
118
Int32 straight; //����� ������ ��������
119
Int32 italic; //����� ���������
120
Int32 it_ser; //��������� ��������
121
Int32 it_gelv; //��������� ����������
122
Int32 st_ser; //�� �� ��� ������
118
int32_t straight; //всего прямых символов
119
int32_t italic; //всего курсивных
120
int32_t it_ser; //курсивных серифных
121
int32_t it_gelv; //курсивных несерифных
122
int32_t st_ser; //то же для прямых
126
typedef struct tagFragStat //��� ��������� ������
126
typedef struct tagFragStat //для выявления мусора
129
Rect32 rect; //������������ �������������
130
Int16 nsym; //����� �������� �� ���������
131
Int16 nbig; //������� (�����, �����, "?" � �.�.)
132
Int16 nstick; //��������
133
Int16 nlet; //����� ������������
134
Int16 ndig; // -"- ����
135
Int16 nconf; //�� ������� ��� ��������������
136
Int16 ngood; //������� ������������
137
Int16 nhigh; //������� ������
138
Int16 npunct; //������ ���������
129
Rect32 rect; //охватывающий прямоугольник
130
int16_t nsym; //всего символов во фрагменте
131
int16_t nbig; //больших (буквы, цифры, "?" и т.д.)
132
int16_t nstick; //палочных
133
int16_t nlet; //всего распознанных
134
int16_t ndig; // -"- цифр
135
int16_t nconf; //по эвентам или подтвержденных
136
int16_t ngood; //надежно распознанных
137
int16_t nhigh; //высокая оценка
138
int16_t npunct; //знаков препинани
142
142
#define RS_GOOD 1
144
144
#define RS_STRANGE 4
145
145
#define RS_ADD 128
148
typedef struct tagLineNumber //������ �� ���������
148
typedef struct tagLineNumber //строка во фрагменте
150
Int32 n; //����� ������ �� ��������
151
struct tagLineNumber *next; //��������� ������ ���������
150
int32_t n; //номер строки на странице
151
struct tagLineNumber *next; //следующая строка фрагмента
154
typedef struct tagLineList //������ �����
154
typedef struct tagLineList //список строк
156
LineNumber pool[LINE_PAGE]; //����
157
LineNumber *node[FRAG_PAGE+1]; //������ ������ ��� ������� ���������
156
LineNumber pool[LINE_PAGE]; //куча
157
LineNumber *node[FRAG_PAGE+1]; //начало списка для каждого фрагмента
161
161
extern Bool32 gbFax100;
162
162
extern Bool32 snap_enable;
163
163
extern Bool32 exit_enable;
164
extern Word8 language;
164
extern uchar language;
166
166
Bool32 gbGarbage = TRUE;
167
167
Handle hSnapMain = 0;
171
171
Handle hSnapTable = 0;
173
173
static Handle hCPAGE;
174
static Int32 nIncline;
174
static int32_t nIncline;
175
175
static KegTab keg_tab;
176
static Int32 num_keg,num_keg_opt; //���������� ������ �� �������� �������� � �����������
177
static KegStat keg_stats; //���������� ������ �� �������� ��������
178
static Word8 max_keg=0,min_keg=255; //����������� � ������������ ����� �� ��������
179
static Int32 version; //������ ������
180
static Word32 key=1; //��� snap'�
181
static Int32 skew=0; //������� �������� (��� ������?)
182
static Int32 num_frag=0; //����� ���������� �� ��������
183
static Bool fr_ovf; //�� �������� ������ FRAG_PAGE ����������
184
static Int16 fragments[LINE_PAGE+FRAG_PAGE],*fragments_end=NULL,*cur_fragment;
185
/* ��������� ���������� �� ��������:
186
n1 - ����� ����� � 1-�� ���������
187
i[1] - ����� ������ ������
176
static int32_t num_keg,num_keg_opt; //количество кеглей на странице исходное и оптимальное
177
static KegStat keg_stats; //статистика кеглей на исходной странице
178
static uchar max_keg=0,min_keg=255; //минимальный и максимальный кегли на страницы
179
static int32_t version; //версия строки
180
static uint32_t key=1; //для snap'а
181
static int32_t skew=0; //поворот страницы (или строки?)
182
static int32_t num_frag=0; //число фрагментов на странице
183
static Bool fr_ovf; //на странице больше FRAG_PAGE фрагментов
184
static int16_t fragments[LINE_PAGE+FRAG_PAGE],*fragments_end=NULL,*cur_fragment;
185
/* структура фрагментов на странице:
186
n1 - число строк в 1-ом фрагменте
187
i[1] - номер первой строки
189
i[n1] - ����� ��������� ������
190
n2 - ����� ����� � 2-�� ���������
189
i[n1] - номер последней строки
190
n2 - число строк в 2-ом фрагменте
193
static Word8 fragfont[FRAG_PAGE],*cur_font;
193
static uchar fragfont[FRAG_PAGE],*cur_font;
194
194
static RecStat recstat[FRAG_PAGE];
196
196
static PageWord cur_word;
209
209
static Bool rtf_correct();
211
211
static void garbage_fragments();
212
static void draw_fragments(Word32 color);
213
static void draw_fragment(Handle hBlock, Word32 color, Word32 key);
214
static void display_fragment(RecStat *rsti, Word32 color, Word32 key);
215
static Bool in_gap(Int32 top, Int32 bottom, Word8 *proj);
212
static void draw_fragments(uint32_t color);
213
static void draw_fragment(Handle hBlock, uint32_t color, uint32_t key);
214
static void display_fragment(RecStat *rsti, uint32_t color, uint32_t key);
215
static Bool in_gap(int32_t top, int32_t bottom, uchar *proj);
216
216
static Bool condition1(RecStat *rsti);
217
217
static Bool condition2(RecStat *rsti);
218
218
static Bool condition3(RecStat *rsti);
219
219
static Bool condition4(RecStat *rsti);
220
static Bool condition34(RecStat *rsti, Int32 ngood);
220
static Bool condition34(RecStat *rsti, int32_t ngood);
222
static void mark_word(Word32 color);
222
static void mark_word(uint32_t color);
223
223
static Bool set_cur_word(PageWord *pw);
224
224
static Bool next_word_inline(CSTR_rast *beg, CSTR_rast *end);
225
225
static Bool prev_word_inline(CSTR_rast *beg, CSTR_rast *end);
227
227
static Bool next_word();
228
228
static Bool prev_word();
229
229
static Bool cur_word_eq(PageWord *cmp);
230
static void set_word_keg(Word8 keg);
231
static Word8 get_word_keg();
230
static void set_word_keg(uchar keg);
231
static uchar get_word_keg();
232
232
static Bool contain(Rect32 *b, Rect32 *s);
233
233
static void to_real(Rect32 *rect);
234
234
static void to_real16(Rect16 *rect);
236
static Handle find_hBlock(Int32 fragment);
236
static Handle find_hBlock(int32_t fragment);
237
237
static void pull_rect(Rect32 *rect, Point32 *point);
238
238
static void cover_rect(Rect32 *main_area, Rect32 *rect);
239
static Int32 rect_dist(Rect32 *main, Rect32 *test);
240
static Int32 dist_border(Rect32 *rect);
241
static Bool add2list(LineNumber **frag_lines, Int32 fn, Int32 ln);
239
static int32_t rect_dist(Rect32 *main, Rect32 *test);
240
static int32_t dist_border(Rect32 *rect);
241
static Bool add2list(LineNumber **frag_lines, int32_t fn, int32_t ln);
243
243
static void draw_keg(const char *str);
244
static void draw_rect(Rect32 *rect, Word32 color, Word32 key);
244
static void draw_rect(Rect32 *rect, uint32_t color, uint32_t key);
246
246
static void kegl_by_frag();
247
247
static void keg_frag_stats();
249
//Word32 myMonitorProc(Handle wnd,Handle hwnd,Word32 message,Word32 wParam,Word32 lParam);
249
//uint32_t myMonitorProc(Handle wnd,Handle hwnd,uint32_t message,uint32_t wParam,uint32_t lParam);
251
Bool32 CorrectKegl(Int32 ver)
251
Bool32 CorrectKegl(int32_t ver)
255
255
hCPAGE = CPAGE_GetHandlePage( CPAGE_GetCurrentPage());
478
478
static void get_keg_tab()
480
Word16 *prev_max=NULL,*cur_min=NULL,*keg_statsi=NULL;
481
Int32 prev_max_n=0,min_n=INT_MAX,prev_n=0;
482
// Int32 prev_size=0,i_prev=0;
484
Word8 rely1,rely2,extend2;
480
uint16_t *prev_max=NULL,*cur_min=NULL,*keg_statsi=NULL;
481
int32_t prev_max_n=0,min_n=INT_MAX,prev_n=0;
482
// int32_t prev_size=0,i_prev=0;
484
uchar rely1,rely2,extend2;
485
485
KegTabElement *keg_tabi;
487
Word8 temp_tab[3*KEG_PAGE]; //������� �� num_keg_opt ������
488
//��������� temp_tab:
490
// 1 - ������� ������� ����������������
491
// 2 - ������� ������� ����������������
487
uchar temp_tab[3*KEG_PAGE]; //таблица из num_keg_opt кеглей
488
//структура temp_tab:
490
// 1 - граница области неопределенности
491
// 2 - граница области неопределенности
502
502
for (i=0,keg_statsi=keg_stats; i<=num_keg+1 && num_keg_opt<KEG_PAGE; i++,keg_statsi++)
503
{ //���� �������� ���� �� �����
503
{ //цикл включает нули по краям
504
int32_t n=*keg_statsi;
569
569
for (i=1; i<=num_keg_opt; i++,tab += 3)
571
Int32 tol=(Int8)(keg_stats[*tab])/3;
571
int32_t tol=(char)(keg_stats[*tab])/3;
573
573
rely2=*(tab+1)-1; extend2=*(tab+2); keg_tabi=keg_tab+j;
574
574
for (k=rely1,keg_statsi=keg_stats+k; k<=rely2; k++,keg_statsi++)
575
575
if (*keg_statsi>=tol) { n += *keg_statsi; keg += *keg_statsi*k; }
576
// if (n>0) keg=keg*2/n; //������ ������ �� ����� ��������� �� ���� ���������
576
// if (n>0) keg=keg*2/n; //размер шрифта от верха заглавной до низа опущенной
577
577
if (n>0) keg=(keg+n/2)/n;
578
for ( ; j<rely1; j++,keg_tabi++) keg_tabi->keg1=-(Int8)keg;
579
for ( ; j<=rely2; j++,keg_tabi++) keg_tabi->keg0= (Int8)keg;
580
for ( ; j<=extend2; j++,keg_tabi++) keg_tabi->keg0=-(Int8)keg;
578
for ( ; j<rely1; j++,keg_tabi++) keg_tabi->keg1=-(char)keg;
579
for ( ; j<=rely2; j++,keg_tabi++) keg_tabi->keg0= (char)keg;
580
for ( ; j<=extend2; j++,keg_tabi++) keg_tabi->keg0=-(char)keg;
581
581
rely1=extend2+1; j=rely2+1;
585
585
static Bool make_correct()
586
//����������� ����� ��� ��������� ����� (�������) � ����� ����� � ������,
587
// ���� � ��������� ���� �������
586
//проставляет кегль для надежного слова (опорный) и далее влево и вправо,
587
// пока в вариантах есть опорный
589
589
LDPUMA_DeleteRects(NULL, key);
1339
1339
/* if( snap_enable && !LDPUMA_SkipEx(hSnapGarbage,FALSE,TRUE,1) )
1340
1340
if (line) LDPUMA_CSTR_Monitor(hSnapMain,line,0,myMonitorProc);*/
1342
//�������� ����������
1342
//удаление фрагментов
1344
1344
hBlock = CPAGE_GetBlockFirst(hCPAGE,TYPE_TEXT);
1347
1347
Handle hNext = CPAGE_GetBlockNext(hCPAGE,hBlock,TYPE_TEXT);
1349
Word32 bl_flg=CPAGE_GetBlockFlags(hCPAGE,hBlock);
1349
uint32_t bl_flg=CPAGE_GetBlockFlags(hCPAGE,hBlock);
1350
1350
if (!(bl_flg & USER_FRAG) || rsti->flag==RS_STRANGE)
1352
1352
for (i=0,rsti=recstat; i<num_frag; i++,rsti++)
1353
1353
if (hBlock==rsti->hBlock) break;
1355
if (i==num_frag || rsti->flag==0 || rsti->flag==RS_BAD || rsti->flag==RS_STRANGE) //��������� (��� �����), ����� ��� � ��������
1355
if (i==num_frag || rsti->flag==0 || rsti->flag==RS_BAD || rsti->flag==RS_STRANGE) //фиктивный (без строк), грязь или с ошибками
1356
1356
CPAGE_DeleteBlock(hCPAGE,hBlock);
1358
1358
hBlock = hNext;
1472
1472
COMMON *com=&poly.com;
1473
1473
Point32 p32=com->Vertex[0];
1474
1474
Point16 cv,pv,v0;
1476
v0.x=(Int16)p32.x; v0.y=(Int16)p32.y;
1476
v0.x=(int16_t)p32.x; v0.y=(int16_t)p32.y;
1478
1478
for (i=1; i<com->count; i++)
1480
1480
Point32 p32=com->Vertex[i];
1482
cv.x=(Int16)p32.x; cv.y=(Int16)p32.y;
1482
cv.x=(int16_t)p32.x; cv.y=(int16_t)p32.y;
1483
1483
LDPUMA_DrawLine(NULL,&pv,&cv,0,color,1,key);
1485
1485
LDPUMA_DrawLine(NULL,&v0,&cv,0,color,1,key);
1486
1486
if( snap_enable && !LDPUMA_SkipEx(hSnapGarbage,FALSE,TRUE,1) )
1489
sprintf((char*)msg,"draw=%d handle=%x\n",com->number,CPAGE_GetHandleBlock(hCPAGE, com->number));
1489
sprintf((char*)msg,"draw=%d handle=%x\n",com->number,(unsigned int)((unsigned long)CPAGE_GetHandleBlock(hCPAGE, com->number)));
1490
1490
LDPUMA_Console((const char*)msg);
1491
1491
LDPUMA_RasterText((char*)msg);
1554
1554
main_area->bottom=MAX(main_area->bottom,rect->bottom);
1557
static Int32 rect_dist(Rect32 *main, Rect32 *test)
1557
static int32_t rect_dist(Rect32 *main, Rect32 *test)
1560
Int32 x1=main->left-test->right;
1561
Int32 x2=test->left-main->right;
1562
Int32 y1=main->top-test->bottom;
1563
Int32 y2=test->top-main->bottom;
1564
if (x1>0 || x2>0 || y1>0 || y2>0) //�� �����������
1560
int32_t x1=main->left-test->right;
1561
int32_t x2=test->left-main->right;
1562
int32_t y1=main->top-test->bottom;
1563
int32_t y2=test->top-main->bottom;
1564
if (x1>0 || x2>0 || y1>0 || y2>0) //не пересекаютс
1566
1566
x=MAX(x1,x2); y=max(y1,y2);
1567
1567
if (x<0) return y;
1608
1608
IDEAL_XY(rect->bottom, rect->right);
1611
static void draw_rect(Rect32 *rect, Word32 color, Word32 key)
1611
static void draw_rect(Rect32 *rect, uint32_t color, uint32_t key)
1613
1613
Point16 v1,v2,v3,v4;
1614
v1.x=(Int16)rect->left; v1.y=(Int16)rect->top;
1615
v2.x=(Int16)rect->right; v2.y=(Int16)rect->top;
1616
v3.x=(Int16)rect->right; v3.y=(Int16)rect->bottom;
1617
v4.x=(Int16)rect->left; v4.y=(Int16)rect->bottom;
1614
v1.x=(int16_t)rect->left; v1.y=(int16_t)rect->top;
1615
v2.x=(int16_t)rect->right; v2.y=(int16_t)rect->top;
1616
v3.x=(int16_t)rect->right; v3.y=(int16_t)rect->bottom;
1617
v4.x=(int16_t)rect->left; v4.y=(int16_t)rect->bottom;
1618
1618
LDPUMA_DrawLine(NULL,&v1,&v2,0,color,1,key);
1619
1619
LDPUMA_DrawLine(NULL,&v2,&v3,0,color,1,key);
1620
1620
LDPUMA_DrawLine(NULL,&v3,&v4,0,color,1,key);
1621
1621
LDPUMA_DrawLine(NULL,&v4,&v1,0,color,1,key);
1624
static Bool add2list(LineNumber **frag_lines_list, Int32 fn, Int32 ln)
1624
static Bool add2list(LineNumber **frag_lines_list, int32_t fn, int32_t ln)
1626
1626
LineNumber *cur_num=*frag_lines_list;
1627
if (cur_num != (LineNumber *)frag_lines_list) //���� �����
1627
if (cur_num != (LineNumber *)frag_lines_list) //есть место
1629
cur_num->n=ln; //������
1629
cur_num->n=ln; //данные
1630
1630
cur_num->next=frag_lines_list[fn];
1631
frag_lines_list[fn]=cur_num; //��������� � ������ ���������
1632
(*frag_lines_list)++; //��������� �����
1631
frag_lines_list[fn]=cur_num; //добавляем к списку фрагмента
1632
(*frag_lines_list)++; //свободное место
1705
1705
void kegl_snap_init()
1707
LDPUMA_Registry(&hSnapMain,"��������� �����...",NULL);
1708
LDPUMA_RegistryHelp(hSnapMain,"��������� �����...",FALSE);
1709
LDPUMA_Registry(&hSnapEndPage,"����� ��������",hSnapMain);
1710
LDPUMA_RegistryHelp(hSnapEndPage,"����� ��������",FALSE);
1711
// LDPUMA_Registry(&hSnapTable,"������ ����� � �������",hSnapMain);
1712
LDPUMA_Registry(&hSnapGarbage,"�������� ������",NULL);
1713
LDPUMA_Registry(&hSnapGarbageLine,"�������� �����",hSnapGarbage);
1714
LDPUMA_RegistryHelp(hSnapGarbage,"�������� ������",FALSE);
1715
LDPUMA_RegistryHelp(hSnapGarbageLine,"��������� �� ������ ������ ���������",FALSE);
1716
LDPUMA_RegVariable(hSnapGarbage,"������� �����",&gbGarbage,"long");
1717
LDPUMA_RegVariable(hSnapMain,"����",&gbFax100,"long");
1707
LDPUMA_Registry(&hSnapMain,"Коррекция кегля...",NULL);
1708
LDPUMA_RegistryHelp(hSnapMain,"Коррекция кегля...",FALSE);
1709
LDPUMA_Registry(&hSnapEndPage,"Конец страницы",hSnapMain);
1710
LDPUMA_RegistryHelp(hSnapEndPage,"Конец страницы",FALSE);
1711
// LDPUMA_Registry(&hSnapTable,"Единый кегль в таблице",hSnapMain);
1712
LDPUMA_Registry(&hSnapGarbage,"Удаление мусора",NULL);
1713
LDPUMA_Registry(&hSnapGarbageLine,"Просмотр строк",hSnapGarbage);
1714
LDPUMA_RegistryHelp(hSnapGarbage,"Удаление мусора",FALSE);
1715
LDPUMA_RegistryHelp(hSnapGarbageLine,"Остановка на каждой строке фрагмента",FALSE);
1716
LDPUMA_RegVariable(hSnapGarbage,"Чистить мусор",&gbGarbage,"long");
1717
LDPUMA_RegVariable(hSnapMain,"Факс",&gbFax100,"long");
1720
1720
static void kegl_by_frag()