tesseract_bin 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (612) hide show
  1. data/.document +5 -0
  2. data/Gemfile +14 -0
  3. data/Gemfile.lock +23 -0
  4. data/LICENSE.txt +20 -0
  5. data/README.rdoc +19 -0
  6. data/Rakefile +46 -0
  7. data/VERSION +1 -0
  8. data/ext/tesseract_bin/extconf.rb +17 -0
  9. data/lib/tesseract_bin.rb +12 -0
  10. data/tesseract_bin.gemspec +660 -0
  11. data/test/helper.rb +18 -0
  12. data/test/test_tesseract_bin.rb +7 -0
  13. data/vendor/tesseract-2.04/AUTHORS +8 -0
  14. data/vendor/tesseract-2.04/COPYING +23 -0
  15. data/vendor/tesseract-2.04/ChangeLog +71 -0
  16. data/vendor/tesseract-2.04/INSTALL +229 -0
  17. data/vendor/tesseract-2.04/Makefile.am +20 -0
  18. data/vendor/tesseract-2.04/Makefile.in +641 -0
  19. data/vendor/tesseract-2.04/NEWS +1 -0
  20. data/vendor/tesseract-2.04/README +138 -0
  21. data/vendor/tesseract-2.04/ReleaseNotes +213 -0
  22. data/vendor/tesseract-2.04/StdAfx.cpp +8 -0
  23. data/vendor/tesseract-2.04/StdAfx.h +24 -0
  24. data/vendor/tesseract-2.04/ccmain/Makefile.am +63 -0
  25. data/vendor/tesseract-2.04/ccmain/Makefile.in +735 -0
  26. data/vendor/tesseract-2.04/ccmain/adaptions.cpp +1082 -0
  27. data/vendor/tesseract-2.04/ccmain/adaptions.h +109 -0
  28. data/vendor/tesseract-2.04/ccmain/applybox.cpp +891 -0
  29. data/vendor/tesseract-2.04/ccmain/applybox.h +73 -0
  30. data/vendor/tesseract-2.04/ccmain/baseapi.cpp +1105 -0
  31. data/vendor/tesseract-2.04/ccmain/baseapi.h +256 -0
  32. data/vendor/tesseract-2.04/ccmain/blobcmp.cpp +76 -0
  33. data/vendor/tesseract-2.04/ccmain/blobcmp.h +29 -0
  34. data/vendor/tesseract-2.04/ccmain/callnet.cpp +93 -0
  35. data/vendor/tesseract-2.04/ccmain/callnet.h +32 -0
  36. data/vendor/tesseract-2.04/ccmain/charcut.cpp +704 -0
  37. data/vendor/tesseract-2.04/ccmain/charcut.h +120 -0
  38. data/vendor/tesseract-2.04/ccmain/charsample.cpp +699 -0
  39. data/vendor/tesseract-2.04/ccmain/control.cpp +1842 -0
  40. data/vendor/tesseract-2.04/ccmain/control.h +198 -0
  41. data/vendor/tesseract-2.04/ccmain/docqual.cpp +1481 -0
  42. data/vendor/tesseract-2.04/ccmain/docqual.h +155 -0
  43. data/vendor/tesseract-2.04/ccmain/expandblob.cpp +82 -0
  44. data/vendor/tesseract-2.04/ccmain/expandblob.h +13 -0
  45. data/vendor/tesseract-2.04/ccmain/fixspace.cpp +989 -0
  46. data/vendor/tesseract-2.04/ccmain/fixspace.h +72 -0
  47. data/vendor/tesseract-2.04/ccmain/fixxht.cpp +825 -0
  48. data/vendor/tesseract-2.04/ccmain/fixxht.h +93 -0
  49. data/vendor/tesseract-2.04/ccmain/imgscale.cpp +154 -0
  50. data/vendor/tesseract-2.04/ccmain/imgscale.h +32 -0
  51. data/vendor/tesseract-2.04/ccmain/matmatch.cpp +391 -0
  52. data/vendor/tesseract-2.04/ccmain/matmatch.h +48 -0
  53. data/vendor/tesseract-2.04/ccmain/output.cpp +1273 -0
  54. data/vendor/tesseract-2.04/ccmain/output.h +116 -0
  55. data/vendor/tesseract-2.04/ccmain/pagewalk.cpp +666 -0
  56. data/vendor/tesseract-2.04/ccmain/pagewalk.h +155 -0
  57. data/vendor/tesseract-2.04/ccmain/paircmp.cpp +107 -0
  58. data/vendor/tesseract-2.04/ccmain/paircmp.h +43 -0
  59. data/vendor/tesseract-2.04/ccmain/pgedit.cpp +1867 -0
  60. data/vendor/tesseract-2.04/ccmain/pgedit.h +181 -0
  61. data/vendor/tesseract-2.04/ccmain/reject.cpp +1775 -0
  62. data/vendor/tesseract-2.04/ccmain/reject.h +181 -0
  63. data/vendor/tesseract-2.04/ccmain/scaleimg.cpp +366 -0
  64. data/vendor/tesseract-2.04/ccmain/scaleimg.h +35 -0
  65. data/vendor/tesseract-2.04/ccmain/tessbox.cpp +375 -0
  66. data/vendor/tesseract-2.04/ccmain/tessbox.h +110 -0
  67. data/vendor/tesseract-2.04/ccmain/tessedit.cpp +278 -0
  68. data/vendor/tesseract-2.04/ccmain/tessedit.h +49 -0
  69. data/vendor/tesseract-2.04/ccmain/tessembedded.cpp +110 -0
  70. data/vendor/tesseract-2.04/ccmain/tessembedded.h +38 -0
  71. data/vendor/tesseract-2.04/ccmain/tesseractfull.cc +37 -0
  72. data/vendor/tesseract-2.04/ccmain/tesseractmain.cpp +387 -0
  73. data/vendor/tesseract-2.04/ccmain/tesseractmain.h +58 -0
  74. data/vendor/tesseract-2.04/ccmain/tessio.h +110 -0
  75. data/vendor/tesseract-2.04/ccmain/tessvars.cpp +38 -0
  76. data/vendor/tesseract-2.04/ccmain/tessvars.h +48 -0
  77. data/vendor/tesseract-2.04/ccmain/tfacep.h +62 -0
  78. data/vendor/tesseract-2.04/ccmain/tfacepp.cpp +443 -0
  79. data/vendor/tesseract-2.04/ccmain/tfacepp.h +85 -0
  80. data/vendor/tesseract-2.04/ccmain/tstruct.cpp +549 -0
  81. data/vendor/tesseract-2.04/ccmain/tstruct.h +108 -0
  82. data/vendor/tesseract-2.04/ccmain/varabled.cpp +346 -0
  83. data/vendor/tesseract-2.04/ccmain/varabled.h +125 -0
  84. data/vendor/tesseract-2.04/ccmain/werdit.cpp +193 -0
  85. data/vendor/tesseract-2.04/ccmain/werdit.h +67 -0
  86. data/vendor/tesseract-2.04/ccstruct/Makefile.am +25 -0
  87. data/vendor/tesseract-2.04/ccstruct/Makefile.in +650 -0
  88. data/vendor/tesseract-2.04/ccstruct/blckerr.h +29 -0
  89. data/vendor/tesseract-2.04/ccstruct/blobbox.cpp +778 -0
  90. data/vendor/tesseract-2.04/ccstruct/blobbox.h +381 -0
  91. data/vendor/tesseract-2.04/ccstruct/blobs.cpp +247 -0
  92. data/vendor/tesseract-2.04/ccstruct/blobs.h +119 -0
  93. data/vendor/tesseract-2.04/ccstruct/blread.cpp +537 -0
  94. data/vendor/tesseract-2.04/ccstruct/blread.h +63 -0
  95. data/vendor/tesseract-2.04/ccstruct/callcpp.cpp +252 -0
  96. data/vendor/tesseract-2.04/ccstruct/coutln.cpp +650 -0
  97. data/vendor/tesseract-2.04/ccstruct/coutln.h +186 -0
  98. data/vendor/tesseract-2.04/ccstruct/crakedge.h +39 -0
  99. data/vendor/tesseract-2.04/ccstruct/genblob.cpp +133 -0
  100. data/vendor/tesseract-2.04/ccstruct/genblob.h +52 -0
  101. data/vendor/tesseract-2.04/ccstruct/hpddef.h +39 -0
  102. data/vendor/tesseract-2.04/ccstruct/hpdsizes.h +8 -0
  103. data/vendor/tesseract-2.04/ccstruct/ipoints.h +479 -0
  104. data/vendor/tesseract-2.04/ccstruct/labls.cpp +188 -0
  105. data/vendor/tesseract-2.04/ccstruct/labls.h +38 -0
  106. data/vendor/tesseract-2.04/ccstruct/linlsq.cpp +249 -0
  107. data/vendor/tesseract-2.04/ccstruct/linlsq.h +102 -0
  108. data/vendor/tesseract-2.04/ccstruct/lmedsq.cpp +453 -0
  109. data/vendor/tesseract-2.04/ccstruct/lmedsq.h +84 -0
  110. data/vendor/tesseract-2.04/ccstruct/mod128.cpp +100 -0
  111. data/vendor/tesseract-2.04/ccstruct/mod128.h +85 -0
  112. data/vendor/tesseract-2.04/ccstruct/normalis.cpp +176 -0
  113. data/vendor/tesseract-2.04/ccstruct/normalis.h +108 -0
  114. data/vendor/tesseract-2.04/ccstruct/ocrblock.cpp +369 -0
  115. data/vendor/tesseract-2.04/ccstruct/ocrblock.h +235 -0
  116. data/vendor/tesseract-2.04/ccstruct/ocrrow.cpp +216 -0
  117. data/vendor/tesseract-2.04/ccstruct/ocrrow.h +133 -0
  118. data/vendor/tesseract-2.04/ccstruct/pageblk.cpp +879 -0
  119. data/vendor/tesseract-2.04/ccstruct/pageblk.h +318 -0
  120. data/vendor/tesseract-2.04/ccstruct/pageres.cpp +330 -0
  121. data/vendor/tesseract-2.04/ccstruct/pageres.h +313 -0
  122. data/vendor/tesseract-2.04/ccstruct/pdblock.cpp +361 -0
  123. data/vendor/tesseract-2.04/ccstruct/pdblock.h +181 -0
  124. data/vendor/tesseract-2.04/ccstruct/pdclass.h +54 -0
  125. data/vendor/tesseract-2.04/ccstruct/points.cpp +102 -0
  126. data/vendor/tesseract-2.04/ccstruct/points.h +299 -0
  127. data/vendor/tesseract-2.04/ccstruct/polyaprx.cpp +588 -0
  128. data/vendor/tesseract-2.04/ccstruct/polyaprx.h +51 -0
  129. data/vendor/tesseract-2.04/ccstruct/polyblk.cpp +398 -0
  130. data/vendor/tesseract-2.04/ccstruct/polyblk.h +122 -0
  131. data/vendor/tesseract-2.04/ccstruct/polyblob.cpp +357 -0
  132. data/vendor/tesseract-2.04/ccstruct/polyblob.h +102 -0
  133. data/vendor/tesseract-2.04/ccstruct/polyvert.cpp +23 -0
  134. data/vendor/tesseract-2.04/ccstruct/polyvert.h +58 -0
  135. data/vendor/tesseract-2.04/ccstruct/poutline.cpp +441 -0
  136. data/vendor/tesseract-2.04/ccstruct/poutline.h +125 -0
  137. data/vendor/tesseract-2.04/ccstruct/quadlsq.cpp +147 -0
  138. data/vendor/tesseract-2.04/ccstruct/quadlsq.h +67 -0
  139. data/vendor/tesseract-2.04/ccstruct/quadratc.cpp +21 -0
  140. data/vendor/tesseract-2.04/ccstruct/quadratc.h +63 -0
  141. data/vendor/tesseract-2.04/ccstruct/quspline.cpp +382 -0
  142. data/vendor/tesseract-2.04/ccstruct/quspline.h +113 -0
  143. data/vendor/tesseract-2.04/ccstruct/ratngs.cpp +372 -0
  144. data/vendor/tesseract-2.04/ccstruct/ratngs.h +198 -0
  145. data/vendor/tesseract-2.04/ccstruct/rect.cpp +229 -0
  146. data/vendor/tesseract-2.04/ccstruct/rect.h +320 -0
  147. data/vendor/tesseract-2.04/ccstruct/rejctmap.cpp +545 -0
  148. data/vendor/tesseract-2.04/ccstruct/rejctmap.h +284 -0
  149. data/vendor/tesseract-2.04/ccstruct/rwpoly.cpp +89 -0
  150. data/vendor/tesseract-2.04/ccstruct/rwpoly.h +45 -0
  151. data/vendor/tesseract-2.04/ccstruct/statistc.cpp +905 -0
  152. data/vendor/tesseract-2.04/ccstruct/statistc.h +135 -0
  153. data/vendor/tesseract-2.04/ccstruct/stepblob.cpp +296 -0
  154. data/vendor/tesseract-2.04/ccstruct/stepblob.h +88 -0
  155. data/vendor/tesseract-2.04/ccstruct/txtregn.cpp +230 -0
  156. data/vendor/tesseract-2.04/ccstruct/txtregn.h +155 -0
  157. data/vendor/tesseract-2.04/ccstruct/vecfuncs.cpp +63 -0
  158. data/vendor/tesseract-2.04/ccstruct/vecfuncs.h +91 -0
  159. data/vendor/tesseract-2.04/ccstruct/werd.cpp +967 -0
  160. data/vendor/tesseract-2.04/ccstruct/werd.h +277 -0
  161. data/vendor/tesseract-2.04/ccutil/Makefile.am +19 -0
  162. data/vendor/tesseract-2.04/ccutil/Makefile.in +626 -0
  163. data/vendor/tesseract-2.04/ccutil/basedir.cpp +118 -0
  164. data/vendor/tesseract-2.04/ccutil/basedir.h +32 -0
  165. data/vendor/tesseract-2.04/ccutil/bits16.cpp +30 -0
  166. data/vendor/tesseract-2.04/ccutil/bits16.h +61 -0
  167. data/vendor/tesseract-2.04/ccutil/boxread.cpp +105 -0
  168. data/vendor/tesseract-2.04/ccutil/boxread.h +44 -0
  169. data/vendor/tesseract-2.04/ccutil/clst.cpp +626 -0
  170. data/vendor/tesseract-2.04/ccutil/clst.h +1085 -0
  171. data/vendor/tesseract-2.04/ccutil/debugwin.cpp +500 -0
  172. data/vendor/tesseract-2.04/ccutil/debugwin.h +103 -0
  173. data/vendor/tesseract-2.04/ccutil/elst.cpp +593 -0
  174. data/vendor/tesseract-2.04/ccutil/elst.h +1125 -0
  175. data/vendor/tesseract-2.04/ccutil/elst2.cpp +606 -0
  176. data/vendor/tesseract-2.04/ccutil/elst2.h +1121 -0
  177. data/vendor/tesseract-2.04/ccutil/errcode.cpp +104 -0
  178. data/vendor/tesseract-2.04/ccutil/errcode.h +104 -0
  179. data/vendor/tesseract-2.04/ccutil/fileerr.h +34 -0
  180. data/vendor/tesseract-2.04/ccutil/globaloc.cpp +115 -0
  181. data/vendor/tesseract-2.04/ccutil/globaloc.h +40 -0
  182. data/vendor/tesseract-2.04/ccutil/hashfn.cpp +57 -0
  183. data/vendor/tesseract-2.04/ccutil/hashfn.h +30 -0
  184. data/vendor/tesseract-2.04/ccutil/host.h +180 -0
  185. data/vendor/tesseract-2.04/ccutil/hosthplb.h +1 -0
  186. data/vendor/tesseract-2.04/ccutil/lsterr.h +43 -0
  187. data/vendor/tesseract-2.04/ccutil/mainblk.cpp +126 -0
  188. data/vendor/tesseract-2.04/ccutil/mainblk.h +39 -0
  189. data/vendor/tesseract-2.04/ccutil/memblk.cpp +1106 -0
  190. data/vendor/tesseract-2.04/ccutil/memblk.h +189 -0
  191. data/vendor/tesseract-2.04/ccutil/memry.cpp +532 -0
  192. data/vendor/tesseract-2.04/ccutil/memry.h +192 -0
  193. data/vendor/tesseract-2.04/ccutil/memryerr.h +38 -0
  194. data/vendor/tesseract-2.04/ccutil/mfcpch.cpp +5 -0
  195. data/vendor/tesseract-2.04/ccutil/mfcpch.h +37 -0
  196. data/vendor/tesseract-2.04/ccutil/ndminx.h +31 -0
  197. data/vendor/tesseract-2.04/ccutil/notdll.h +28 -0
  198. data/vendor/tesseract-2.04/ccutil/nwmain.h +176 -0
  199. data/vendor/tesseract-2.04/ccutil/ocrclass.h +345 -0
  200. data/vendor/tesseract-2.04/ccutil/ocrshell.cpp +772 -0
  201. data/vendor/tesseract-2.04/ccutil/ocrshell.h +191 -0
  202. data/vendor/tesseract-2.04/ccutil/platform.h +18 -0
  203. data/vendor/tesseract-2.04/ccutil/scanutils.cpp +543 -0
  204. data/vendor/tesseract-2.04/ccutil/scanutils.h +55 -0
  205. data/vendor/tesseract-2.04/ccutil/secname.h +9 -0
  206. data/vendor/tesseract-2.04/ccutil/serialis.cpp +117 -0
  207. data/vendor/tesseract-2.04/ccutil/serialis.h +93 -0
  208. data/vendor/tesseract-2.04/ccutil/stderr.h +26 -0
  209. data/vendor/tesseract-2.04/ccutil/strngs.cpp +495 -0
  210. data/vendor/tesseract-2.04/ccutil/strngs.h +138 -0
  211. data/vendor/tesseract-2.04/ccutil/tessclas.h +135 -0
  212. data/vendor/tesseract-2.04/ccutil/tessopt.cpp +61 -0
  213. data/vendor/tesseract-2.04/ccutil/tessopt.h +30 -0
  214. data/vendor/tesseract-2.04/ccutil/tprintf.cpp +122 -0
  215. data/vendor/tesseract-2.04/ccutil/tprintf.h +35 -0
  216. data/vendor/tesseract-2.04/ccutil/unichar.cpp +144 -0
  217. data/vendor/tesseract-2.04/ccutil/unichar.h +84 -0
  218. data/vendor/tesseract-2.04/ccutil/unicharmap.cpp +172 -0
  219. data/vendor/tesseract-2.04/ccutil/unicharmap.h +82 -0
  220. data/vendor/tesseract-2.04/ccutil/unicharset.cpp +307 -0
  221. data/vendor/tesseract-2.04/ccutil/unicharset.h +267 -0
  222. data/vendor/tesseract-2.04/ccutil/varable.cpp +672 -0
  223. data/vendor/tesseract-2.04/ccutil/varable.h +419 -0
  224. data/vendor/tesseract-2.04/classify/Makefile.am +24 -0
  225. data/vendor/tesseract-2.04/classify/Makefile.in +647 -0
  226. data/vendor/tesseract-2.04/classify/adaptive.cpp +535 -0
  227. data/vendor/tesseract-2.04/classify/adaptive.h +199 -0
  228. data/vendor/tesseract-2.04/classify/adaptmatch.cpp +2958 -0
  229. data/vendor/tesseract-2.04/classify/adaptmatch.h +86 -0
  230. data/vendor/tesseract-2.04/classify/baseline.cpp +58 -0
  231. data/vendor/tesseract-2.04/classify/baseline.h +91 -0
  232. data/vendor/tesseract-2.04/classify/blobclass.cpp +123 -0
  233. data/vendor/tesseract-2.04/classify/blobclass.h +49 -0
  234. data/vendor/tesseract-2.04/classify/chartoname.cpp +74 -0
  235. data/vendor/tesseract-2.04/classify/chartoname.h +21 -0
  236. data/vendor/tesseract-2.04/classify/cluster.cpp +2834 -0
  237. data/vendor/tesseract-2.04/classify/cluster.h +158 -0
  238. data/vendor/tesseract-2.04/classify/clusttool.cpp +507 -0
  239. data/vendor/tesseract-2.04/classify/clusttool.h +70 -0
  240. data/vendor/tesseract-2.04/classify/cutoffs.cpp +73 -0
  241. data/vendor/tesseract-2.04/classify/cutoffs.h +49 -0
  242. data/vendor/tesseract-2.04/classify/extern.h +32 -0
  243. data/vendor/tesseract-2.04/classify/extract.cpp +100 -0
  244. data/vendor/tesseract-2.04/classify/extract.h +36 -0
  245. data/vendor/tesseract-2.04/classify/featdefs.cpp +244 -0
  246. data/vendor/tesseract-2.04/classify/featdefs.h +71 -0
  247. data/vendor/tesseract-2.04/classify/flexfx.cpp +87 -0
  248. data/vendor/tesseract-2.04/classify/flexfx.h +34 -0
  249. data/vendor/tesseract-2.04/classify/float2int.cpp +126 -0
  250. data/vendor/tesseract-2.04/classify/float2int.h +65 -0
  251. data/vendor/tesseract-2.04/classify/fpoint.cpp +73 -0
  252. data/vendor/tesseract-2.04/classify/fpoint.h +63 -0
  253. data/vendor/tesseract-2.04/classify/fxdefs.cpp +74 -0
  254. data/vendor/tesseract-2.04/classify/fxdefs.h +93 -0
  255. data/vendor/tesseract-2.04/classify/fxid.h +69 -0
  256. data/vendor/tesseract-2.04/classify/hideedge.cpp +35 -0
  257. data/vendor/tesseract-2.04/classify/hideedge.h +76 -0
  258. data/vendor/tesseract-2.04/classify/intfx.cpp +608 -0
  259. data/vendor/tesseract-2.04/classify/intfx.h +63 -0
  260. data/vendor/tesseract-2.04/classify/intmatcher.cpp +1524 -0
  261. data/vendor/tesseract-2.04/classify/intmatcher.h +199 -0
  262. data/vendor/tesseract-2.04/classify/intproto.cpp +1823 -0
  263. data/vendor/tesseract-2.04/classify/intproto.h +320 -0
  264. data/vendor/tesseract-2.04/classify/kdtree.cpp +884 -0
  265. data/vendor/tesseract-2.04/classify/kdtree.h +118 -0
  266. data/vendor/tesseract-2.04/classify/mf.cpp +106 -0
  267. data/vendor/tesseract-2.04/classify/mf.h +43 -0
  268. data/vendor/tesseract-2.04/classify/mfdefs.cpp +58 -0
  269. data/vendor/tesseract-2.04/classify/mfdefs.h +60 -0
  270. data/vendor/tesseract-2.04/classify/mfoutline.cpp +1087 -0
  271. data/vendor/tesseract-2.04/classify/mfoutline.h +277 -0
  272. data/vendor/tesseract-2.04/classify/mfx.cpp +436 -0
  273. data/vendor/tesseract-2.04/classify/mfx.h +52 -0
  274. data/vendor/tesseract-2.04/classify/normfeat.cpp +132 -0
  275. data/vendor/tesseract-2.04/classify/normfeat.h +63 -0
  276. data/vendor/tesseract-2.04/classify/normmatch.cpp +305 -0
  277. data/vendor/tesseract-2.04/classify/normmatch.h +38 -0
  278. data/vendor/tesseract-2.04/classify/ocrfeatures.cpp +310 -0
  279. data/vendor/tesseract-2.04/classify/ocrfeatures.h +148 -0
  280. data/vendor/tesseract-2.04/classify/outfeat.cpp +262 -0
  281. data/vendor/tesseract-2.04/classify/outfeat.h +76 -0
  282. data/vendor/tesseract-2.04/classify/picofeat.cpp +297 -0
  283. data/vendor/tesseract-2.04/classify/picofeat.h +65 -0
  284. data/vendor/tesseract-2.04/classify/protos.cpp +472 -0
  285. data/vendor/tesseract-2.04/classify/protos.h +258 -0
  286. data/vendor/tesseract-2.04/classify/sigmenu.cpp +225 -0
  287. data/vendor/tesseract-2.04/classify/sigmenu.h +39 -0
  288. data/vendor/tesseract-2.04/classify/speckle.cpp +127 -0
  289. data/vendor/tesseract-2.04/classify/speckle.h +69 -0
  290. data/vendor/tesseract-2.04/classify/xform2d.cpp +120 -0
  291. data/vendor/tesseract-2.04/classify/xform2d.h +60 -0
  292. data/vendor/tesseract-2.04/config/config.guess +1466 -0
  293. data/vendor/tesseract-2.04/config/config.h.in +188 -0
  294. data/vendor/tesseract-2.04/config/config.sub +1579 -0
  295. data/vendor/tesseract-2.04/config/depcomp +530 -0
  296. data/vendor/tesseract-2.04/config/install-sh +269 -0
  297. data/vendor/tesseract-2.04/config/missing +198 -0
  298. data/vendor/tesseract-2.04/config/mkinstalldirs +40 -0
  299. data/vendor/tesseract-2.04/config/stamp-h.in +0 -0
  300. data/vendor/tesseract-2.04/configure +10424 -0
  301. data/vendor/tesseract-2.04/cutil/Makefile.am +14 -0
  302. data/vendor/tesseract-2.04/cutil/Makefile.in +612 -0
  303. data/vendor/tesseract-2.04/cutil/bitvec.cpp +115 -0
  304. data/vendor/tesseract-2.04/cutil/bitvec.h +100 -0
  305. data/vendor/tesseract-2.04/cutil/callcpp.h +190 -0
  306. data/vendor/tesseract-2.04/cutil/const.h +108 -0
  307. data/vendor/tesseract-2.04/cutil/cutil.cpp +92 -0
  308. data/vendor/tesseract-2.04/cutil/cutil.h +159 -0
  309. data/vendor/tesseract-2.04/cutil/danerror.cpp +144 -0
  310. data/vendor/tesseract-2.04/cutil/danerror.h +41 -0
  311. data/vendor/tesseract-2.04/cutil/debug.cpp +97 -0
  312. data/vendor/tesseract-2.04/cutil/debug.h +348 -0
  313. data/vendor/tesseract-2.04/cutil/efio.cpp +62 -0
  314. data/vendor/tesseract-2.04/cutil/efio.h +32 -0
  315. data/vendor/tesseract-2.04/cutil/emalloc.cpp +91 -0
  316. data/vendor/tesseract-2.04/cutil/emalloc.h +44 -0
  317. data/vendor/tesseract-2.04/cutil/freelist.cpp +75 -0
  318. data/vendor/tesseract-2.04/cutil/freelist.h +45 -0
  319. data/vendor/tesseract-2.04/cutil/funcdefs.h +35 -0
  320. data/vendor/tesseract-2.04/cutil/general.h +33 -0
  321. data/vendor/tesseract-2.04/cutil/globals.cpp +69 -0
  322. data/vendor/tesseract-2.04/cutil/globals.h +70 -0
  323. data/vendor/tesseract-2.04/cutil/listio.cpp +68 -0
  324. data/vendor/tesseract-2.04/cutil/listio.h +43 -0
  325. data/vendor/tesseract-2.04/cutil/minmax.h +40 -0
  326. data/vendor/tesseract-2.04/cutil/oldheap.cpp +337 -0
  327. data/vendor/tesseract-2.04/cutil/oldheap.h +126 -0
  328. data/vendor/tesseract-2.04/cutil/oldlist.cpp +393 -0
  329. data/vendor/tesseract-2.04/cutil/oldlist.h +350 -0
  330. data/vendor/tesseract-2.04/cutil/structures.cpp +66 -0
  331. data/vendor/tesseract-2.04/cutil/structures.h +112 -0
  332. data/vendor/tesseract-2.04/cutil/tessarray.cpp +115 -0
  333. data/vendor/tesseract-2.04/cutil/tessarray.h +166 -0
  334. data/vendor/tesseract-2.04/cutil/tordvars.cpp +95 -0
  335. data/vendor/tesseract-2.04/cutil/tordvars.h +61 -0
  336. data/vendor/tesseract-2.04/cutil/variables.cpp +317 -0
  337. data/vendor/tesseract-2.04/cutil/variables.h +170 -0
  338. data/vendor/tesseract-2.04/dict/Makefile.am +13 -0
  339. data/vendor/tesseract-2.04/dict/Makefile.in +609 -0
  340. data/vendor/tesseract-2.04/dict/choicearr.h +96 -0
  341. data/vendor/tesseract-2.04/dict/choices.cpp +210 -0
  342. data/vendor/tesseract-2.04/dict/choices.h +241 -0
  343. data/vendor/tesseract-2.04/dict/context.cpp +270 -0
  344. data/vendor/tesseract-2.04/dict/context.h +82 -0
  345. data/vendor/tesseract-2.04/dict/dawg.cpp +363 -0
  346. data/vendor/tesseract-2.04/dict/dawg.h +394 -0
  347. data/vendor/tesseract-2.04/dict/hyphen.cpp +84 -0
  348. data/vendor/tesseract-2.04/dict/hyphen.h +125 -0
  349. data/vendor/tesseract-2.04/dict/lookdawg.cpp +228 -0
  350. data/vendor/tesseract-2.04/dict/lookdawg.h +76 -0
  351. data/vendor/tesseract-2.04/dict/makedawg.cpp +449 -0
  352. data/vendor/tesseract-2.04/dict/makedawg.h +83 -0
  353. data/vendor/tesseract-2.04/dict/matchdefs.h +145 -0
  354. data/vendor/tesseract-2.04/dict/permdawg.cpp +415 -0
  355. data/vendor/tesseract-2.04/dict/permdawg.h +98 -0
  356. data/vendor/tesseract-2.04/dict/permngram.cpp +358 -0
  357. data/vendor/tesseract-2.04/dict/permngram.h +33 -0
  358. data/vendor/tesseract-2.04/dict/permnum.cpp +522 -0
  359. data/vendor/tesseract-2.04/dict/permnum.h +83 -0
  360. data/vendor/tesseract-2.04/dict/permute.cpp +1704 -0
  361. data/vendor/tesseract-2.04/dict/permute.h +93 -0
  362. data/vendor/tesseract-2.04/dict/reduce.cpp +424 -0
  363. data/vendor/tesseract-2.04/dict/reduce.h +112 -0
  364. data/vendor/tesseract-2.04/dict/states.cpp +382 -0
  365. data/vendor/tesseract-2.04/dict/states.h +111 -0
  366. data/vendor/tesseract-2.04/dict/stopper.cpp +1458 -0
  367. data/vendor/tesseract-2.04/dict/stopper.h +103 -0
  368. data/vendor/tesseract-2.04/dict/trie.cpp +683 -0
  369. data/vendor/tesseract-2.04/dict/trie.h +190 -0
  370. data/vendor/tesseract-2.04/dlltest/Makefile.am +2 -0
  371. data/vendor/tesseract-2.04/dlltest/Makefile.in +388 -0
  372. data/vendor/tesseract-2.04/dlltest/dlltest.cpp +163 -0
  373. data/vendor/tesseract-2.04/dlltest/dlltest.dsp +186 -0
  374. data/vendor/tesseract-2.04/dlltest/dlltest.vcproj +637 -0
  375. data/vendor/tesseract-2.04/eurotext.tif +0 -0
  376. data/vendor/tesseract-2.04/image/Makefile.am +10 -0
  377. data/vendor/tesseract-2.04/image/Makefile.in +596 -0
  378. data/vendor/tesseract-2.04/image/bitstrm.cpp +157 -0
  379. data/vendor/tesseract-2.04/image/bitstrm.h +73 -0
  380. data/vendor/tesseract-2.04/image/img.h +336 -0
  381. data/vendor/tesseract-2.04/image/imgbmp.cpp +223 -0
  382. data/vendor/tesseract-2.04/image/imgbmp.h +50 -0
  383. data/vendor/tesseract-2.04/image/imgerrs.h +35 -0
  384. data/vendor/tesseract-2.04/image/imgio.cpp +321 -0
  385. data/vendor/tesseract-2.04/image/imgio.h +22 -0
  386. data/vendor/tesseract-2.04/image/imgs.cpp +1764 -0
  387. data/vendor/tesseract-2.04/image/imgs.h +102 -0
  388. data/vendor/tesseract-2.04/image/imgtiff.cpp +723 -0
  389. data/vendor/tesseract-2.04/image/imgtiff.h +89 -0
  390. data/vendor/tesseract-2.04/image/imgunpk.h +1377 -0
  391. data/vendor/tesseract-2.04/image/svshowim.cpp +40 -0
  392. data/vendor/tesseract-2.04/image/svshowim.h +25 -0
  393. data/vendor/tesseract-2.04/java/Makefile.am +4 -0
  394. data/vendor/tesseract-2.04/java/Makefile.in +473 -0
  395. data/vendor/tesseract-2.04/java/com/Makefile.am +1 -0
  396. data/vendor/tesseract-2.04/java/com/Makefile.in +470 -0
  397. data/vendor/tesseract-2.04/java/com/google/Makefile.am +1 -0
  398. data/vendor/tesseract-2.04/java/com/google/Makefile.in +470 -0
  399. data/vendor/tesseract-2.04/java/com/google/scrollview/Makefile.am +4 -0
  400. data/vendor/tesseract-2.04/java/com/google/scrollview/Makefile.in +473 -0
  401. data/vendor/tesseract-2.04/java/com/google/scrollview/ScrollView.java +421 -0
  402. data/vendor/tesseract-2.04/java/com/google/scrollview/events/Makefile.am +5 -0
  403. data/vendor/tesseract-2.04/java/com/google/scrollview/events/Makefile.in +474 -0
  404. data/vendor/tesseract-2.04/java/com/google/scrollview/events/SVEvent.java +87 -0
  405. data/vendor/tesseract-2.04/java/com/google/scrollview/events/SVEventHandler.java +296 -0
  406. data/vendor/tesseract-2.04/java/com/google/scrollview/events/SVEventType.java +31 -0
  407. data/vendor/tesseract-2.04/java/com/google/scrollview/ui/Makefile.am +7 -0
  408. data/vendor/tesseract-2.04/java/com/google/scrollview/ui/Makefile.in +476 -0
  409. data/vendor/tesseract-2.04/java/com/google/scrollview/ui/SVAbstractMenuItem.java +58 -0
  410. data/vendor/tesseract-2.04/java/com/google/scrollview/ui/SVCheckboxMenuItem.java +60 -0
  411. data/vendor/tesseract-2.04/java/com/google/scrollview/ui/SVEmptyMenuItem.java +48 -0
  412. data/vendor/tesseract-2.04/java/com/google/scrollview/ui/SVImageHandler.java +228 -0
  413. data/vendor/tesseract-2.04/java/com/google/scrollview/ui/SVMenuBar.java +130 -0
  414. data/vendor/tesseract-2.04/java/com/google/scrollview/ui/SVMenuItem.java +61 -0
  415. data/vendor/tesseract-2.04/java/com/google/scrollview/ui/SVPopupMenu.java +142 -0
  416. data/vendor/tesseract-2.04/java/com/google/scrollview/ui/SVSubMenuItem.java +41 -0
  417. data/vendor/tesseract-2.04/java/com/google/scrollview/ui/SVWindow.java +643 -0
  418. data/vendor/tesseract-2.04/java/makefile +55 -0
  419. data/vendor/tesseract-2.04/pageseg/Makefile.am +13 -0
  420. data/vendor/tesseract-2.04/pageseg/Makefile.in +596 -0
  421. data/vendor/tesseract-2.04/pageseg/leptonica_pageseg.cpp +363 -0
  422. data/vendor/tesseract-2.04/pageseg/leptonica_pageseg.h +90 -0
  423. data/vendor/tesseract-2.04/pageseg/leptonica_pageseg_interface.cpp +82 -0
  424. data/vendor/tesseract-2.04/pageseg/leptonica_pageseg_interface.h +30 -0
  425. data/vendor/tesseract-2.04/pageseg/pageseg.cpp +170 -0
  426. data/vendor/tesseract-2.04/pageseg/pageseg.h +29 -0
  427. data/vendor/tesseract-2.04/phototest.tif +0 -0
  428. data/vendor/tesseract-2.04/tessdata/Makefile.am +31 -0
  429. data/vendor/tesseract-2.04/tessdata/Makefile.in +529 -0
  430. data/vendor/tesseract-2.04/tessdata/configs/Makefile.am +3 -0
  431. data/vendor/tesseract-2.04/tessdata/configs/Makefile.in +344 -0
  432. data/vendor/tesseract-2.04/tessdata/configs/api_config +1 -0
  433. data/vendor/tesseract-2.04/tessdata/configs/box.train +19 -0
  434. data/vendor/tesseract-2.04/tessdata/configs/box.train.stderr +18 -0
  435. data/vendor/tesseract-2.04/tessdata/configs/inter +4 -0
  436. data/vendor/tesseract-2.04/tessdata/configs/kannada +4 -0
  437. data/vendor/tesseract-2.04/tessdata/configs/makebox +1 -0
  438. data/vendor/tesseract-2.04/tessdata/configs/unlv +3 -0
  439. data/vendor/tesseract-2.04/tessdata/confsets +3 -0
  440. data/vendor/tesseract-2.04/tessdata/eng.DangAmbigs +39 -0
  441. data/vendor/tesseract-2.04/tessdata/eng.freq-dawg +0 -0
  442. data/vendor/tesseract-2.04/tessdata/eng.inttemp +0 -0
  443. data/vendor/tesseract-2.04/tessdata/eng.normproto +1247 -0
  444. data/vendor/tesseract-2.04/tessdata/eng.pffmtable +111 -0
  445. data/vendor/tesseract-2.04/tessdata/eng.unicharset +113 -0
  446. data/vendor/tesseract-2.04/tessdata/eng.user-words +921 -0
  447. data/vendor/tesseract-2.04/tessdata/eng.word-dawg +0 -0
  448. data/vendor/tesseract-2.04/tessdata/makedummies +8 -0
  449. data/vendor/tesseract-2.04/tessdata/tessconfigs/Makefile.am +3 -0
  450. data/vendor/tesseract-2.04/tessdata/tessconfigs/Makefile.in +344 -0
  451. data/vendor/tesseract-2.04/tessdata/tessconfigs/batch +2 -0
  452. data/vendor/tesseract-2.04/tessdata/tessconfigs/batch.nochop +2 -0
  453. data/vendor/tesseract-2.04/tessdata/tessconfigs/matdemo +7 -0
  454. data/vendor/tesseract-2.04/tessdata/tessconfigs/msdemo +13 -0
  455. data/vendor/tesseract-2.04/tessdata/tessconfigs/nobatch +2 -0
  456. data/vendor/tesseract-2.04/tessdata/tessconfigs/segdemo +9 -0
  457. data/vendor/tesseract-2.04/tessdll.cpp +351 -0
  458. data/vendor/tesseract-2.04/tessdll.dsp +2050 -0
  459. data/vendor/tesseract-2.04/tessdll.h +143 -0
  460. data/vendor/tesseract-2.04/tessdll.vcproj +5495 -0
  461. data/vendor/tesseract-2.04/tesseract.dsp +2124 -0
  462. data/vendor/tesseract-2.04/tesseract.dsw +116 -0
  463. data/vendor/tesseract-2.04/tesseract.sln +59 -0
  464. data/vendor/tesseract-2.04/tesseract.spec +188 -0
  465. data/vendor/tesseract-2.04/tesseract.vcproj +5859 -0
  466. data/vendor/tesseract-2.04/testing/Makefile.am +2 -0
  467. data/vendor/tesseract-2.04/testing/Makefile.in +312 -0
  468. data/vendor/tesseract-2.04/testing/README +43 -0
  469. data/vendor/tesseract-2.04/testing/counttestset.sh +61 -0
  470. data/vendor/tesseract-2.04/testing/reorgdata.sh +44 -0
  471. data/vendor/tesseract-2.04/testing/reports/1995.bus.3B.sum +1 -0
  472. data/vendor/tesseract-2.04/testing/reports/1995.doe3.3B.sum +1 -0
  473. data/vendor/tesseract-2.04/testing/reports/1995.mag.3B.sum +1 -0
  474. data/vendor/tesseract-2.04/testing/reports/1995.news.3B.sum +1 -0
  475. data/vendor/tesseract-2.04/testing/reports/2.03.summary +9 -0
  476. data/vendor/tesseract-2.04/testing/reports/2.04.summary +9 -0
  477. data/vendor/tesseract-2.04/testing/runalltests.sh +110 -0
  478. data/vendor/tesseract-2.04/testing/runtestset.sh +61 -0
  479. data/vendor/tesseract-2.04/textord/Makefile.am +20 -0
  480. data/vendor/tesseract-2.04/textord/Makefile.in +624 -0
  481. data/vendor/tesseract-2.04/textord/blkocc.cpp +809 -0
  482. data/vendor/tesseract-2.04/textord/blkocc.h +327 -0
  483. data/vendor/tesseract-2.04/textord/blobcmpl.h +31 -0
  484. data/vendor/tesseract-2.04/textord/drawedg.cpp +77 -0
  485. data/vendor/tesseract-2.04/textord/drawedg.h +34 -0
  486. data/vendor/tesseract-2.04/textord/drawtord.cpp +469 -0
  487. data/vendor/tesseract-2.04/textord/drawtord.h +107 -0
  488. data/vendor/tesseract-2.04/textord/edgblob.cpp +412 -0
  489. data/vendor/tesseract-2.04/textord/edgblob.h +100 -0
  490. data/vendor/tesseract-2.04/textord/edgloop.cpp +211 -0
  491. data/vendor/tesseract-2.04/textord/edgloop.h +66 -0
  492. data/vendor/tesseract-2.04/textord/fpchop.cpp +1641 -0
  493. data/vendor/tesseract-2.04/textord/fpchop.h +238 -0
  494. data/vendor/tesseract-2.04/textord/gap_map.cpp +166 -0
  495. data/vendor/tesseract-2.04/textord/gap_map.h +40 -0
  496. data/vendor/tesseract-2.04/textord/makerow.cpp +2628 -0
  497. data/vendor/tesseract-2.04/textord/makerow.h +295 -0
  498. data/vendor/tesseract-2.04/textord/oldbasel.cpp +1761 -0
  499. data/vendor/tesseract-2.04/textord/oldbasel.h +195 -0
  500. data/vendor/tesseract-2.04/textord/pithsync.cpp +696 -0
  501. data/vendor/tesseract-2.04/textord/pithsync.h +134 -0
  502. data/vendor/tesseract-2.04/textord/pitsync1.cpp +425 -0
  503. data/vendor/tesseract-2.04/textord/pitsync1.h +135 -0
  504. data/vendor/tesseract-2.04/textord/scanedg.cpp +452 -0
  505. data/vendor/tesseract-2.04/textord/scanedg.h +74 -0
  506. data/vendor/tesseract-2.04/textord/sortflts.cpp +80 -0
  507. data/vendor/tesseract-2.04/textord/sortflts.h +64 -0
  508. data/vendor/tesseract-2.04/textord/tessout.h +76 -0
  509. data/vendor/tesseract-2.04/textord/topitch.cpp +2019 -0
  510. data/vendor/tesseract-2.04/textord/topitch.h +195 -0
  511. data/vendor/tesseract-2.04/textord/tordmain.cpp +907 -0
  512. data/vendor/tesseract-2.04/textord/tordmain.h +132 -0
  513. data/vendor/tesseract-2.04/textord/tospace.cpp +1939 -0
  514. data/vendor/tesseract-2.04/textord/tospace.h +193 -0
  515. data/vendor/tesseract-2.04/textord/tovars.cpp +87 -0
  516. data/vendor/tesseract-2.04/textord/tovars.h +94 -0
  517. data/vendor/tesseract-2.04/textord/underlin.cpp +312 -0
  518. data/vendor/tesseract-2.04/textord/underlin.h +53 -0
  519. data/vendor/tesseract-2.04/textord/wordseg.cpp +620 -0
  520. data/vendor/tesseract-2.04/textord/wordseg.h +70 -0
  521. data/vendor/tesseract-2.04/training/Makefile.am +54 -0
  522. data/vendor/tesseract-2.04/training/Makefile.in +720 -0
  523. data/vendor/tesseract-2.04/training/cnTraining.cpp +855 -0
  524. data/vendor/tesseract-2.04/training/cntraining.dsp +243 -0
  525. data/vendor/tesseract-2.04/training/cntraining.vcproj +950 -0
  526. data/vendor/tesseract-2.04/training/mergenf.cpp +451 -0
  527. data/vendor/tesseract-2.04/training/mergenf.h +106 -0
  528. data/vendor/tesseract-2.04/training/mfTraining.cpp +1341 -0
  529. data/vendor/tesseract-2.04/training/mftraining.dsp +285 -0
  530. data/vendor/tesseract-2.04/training/mftraining.vcproj +1055 -0
  531. data/vendor/tesseract-2.04/training/name2char.cpp +166 -0
  532. data/vendor/tesseract-2.04/training/name2char.h +38 -0
  533. data/vendor/tesseract-2.04/training/training.cpp +190 -0
  534. data/vendor/tesseract-2.04/training/training.h +130 -0
  535. data/vendor/tesseract-2.04/training/unicharset_extractor.cpp +140 -0
  536. data/vendor/tesseract-2.04/training/unicharset_extractor.dsp +335 -0
  537. data/vendor/tesseract-2.04/training/unicharset_extractor.vcproj +769 -0
  538. data/vendor/tesseract-2.04/training/wordlist2dawg.cpp +69 -0
  539. data/vendor/tesseract-2.04/training/wordlist2dawg.dsp +319 -0
  540. data/vendor/tesseract-2.04/training/wordlist2dawg.vcproj +1113 -0
  541. data/vendor/tesseract-2.04/viewer/Makefile.am +9 -0
  542. data/vendor/tesseract-2.04/viewer/Makefile.in +591 -0
  543. data/vendor/tesseract-2.04/viewer/scrollview.cpp +825 -0
  544. data/vendor/tesseract-2.04/viewer/scrollview.h +414 -0
  545. data/vendor/tesseract-2.04/viewer/svmnode.cpp +140 -0
  546. data/vendor/tesseract-2.04/viewer/svmnode.h +94 -0
  547. data/vendor/tesseract-2.04/viewer/svpaint.cpp +220 -0
  548. data/vendor/tesseract-2.04/viewer/svutil.cpp +347 -0
  549. data/vendor/tesseract-2.04/viewer/svutil.h +138 -0
  550. data/vendor/tesseract-2.04/wordrec/Makefile.am +23 -0
  551. data/vendor/tesseract-2.04/wordrec/Makefile.in +641 -0
  552. data/vendor/tesseract-2.04/wordrec/associate.cpp +62 -0
  553. data/vendor/tesseract-2.04/wordrec/associate.h +93 -0
  554. data/vendor/tesseract-2.04/wordrec/badwords.cpp +106 -0
  555. data/vendor/tesseract-2.04/wordrec/badwords.h +51 -0
  556. data/vendor/tesseract-2.04/wordrec/bestfirst.cpp +526 -0
  557. data/vendor/tesseract-2.04/wordrec/bestfirst.h +203 -0
  558. data/vendor/tesseract-2.04/wordrec/charsample.h +208 -0
  559. data/vendor/tesseract-2.04/wordrec/chop.cpp +458 -0
  560. data/vendor/tesseract-2.04/wordrec/chop.h +153 -0
  561. data/vendor/tesseract-2.04/wordrec/chopper.cpp +750 -0
  562. data/vendor/tesseract-2.04/wordrec/chopper.h +104 -0
  563. data/vendor/tesseract-2.04/wordrec/closed.cpp +136 -0
  564. data/vendor/tesseract-2.04/wordrec/closed.h +65 -0
  565. data/vendor/tesseract-2.04/wordrec/djmenus.cpp +118 -0
  566. data/vendor/tesseract-2.04/wordrec/djmenus.h +33 -0
  567. data/vendor/tesseract-2.04/wordrec/drawfx.cpp +92 -0
  568. data/vendor/tesseract-2.04/wordrec/drawfx.h +33 -0
  569. data/vendor/tesseract-2.04/wordrec/findseam.cpp +566 -0
  570. data/vendor/tesseract-2.04/wordrec/findseam.h +69 -0
  571. data/vendor/tesseract-2.04/wordrec/gradechop.cpp +226 -0
  572. data/vendor/tesseract-2.04/wordrec/gradechop.h +91 -0
  573. data/vendor/tesseract-2.04/wordrec/heuristic.cpp +194 -0
  574. data/vendor/tesseract-2.04/wordrec/heuristic.h +120 -0
  575. data/vendor/tesseract-2.04/wordrec/makechop.cpp +281 -0
  576. data/vendor/tesseract-2.04/wordrec/makechop.h +69 -0
  577. data/vendor/tesseract-2.04/wordrec/matchtab.cpp +191 -0
  578. data/vendor/tesseract-2.04/wordrec/matchtab.h +45 -0
  579. data/vendor/tesseract-2.04/wordrec/matrix.cpp +118 -0
  580. data/vendor/tesseract-2.04/wordrec/matrix.h +104 -0
  581. data/vendor/tesseract-2.04/wordrec/measure.h +135 -0
  582. data/vendor/tesseract-2.04/wordrec/metrics.cpp +363 -0
  583. data/vendor/tesseract-2.04/wordrec/metrics.h +130 -0
  584. data/vendor/tesseract-2.04/wordrec/mfvars.cpp +51 -0
  585. data/vendor/tesseract-2.04/wordrec/mfvars.h +27 -0
  586. data/vendor/tesseract-2.04/wordrec/msmenus.cpp +110 -0
  587. data/vendor/tesseract-2.04/wordrec/msmenus.h +45 -0
  588. data/vendor/tesseract-2.04/wordrec/olutil.cpp +153 -0
  589. data/vendor/tesseract-2.04/wordrec/olutil.h +128 -0
  590. data/vendor/tesseract-2.04/wordrec/outlines.cpp +172 -0
  591. data/vendor/tesseract-2.04/wordrec/outlines.h +148 -0
  592. data/vendor/tesseract-2.04/wordrec/pieces.cpp +410 -0
  593. data/vendor/tesseract-2.04/wordrec/pieces.h +154 -0
  594. data/vendor/tesseract-2.04/wordrec/plotedges.cpp +134 -0
  595. data/vendor/tesseract-2.04/wordrec/plotedges.h +71 -0
  596. data/vendor/tesseract-2.04/wordrec/plotseg.cpp +116 -0
  597. data/vendor/tesseract-2.04/wordrec/plotseg.h +73 -0
  598. data/vendor/tesseract-2.04/wordrec/render.cpp +152 -0
  599. data/vendor/tesseract-2.04/wordrec/render.h +58 -0
  600. data/vendor/tesseract-2.04/wordrec/seam.cpp +482 -0
  601. data/vendor/tesseract-2.04/wordrec/seam.h +136 -0
  602. data/vendor/tesseract-2.04/wordrec/split.cpp +182 -0
  603. data/vendor/tesseract-2.04/wordrec/split.h +115 -0
  604. data/vendor/tesseract-2.04/wordrec/tally.cpp +68 -0
  605. data/vendor/tesseract-2.04/wordrec/tally.h +94 -0
  606. data/vendor/tesseract-2.04/wordrec/tessinit.cpp +108 -0
  607. data/vendor/tesseract-2.04/wordrec/tessinit.h +46 -0
  608. data/vendor/tesseract-2.04/wordrec/tface.cpp +272 -0
  609. data/vendor/tesseract-2.04/wordrec/tface.h +35 -0
  610. data/vendor/tesseract-2.04/wordrec/wordclass.cpp +284 -0
  611. data/vendor/tesseract-2.04/wordrec/wordclass.h +64 -0
  612. metadata +708 -0
