~ubuntu-branches/debian/experimental/cuneiform/experimental

« back to all changes in this revision

Viewing changes to cuneiform_src/Kern/pass2/src/p2_tools.c

  • Committer: Bazaar Package Importer
  • Author(s): Jakub Wilk, libm.diff, swapbytes.diff
  • Date: 2010-09-14 15:53:54 UTC
  • mfrom: (1.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20100914155354-hhxaa13xmhb82e3e
Tags: 1.0.0+dfsg-1
* New upstream release (closes: #575419).
* New maintainer (closes: #543893).
* Document in README.source how to repackage upstream tarball.
* Update debian/copyright.
  + Document that the package is auto-buildable.
  + Document which files were stripped from the upstream tarball.
  + Convert to the DEP-5 format.
* Drop README.Debian, no longer needed.
* Rewrite debian/rules from scratch using dh.
  + Bump debhelper minimum version to 7.4.4 (for cmake support).
  + Turn on MAKE_VERBOSE_MAKEFILE.
  + Disable call to dh_makeshlibs to avoid creation of spurious
    calls to ldconfig in postrm/postinst.
  + Add get-orig-source target.
* Remove unused overrides.
* Link to GraphicsMagick rather than ImageMagick:
  + Build-depend on graphicsmagick-libmagick-dev-compat.
  + Add patch to properly initialize the library. [graphicsmagick.diff]    
* Bump standards version to 3.9.1 (no changes needed).
* Force upgrade of ocrodjvu to at least 0.4.2; earlier versions of ocrodjvu
  don't support this version of Cuneiform.
* List all the supported languages in the package description.
* Update the manual page.
  + Document --dotmatrix, --fax and --singlecolumn options.
  + Document all output formats.
  + Don't use hyphen as minus sign.
  + Fix a few formatting issues.
* Drop Vcs-* fields.
* Add watch file.
* Add patch from Dmitrijs Ledkovs to link the lao library with libm.
  [libm.diff]
* Add patch for a for a more portable function to swap byte order.
  [swapbytes.diff]
* Set Architecture to any; there's no good reason to limit it.
* Run rudimentary tests at build time.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
 
Copyright (c) 1993-2008, Cognitive Technologies
3
 
All rights reserved.
4
 
 
5
 
����������� ��������� ��������������� � ������������� ��� � ���� ��������� ����,
6
 
��� � � �������� �����, � ����������� ��� ���, ��� ���������� ��������� �������:
7
 
 
8
 
      * ��� ��������� ��������������� ��������� ���� ������ ���������� ���������
9
 
        ���� ����������� �� ��������� �����, ���� ������ ������� � �����������
10
 
        ����� �� ��������.
11
 
      * ��� ��������� ��������������� ��������� ���� � ������������ �/��� �
12
 
        ������ ����������, ������������ ��� ���������������, ������ �����������
13
 
        ��������� ���� ���������� �� ��������� �����, ���� ������ ������� �
14
 
        ����������� ����� �� ��������.
15
 
      * �� �������� Cognitive Technologies, �� ����� �� ����������� �� �����
16
 
        ���� ������������ � �������� �������� ��������� �/��� �����������
17
 
        ���������, ���������� �� ���� ��, ��� ���������������� �����������
18
 
        ����������.
19
 
 
20
 
��� ��������� ������������� ����������� ��������� ���� �/��� ������� ������ "���
21
 
��� ����" ��� ������-���� ���� ��������, ���������� ���� ��� ���������������,
22
 
������� �������� ������������ �������� � ����������� ��� ���������� ����, �� ��
23
 
������������� ���. �� �������� ��������� ���� � �� ���� ������ ����, �������
24
 
����� �������� �/��� �������� �������������� ���������, �� � ���� ������ ��
25
 
��Ѩ� ���������������, ������� ����� �����, ���������, ����������� ���
26
 
������������� ������, ��������� � �������������� ��� ���������� ����������
27
 
������������� ������������� ��������� (������� ������ ������, ��� ������,
28
 
������� ���������, ��� ������ �/��� ������ �������, ���������� ��-�� ��������
29
 
������� ��� �/��� ������ ��������� �������� ��������� � ������� �����������,
30
 
�� �� ������������� ����� ��������), �� �� ������������� ���, ���� ���� �����
31
 
�������� ��� ������ ���� ���� �������� � ����������� ����� ������� � ������.
32
 
 
33
 
Redistribution and use in source and binary forms, with or without modification,
34
 
are permitted provided that the following conditions are met:
35
 
 
36
 
    * Redistributions of source code must retain the above copyright notice,
37
 
      this list of conditions and the following disclaimer.
38
 
    * Redistributions in binary form must reproduce the above copyright notice,
39
 
      this list of conditions and the following disclaimer in the documentation
40
 
      and/or other materials provided with the distribution.
41
 
    * Neither the name of the Cognitive Technologies nor the names of its
42
 
      contributors may be used to endorse or promote products derived from this
43
 
      software without specific prior written permission.
44
 
 
45
 
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
46
 
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
47
 
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
48
 
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
49
 
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
50
 
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
51
 
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
52
 
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
53
 
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
54
 
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
55
 
*/
 
2
 Copyright (c) 1993-2008, Cognitive Technologies
 
3
 All rights reserved.
 
4
 
 
5
 ����������� ��������� ��������������� � ������������� ��� � ���� ��������� ����,
 
6
 ��� � � �������� �����, � ����������� ��� ���, ��� ���������� ��������� �������:
 
7
 
 
8
 * ��� ��������� ��������������� ��������� ���� ������ ���������� ���������
 
9
 ���� ����������� �� ��������� �����, ���� ������ ������� � �����������
 
10
 ����� �� ��������.
 
11
 * ��� ��������� ��������������� ��������� ���� � ������������ �/��� �
 
12
 ������ ����������, ������������ ��� ���������������, ������ �����������
 
13
 ��������� ���� ���������� �� ��������� �����, ���� ������ ������� �
 
14
 ����������� ����� �� ��������.
 
15
 * �� �������� Cognitive Technologies, �� ����� �� ����������� �� �����
 
16
 ���� ������������ � �������� �������� ��������� �/��� �����������
 
17
 ���������, ���������� �� ���� ��, ��� ���������������� �����������
 
18
 ����������.
 
19
 
 
20
 ��� ��������� ������������� ����������� ��������� ���� �/��� ������� ������ "���
 
21
 ��� ����" ��� ������-���� ���� ��������, ���������� ���� ��� ���������������,
 
22
 ������� �������� ������������ �������� � ����������� ��� ���������� ����, �� ��
 
23
 ������������� ���. �� �������� ��������� ���� � �� ���� ������ ����, �������
 
24
 ����� �������� �/��� �������� �������������� ���������, �� � ���� ������ ��
 
25
 ��Ѩ� ���������������, ������� ����� �����, ���������, ����������� ���
 
26
 ������������� ������, ��������� � �������������� ��� ���������� ����������
 
27
 ������������� ������������� ��������� (������� ������ ������, ��� ������,
 
28
 ������� ���������, ��� ������ �/��� ������ �������, ���������� ��-�� ��������
 
29
 ������� ��� �/��� ������ ��������� �������� ��������� � ������� �����������,
 
30
 �� �� ������������� ����� ��������), �� �� ������������� ���, ���� ���� �����
 
31
 �������� ��� ������ ���� ���� �������� � ����������� ����� ������� � ������.
 
32
 
 
33
 Redistribution and use in source and binary forms, with or without modification,
 
34
 are permitted provided that the following conditions are met:
 
35
 
 
36
 * Redistributions of source code must retain the above copyright notice,
 
37
 this list of conditions and the following disclaimer.
 
38
 * Redistributions in binary form must reproduce the above copyright notice,
 
39
 this list of conditions and the following disclaimer in the documentation
 
40
 and/or other materials provided with the distribution.
 
41
 * Neither the name of the Cognitive Technologies nor the names of its
 
42
 contributors may be used to endorse or promote products derived from this
 
43
 software without specific prior written permission.
 
44
 
 
45
 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 
46
 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 
47
 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 
48
 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
 
49
 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 
50
 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 
51
 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 
52
 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 
53
 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 
54
 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
55
 */
56
56
 
57
57
// must accord #define _USE_DETOUCH_ in p2_proc !!!
58
58
//#define _USE_DETOUCH_
59
59
 
60
 
 #include <stdlib.h>
61
 
 #include <sys/stat.h>
62
 
 /*#include <io.h>*/
 
60
#include <stdlib.h>
 
61
#include <sys/stat.h>
63
62
 
64
 
 #include "nt_types.h"
65
 
 #include <stdio.h>
66
 
 #include <fcntl.h>
67
 
/* #include <direct.h>*/
68
 
 #include <string.h>
 
63
#include <stdio.h>
 
64
#include <fcntl.h>
 
65
#include <string.h>
69
66
 
70
67
#include "cstr.h" // OLEG
71
68
#include "globus.h"
74
71
#include "leo.h"
75
72
#include "lang_def.h"
76
73
#include "ccom.h"
77
 
//#include "struct.h"
78
74
#include "fon.h"
79
75
#include "std.h"
80
76
 
84
80
extern P2GLOBALS p2globals;
85
81
// ���� language
86
82
#include "ligas.h"                              // 01.06.2001 E.P.
87
 
 
88
83
////////////////
89
 
Bool32 p2_StoreVersions(CSTR_rast rast,RecVersions *rver)
90
 
{
91
 
INT i;
92
 
UniVersions cver,*ver;
93
 
Word8 let;
94
 
INT lang=p2globals.language;
95
 
 
96
 
if( lang==LANG_ENGLISH && p2globals.multy_language )
97
 
    lang    = LANG_RUSENG;
98
 
 
99
 
 if(!rast) return FALSE;
100
 
 ver=&cver;
101
 
 memset(ver,0,sizeof(UniVersions));
102
 
 ver->lnAltCnt = MIN(REC_MAX_VERS,rver->lnAltCnt);
103
 
 ver->lnAltMax = REC_MAX_VERS;
104
 
 
105
 
 for(i=0;i<ver->lnAltCnt;i++)
106
 
      {
107
 
      let = rver->Alt[i].Code;
108
 
      //strcpy(ver->Alt[i].Code , decode_ASCII_to_[let]);
109
 
          RSTR_p2_DecodeCode(ver->Alt[i].Code,let);
110
 
      ver->Alt[i].Liga      =  let;
111
 
      ver->Alt[i].Prob      =  rver->Alt[i].Prob;
112
 
      ver->Alt[i].Method    =  rver->Alt[i].Method;
113
 
      //ver->Alt[i].Charset   =  CodePages[lang]; // Oleg
114
 
          ver->Alt[i].Charset = RSTR_p2_GetCodePage(lang);
115
 
      ver->Alt[i].Info      =  rver->Alt[i].Info;
116
 
      }
117
 
 
118
 
 return CSTR_StoreCollectionUni(rast,ver);
 
84
Bool32 p2_StoreVersions(CSTR_rast rast, RecVersions *rver) {
 
85
        int16_t i;
 
86
        UniVersions cver, *ver;
 
87
        uchar let;
 
88
        int16_t lang = p2globals.language;
 
89
 
 
90
        if (lang == LANG_ENGLISH && p2globals.multy_language)
 
91
                lang = LANG_RUSENG;
 
92
 
 
93
        if (!rast)
 
94
                return FALSE;
 
95
        ver = &cver;
 
96
        memset(ver, 0, sizeof(UniVersions));
 
97
        ver->lnAltCnt = MIN(REC_MAX_VERS, rver->lnAltCnt);
 
98
        ver->lnAltMax = REC_MAX_VERS;
 
99
 
 
100
        for (i = 0; i < ver->lnAltCnt; i++) {
 
101
                let = rver->Alt[i].Code;
 
102
                //strcpy(ver->Alt[i].Code , decode_ASCII_to_[let]);
 
103
                RSTR_p2_DecodeCode(ver->Alt[i].Code, let);
 
104
                ver->Alt[i].Liga = let;
 
105
                ver->Alt[i].Prob = rver->Alt[i].Prob;
 
106
                ver->Alt[i].Method = rver->Alt[i].Method;
 
107
                //ver->Alt[i].Charset   =  CodePages[lang]; // Oleg
 
108
                ver->Alt[i].Charset = RSTR_p2_GetCodePage(lang);
 
109
                ver->Alt[i].Info = rver->Alt[i].Info;
 
110
        }
 
111
 
 
112
        return CSTR_StoreCollectionUni(rast, ver);
119
113
}
120
114
/////////////////
121
115
 
122
 
static void StoreOneInterval( Word8 *raster, int b, int e)
123
 
{
124
 
int i;
125
 
Word8 mask[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
126
 
 
127
 
if(b < 0) b=0;
128
 
for(i=b;i<e;i++)
129
 
  {
130
 
  raster[ i>>3 ] |=  mask[ i&7 ];
131
 
  }
132
 
 
133
 
return;
 
116
static void StoreOneInterval(uchar *raster, int b, int e) {
 
117
        int i;
 
118
        uchar mask[] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
 
119
 
 
120
        if (b < 0)
 
121
                b = 0;
 
122
        for (i = b; i < e; i++) {
 
123
                raster[i >> 3] |= mask[i & 7];
 
124
        }
 
125
 
 
126
        return;
134
127
}
135
128
////////////
136
 
static Bool32 Lines2Raster(CCOM_lnhead *linerep, Int16 size,
137
 
                      Int16 w, Int16 h,
138
 
                      RecRaster *rec)
139
 
{
140
 
 int            ww, len, i;
141
 
 CCOM_lnhead    * line;
142
 
 CCOM_interval  * inter;
143
 
 
144
 
 if( !w || !h || w > rec->lnPixWidth || h > rec->lnPixHeight )
145
 
  return FALSE;
146
 
 
147
 
 ww = REC_GW_WORD8(rec->lnPixWidth);
148
 
 
149
 
 for(line=linerep,len=0; len<size && line->lth; len+=line->lth,line=(CCOM_lnhead *)((intptr_t)line+line->lth))
150
 
  {
151
 
   Word8 *buf=&rec->Raster[ line->row*ww ];
152
 
   for(inter = (CCOM_interval*)(line+1), i=0; i<line->h; i++, inter++,buf+=ww)
153
 
    StoreOneInterval( buf, inter->e-inter->l, MIN(w,inter->e));
154
 
  }
155
 
 
156
 
return TRUE;
 
129
static Bool32 Lines2Raster(CCOM_lnhead *linerep, int16_t size, int16_t w,
 
130
                int16_t h, RecRaster *rec) {
 
131
        int ww, len, i;
 
132
        CCOM_lnhead * line;
 
133
        CCOM_interval * inter;
 
134
 
 
135
        if (!w || !h || w > rec->lnPixWidth || h > rec->lnPixHeight)
 
136
                return FALSE;
 
137
 
 
138
        ww = REC_GW_WORD8(rec->lnPixWidth);
 
139
 
 
140
        for (line = linerep, len = 0; len < size && line->lth; len += line->lth, line
 
141
                        = (CCOM_lnhead *) ((intptr_t) line + line->lth)) {
 
142
                uchar *buf = &rec->Raster[line->row * ww];
 
143
                for (inter = (CCOM_interval*) (line + 1), i = 0; i < line->h; i++, inter++, buf
 
144
                                += ww)
 
145
                        StoreOneInterval(buf, inter->e - inter->l, MIN(w, inter->e));
 
146
        }
 
147
 
 
148
        return TRUE;
157
149
}
158
150
///////////////
159
151
// �������� �����, �������� ������, �� �������� ����������
160
152
//
161
153
// Bool32 p2_Line2Raster(c_comp *comp, RecRaster *rec)
162
 
//   lp = (Word8 *)(comp+1);
163
 
//   lt = *(Int16*)lp;
 
154
//   lp = (uchar *)(comp+1);
 
155
//   lt = *(int16_t*)lp;
164
156
//   w = comp->w
165
157
//   h = comp->h
166
 
P2_FUNC(Bool32) p2_Comp2Raster(Int16 lt,Word8 *lp,Int16 w,Int16 h,
167
 
                                          RecRaster *rec)
 
158
P2_FUNC(Bool32) p2_Comp2Raster(int16_t lt,uchar *lp,int16_t w,int16_t h,
 
159
                RecRaster *rec)
168
160
{
169
 
//Int16  w, h;
170
 
//Word8  *lp;
171
 
//Int16  *lt;
172
 
Bool32 ret;
173
 
 
174
 
// if( !comp || !rec )
175
 
//    return FALSE;
176
 
 
177
 
 rec->lnPixWidth  = w;
178
 
 rec->lnPixHeight = h;
179
 
 rec->lnRasterBufSize=REC_MAX_RASTER_SIZE;
180
 
 
181
 
// if( comp->scale )
182
 
//    {
183
 
//    rec->lnPixWidth  >>= comp->scale;
184
 
//    rec->lnPixHeight >>= comp->scale;
185
 
//    }
186
 
 
187
 
  if( rec->lnPixWidth  <= 0 ||
188
 
     rec->lnPixHeight <= 0 )
189
 
         return FALSE;
190
 
 
191
 
  memset( rec->Raster, 0 , REC_GW_WORD8(rec->lnPixWidth)*rec->lnPixHeight);
192
 
 
193
 
//  lp = (Word8 *)(comp+1);
194
 
//  lt = *(Int16*)lp;
195
 
//
196
 
  w=(Int16)rec->lnPixWidth;
197
 
  h=(Int16)rec->lnPixHeight;
198
 
 
199
 
//  do  { // comps cycle - in CCOM_GetRaster if numcomp>1
200
 
//          if( (*lt) <= 2 ) break;
201
 
        ret = Lines2Raster((CCOM_lnhead*)&lp[2],(Int16)(lt-2), w, h ,rec);
202
 
//      lp += *lt;
203
 
//      lt  = (Int16*)lp;
204
 
//       }
205
 
//  while( ret );
206
 
 
207
 
  return ret;
 
161
        //int16_t  w, h;
 
162
        //uchar  *lp;
 
163
        //int16_t  *lt;
 
164
        Bool32 ret;
 
165
 
 
166
        // if( !comp || !rec )
 
167
        //    return FALSE;
 
168
 
 
169
        rec->lnPixWidth = w;
 
170
        rec->lnPixHeight = h;
 
171
        rec->lnRasterBufSize=REC_MAX_RASTER_SIZE;
 
172
 
 
173
        // if( comp->scale )
 
174
        //    {
 
175
        //    rec->lnPixWidth  >>= comp->scale;
 
176
        //    rec->lnPixHeight >>= comp->scale;
 
177
        //    }
 
178
 
 
179
        if( rec->lnPixWidth <= 0 ||
 
180
                        rec->lnPixHeight <= 0 )
 
181
        return FALSE;
 
182
 
 
183
        memset( rec->Raster, 0 , REC_GW_WORD8(rec->lnPixWidth)*rec->lnPixHeight);
 
184
 
 
185
        //  lp = (uchar *)(comp+1);
 
186
        //  lt = *(int16_t*)lp;
 
187
        //
 
188
        w=(int16_t)rec->lnPixWidth;
 
189
        h=(int16_t)rec->lnPixHeight;
 
190
 
 
191
        //  do  { // comps cycle - in CCOM_GetRaster if numcomp>1
 
192
        //          if( (*lt) <= 2 ) break;
 
193
        ret = Lines2Raster((CCOM_lnhead*)&lp[2],(int16_t)(lt-2), w, h ,rec);
 
194
        //      lp += *lt;
 
195
        //      lt  = (int16_t*)lp;
 
196
        //       }
 
197
        //  while( ret );
 
198
 
 
199
        return ret;
208
200
}
209
201
////////////
210
 
static int fir1[256]=
211
 
{8,7,6,6,5,5,5,5,4,4,4,4,4,4,4,4,
212
 
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
213
 
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
214
 
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
215
 
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
216
 
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
217
 
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
218
 
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
219
 
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
220
 
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
221
 
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
222
 
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
223
 
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
224
 
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
225
 
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
226
 
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
 
202
static int fir1[256] = { 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3,
 
203
                3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
 
204
                2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1,
 
205
                1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
 
206
                1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
 
207
                1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 
208
                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 
209
                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 
210
                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 
211
                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 
212
                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
227
213
///////////
228
 
static int las1[256]=
229
 
{8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
230
 
4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
231
 
5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
232
 
4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
233
 
6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
234
 
4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
235
 
5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
236
 
4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
 
214
static int las1[256] = { 8, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0,
 
215
                1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0,
 
216
                1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0,
 
217
                1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0,
 
218
                1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0,
 
219
                1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
237
220
 
238
 
7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
239
 
4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
240
 
5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
241
 
4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
242
 
6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
243
 
4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
244
 
5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
245
 
4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0} ;
 
221
                7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0,
 
222
                3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
 
223
                4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0,
 
224
                3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
 
225
                5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0,
 
226
                3, 0, 1, 0, 2, 0, 1, 0 };
246
227
 
247
228
//////////////////////
248
229
///////////////////////////////////
249
 
static void MoveWindowRow0(BYTE *outrow,BYTE *inrow,int SizeByte,int fir)
250
 
{
251
 
          memcpy(outrow,inrow,SizeByte);
 
230
static void MoveWindowRow0(uchar *outrow, uchar *inrow, int SizeByte, int fir) {
 
231
        memcpy(outrow, inrow, SizeByte);
252
232
}
253
233
//////////
254
 
static void MoveWindowRow2(BYTE *outrow,BYTE *inrow,int SizeByte,int fir)
255
 
{
256
 
 int i;
257
 
  switch(fir)
258
 
  {
259
 
   case 1:
260
 
        for(i=0;i<SizeByte;i++)
261
 
         outrow[i]=(inrow[i]<<1)|(inrow[i+1]>>7);
262
 
        break;
263
 
   case 2:
264
 
        for(i=0;i<SizeByte;i++)
265
 
         outrow[i]=(inrow[i]<<2)|(inrow[i+1]>>6);
266
 
        break;
267
 
   case 3:
268
 
        for(i=0;i<SizeByte;i++)
269
 
         outrow[i]=(inrow[i]<<3)|(inrow[i+1]>>5);
270
 
        break;
271
 
   case 4:
272
 
        for(i=0;i<SizeByte;i++)
273
 
         outrow[i]=(inrow[i]<<4)|(inrow[i+1]>>4);
274
 
        break;
275
 
   case 5:
276
 
        for(i=0;i<SizeByte;i++)
277
 
         outrow[i]=(inrow[i]<<5)|(inrow[i+1]>>3);
278
 
        break;
279
 
   case 6:
280
 
        for(i=0;i<SizeByte;i++)
281
 
         outrow[i]=(inrow[i]<<6)|(inrow[i+1]>>2);
282
 
        break;
283
 
   case 7:
284
 
        for(i=0;i<SizeByte;i++)
285
 
         outrow[i]=(inrow[i]<<7)|(inrow[i+1]>>1);
286
 
        break;
287
 
   default:return;
288
 
  }
289
 
 
290
 
//  outrow[SizeByte-1] |=       (BYTE)tiffWindow.maska;
291
 
}
292
 
///////////////
293
 
void MoveWindowRow1(BYTE *outrow,BYTE *inrow,int SizeByte,int fir)
294
 
{
295
 
 int i;
296
 
  SizeByte--;
297
 
  switch(fir)
298
 
  {
299
 
   case 1:
300
 
        for(i=0;i<SizeByte;i++)
301
 
         outrow[i]=(inrow[i]<<1)|(inrow[i+1]>>7);
302
 
        outrow[SizeByte]=inrow[SizeByte]<<1;
303
 
        break;
304
 
   case 2:
305
 
        for(i=0;i<SizeByte;i++)
306
 
         outrow[i]=(inrow[i]<<2)|(inrow[i+1]>>6);
307
 
        outrow[SizeByte]=inrow[SizeByte]<<2;
308
 
        break;
309
 
   case 3:
310
 
        for(i=0;i<SizeByte;i++)
311
 
         outrow[i]=(inrow[i]<<3)|(inrow[i+1]>>5);
312
 
        outrow[SizeByte]=inrow[SizeByte]<<3;
313
 
        break;
314
 
   case 4:
315
 
        for(i=0;i<SizeByte;i++)
316
 
         outrow[i]=(inrow[i]<<4)|(inrow[i+1]>>4);
317
 
        outrow[SizeByte]=inrow[SizeByte]<<4;
318
 
        break;
319
 
   case 5:
320
 
        for(i=0;i<SizeByte;i++)
321
 
         outrow[i]=(inrow[i]<<5)|(inrow[i+1]>>3);
322
 
        outrow[SizeByte]=inrow[SizeByte]<<5;
323
 
        break;
324
 
   case 6:
325
 
        for(i=0;i<SizeByte;i++)
326
 
         outrow[i]=(inrow[i]<<6)|(inrow[i+1]>>2);
327
 
        outrow[SizeByte]=inrow[SizeByte]<<6;
328
 
        break;
329
 
   case 7:
330
 
        for(i=0;i<SizeByte;i++)
331
 
         outrow[i]=(inrow[i]<<7)|(inrow[i+1]>>1);
332
 
        outrow[SizeByte]=inrow[SizeByte]<<7;
333
 
        break;
334
 
   default:return;
335
 
  }
336
 
 
337
 
//  outrow[SizeByte] |= (BYTE)tiffWindow.maska;
338
 
}
339
 
///////////////
340
 
static void (*MoveWindowRow)(BYTE *orow,BYTE *irow,int SizeByte,int fir);
341
 
static Word8 tmpRaster[REC_MAX_RASTER_SIZE];
 
234
static void MoveWindowRow2(uchar *outrow, uchar *inrow, int SizeByte, int fir) {
 
235
        int i;
 
236
        switch (fir) {
 
237
        case 1:
 
238
                for (i = 0; i < SizeByte; i++)
 
239
                        outrow[i] = (inrow[i] << 1) | (inrow[i + 1] >> 7);
 
240
                break;
 
241
        case 2:
 
242
                for (i = 0; i < SizeByte; i++)
 
243
                        outrow[i] = (inrow[i] << 2) | (inrow[i + 1] >> 6);
 
244
                break;
 
245
        case 3:
 
246
                for (i = 0; i < SizeByte; i++)
 
247
                        outrow[i] = (inrow[i] << 3) | (inrow[i + 1] >> 5);
 
248
                break;
 
249
        case 4:
 
250
                for (i = 0; i < SizeByte; i++)
 
251
                        outrow[i] = (inrow[i] << 4) | (inrow[i + 1] >> 4);
 
252
                break;
 
253
        case 5:
 
254
                for (i = 0; i < SizeByte; i++)
 
255
                        outrow[i] = (inrow[i] << 5) | (inrow[i + 1] >> 3);
 
256
                break;
 
257
        case 6:
 
258
                for (i = 0; i < SizeByte; i++)
 
259
                        outrow[i] = (inrow[i] << 6) | (inrow[i + 1] >> 2);
 
260
                break;
 
261
        case 7:
 
262
                for (i = 0; i < SizeByte; i++)
 
263
                        outrow[i] = (inrow[i] << 7) | (inrow[i + 1] >> 1);
 
264
                break;
 
265
        default:
 
266
                return;
 
267
        }
 
268
 
 
269
        //  outrow[SizeByte-1] |=       (uchar)tiffWindow.maska;
 
270
}
 
271
///////////////
 
272
void MoveWindowRow1(uchar *outrow, uchar *inrow, int SizeByte, int fir) {
 
273
        int i;
 
274
        SizeByte--;
 
275
        switch (fir) {
 
276
        case 1:
 
277
                for (i = 0; i < SizeByte; i++)
 
278
                        outrow[i] = (inrow[i] << 1) | (inrow[i + 1] >> 7);
 
279
                outrow[SizeByte] = inrow[SizeByte] << 1;
 
280
                break;
 
281
        case 2:
 
282
                for (i = 0; i < SizeByte; i++)
 
283
                        outrow[i] = (inrow[i] << 2) | (inrow[i + 1] >> 6);
 
284
                outrow[SizeByte] = inrow[SizeByte] << 2;
 
285
                break;
 
286
        case 3:
 
287
                for (i = 0; i < SizeByte; i++)
 
288
                        outrow[i] = (inrow[i] << 3) | (inrow[i + 1] >> 5);
 
289
                outrow[SizeByte] = inrow[SizeByte] << 3;
 
290
                break;
 
291
        case 4:
 
292
                for (i = 0; i < SizeByte; i++)
 
293
                        outrow[i] = (inrow[i] << 4) | (inrow[i + 1] >> 4);
 
294
                outrow[SizeByte] = inrow[SizeByte] << 4;
 
295
                break;
 
296
        case 5:
 
297
                for (i = 0; i < SizeByte; i++)
 
298
                        outrow[i] = (inrow[i] << 5) | (inrow[i + 1] >> 3);
 
299
                outrow[SizeByte] = inrow[SizeByte] << 5;
 
300
                break;
 
301
        case 6:
 
302
                for (i = 0; i < SizeByte; i++)
 
303
                        outrow[i] = (inrow[i] << 6) | (inrow[i + 1] >> 2);
 
304
                outrow[SizeByte] = inrow[SizeByte] << 6;
 
305
                break;
 
306
        case 7:
 
307
                for (i = 0; i < SizeByte; i++)
 
308
                        outrow[i] = (inrow[i] << 7) | (inrow[i + 1] >> 1);
 
309
                outrow[SizeByte] = inrow[SizeByte] << 7;
 
310
                break;
 
311
        default:
 
312
                return;
 
313
        }
 
314
 
 
315
        //  outrow[SizeByte] |= (uchar)tiffWindow.maska;
 
316
}
 
317
///////////////
 
318
static void (*MoveWindowRow)(uchar *orow, uchar *irow, int SizeByte, int fir);
 
319
static uchar tmpRaster[REC_MAX_RASTER_SIZE];
342
320
/////////////////
343
 
int p2_rotateRecRaster(RecRaster *rec,int ninc)
344
 
{
345
 
  int xbyte8 = REC_GW_WORD8(rec->lnPixWidth);
346
 
  int xbyte  = (rec->lnPixWidth+7)>>3;
347
 
  int yrow   = rec->lnPixHeight;
348
 
  int i,j,k;
349
 
  Word8 *tmpBuf;
350
 
  Word8 *tmpRas;
351
 
  int outByte;
352
 
  int firCol,lasCol;
353
 
  int max_shift,outXbit,outXbyte;
354
 
 
355
 
  if( ninc == 0 )
356
 
          return 1;
357
 
 
358
 
  //rec->lnPixWidth=erect_raster_value(tmpRaster,(INT)rec->lnPixWidth,(INT)yrow,(INT)ninc);
359
 
 
360
 
  max_shift=((long)(yrow-1)*ninc)/2048;
361
 
  if( max_shift < 0 )
362
 
          max_shift = -max_shift;
363
 
 
364
 
  if( max_shift < 1 )
365
 
          return 1;
366
 
 
367
 
 
368
 
  outXbit = rec->lnPixWidth + max_shift;
369
 
  outXbyte=(outXbit+7)>>3;
370
 
 
371
 
  memset (tmpRaster, 0, outXbyte*yrow);
372
 
 
373
 
        {
374
 
        int s1,s2,c;
375
 
        Word8 *rr;
376
 
 
377
 
        for (tmpRas=tmpRaster,tmpBuf=rec->Raster,i=0; i < yrow ;
378
 
              i++, tmpRas+=outXbyte,  tmpBuf+=xbyte8 )
379
 
        {
380
 
                if( ninc < 0)
381
 
                        c=((long)(i+1-yrow)*ninc)/2048;
382
 
                else
383
 
                        c=max_shift- (((long)(yrow-1-i)*ninc)/2048);
384
 
 
385
 
        rr = tmpRas + (c>>3) ;
386
 
                s1 = c&7;
387
 
                s2 = 8 - s1;
388
 
 
389
 
                rr[0]=(tmpBuf[0]>>s1);      // first
390
 
                for( j=1; j<xbyte; j++)
391
 
                        rr[j] = (tmpBuf[j-1]<<s2) | (tmpBuf[j]>>s1);
392
 
 
393
 
        if( outXbyte > xbyte )
394
 
            rr[j]=tmpBuf[j-1]<<s2;
395
 
         }
396
 
 
397
 
        }
398
 
 
399
 
//  rec->lnPixWidth=erect_raster_value(tmpRaster,(INT)rec->lnPixWidth,(INT)yrow,(INT)ninc);
400
 
 
401
 
// ����� ��������� ������� !
402
 
  for(i=0,firCol=outXbit;i<outXbyte;i++)
403
 
  {
404
 
          tmpBuf=tmpRaster+i;
405
 
          for(j=0;j<yrow;j++,tmpBuf+=outXbyte)
406
 
                  if( *tmpBuf )
407
 
                  {
408
 
                          k=(i<<3)+fir1[*tmpBuf];
409
 
                          if( k < firCol)
410
 
                                  firCol=k;
411
 
                  }
412
 
     if(firCol < outXbit ) break;
413
 
  }
414
 
 
415
 
  for(i=outXbyte-1,lasCol=0;i>=0;i--)
416
 
  {
417
 
          tmpBuf=tmpRaster+i;
418
 
          for(j=0;j<yrow;j++,tmpBuf+=outXbyte)
419
 
                  if( *tmpBuf)
420
 
                  {
421
 
                          k=(i<<3)+8-las1[*tmpBuf];
422
 
                          if( k > lasCol)
423
 
                                  lasCol=k;
424
 
                  }
425
 
     if(lasCol > 0) break;
426
 
  }
427
 
 
428
 
  // ����� �������� ���������� ���� ?
429
 
  if( firCol >= lasCol )
430
 
     return 0;
431
 
 
432
 
  rec->lnPixWidth = lasCol-firCol;
433
 
  outByte=(rec->lnPixWidth+7)>>3;
434
 
  xbyte8 = REC_GW_WORD8(rec->lnPixWidth);
435
 
 
436
 
  tmpBuf=tmpRaster+(firCol>>3);
437
 
  tmpRas=rec->Raster;
438
 
  memset(tmpRas,0,xbyte8*yrow);
439
 
 
440
 
 
441
 
  if( (firCol&7) == 0) MoveWindowRow=MoveWindowRow0;
442
 
  else if( ((lasCol-1)&7) >= ((lasCol-1-firCol)&7) )
443
 
           MoveWindowRow=MoveWindowRow1;
444
 
  else MoveWindowRow=MoveWindowRow2;
445
 
 
446
 
  firCol&=7;
447
 
  for (i =0; i < yrow; i++, tmpBuf+=outXbyte,tmpRas+=xbyte8)
448
 
    MoveWindowRow(tmpRas,tmpBuf,outByte,firCol);
449
 
 
450
 
  return 1;
 
321
int p2_rotateRecRaster(RecRaster *rec, int ninc) {
 
322
        int xbyte8 = REC_GW_WORD8(rec->lnPixWidth);
 
323
        int xbyte = (rec->lnPixWidth + 7) >> 3;
 
324
        int yrow = rec->lnPixHeight;
 
325
        int i, j, k;
 
326
        uchar *tmpBuf;
 
327
        uchar *tmpRas;
 
328
        int outByte;
 
329
        int firCol, lasCol;
 
330
        int max_shift, outXbit, outXbyte;
 
331
 
 
332
        if (ninc == 0)
 
333
                return 1;
 
334
 
 
335
        //rec->lnPixWidth=erect_raster_value(tmpRaster,(int16_t)rec->lnPixWidth,(int16_t)yrow,(int16_t)ninc);
 
336
 
 
337
        max_shift = ((long) (yrow - 1) * ninc) / 2048;
 
338
        if (max_shift < 0)
 
339
                max_shift = -max_shift;
 
340
 
 
341
        if (max_shift < 1)
 
342
                return 1;
 
343
 
 
344
        outXbit = rec->lnPixWidth + max_shift;
 
345
        outXbyte = (outXbit + 7) >> 3;
 
346
 
 
347
        memset(tmpRaster, 0, outXbyte * yrow);
 
348
 
 
349
        {
 
350
                int s1, s2, c;
 
351
                uchar *rr;
 
352
 
 
353
                for (tmpRas = tmpRaster, tmpBuf = rec->Raster, i = 0; i < yrow; i++, tmpRas
 
354
                                += outXbyte, tmpBuf += xbyte8) {
 
355
                        if (ninc < 0)
 
356
                                c = ((long) (i + 1 - yrow) * ninc) / 2048;
 
357
                        else
 
358
                                c = max_shift - (((long) (yrow - 1 - i) * ninc) / 2048);
 
359
 
 
360
                        rr = tmpRas + (c >> 3);
 
361
                        s1 = c & 7;
 
362
                        s2 = 8 - s1;
 
363
 
 
364
                        rr[0] = (tmpBuf[0] >> s1); // first
 
365
                        for (j = 1; j < xbyte; j++)
 
366
                                rr[j] = (tmpBuf[j - 1] << s2) | (tmpBuf[j] >> s1);
 
367
 
 
368
                        if (outXbyte > xbyte)
 
369
                                rr[j] = tmpBuf[j - 1] << s2;
 
370
                }
 
371
 
 
372
        }
 
373
 
 
374
        //  rec->lnPixWidth=erect_raster_value(tmpRaster,(int16_t)rec->lnPixWidth,(int16_t)yrow,(int16_t)ninc);
 
375
 
 
376
        // ����� ��������� ������� !
 
377
        for (i = 0, firCol = outXbit; i < outXbyte; i++) {
 
378
                tmpBuf = tmpRaster + i;
 
379
                for (j = 0; j < yrow; j++, tmpBuf += outXbyte)
 
380
                        if (*tmpBuf) {
 
381
                                k = (i << 3) + fir1[*tmpBuf];
 
382
                                if (k < firCol)
 
383
                                        firCol = k;
 
384
                        }
 
385
                if (firCol < outXbit)
 
386
                        break;
 
387
        }
 
388
 
 
389
        for (i = outXbyte - 1, lasCol = 0; i >= 0; i--) {
 
390
                tmpBuf = tmpRaster + i;
 
391
                for (j = 0; j < yrow; j++, tmpBuf += outXbyte)
 
392
                        if (*tmpBuf) {
 
393
                                k = (i << 3) + 8 - las1[*tmpBuf];
 
394
                                if (k > lasCol)
 
395
                                        lasCol = k;
 
396
                        }
 
397
                if (lasCol > 0)
 
398
                        break;
 
399
        }
 
400
 
 
401
        // ����� �������� ���������� ���� ?
 
402
        if (firCol >= lasCol)
 
403
                return 0;
 
404
 
 
405
        rec->lnPixWidth = lasCol - firCol;
 
406
        outByte = (rec->lnPixWidth + 7) >> 3;
 
407
        xbyte8 = REC_GW_WORD8(rec->lnPixWidth);
 
408
 
 
409
        tmpBuf = tmpRaster + (firCol >> 3);
 
410
        tmpRas = rec->Raster;
 
411
        memset(tmpRas, 0, xbyte8 * yrow);
 
412
 
 
413
        if ((firCol & 7) == 0)
 
414
                MoveWindowRow = MoveWindowRow0;
 
415
        else if (((lasCol - 1) & 7) >= ((lasCol - 1 - firCol) & 7))
 
416
                MoveWindowRow = MoveWindowRow1;
 
417
        else
 
418
                MoveWindowRow = MoveWindowRow2;
 
419
 
 
420
        firCol &= 7;
 
421
        for (i = 0; i < yrow; i++, tmpBuf += outXbyte, tmpRas += xbyte8)
 
422
                MoveWindowRow(tmpRas, tmpBuf, outByte, firCol);
 
423
 
 
424
        return 1;
451
425
}
452
426
///////////////
453
 
void p2_TextWord(CSTR_rast  c,CSTR_rast stop, char *intxt,BOOL ansi)
454
 
{
455
 
        CSTR_rast_attr attr;
456
 
        UniVersions     vers;
457
 
        char *txt=intxt;
458
 
 
459
 
        for(*txt='\0'; c && c!=stop; c=CSTR_GetNextRaster (c,CSTR_f_all))
460
 
    {
461
 
    CSTR_GetAttr(c, &attr);
462
 
    if( !(attr.flg & (CSTR_f_let|CSTR_f_punct|CSTR_f_bad|CSTR_f_space)) )
463
 
        continue;
464
 
    CSTR_GetCollectionUni(c, &vers);
465
 
    if( !vers.lnAltCnt )
466
 
                strcat(txt,"~");
467
 
    else
468
 
                strcat(txt,vers.Alt[0].Code);
469
 
    }
470
 
 
471
 
 
472
 
    for(txt=intxt;*txt;txt++)
473
 
         *txt=stdAnsiToAscii(*txt);
 
427
void p2_TextWord(CSTR_rast c, CSTR_rast stop, char *intxt, Bool ansi) {
 
428
        CSTR_rast_attr attr;
 
429
        UniVersions vers;
 
430
        char *txt = intxt;
 
431
 
 
432
        for (*txt = '\0'; c && c != stop; c = CSTR_GetNextRaster(c, CSTR_f_all)) {
 
433
                CSTR_GetAttr(c, &attr);
 
434
                if (!(attr.flg
 
435
                                & (CSTR_f_let | CSTR_f_punct | CSTR_f_bad | CSTR_f_space)))
 
436
                        continue;
 
437
                CSTR_GetCollectionUni(c, &vers);
 
438
                if (!vers.lnAltCnt)
 
439
                        strcat(txt, "~");
 
440
                else
 
441
                        strcat(txt, vers.Alt[0].Code);
 
442
        }
 
443
 
 
444
        for (txt = intxt; *txt; txt++)
 
445
                *txt = stdAnsiToAscii(*txt);
474
446
 
475
447
}
476
448
//////////////////
477
 
void p2_FillTxt(CSTR_line cc,char *intxt,BOOL ansi)
478
 
{
479
 
        CSTR_rast first=CSTR_GetFirstRaster(cc);
480
 
        CSTR_rast last=CSTR_GetLastRaster(cc);
481
 
        if(!first) return;
482
 
    p2_TextWord(CSTR_GetNext(first),last,intxt,ansi);
 
449
void p2_FillTxt(CSTR_line cc, char *intxt, Bool ansi) {
 
450
        CSTR_rast first = CSTR_GetFirstRaster(cc);
 
451
        CSTR_rast last = CSTR_GetLastRaster(cc);
 
452
        if (!first)
 
453
                return;
 
454
        p2_TextWord(CSTR_GetNext(first), last, intxt, ansi);
483
455
}
484
456
//////////////////////////////
485
 
Int32 p2_TextProb(CSTR_line cc,CSTR_rast  first,CSTR_rast last, char *intxt,int maxTxt)
486
 
{
487
 
        CSTR_rast_attr  attr;
488
 
        UniVersions     vers;
489
 
        CSTR_rast       c;
490
 
        char            *txt=intxt;
491
 
 
492
 
  if( cc )
493
 
        {
494
 
          first=CSTR_GetNext( CSTR_GetFirstRaster(cc));
495
 
          last=CSTR_GetLastRaster(cc);
496
 
        }
497
 
 
498
 
  for(c=first,*txt='\0'; c && c!=last; c=CSTR_GetNextRaster (c,CSTR_f_all))
499
 
  {
500
 
    CSTR_GetAttr(c, &attr);
501
 
    if( !(attr.flg & (CSTR_f_let|CSTR_f_punct|CSTR_f_bad|CSTR_f_space)) )
502
 
        continue;
503
 
    CSTR_GetCollectionUni(c, &vers);
504
 
    if( !vers.lnAltCnt )
505
 
                strcat(txt,"~(0)");
506
 
    else
507
 
        {
508
 
                strcat(txt,vers.Alt[0].Code);
509
 
                sprintf(txt+strlen(txt),"(%d)",vers.Alt[0].Prob);
510
 
        }
511
 
 
512
 
        if( (int)strlen(txt) >= maxTxt)
513
 
                break;
514
 
  }
515
 
 
516
 
//      if(ansi)
517
 
        {
518
 
            for(txt=intxt;*txt;txt++)
519
 
                 *txt=stdAnsiToAscii(*txt);
520
 
        }
521
 
 
522
 
  return strlen(intxt);
 
457
int32_t p2_TextProb(CSTR_line cc, CSTR_rast first, CSTR_rast last, char *intxt,
 
458
                int maxTxt) {
 
459
        CSTR_rast_attr attr;
 
460
        UniVersions vers;
 
461
        CSTR_rast c;
 
462
        char *txt = intxt;
 
463
 
 
464
        if (cc) {
 
465
                first = CSTR_GetNext(CSTR_GetFirstRaster(cc));
 
466
                last = CSTR_GetLastRaster(cc);
 
467
        }
 
468
 
 
469
        for (c = first, *txt = '\0'; c && c != last; c = CSTR_GetNextRaster(c,
 
470
                        CSTR_f_all)) {
 
471
                CSTR_GetAttr(c, &attr);
 
472
                if (!(attr.flg
 
473
                                & (CSTR_f_let | CSTR_f_punct | CSTR_f_bad | CSTR_f_space)))
 
474
                        continue;
 
475
                CSTR_GetCollectionUni(c, &vers);
 
476
                if (!vers.lnAltCnt)
 
477
                        strcat(txt, "~(0)");
 
478
                else {
 
479
                        strcat(txt, vers.Alt[0].Code);
 
480
                        sprintf(txt + strlen(txt), "(%d)", vers.Alt[0].Prob);
 
481
                }
 
482
 
 
483
                if ((int) strlen(txt) >= maxTxt)
 
484
                        break;
 
485
        }
 
486
 
 
487
        //      if(ansi)
 
488
        {
 
489
                for (txt = intxt; *txt; txt++)
 
490
                        *txt = stdAnsiToAscii(*txt);
 
491
        }
 
492
 
 
493
        return strlen(intxt);
523
494
}
524
495
//////////////////
525
 
static Word32 oddEvenFlag=CSTR_fn_val2odd;
526
 
Int32 p2_setOddEvenFlag(CSTR_rast first,CSTR_rast last)
527
 
{
528
 
  int numCell;
529
 
  CSTR_rast curr;
530
 
  CSTR_rast_attr cur;
531
 
 
532
 
  for (numCell=0,curr=first; curr&&curr!=last; curr=CSTR_GetNextRaster (curr, CSTR_f_all))
533
 
  {
534
 
    CSTR_GetAttr(curr,&cur);
535
 
    if(! ( cur.flg & CSTR_f_let) )
536
 
                continue;
537
 
        numCell++;
538
 
        cur.flg_new |= oddEvenFlag;
539
 
        CSTR_SetAttr(curr,&cur);
540
 
  }
541
 
 
542
 
  if( numCell <= 0)
543
 
          return 0;
544
 
 
545
 
  if( oddEvenFlag == CSTR_fn_val2odd)
546
 
          oddEvenFlag = CSTR_fn_val2even;
547
 
  else
548
 
          oddEvenFlag = CSTR_fn_val2odd;
549
 
 
550
 
  return numCell;
 
496
static uint32_t oddEvenFlag = CSTR_fn_val2odd;
 
497
int32_t p2_setOddEvenFlag(CSTR_rast first, CSTR_rast last) {
 
498
        int numCell;
 
499
        CSTR_rast curr;
 
500
        CSTR_rast_attr cur;
 
501
 
 
502
        for (numCell = 0, curr = first; curr && curr != last; curr
 
503
                        = CSTR_GetNextRaster(curr, CSTR_f_all)) {
 
504
                CSTR_GetAttr(curr, &cur);
 
505
                if (!(cur.flg & CSTR_f_let))
 
506
                        continue;
 
507
                numCell++;
 
508
                cur.flg_new |= oddEvenFlag;
 
509
                CSTR_SetAttr(curr, &cur);
 
510
        }
 
511
 
 
512
        if (numCell <= 0)
 
513
                return 0;
 
514
 
 
515
        if (oddEvenFlag == CSTR_fn_val2odd)
 
516
                oddEvenFlag = CSTR_fn_val2even;
 
517
        else
 
518
                oddEvenFlag = CSTR_fn_val2odd;
 
519
 
 
520
        return numCell;
551
521
}
552
522
////////////////
553
523
/* Function returns UPPER CASE variant of the letter.             */
554
 
BYTE p2_to_upperASCII( BYTE c )
555
 
{
556
 
  if ( c >= (BYTE)'a' && c <= (BYTE)'z') return c - (BYTE)'a' + (BYTE)'A';
557
 
  if(p2globals.language==LANG_RUSSIAN)
558
 
  {
559
 
     // for ASCII
560
 
    if ( c >= (BYTE)'�' && c <= (BYTE)'�') return c - (BYTE)'�' + (BYTE)'�';
561
 
    if ( c >= (BYTE)'�' && c <= (BYTE)'�') return c - (BYTE)'�' + (BYTE)'�';
562
 
  }
563
 
  return c;
 
524
uchar p2_to_upperASCII(uchar c) {
 
525
        if (c >= (uchar) 'a' && c <= (uchar) 'z')
 
526
                return c - (uchar) 'a' + (uchar) 'A';
 
527
        if (p2globals.language == LANG_RUSSIAN) {
 
528
                // for ASCII
 
529
                if (c >= (uchar) '�' && c <= (uchar) '�')
 
530
                        return c - (uchar) '�' + (uchar) '�';
 
531
                if (c >= (uchar) '�' && c <= (uchar) '�')
 
532
                        return c - (uchar) '�' + (uchar) '�';
 
533
        }
 
534
        return c;
564
535
}
565
536
 
566
 
 /* Function returns LOWER CASE variant of the letter.             */
567
 
BYTE p2_to_lowerASCII(BYTE c)
568
 
{
569
 
  if ( c >= (BYTE)'A' && c <= (BYTE)'Z') return c - (BYTE)'A'+ (BYTE)'a' ;
570
 
  if(p2globals.language==LANG_RUSSIAN)
571
 
  {
572
 
   // for ASCII
573
 
    if ( c >= (BYTE)'�' && c <= (BYTE)'�') return c - (BYTE)'�'+ (BYTE)'�' ;
574
 
    if ( c >= (BYTE)'�' && c <= (BYTE)'�') return c - (BYTE)'�'+ (BYTE)'�' ;
575
 
  }
576
 
  return c;
 
537
/* Function returns LOWER CASE variant of the letter.             */
 
538
uchar p2_to_lowerASCII(uchar c) {
 
539
        if (c >= (uchar) 'A' && c <= (uchar) 'Z')
 
540
                return c - (uchar) 'A' + (uchar) 'a';
 
541
        if (p2globals.language == LANG_RUSSIAN) {
 
542
                // for ASCII
 
543
                if (c >= (uchar) '�' && c <= (uchar) '�')
 
544
                        return c - (uchar) '�' + (uchar) '�';
 
545
                if (c >= (uchar) '�' && c <= (uchar) '�')
 
546
                        return c - (uchar) '�' + (uchar) '�';
 
547
        }
 
548
        return c;
577
549
}
578
550
///////////////
579
 
Bool32 p2_is_lowerASCII(BYTE ch)
580
 
{
 
551
Bool32 p2_is_lowerASCII(uchar ch) {
581
552
 
582
 
 if(p2globals.language==LANG_RUSSIAN)
583
 
 {
584
 
   // for ASCII
585
 
   if((ch >=(BYTE)'�' && ch <=(BYTE)'�') ||
586
 
      (ch >=(BYTE)'�' && ch <=(BYTE)'�')
587
 
     )
588
 
         return TRUE;
589
 
 }
590
 
 if(ch >= 'a' && ch <= 'z') return TRUE;
591
 
 return FALSE;
 
553
        if (p2globals.language == LANG_RUSSIAN) {
 
554
                // for ASCII
 
555
                if ((ch >= (uchar) '�' && ch <= (uchar) '�') || (ch >= (uchar) '�'
 
556
                                && ch <= (uchar) '�'))
 
557
                        return TRUE;
 
558
        }
 
559
        if (ch >= 'a' && ch <= 'z')
 
560
                return TRUE;
 
561
        return FALSE;
592
562
}
593
563
/////////////////////
594
 
Bool32 p2_is_upperASCII(BYTE ch)
595
 
{
596
 
 if(p2globals.language==LANG_RUSSIAN)
597
 
 {
598
 
      if(ch >=(BYTE)'�' && ch <=(BYTE)'�')
599
 
          return 1;
600
 
 }
601
 
 if(ch >= 'A' && ch <= 'Z') return 1;
602
 
 return 0;
 
564
Bool32 p2_is_upperASCII(uchar ch) {
 
565
        if (p2globals.language == LANG_RUSSIAN) {
 
566
                if (ch >= (uchar) '�' && ch <= (uchar) '�')
 
567
                        return 1;
 
568
        }
 
569
        if (ch >= 'A' && ch <= 'Z')
 
570
                return 1;
 
571
        return 0;
603
572
}
604
573
//////////////////
605
 
static Word8 rus_alias  []="��⡂8";  // "�����8"
606
 
static Word8 eng_alias  []="rnr68B";
 
574
static uchar rus_alias[] = "��⡂8"; // "�����8"
 
575
static uchar eng_alias[] = "rnr68B";
607
576
/////////////
608
 
Word8    p2_rsadd_get_alias_class(Word8 let,Word8 lang)
609
 
{
610
 
 Word8   *fa;
611
 
 if( lang==LANG_RUSSIAN )
612
 
    fa=rus_alias;
613
 
 else if( lang==LANG_ENGLISH )
614
 
    fa=eng_alias;
615
 
 else
616
 
    return 0;
 
577
uchar p2_rsadd_get_alias_class(uchar let, uchar lang) {
 
578
        uchar *fa;
 
579
        if (lang == LANG_RUSSIAN)
 
580
                fa = rus_alias;
 
581
        else if (lang == LANG_ENGLISH)
 
582
                fa = eng_alias;
 
583
        else
 
584
                return 0;
617
585
 
618
 
 if( strchr(fa,let) )
619
 
    return 1;
620
 
 return 0;
 
586
        if (strchr(fa, let))
 
587
                return 1;
 
588
        return 0;
621
589
}
622
590
/////////////////////