2
Copyright (c) 1993-2008, Cognitive Technologies
5
ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ ļæ½ ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½,
6
ļæ½ļæ½ļæ½ ļæ½ ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½, ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½, ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½:
8
* ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½
9
ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½, ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½
10
ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½.
11
* ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½/ļæ½ļæ½ļæ½ ļæ½
12
ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½, ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½, ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½
13
ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½, ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½
14
ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½.
15
* ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ Cognitive Technologies, ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½
16
ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½/ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½
17
ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½, ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½, ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½
18
ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½.
20
ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ ļæ½/ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ "ļæ½ļæ½ļæ½
21
ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½" ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½-ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½, ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½,
22
ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½, ļæ½ļæ½ ļæ½ļæ½
23
ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½. ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ ļæ½ ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½, ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½
24
ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½/ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½, ļæ½ļæ½ ļæ½ ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½
25
ļæ½ļæ½ŃØļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½, ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½, ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½, ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½
26
ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½, ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½
27
ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ (ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½, ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½,
28
ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½, ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½/ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½, ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½-ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½
29
ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ ļæ½/ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½,
30
ļæ½ļæ½ ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½), ļæ½ļæ½ ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½, ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½
31
ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ ļæ½ ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½.
33
Redistribution and use in source and binary forms, with or without modification,
34
are permitted provided that the following conditions are met:
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.
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.
58
ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½
60
ļæ½ļæ½ Copyright (C) 1990 Cognitive Technology Corporation. ļæ½ļæ½
61
ļæ½ļæ½ All rights reserved. This program is proprietary and ļæ½ļæ½
62
ļæ½ļæ½ a trade secret of Cognitive Technology Corporation. ļæ½ļæ½
64
ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½
67
/****************************************************************************
69
* S T R I N G S E X T R A C T I O N *
71
* Written in 1991 by Yuri Panchul *
73
* SESTRING.C - working with string data *
75
* 07/27/92 - insert checking nSpecialsLetters == nLetters *
76
* into StringCalculateParameters *
78
***************************************************************************/
91
int nCurrentFillingRoots;
94
Bool32 StringsUpdatedByBukvica()
101
for (nString = 0, p = pStringsUpList; p != NULL; p = p -> pDown, nString++)
103
if((p->nLetters == 1)&&((&pRoots [p -> pLettersList [0]])->nHeight >64))
106
CCOM_USER_BLOCK uBlock;
108
uBlock.code = CCOM_UB_CAPDROPLN;
109
uBlock.data = (Word8*)&data;
111
if((p->pUp!=NULL)||(p->pDown!=NULL))
115
*(int*)uBlock.data = nString+1;
121
*(int*)uBlock.data = nString-1;
125
if(abs(p->pUp->yTop - p->yTop)<=abs(p->pDown->yTop - p->yTop))
127
*(int*)uBlock.data = nString-1;
131
*(int*)uBlock.data = nString+1;
135
p->uFlags += CSTR_STR_CapDrop;
138
uBlock.size = sizeof(data);
139
CCOM_SetUserBlock((CCOM_comp*)(pRoots [p -> pLettersList [0]]).pComp, &uBlock);
147
void StringCalculateParameters (STRING *pString)
153
int nSumTopDispersion;
154
int nSumBottomDispersion;
157
pString -> language = pCurrentBlock -> language; // Pit 02-??-94
159
if (pString -> nLetters == 0)
161
pString -> nMiddleHeight = 0;
162
pString -> yMiddleTop = 0;
163
pString -> yMiddleBottom = 0;
164
pString -> nTopDispersion = 0;
165
pString -> nBottomDispersion = 0;
171
pString -> nSpecialsLetters = 0;
177
for (i = 0; i < pString -> nLetters; i++)
179
pRoot = pRoots + pString -> pLettersList [i];
181
if (pRoot -> bType & (ROOT_SPECIAL_LETTER | ROOT_SPECIAL_DUST))
184
nSumHeight += pRoot -> nHeight;
185
ySumTop += pRoot -> yRow;
188
pString -> nMiddleHeight = nSumHeight
189
/ (pString -> nLetters - pString -> nSpecialsLetters);
190
pString -> yMiddleTop = ySumTop
191
/ (pString -> nLetters - pString -> nSpecialsLetters);
192
pString -> yMiddleBottom = (ySumTop + nSumHeight)
193
/ (pString -> nLetters - pString -> nSpecialsLetters);
194
pString -> yMiddleLine =
195
(pString -> yMiddleTop + pString -> yMiddleBottom) / 2;
197
nSumTopDispersion = 0;
198
nSumBottomDispersion = 0;
200
for (i = 0; i < pString -> nLetters; i++)
202
pRoot = pRoots + pString -> pLettersList [i];
204
if (pRoot -> bType & (ROOT_SPECIAL_LETTER | ROOT_SPECIAL_DUST))
208
(pRoot -> yRow - pString -> yMiddleTop) *
209
(pRoot -> yRow - pString -> yMiddleTop);
211
nSumBottomDispersion +=
212
(pRoot -> yRow + pRoot -> nHeight - pString -> yMiddleBottom) *
213
(pRoot -> yRow + pRoot -> nHeight - pString -> yMiddleBottom);
216
pString -> nTopDispersion =
217
(int) long_sqrt ((LONG) (nSumTopDispersion
218
/ (pString -> nLetters - pString -> nSpecialsLetters)));
220
pString -> nBottomDispersion =
221
(int) long_sqrt ((LONG) (nSumBottomDispersion
222
/ (pString -> nLetters - pString -> nSpecialsLetters)));
224
pString -> yMin = pString -> yMiddleTop
225
- MAX (2 * pString -> nTopDispersion,
226
3 * pString -> nMiddleHeight / 4);
228
pString -> yMax = pString -> yMiddleBottom
229
+ MAX (2 * pString -> nBottomDispersion,
230
3 * pString -> nMiddleHeight / 4);
232
bSpecialFound = FALSE;
234
for (i = 0; i < pString -> nLetters; i++)
236
pRoot = pRoots + pString -> pLettersList [i];
238
if (pRoot -> bType & (ROOT_SPECIAL_LETTER | ROOT_SPECIAL_DUST))
241
if (pRoot -> yRow > pString -> yMiddleLine ||
242
pRoot -> yRow + pRoot -> nHeight - 1 < pString -> yMiddleLine)
244
pRoot -> bType |= ROOT_SPECIAL_DUST;
245
bSpecialFound = TRUE;
246
pString -> nSpecialsLetters++;
248
else if (pRoot -> yRow < pString -> yMin ||
249
pRoot -> yRow + pRoot -> nHeight - 1 > pString -> yMax)
251
pRoot -> bType |= ROOT_SPECIAL_LETTER;
252
bSpecialFound = TRUE;
253
pString -> nSpecialsLetters++;
261
if (pString -> nSpecialsLetters == pString -> nLetters)
263
for (i = 0; i < pString -> nLetters; i++)
265
pRoot = pRoots + pString -> pLettersList [i];
267
if (pRoot -> bType & ROOT_SPECIAL_LETTER)
269
pRoot -> bType &= ~(ROOT_SPECIAL_LETTER | ROOT_SPECIAL_DUST);
270
pString -> nSpecialsLetters--;
275
if (pString -> nSpecialsLetters == pString -> nLetters)
276
return; // Piter 22.02.00
281
void StringsFill (void)
287
BOOL CorrectHist=FALSE;
292
if (SE_DebugGraphicsLevel >= 4)
293
BlockHystogramShow (pCurrentBlock);
298
for (i = 0; i < pCurrentBlock -> nHystColumns; i++)
300
if (pCurrentBlock -> pHystogram [i]
301
> pCurrentBlock -> pHystogram [iMax])
307
if (pCurrentBlock -> pHystogram [iMax] == 0)
310
y = pCurrentBlock -> Rect.yTop + iMax;
312
StringNewDescriptor ();
314
for (CorrectHist=FALSE,pRoot = pCurrentBlock -> pRoots;
316
pRoot = pRoot -> u1.pNext)
318
if (pRoot -> bType & ROOT_USED)
321
if (IS_LAYOUT_DUST (*pRoot))
324
if (pRoot -> yRow <= y &&
325
pRoot -> yRow + pRoot -> nHeight > y)
328
StringAddLetter1 (pRoot - pRoots);
329
pRoot -> bType |= ROOT_USED;
331
BlockHystogramDiscountRoot (pCurrentBlock, pRoot);
335
if( !CorrectHist ) // Oleg & Pit : ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ļæ½ UPIC31
337
StringCalculateParameters (&String);
340
if (SE_DebugGraphicsLevel >= 4)
341
LT_GraphicsCurrentStringOutput ("Current string");
343
StringSortLetters (&String);
346
nCurrentFillingRoots += String.nLetters;
347
progress_set_percent (nCurrentFillingRoots * 100 / nRoots);
351
void StringsListEdit (void)
356
for (p = pStringsList; p != NULL; p = p -> pNext)
358
if(p->nUserNum != IS_IN_TABLE)
360
if (p -> nRecognized == 0 &&
361
p -> yBottom - p -> yTop + 1 < pCurrentBlock -> nAverageHeight)
363
if (p == pStringsList)
368
else if (p == pStringsListEnd)
376
StringRemove (p -> pNext);
382
for (q = p -> pNext; q != NULL; q = q -> pNext)
384
if (StringIncludes (p, q))
386
if (q -> xLeft < p -> xLeft)
387
p -> xLeft = q -> xLeft;
389
if (q -> xRight > q -> xRight)
390
p -> xRight = q -> xRight;
398
static int nStripHeight;
399
static int nDustUpper, nDustLower;
400
static int nDustLeft, nDustRight;
403
static BOOL PassForDust (STRING *pString, ROOT *pRootsBegin, ROOT *pRootsAfter)
405
BOOL bStripWasExpanded = FALSE;
408
for (pRoot = pRootsBegin; pRoot < pRootsAfter; pRoot++)
410
if (pRoot -> nBlock != nCurrentBlock &&
411
pRoot -> nBlock != 0)
416
if ((pRoot -> bType & ROOT_USED) ||
417
(pRoot -> bType & ROOT_SPECIAL_LETTER) ||
418
pRoot -> yRow > nDustLower ||
419
pRoot -> yRow + pRoot -> nHeight - 1 < nDustUpper)
424
if (pRoot -> xColumn < nDustLeft)
426
if (nDustLeft - (pRoot -> xColumn + pRoot -> nWidth)
432
nDustLeft = pRoot -> xColumn;
433
bStripWasExpanded = TRUE;
436
if (pRoot -> xColumn + pRoot -> nWidth - 1 > nDustRight)
438
if (pRoot -> xColumn - nDustRight >= nDustGap)
443
nDustRight = pRoot -> xColumn + pRoot -> nWidth - 1;
444
bStripWasExpanded = TRUE;
447
pRoot -> bType |= ROOT_USED;
448
StringAddDust2 (pString, pRoot - pRoots);
451
return (bStripWasExpanded);
454
void StringDustAccount (STRING *pString)
457
ROOT *pLocalRootsBegin, *pLocalRootsAfter;
458
BOOL bExpanded1, bExpanded2;
460
nStripHeight = pString -> yBottom - pString -> yTop + 1;
461
nDustUpper = pString -> yTop - nStripHeight / 2;
462
nDustLower = pString -> yBottom + nStripHeight / 2;
463
nDustLeft = pString -> xLeft;
464
nDustRight = pString -> xRight;
465
nDustGap = nDustLower - nDustUpper + 1;
467
RootStripsGetLoopParameters
475
if (pLocalRootsBegin == NULL)
480
bExpanded1 = PassForDust (pString, pLocalRootsBegin, pLocalRootsAfter);
481
bExpanded2 = PassForDust (pString, pAfterOriginalRoots, pAfterRoots);
483
while (bExpanded1 || bExpanded2);
485
for (i = 0; i < pString -> nDust; i++)
486
pRoots [pString -> pDustList [i]].bType &= ~ROOT_USED;
488
StringSortDust (pString);
491
void StringsDustAccount (void)
495
for (pString = pStringsList; pString != NULL; pString = pString -> pNext)
498
if (! (pString -> uFlags & SF_SPECIAL))
499
StringDustAccount (pString);
501
StringDustAccount (pString);
505
BOOL StringIsTrash (STRING *pString)
512
if (pString -> nDust < pString -> nLetters)
516
nBigDustHeight = pString -> nMiddleHeight / 2;
518
for (i = 0; i < pString -> nDust; i++)
520
pRoot = & pRoots [pString -> pDustList [i]];
522
if (pRoot -> nHeight >= nBigDustHeight &&
523
pRoot -> xColumn <= pString -> xRight &&
524
pRoot -> xColumn + pRoot -> nWidth - 1 >= pString -> xLeft)
530
return (pString -> nLetters < 30 && nBigDust > pString -> nLetters ||
531
nBigDust > 2 * pString -> nLetters);
534
void StringsRemoveTrash (void)
539
pString = pStringsList;
541
while (pString != NULL)
543
pNext = pString -> pNext;
545
if (StringIsTrash (pString))
546
StringRemove (pString);
552
void StringsForming (void)
555
if (pCurrentBlock -> pHystogram == NULL ||
556
pCurrentBlock -> nHystColumns == 0)
558
ErrorInternal ((PSTR)"Empty hystogram");
565
if (bOptionBusinessCardsLayout)
568
StringsBreakOnVertical ();
572
if (SE_DebugGraphicsLevel >= 1)
573
LT_GraphicsStringsOutput ("After breaking on vertical");
578
if (SE_DebugGraphicsLevel >= 2)
579
LT_GraphicsStringsOutput ("Before edit");
585
if (SE_DebugGraphicsLevel >= 2)
586
LT_GraphicsStringsOutput ("After edit");
589
StringsProcessSpecials ();
592
if (SE_DebugGraphicsLevel >= 2)
593
LT_GraphicsStringsOutput ("After processing specials");
596
StringsDustAccount ();
599
if (SE_DebugGraphicsLevel >= 1)
600
LT_GraphicsStringsOutput ("After dust accounting");
605
if (! bOptionBusinessCardsLayout)
607
StringsBreakOnVertical ();
610
if (SE_DebugGraphicsLevel >= 1)
611
LT_GraphicsStringsOutput ("After breaking on vertical");
615
StringsRemoveTrash ();
618
if (SE_DebugGraphicsLevel >= 1)
619
LT_GraphicsStringsOutput ("After removing trash strings");
621
if (SE_DebugGraphicsLevel >= 3)
623
LT_GraphicsStringsForwardOrderOutput ("Forward strings order");
624
LT_GraphicsStringsBackwardOrderOutput ("Backward strings order");
625
LT_GraphicsStringsUpOrderOutput ("Up strings order");
626
LT_GraphicsStringsDownOrderOutput ("Down strings order");
630
StringsUpdatedByBukvica();
631
StringsListOutput ();