@@ -0,0 +1,1087 @@
1
+ /******************************************************************************
2
+ ** Filename: mfoutline.c
3
+ ** Purpose: Interface to outline struct used for extracting features
4
+ ** Author: Dan Johnson
5
+ ** History: Thu May 17 08:14:18 1990, DSJ, Created.
6
+ **
7
+ ** (c) Copyright Hewlett-Packard Company, 1988.
8
+ ** Licensed under the Apache License, Version 2.0 (the "License");
9
+ ** you may not use this file except in compliance with the License.
10
+ ** You may obtain a copy of the License at
11
+ ** http://www.apache.org/licenses/LICENSE-2.0
12
+ ** Unless required by applicable law or agreed to in writing, software
13
+ ** distributed under the License is distributed on an "AS IS" BASIS,
14
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ ** See the License for the specific language governing permissions and
16
+ ** limitations under the License.
17
+ ******************************************************************************/
18
+ /**----------------------------------------------------------------------------
19
+ Include Files and Type Defines
20
+ ----------------------------------------------------------------------------**/
21
+ #include "clusttool.h" //If remove you get cought in a loop somewhere
22
+ #include "emalloc.h"
23
+ #include "mfoutline.h"
24
+ #include "debug.h"
25
+ #include "hideedge.h"
26
+ #include "blobs.h"
27
+ #include "const.h"
28
+ #include "mfx.h"
29
+
30
+ #include <math.h>
31
+ #include <stdio.h>
32
+
33
+ #define MIN_INERTIA (0.00001)
34
+
35
+ /**----------------------------------------------------------------------------
36
+ Private Function Prototypes
37
+ ----------------------------------------------------------------------------**/
38
+ /*
39
+ #if defined(__STDC__) || defined(__cplusplus)
40
+ # define _ARGS(s) s
41
+ #else
42
+ # define _ARGS(s) ()
43
+ #endif*/
44
+
45
+ /* /users/danj/wiseowl/src/danj/microfeatures/mfoutline.c
46
+ void ChangeDirection
47
+ _ARGS((MFOUTLINE Start,
48
+ MFOUTLINE End,
49
+ DIRECTION Direction));
50
+
51
+ void CharNormalizeOutline
52
+ _ARGS((MFOUTLINE Outline,
53
+ OUTLINE_STATS *OutlineStats));
54
+
55
+ void ComputeDirection
56
+ _ARGS((MFEDGEPT *Start,
57
+ MFEDGEPT *Finish,
58
+ FLOAT32 MinSlope,
59
+ FLOAT32 MaxSlope));
60
+
61
+ void FinishOutlineStats
62
+ _ARGS((OUTLINE_STATS *OutlineStats));
63
+
64
+ void InitOutlineStats
65
+ _ARGS((OUTLINE_STATS *OutlineStats));
66
+
67
+ MFOUTLINE NextDirectionChange
68
+ _ARGS((MFOUTLINE EdgePoint));
69
+
70
+ void UpdateOutlineStats
71
+ _ARGS((OUTLINE_STATS *OutlineStats,
72
+ FLOAT32 x1,
73
+ FLOAT32 y1,
74
+ FLOAT32 x2,
75
+ FLOAT32 y2));
76
+
77
+ #undef _ARGS
78
+ */
79
+ /**----------------------------------------------------------------------------
80
+ Global Data Definitions and Declarations
81
+ ----------------------------------------------------------------------------**/
82
+ /* center of current blob being processed - used when "unexpanding"
83
+ expanded blobs */
84
+ static TPOINT BlobCenter;
85
+
86
+ /* control knobs used to control normalization of outlines */
87
+ make_int_var (NormMethod, character, MakeNormMethod,
88
+ 15, 10, SetNormMethod, "Normalization Method ...")
89
+ /* PREV DEFAULT "baseline" */
90
+ make_float_var (CharNormRange, 0.2, MakeCharNormRange,
91
+ 15, 11, SetCharNormRange, "Character Normalization Range ...")
92
+ make_float_var (MinNormScaleX, 0.0, MakeMinNormScaleX,
93
+ 15, 12, SetMinNormScaleX, "Min char x-norm scale ...")
94
+ /* PREV DEFAULT 0.1 */
95
+ make_float_var (MaxNormScaleX, 0.325, MakeMaxNormScaleX,
96
+ 15, 13, SetMaxNormScaleX, "Max char x-norm scale ...")
97
+ /* PREV DEFAULT 0.3 */
98
+ make_float_var (MinNormScaleY, 0.0, MakeMinNormScaleY,
99
+ 15, 14, SetMinNormScaleY, "Min char y-norm scale ...")
100
+ /* PREV DEFAULT 0.1 */
101
+ make_float_var (MaxNormScaleY, 0.325, MakeMaxNormScaleY,
102
+ 15, 15, SetMaxNormScaleY, "Max char y-norm scale ...")
103
+ /* PREV DEFAULT 0.3 */
104
+ /**----------------------------------------------------------------------------
105
+ Public Code
106
+ ----------------------------------------------------------------------------**/
107
+ /*---------------------------------------------------------------------------*/
108
+ void ComputeBlobCenter(TBLOB *Blob, TPOINT *BlobCenter) {
109
+ /*
110
+ ** Parameters:
111
+ ** Blob blob to compute centerpoint of
112
+ ** BlobCenter data struct to place results in
113
+ ** Globals: none
114
+ ** Operation:
115
+ ** This routine computes the center point of the specified
116
+ ** blob using the bounding box of all top level outlines in the
117
+ ** blob. The center point is computed in a coordinate system
118
+ ** which is scaled up by VECSCALE from the page coordinate
119
+ ** system.
120
+ ** Return: none
121
+ ** Exceptions: none
122
+ ** History: Fri Sep 8 10:45:39 1989, DSJ, Created.
123
+ */
124
+ TPOINT TopLeft;
125
+ TPOINT BottomRight;
126
+
127
+ blob_bounding_box(Blob, &TopLeft, &BottomRight);
128
+
129
+ BlobCenter->x = ((TopLeft.x << VECSCALE) + (BottomRight.x << VECSCALE)) / 2;
130
+ BlobCenter->y = ((TopLeft.y << VECSCALE) + (BottomRight.y << VECSCALE)) / 2;
131
+
132
+ } /* ComputeBlobCenter */
133
+
134
+
135
+ /*---------------------------------------------------------------------------*/
136
+ LIST ConvertBlob(TBLOB *Blob) {
137
+ /*
138
+ ** Parameters:
139
+ ** Blob blob to be converted
140
+ ** Globals: none
141
+ ** Operation: Convert Blob into a list of outlines.
142
+ ** Return: List of outlines representing blob.
143
+ ** Exceptions: none
144
+ ** History: Thu Dec 13 15:40:17 1990, DSJ, Created.
145
+ */
146
+ LIST ConvertedOutlines = NIL;
147
+
148
+ if (Blob != NULL) {
149
+ SettupBlobConversion(Blob); //ComputeBlobCenter (Blob, &BlobCenter);
150
+ ConvertedOutlines = ConvertOutlines (Blob->outlines,
151
+ ConvertedOutlines, outer);
152
+ }
153
+
154
+ return (ConvertedOutlines);
155
+ } /* ConvertBlob */
156
+
157
+
158
+ /*---------------------------------------------------------------------------*/
159
+ MFOUTLINE ConvertOutline(TESSLINE *Outline) {
160
+ /*
161
+ ** Parameters:
162
+ ** Outline outline to be converted
163
+ ** Globals:
164
+ ** BlobCenter pre-computed center of current blob
165
+ ** Operation:
166
+ ** This routine converts the specified outline into a special
167
+ ** data structure which is used for extracting micro-features.
168
+ ** If the outline has been pre-normalized by the splitter,
169
+ ** then it is assumed to be in expanded form and all we must
170
+ ** do is copy the points. Otherwise,
171
+ ** if the outline is expanded, then the expanded form is used
172
+ ** and the coordinates of the points are returned to page
173
+ ** coordinates using the global variable BlobCenter and the
174
+ ** scaling factor REALSCALE. If the outline is not expanded,
175
+ ** then the compressed form is used.
176
+ ** Return: Outline converted into special micro-features format.
177
+ ** Exceptions: none
178
+ ** History: 8/2/89, DSJ, Created.
179
+ ** 9/8/89, DSJ, Added ability to convert expanded blobs.
180
+ ** 1/11/90, DSJ, Changed to use REALSCALE instead of VECSCALE
181
+ ** to eliminate round-off problems.
182
+ ** 2/21/91, DSJ, Added ability to work with pre-normalized
183
+ ** blobs.
184
+ ** 4/30/91, DSJ, Added concept of "hidden" segments.
185
+ */
186
+ register BYTEVEC *Vector;
187
+ TPOINT Position;
188
+ TPOINT StartPosition;
189
+ MFEDGEPT *NewPoint;
190
+ MFOUTLINE MFOutline = NIL;
191
+ EDGEPT *EdgePoint;
192
+ EDGEPT *StartPoint;
193
+ EDGEPT *NextPoint;
194
+
195
+ if (Outline == NULL ||
196
+ (Outline->compactloop == NULL && Outline->loop == NULL))
197
+ return (MFOutline);
198
+
199
+ /* have outlines been prenormalized */
200
+ if (is_baseline_normalized ()) {
201
+ StartPoint = Outline->loop;
202
+ EdgePoint = StartPoint;
203
+ do {
204
+ NextPoint = EdgePoint->next;
205
+
206
+ /* filter out duplicate points */
207
+ if (EdgePoint->pos.x != NextPoint->pos.x ||
208
+ EdgePoint->pos.y != NextPoint->pos.y) {
209
+ NewPoint = NewEdgePoint ();
210
+ ClearMark(NewPoint);
211
+ NewPoint->Hidden = is_hidden_edge (EdgePoint) ? TRUE : FALSE;
212
+ NewPoint->Point.x = EdgePoint->pos.x;
213
+ NewPoint->Point.y = EdgePoint->pos.y;
214
+ MFOutline = push (MFOutline, NewPoint);
215
+ }
216
+ EdgePoint = NextPoint;
217
+ }
218
+ while (EdgePoint != StartPoint);
219
+ }
220
+ /* use compressed version of outline */
221
+ else if (Outline->loop == NULL) {
222
+ Position.x = StartPosition.x = Outline->start.x;
223
+ Position.y = StartPosition.y = Outline->start.y;
224
+ Vector = Outline->compactloop;
225
+ do {
226
+ if (Vector->dx != 0 || Vector->dy != 0) {
227
+ NewPoint = NewEdgePoint ();
228
+ ClearMark(NewPoint);
229
+ /* all edges are visible */
230
+ NewPoint->Hidden = FALSE;
231
+ CopyPoint (Position, NewPoint->Point);
232
+ MFOutline = push (MFOutline, NewPoint);
233
+ }
234
+ Position.x += Vector->dx;
235
+ Position.y += Vector->dy;
236
+ Vector++;
237
+ }
238
+ while (Position.x != StartPosition.x ||
239
+ (Position.y != StartPosition.y));
240
+ }
241
+ else { /* use expanded version of outline */
242
+ StartPoint = Outline->loop;
243
+ EdgePoint = StartPoint;
244
+ do {
245
+ NextPoint = EdgePoint->next;
246
+
247
+ /* filter out duplicate points */
248
+ if (EdgePoint->pos.x != NextPoint->pos.x ||
249
+ EdgePoint->pos.y != NextPoint->pos.y) {
250
+ NewPoint = NewEdgePoint ();
251
+ ClearMark(NewPoint);
252
+ NewPoint->Hidden = is_hidden_edge (EdgePoint) ? TRUE : FALSE;
253
+ NewPoint->Point.x =
254
+ (EdgePoint->pos.x + BlobCenter.x) / REALSCALE;
255
+ NewPoint->Point.y =
256
+ (EdgePoint->pos.y + BlobCenter.y) / REALSCALE;
257
+ MFOutline = push (MFOutline, NewPoint);
258
+ }
259
+ EdgePoint = NextPoint;
260
+ }
261
+ while (EdgePoint != StartPoint);
262
+ }
263
+
264
+ MakeOutlineCircular(MFOutline);
265
+ return (MFOutline);
266
+
267
+ } /* ConvertOutline */
268
+
269
+
270
+ /*---------------------------------------------------------------------------*/
271
+ LIST ConvertOutlines(TESSLINE *Outline,
272
+ LIST ConvertedOutlines,
273
+ OUTLINETYPE OutlineType) {
274
+ /*
275
+ ** Parameters:
276
+ ** Outline first outline to be converted
277
+ ** ConvertedOutlines list to add converted outlines to
278
+ ** OutlineType are the outlines outer or holes?
279
+ ** Globals: none
280
+ ** Operation:
281
+ ** This routine converts all given outlines into a new format.
282
+ ** of outlines. Outline points to a list of the top level
283
+ ** outlines to be converted. The children of these outlines
284
+ ** are also recursively converted. All converted outlines
285
+ ** are added to ConvertedOutlines. This is a list of outlines,
286
+ ** one for each outline that was converted.
287
+ ** Return: Updated list of converted outlines.
288
+ ** Exceptions: none
289
+ ** History: Thu Dec 13 15:57:38 1990, DSJ, Created.
290
+ */
291
+ MFOUTLINE MFOutline;
292
+
293
+ while (Outline != NULL) {
294
+ if (Outline->child != NULL) {
295
+ if (OutlineType == outer)
296
+ ConvertedOutlines = ConvertOutlines (Outline->child,
297
+ ConvertedOutlines, hole);
298
+ else
299
+ ConvertedOutlines = ConvertOutlines (Outline->child,
300
+ ConvertedOutlines, outer);
301
+ }
302
+
303
+ MFOutline = ConvertOutline (Outline);
304
+ ConvertedOutlines = push (ConvertedOutlines, MFOutline);
305
+ Outline = Outline->next;
306
+ }
307
+ return (ConvertedOutlines);
308
+ } /* ConvertOutlines */
309
+
310
+
311
+ /*---------------------------------------------------------------------------*/
312
+ void ComputeOutlineStats(LIST Outlines, OUTLINE_STATS *OutlineStats) {
313
+ /*
314
+ ** Parameters:
315
+ ** Outlines list of outlines to compute stats for
316
+ ** OutlineStats place to put results
317
+ ** Globals: none
318
+ ** Operation: This routine computes several statistics about the outlines
319
+ ** in Outlines. These statistics are usually used to perform
320
+ ** anistropic normalization of all of the outlines. The
321
+ ** statistics generated are:
322
+ ** first moments about x and y axes
323
+ ** total length of all outlines
324
+ ** center of mass of all outlines
325
+ ** second moments about center of mass axes
326
+ ** radius of gyration about center of mass axes
327
+ ** Return: none (results are returned in OutlineStats)
328
+ ** Exceptions: none
329
+ ** History: Fri Dec 14 08:32:03 1990, DSJ, Created.
330
+ */
331
+ MFOUTLINE Outline;
332
+ MFOUTLINE EdgePoint;
333
+ MFEDGEPT *Current;
334
+ MFEDGEPT *Last;
335
+
336
+ InitOutlineStats(OutlineStats);
337
+ iterate(Outlines) {
338
+ Outline = (MFOUTLINE) first_node (Outlines);
339
+
340
+ Last = PointAt (Outline);
341
+ Outline = NextPointAfter (Outline);
342
+ EdgePoint = Outline;
343
+ do {
344
+ Current = PointAt (EdgePoint);
345
+
346
+ UpdateOutlineStats (OutlineStats,
347
+ Last->Point.x, Last->Point.y,
348
+ Current->Point.x, Current->Point.y);
349
+
350
+ Last = Current;
351
+ EdgePoint = NextPointAfter (EdgePoint);
352
+ }
353
+ while (EdgePoint != Outline);
354
+ }
355
+ FinishOutlineStats(OutlineStats);
356
+
357
+ } /* ComputeOutlineStats */
358
+
359
+
360
+ /*---------------------------------------------------------------------------*/
361
+ void FilterEdgeNoise(MFOUTLINE Outline, FLOAT32 NoiseSegmentLength) {
362
+ /*
363
+ ** Parameters:
364
+ ** Outline outline to be filtered
365
+ ** NoiseSegmentLength maximum length of a "noise" segment
366
+ ** Globals: none
367
+ ** Operation: Filter out noise from the specified outline. This is
368
+ ** done by changing the direction of short segments of the
369
+ ** outline to the same direction as the preceding outline
370
+ ** segment.
371
+ ** Return: none
372
+ ** Exceptions: none
373
+ ** History: Fri May 4 10:23:45 1990, DSJ, Created.
374
+ */
375
+ MFOUTLINE Current;
376
+ MFOUTLINE Last;
377
+ MFOUTLINE First;
378
+ FLOAT32 Length;
379
+ int NumFound = 0;
380
+ DIRECTION DirectionOfFirst = north;
381
+
382
+ if (DegenerateOutline (Outline))
383
+ return;
384
+
385
+ /* find 2 segments of different orientation which are long enough to
386
+ not be filtered. If two cannot be found, leave the outline unchanged. */
387
+ First = NextDirectionChange (Outline);
388
+ Last = First;
389
+ do {
390
+ Current = NextDirectionChange (Last);
391
+ Length = DistanceBetween ((PointAt (Current)->Point),
392
+ PointAt (Last)->Point);
393
+ if (Length >= NoiseSegmentLength) {
394
+ if (NumFound == 0) {
395
+ NumFound = 1;
396
+ DirectionOfFirst = PointAt (Last)->Direction;
397
+ }
398
+ else if (DirectionOfFirst != PointAt (Last)->Direction)
399
+ break;
400
+ }
401
+ Last = Current;
402
+ }
403
+ while (Last != First);
404
+ if (Current == Last)
405
+ return;
406
+
407
+ /* find each segment and filter it out if it is too short. Note that
408
+ the above code guarantees that the initial direction change will
409
+ not be removed, therefore the loop will terminate. */
410
+ First = Last;
411
+ do {
412
+ Current = NextDirectionChange (Last);
413
+ Length = DistanceBetween (PointAt (Current)->Point,
414
+ PointAt (Last)->Point);
415
+ if (Length < NoiseSegmentLength)
416
+ ChangeDirection (Last, Current, PointAt (Last)->PreviousDirection);
417
+
418
+ Last = Current;
419
+ }
420
+ while (Last != First);
421
+
422
+ } /* FilterEdgeNoise */
423
+
424
+
425
+ /*---------------------------------------------------------------------------*/
426
+ void FindDirectionChanges(MFOUTLINE Outline,
427
+ FLOAT32 MinSlope,
428
+ FLOAT32 MaxSlope) {
429
+ /*
430
+ ** Parameters:
431
+ ** Outline micro-feature outline to analyze
432
+ ** MinSlope controls "snapping" of segments to horizontal
433
+ ** MaxSlope controls "snapping" of segments to vertical
434
+ ** Globals: none
435
+ ** Operation:
436
+ ** This routine searches thru the specified outline, computes
437
+ ** a slope for each vector in the outline, and marks each
438
+ ** vector as having one of the following directions:
439
+ ** N, S, E, W, NE, NW, SE, SW
440
+ ** This information is then stored in the outline and the
441
+ ** outline is returned.
442
+ ** Return: none
443
+ ** Exceptions: none
444
+ ** History: 7/21/89, DSJ, Created.
445
+ */
446
+ MFEDGEPT *Current;
447
+ MFEDGEPT *Last;
448
+ MFOUTLINE EdgePoint;
449
+
450
+ if (DegenerateOutline (Outline))
451
+ return;
452
+
453
+ Last = PointAt (Outline);
454
+ Outline = NextPointAfter (Outline);
455
+ EdgePoint = Outline;
456
+ do {
457
+ Current = PointAt (EdgePoint);
458
+ ComputeDirection(Last, Current, MinSlope, MaxSlope);
459
+
460
+ Last = Current;
461
+ EdgePoint = NextPointAfter (EdgePoint);
462
+ }
463
+ while (EdgePoint != Outline);
464
+
465
+ } /* FindDirectionChanges */
466
+
467
+
468
+ /*---------------------------------------------------------------------------*/
469
+ void FreeMFOutline(void *arg) { //MFOUTLINE Outline)
470
+ /*
471
+ ** Parameters:
472
+ ** Outline micro-feature outline to be freed
473
+ ** Globals: none
474
+ ** Operation:
475
+ ** This routine deallocates all of the memory consumed by
476
+ ** a micro-feature outline.
477
+ ** Return: none
478
+ ** Exceptions: none
479
+ ** History: 7/27/89, DSJ, Created.
480
+ */
481
+ MFOUTLINE Start;
482
+ MFOUTLINE Outline = (MFOUTLINE) arg;
483
+
484
+ /* break the circular outline so we can use std. techniques to deallocate */
485
+ Start = rest (Outline);
486
+ set_rest(Outline, NIL);
487
+ while (Start != NULL) {
488
+ free_struct (first_node (Start), sizeof (MFEDGEPT), "MFEDGEPT");
489
+ Start = pop (Start);
490
+ }
491
+
492
+ } /* FreeMFOutline */
493
+
494
+
495
+ /*---------------------------------------------------------------------------*/
496
+ void FreeOutlines(LIST Outlines) {
497
+ /*
498
+ ** Parameters:
499
+ ** Outlines list of mf-outlines to be freed
500
+ ** Globals: none
501
+ ** Operation: Release all memory consumed by the specified list
502
+ ** of outlines.
503
+ ** Return: none
504
+ ** Exceptions: none
505
+ ** History: Thu Dec 13 16:14:50 1990, DSJ, Created.
506
+ */
507
+ destroy_nodes(Outlines, FreeMFOutline);
508
+ } /* FreeOutlines */
509
+
510
+
511
+ /*---------------------------------------------------------------------------*/
512
+ void InitMFOutlineVars() {
513
+ /*
514
+ ** Parameters: none
515
+ ** Globals: none
516
+ ** Operation: This routine initializes the global control knobs for
517
+ ** all routines in this file.
518
+ ** Return: none
519
+ ** Exceptions: none
520
+ ** History: Fri Dec 14 10:50:12 1990, DSJ, Created.
521
+ */
522
+ MakeNormMethod();
523
+ MakeCharNormRange();
524
+ MakeMinNormScaleX();
525
+ MakeMaxNormScaleX();
526
+ MakeMinNormScaleY();
527
+ MakeMaxNormScaleY();
528
+ } /* InitMFOutlineVars */
529
+
530
+
531
+ /*---------------------------------------------------------------------------*/
532
+ void MarkDirectionChanges(MFOUTLINE Outline) {
533
+ /*
534
+ ** Parameters:
535
+ ** Outline micro-feature outline to analyze
536
+ ** Globals: none
537
+ ** Operation:
538
+ ** This routine searches thru the specified outline and finds
539
+ ** the points at which the outline changes direction. These
540
+ ** points are then marked as "extremities". This routine is
541
+ ** used as an alternative to FindExtremities(). It forces the
542
+ ** endpoints of the microfeatures to be at the direction
543
+ ** changes rather than at the midpoint between direction
544
+ ** changes.
545
+ ** Return: none
546
+ ** Exceptions: none
547
+ ** History: 6/29/90, DSJ, Created.
548
+ */
549
+ MFOUTLINE Current;
550
+ MFOUTLINE Last;
551
+ MFOUTLINE First;
552
+
553
+ if (DegenerateOutline (Outline))
554
+ return;
555
+
556
+ First = NextDirectionChange (Outline);
557
+ Last = First;
558
+ do {
559
+ Current = NextDirectionChange (Last);
560
+ MarkPoint (PointAt (Current));
561
+ Last = Current;
562
+ }
563
+ while (Last != First);
564
+
565
+ } /* MarkDirectionChanges */
566
+
567
+
568
+ /*---------------------------------------------------------------------------*/
569
+ MFEDGEPT *NewEdgePoint() {
570
+ /*
571
+ ** Parameters: none
572
+ ** Globals: none
573
+ ** Operation:
574
+ ** This routine allocates and returns a new edge point for
575
+ ** a micro-feature outline.
576
+ ** Return: New edge point.
577
+ ** Exceptions: none
578
+ ** History: 7/21/89, DSJ, Created.
579
+ */
580
+ return ((MFEDGEPT *) alloc_struct (sizeof (MFEDGEPT), "MFEDGEPT"));
581
+
582
+ } /* NewEdgePoint */
583
+
584
+
585
+ /*---------------------------------------------------------------------------*/
586
+ MFOUTLINE NextExtremity(MFOUTLINE EdgePoint) {
587
+ /*
588
+ ** Parameters:
589
+ ** EdgePoint start search from this point
590
+ ** Globals: none
591
+ ** Operation:
592
+ ** This routine returns the next point in the micro-feature
593
+ ** outline that is an extremity. The search starts after
594
+ ** EdgePoint. The routine assumes that the outline being
595
+ ** searched is not a degenerate outline (i.e. it must have
596
+ ** 2 or more edge points).
597
+ ** Return: Next extremity in the outline after EdgePoint.
598
+ ** Exceptions: none
599
+ ** History: 7/26/89, DSJ, Created.
600
+ */
601
+ EdgePoint = NextPointAfter (EdgePoint);
602
+ while (!PointAt (EdgePoint)->ExtremityMark)
603
+ EdgePoint = NextPointAfter (EdgePoint);
604
+
605
+ return (EdgePoint);
606
+
607
+ } /* NextExtremity */
608
+
609
+
610
+ /*---------------------------------------------------------------------------*/
611
+ void NormalizeOutline(MFOUTLINE Outline,
612
+ LINE_STATS *LineStats,
613
+ FLOAT32 XOrigin) {
614
+ /*
615
+ ** Parameters:
616
+ ** Outline outline to be normalized
617
+ ** LineStats statistics for text line normalization
618
+ ** XOrigin x-origin of text
619
+ ** Globals: none
620
+ ** Operation:
621
+ ** This routine normalizes the coordinates of the specified
622
+ ** outline so that the outline is deskewed down to the
623
+ ** baseline, translated so that x=0 is at XOrigin, and scaled
624
+ ** so that the height of a character cell from descender to
625
+ ** ascender is 1. Of this height, 0.25 is for the descender,
626
+ ** 0.25 for the ascender, and 0.5 for the x-height. The
627
+ ** y coordinate of the baseline is 0.
628
+ ** Return: none
629
+ ** Exceptions: none
630
+ ** History: 8/2/89, DSJ, Created.
631
+ ** 10/23/89, DSJ, Added ascender/descender stretching.
632
+ ** 11/89, DSJ, Removed ascender/descender stretching.
633
+ */
634
+ MFEDGEPT *Current;
635
+ MFOUTLINE EdgePoint;
636
+ FLOAT32 ScaleFactor;
637
+ FLOAT32 AscStretch;
638
+ FLOAT32 DescStretch;
639
+
640
+ if (Outline != NIL) {
641
+ ScaleFactor = ComputeScaleFactor (LineStats);
642
+ AscStretch = 1.0;
643
+ DescStretch = 1.0;
644
+
645
+ EdgePoint = Outline;
646
+ do {
647
+ Current = PointAt (EdgePoint);
648
+
649
+ Current->Point.y = ScaleFactor *
650
+ (Current->Point.y -
651
+ BaselineAt (LineStats, XPositionOf (Current)));
652
+
653
+ if (Current->Point.y > NORMAL_X_HEIGHT)
654
+ Current->Point.y = NORMAL_X_HEIGHT +
655
+ (Current->Point.y - NORMAL_X_HEIGHT) / AscStretch;
656
+
657
+ else if (Current->Point.y < NORMAL_BASELINE)
658
+ Current->Point.y = NORMAL_BASELINE +
659
+ (Current->Point.y - NORMAL_BASELINE) / DescStretch;
660
+
661
+ Current->Point.x = ScaleFactor *
662
+ (Current->Point.x - XOrigin);
663
+
664
+ EdgePoint = NextPointAfter (EdgePoint);
665
+ }
666
+ while (EdgePoint != Outline);
667
+ }
668
+ } /* NormalizeOutline */
669
+
670
+
671
+ /*---------------------------------------------------------------------------*/
672
+ void NormalizeOutlines(LIST Outlines,
673
+ LINE_STATS *LineStats,
674
+ FLOAT32 *XScale,
675
+ FLOAT32 *YScale) {
676
+ /*
677
+ ** Parameters:
678
+ ** Outlines list of outlines to be normalized
679
+ ** LineStats statistics for text line normalization
680
+ ** XScale x-direction scale factor used by routine
681
+ ** YScale y-direction scale factor used by routine
682
+ ** Globals:
683
+ ** NormMethod method being used for normalization
684
+ ** CharNormRange map radius of gyration to this value
685
+ ** Operation: This routine normalizes every outline in Outlines
686
+ ** according to the currently selected normalization method.
687
+ ** It also returns the scale factors that it used to do this
688
+ ** scaling. The scale factors returned represent the x and
689
+ ** y sizes in the normalized coordinate system that correspond
690
+ ** to 1 pixel in the original coordinate system.
691
+ ** Return: none (Outlines are changed and XScale and YScale are updated)
692
+ ** Exceptions: none
693
+ ** History: Fri Dec 14 08:14:55 1990, DSJ, Created.
694
+ */
695
+ MFOUTLINE Outline;
696
+ OUTLINE_STATS OutlineStats;
697
+ FLOAT32 BaselineScale;
698
+
699
+ switch (NormMethod) {
700
+ case character:
701
+ ComputeOutlineStats(Outlines, &OutlineStats);
702
+
703
+ /* limit scale factor to avoid overscaling small blobs (.,`'),
704
+ thin blobs (l1ift), and merged blobs */
705
+ *XScale = *YScale = BaselineScale = ComputeScaleFactor (LineStats);
706
+ *XScale *= OutlineStats.Ry;
707
+ *YScale *= OutlineStats.Rx;
708
+ if (*XScale < MinNormScaleX)
709
+ *XScale = MinNormScaleX;
710
+ if (*YScale < MinNormScaleY)
711
+ *YScale = MinNormScaleY;
712
+ if (*XScale > MaxNormScaleX && *YScale <= MaxNormScaleY)
713
+ *XScale = MaxNormScaleX;
714
+ *XScale = CharNormRange * BaselineScale / *XScale;
715
+ *YScale = CharNormRange * BaselineScale / *YScale;
716
+
717
+ iterate(Outlines) {
718
+ Outline = (MFOUTLINE) first_node (Outlines);
719
+ CharNormalizeOutline (Outline,
720
+ OutlineStats.x, OutlineStats.y,
721
+ *XScale, *YScale);
722
+ }
723
+ break;
724
+
725
+ case baseline:
726
+ iterate(Outlines) {
727
+ Outline = (MFOUTLINE) first_node (Outlines);
728
+ NormalizeOutline (Outline, LineStats, 0.0);
729
+ }
730
+ *XScale = *YScale = ComputeScaleFactor (LineStats);
731
+ break;
732
+ }
733
+ } /* NormalizeOutlines */
734
+
735
+
736
+ /*---------------------------------------------------------------------------*/
737
+ void SettupBlobConversion(TBLOB *Blob) {
738
+ /*
739
+ ** Parameters:
740
+ ** Blob blob that is to be converted
741
+ ** Globals:
742
+ ** BlobCenter center of blob to be converted
743
+ ** Operation: Compute the center of the blob's bounding box and save
744
+ ** it in a global variable. This routine must be called before
745
+ ** any calls to ConvertOutline. It must be called once per
746
+ ** blob.
747
+ ** Return: none
748
+ ** Exceptions: none
749
+ ** History: Thu May 17 11:06:17 1990, DSJ, Created.
750
+ */
751
+ ComputeBlobCenter(Blob, &BlobCenter);
752
+
753
+ } /* SettupBlobConversion */
754
+
755
+
756
+ /*---------------------------------------------------------------------------*/
757
+ void SmearExtremities(MFOUTLINE Outline, FLOAT32 XScale, FLOAT32 YScale) {
758
+ /*
759
+ ** Parameters:
760
+ ** Outline outline whose extremities are to be smeared
761
+ ** XScale factor used to normalize outline in x dir
762
+ ** YScale factor used to normalize outline in y dir
763
+ ** Globals: none
764
+ ** Operation:
765
+ ** This routine smears the extremities of the specified outline.
766
+ ** It does this by adding a random number between
767
+ ** -0.5 and 0.5 pixels (that is why X/YScale are needed) to
768
+ ** the x and y position of the point. This is done so that
769
+ ** the discrete nature of the original scanned image does not
770
+ ** affect the statistical clustering used during training.
771
+ ** Return: none
772
+ ** Exceptions: none
773
+ ** History: 1/11/90, DSJ, Created.
774
+ */
775
+ MFEDGEPT *Current;
776
+ MFOUTLINE EdgePoint;
777
+ FLOAT32 MinXSmear;
778
+ FLOAT32 MaxXSmear;
779
+ FLOAT32 MinYSmear;
780
+ FLOAT32 MaxYSmear;
781
+
782
+ if (Outline != NIL) {
783
+ MinXSmear = -0.5 * XScale;
784
+ MaxXSmear = 0.5 * XScale;
785
+ MinYSmear = -0.5 * YScale;
786
+ MaxYSmear = 0.5 * YScale;
787
+ EdgePoint = Outline;
788
+ do {
789
+ Current = PointAt (EdgePoint);
790
+ if (Current->ExtremityMark) {
791
+ Current->Point.x +=
792
+ UniformRandomNumber(MinXSmear, MaxXSmear);
793
+ Current->Point.y +=
794
+ UniformRandomNumber(MinYSmear, MaxYSmear);
795
+ }
796
+
797
+ EdgePoint = NextPointAfter (EdgePoint);
798
+ }
799
+ while (EdgePoint != Outline);
800
+ }
801
+ } /* SmearExtremities */
802
+
803
+
804
+ /**----------------------------------------------------------------------------
805
+ Private Code
806
+ ----------------------------------------------------------------------------**/
807
+ /*---------------------------------------------------------------------------*/
808
+ void ChangeDirection(MFOUTLINE Start, MFOUTLINE End, DIRECTION Direction) {
809
+ /*
810
+ ** Parameters:
811
+ ** Start, End defines segment of outline to be modified
812
+ ** Direction new direction to assign to segment
813
+ ** Globals: none
814
+ ** Operation: Change the direction of every vector in the specified
815
+ ** outline segment to Direction. The segment to be changed
816
+ ** starts at Start and ends at End. Note that the previous
817
+ ** direction of End must also be changed to reflect the
818
+ ** change in direction of the point before it.
819
+ ** Return: none
820
+ ** Exceptions: none
821
+ ** History: Fri May 4 10:42:04 1990, DSJ, Created.
822
+ */
823
+ MFOUTLINE Current;
824
+
825
+ for (Current = Start; Current != End; Current = NextPointAfter (Current))
826
+ PointAt (Current)->Direction = Direction;
827
+
828
+ PointAt (End)->PreviousDirection = Direction;
829
+
830
+ } /* ChangeDirection */
831
+
832
+
833
+ /*---------------------------------------------------------------------------*/
834
+ void CharNormalizeOutline(MFOUTLINE Outline,
835
+ FLOAT32 XCenter,
836
+ FLOAT32 YCenter,
837
+ FLOAT32 XScale,
838
+ FLOAT32 YScale) {
839
+ /*
840
+ ** Parameters:
841
+ ** Outline outline to be character normalized
842
+ ** XCenter, YCenter center point for normalization
843
+ ** XScale, YScale scale factors for normalization
844
+ ** Globals: none
845
+ ** Operation: This routine normalizes each point in Outline by
846
+ ** translating it to the specified center and scaling it
847
+ ** anisotropically according to the given scale factors.
848
+ ** Return: none
849
+ ** Exceptions: none
850
+ ** History: Fri Dec 14 10:27:11 1990, DSJ, Created.
851
+ */
852
+ MFOUTLINE First, Current;
853
+ MFEDGEPT *CurrentPoint;
854
+
855
+ if (Outline == NIL)
856
+ return;
857
+
858
+ First = Outline;
859
+ Current = First;
860
+ do {
861
+ CurrentPoint = PointAt (Current);
862
+ CurrentPoint->Point.x =
863
+ (CurrentPoint->Point.x - XCenter) * XScale;
864
+ CurrentPoint->Point.y =
865
+ (CurrentPoint->Point.y - YCenter) * YScale;
866
+
867
+ Current = NextPointAfter (Current);
868
+ }
869
+ while (Current != First);
870
+
871
+ } /* CharNormalizeOutline */
872
+
873
+
874
+ /*---------------------------------------------------------------------------*/
875
+ void ComputeDirection(MFEDGEPT *Start,
876
+ MFEDGEPT *Finish,
877
+ FLOAT32 MinSlope,
878
+ FLOAT32 MaxSlope) {
879
+ /*
880
+ ** Parameters:
881
+ ** Start starting point to compute direction from
882
+ ** Finish finishing point to compute direction to
883
+ ** MinSlope slope below which lines are horizontal
884
+ ** MaxSlope slope above which lines are vertical
885
+ ** Globals: none
886
+ ** Operation:
887
+ ** This routine computes the slope from Start to Finish and
888
+ ** and then computes the approximate direction of the line
889
+ ** segment from Start to Finish. The direction is quantized
890
+ ** into 8 buckets:
891
+ ** N, S, E, W, NE, NW, SE, SW
892
+ ** Both the slope and the direction are then stored into
893
+ ** the appropriate fields of the Start edge point. The
894
+ ** direction is also stored into the PreviousDirection field
895
+ ** of the Finish edge point.
896
+ ** Return: none
897
+ ** Exceptions: none
898
+ ** History: 7/25/89, DSJ, Created.
899
+ */
900
+ FVECTOR Delta;
901
+
902
+ Delta.x = Finish->Point.x - Start->Point.x;
903
+ Delta.y = Finish->Point.y - Start->Point.y;
904
+ if (Delta.x == 0)
905
+ if (Delta.y < 0) {
906
+ Start->Slope = -MAX_FLOAT32;
907
+ Start->Direction = south;
908
+ }
909
+ else {
910
+ Start->Slope = MAX_FLOAT32;
911
+ Start->Direction = north;
912
+ }
913
+ else {
914
+ Start->Slope = Delta.y / Delta.x;
915
+ if (Delta.x > 0)
916
+ if (Delta.y > 0)
917
+ if (Start->Slope > MinSlope)
918
+ if (Start->Slope < MaxSlope)
919
+ Start->Direction = northeast;
920
+ else
921
+ Start->Direction = north;
922
+ else
923
+ Start->Direction = east;
924
+ else if (Start->Slope < -MinSlope)
925
+ if (Start->Slope > -MaxSlope)
926
+ Start->Direction = southeast;
927
+ else
928
+ Start->Direction = south;
929
+ else
930
+ Start->Direction = east;
931
+ else if (Delta.y > 0)
932
+ if (Start->Slope < -MinSlope)
933
+ if (Start->Slope > -MaxSlope)
934
+ Start->Direction = northwest;
935
+ else
936
+ Start->Direction = north;
937
+ else
938
+ Start->Direction = west;
939
+ else if (Start->Slope > MinSlope)
940
+ if (Start->Slope < MaxSlope)
941
+ Start->Direction = southwest;
942
+ else
943
+ Start->Direction = south;
944
+ else
945
+ Start->Direction = west;
946
+ }
947
+ Finish->PreviousDirection = Start->Direction;
948
+ } /* ComputeDirection */
949
+
950
+
951
+ /*---------------------------------------------------------------------------*/
952
+ void FinishOutlineStats(register OUTLINE_STATS *OutlineStats) {
953
+ /*
954
+ ** Parameters:
955
+ ** OutlineStats statistics about a set of outlines
956
+ ** Globals: none
957
+ ** Operation: Use the preliminary statistics accumulated in OutlineStats
958
+ ** to compute the final statistics.
959
+ ** (see Dan Johnson's Tesseract lab
960
+ ** notebook #2, pgs. 74-78).
961
+ ** Return: none
962
+ ** Exceptions: none
963
+ ** History: Fri Dec 14 10:13:36 1990, DSJ, Created.
964
+ */
965
+ OutlineStats->x = 0.5 * OutlineStats->My / OutlineStats->L;
966
+ OutlineStats->y = 0.5 * OutlineStats->Mx / OutlineStats->L;
967
+
968
+ OutlineStats->Ix = (OutlineStats->Ix / 3.0 -
969
+ OutlineStats->y * OutlineStats->Mx +
970
+ OutlineStats->y * OutlineStats->y * OutlineStats->L);
971
+
972
+ OutlineStats->Iy = (OutlineStats->Iy / 3.0 -
973
+ OutlineStats->x * OutlineStats->My +
974
+ OutlineStats->x * OutlineStats->x * OutlineStats->L);
975
+
976
+ /* Ix and/or Iy could possibly be negative due to roundoff error */
977
+ if (OutlineStats->Ix < 0.0)
978
+ OutlineStats->Ix = MIN_INERTIA;
979
+ if (OutlineStats->Iy < 0.0)
980
+ OutlineStats->Iy = MIN_INERTIA;
981
+
982
+ OutlineStats->Rx = sqrt (OutlineStats->Ix / OutlineStats->L);
983
+ OutlineStats->Ry = sqrt (OutlineStats->Iy / OutlineStats->L);
984
+
985
+ OutlineStats->Mx *= 0.5;
986
+ OutlineStats->My *= 0.5;
987
+
988
+ } /* FinishOutlineStats */
989
+
990
+
991
+ /*---------------------------------------------------------------------------*/
992
+ void InitOutlineStats(OUTLINE_STATS *OutlineStats) {
993
+ /*
994
+ ** Parameters:
995
+ ** OutlineStats stats data structure to be initialized
996
+ ** Globals: none
997
+ ** Operation: Initialize the outline statistics data structure so
998
+ ** that it is ready to start accumulating statistics.
999
+ ** Return: none
1000
+ ** Exceptions: none
1001
+ ** History: Fri Dec 14 08:55:22 1990, DSJ, Created.
1002
+ */
1003
+ OutlineStats->Mx = 0.0;
1004
+ OutlineStats->My = 0.0;
1005
+ OutlineStats->L = 0.0;
1006
+ OutlineStats->x = 0.0;
1007
+ OutlineStats->y = 0.0;
1008
+ OutlineStats->Ix = 0.0;
1009
+ OutlineStats->Iy = 0.0;
1010
+ OutlineStats->Rx = 0.0;
1011
+ OutlineStats->Ry = 0.0;
1012
+ } /* InitOutlineStats */
1013
+
1014
+
1015
+ /*---------------------------------------------------------------------------*/
1016
+ MFOUTLINE NextDirectionChange(MFOUTLINE EdgePoint) {
1017
+ /*
1018
+ ** Parameters:
1019
+ ** EdgePoint start search from this point
1020
+ ** Globals: none
1021
+ ** Operation:
1022
+ ** This routine returns the next point in the micro-feature
1023
+ ** outline that has a direction different than EdgePoint. The
1024
+ ** routine assumes that the outline being searched is not a
1025
+ ** degenerate outline (i.e. it must have 2 or more edge points).
1026
+ ** Return: Point of next direction change in micro-feature outline.
1027
+ ** Exceptions: none
1028
+ ** History: 7/25/89, DSJ, Created.
1029
+ */
1030
+ DIRECTION InitialDirection;
1031
+
1032
+ InitialDirection = PointAt (EdgePoint)->Direction;
1033
+
1034
+ do
1035
+ EdgePoint = NextPointAfter (EdgePoint);
1036
+ while (PointAt (EdgePoint)->Direction == InitialDirection);
1037
+
1038
+ return (EdgePoint);
1039
+ } /* NextDirectionChange */
1040
+
1041
+
1042
+ /*---------------------------------------------------------------------------*/
1043
+ void UpdateOutlineStats(register OUTLINE_STATS *OutlineStats,
1044
+ register FLOAT32 x1,
1045
+ register FLOAT32 x2,
1046
+ register FLOAT32 y1,
1047
+ register FLOAT32 y2) {
1048
+ /*
1049
+ ** Parameters:
1050
+ ** OutlineStats statistics to add this segment to
1051
+ ** x1, y1, x2, y2 segment to be added to statistics
1052
+ ** Globals: none
1053
+ ** Operation: This routine adds the statistics for the specified
1054
+ ** line segment to OutlineStats. The statistics that are
1055
+ ** kept are:
1056
+ ** sum of length of all segments
1057
+ ** sum of 2*Mx for all segments
1058
+ ** sum of 2*My for all segments
1059
+ ** sum of 2*Mx*(y1+y2) - L*y1*y2 for all segments
1060
+ ** sum of 2*My*(x1+x2) - L*x1*x2 for all segments
1061
+ ** These numbers, once collected can later be used to easily
1062
+ ** compute the center of mass, first and second moments,
1063
+ ** and radii of gyration. (see Dan Johnson's Tesseract lab
1064
+ ** notebook #2, pgs. 74-78).
1065
+ ** Return: none
1066
+ ** Exceptions: none
1067
+ ** History: Fri Dec 14 08:59:17 1990, DSJ, Created.
1068
+ */
1069
+ register FLOAT64 L;
1070
+ register FLOAT64 Mx2;
1071
+ register FLOAT64 My2;
1072
+
1073
+ /* compute length of segment */
1074
+ L = sqrt ((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
1075
+ OutlineStats->L += L;
1076
+
1077
+ /* compute 2Mx and 2My components */
1078
+ Mx2 = L * (y1 + y2);
1079
+ My2 = L * (x1 + x2);
1080
+ OutlineStats->Mx += Mx2;
1081
+ OutlineStats->My += My2;
1082
+
1083
+ /* compute second moment component */
1084
+ OutlineStats->Ix += Mx2 * (y1 + y2) - L * y1 * y2;
1085
+ OutlineStats->Iy += My2 * (x1 + x2) - L * x1 * x2;
1086
+
1087
+ } /* UpdateOutlineStats */