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,1764 @@
1
+ /**********************************************************************
2
+ * File: imgs.c (Formerly images.c)
3
+ * Description: Main image manipulation functions.
4
+ * Author: Ray Smith
5
+ * Created: Thu Jun 07 16:25:02 BST 1990
6
+ *
7
+ * (C) Copyright 1990, Hewlett-Packard Ltd.
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
+
20
+ #include "mfcpch.h" //precompiled headers
21
+ #ifdef __MSW32__
22
+ #include <io.h>
23
+ #else
24
+ #include <unistd.h>
25
+ #endif
26
+ #include <string.h>
27
+ #ifdef __UNIX__
28
+ #include <assert.h>
29
+ #endif
30
+
31
+ // Include automatically generated configuration file if running autoconf.
32
+ #ifdef HAVE_CONFIG_H
33
+ #include "config_auto.h"
34
+ #endif
35
+
36
+ #ifdef HAVE_LIBLEPT
37
+ // Include leptonica library only if autoconf (or makefile etc) tell us to.
38
+ #include "allheaders.h"
39
+ #endif
40
+
41
+ #include "stderr.h"
42
+ #include "tprintf.h"
43
+ #include "imgerrs.h"
44
+ #include "memry.h"
45
+ #include "imgs.h"
46
+ #include "imgio.h"
47
+ #include "imgunpk.h"
48
+
49
+ #define FIXED_COLOURS 32 /*number of fixed colours */
50
+ #define MIN_4BIT 48 /*4bpp range */
51
+ #define MAX_4BIT 64
52
+ #define MIN_6BIT 64 /*6bpp range */
53
+ #define MAX_6BIT 128
54
+ #define BLACK_PIX 0
55
+
56
+ static uinT8 grey_scales[FIXED_COLOURS] = {
57
+ 0, 255, 76, 227, 151, 179, 28, 104,
58
+ 149, 72, 215, 67, 53, 44, 156, 137,
59
+ 110, 153, 79, 181, 166, 218, 55, 81,
60
+ 129, 105, 179, 149, 168, 69, 84, 126
61
+ };
62
+
63
+ #undef EXTERN
64
+ #define EXTERN
65
+
66
+ EXTERN INT_VAR (image_default_resolution, 300, "Image resolution dpi");
67
+
68
+ /**********************************************************************
69
+ * IMAGE
70
+ *
71
+ * Contructor for an IMAGE class. Makes the image definitely illegal.
72
+ **********************************************************************/
73
+
74
+ IMAGE::IMAGE() { //construct an image
75
+ bpp = 0; //all illegal
76
+ fd = -1;
77
+ image = NULL;
78
+ photo_interp = 1;
79
+ res = image_default_resolution;
80
+ }
81
+
82
+
83
+ /**********************************************************************
84
+ * IMAGE::operator=
85
+ *
86
+ * Assign an IMAGE to another. The dest becomes the owner of the memory.
87
+ **********************************************************************/
88
+
89
+ IMAGE & IMAGE::operator= ( //assignment
90
+ IMAGE & source //source image
91
+ ) {
92
+ destroy();
93
+ bpp = source.bpp;
94
+ photo_interp = source.photo_interp;
95
+ bps = source.bps;
96
+ bytespp = (bpp + 7) / 8;
97
+ lineskip = source.lineskip; //copy everything
98
+ captured = source.captured;
99
+ xsize = source.xsize;
100
+ ysize = source.ysize;
101
+ res = source.res;
102
+ image = source.image;
103
+ xdim = source.xdim;
104
+ bufheight = source.bufheight;
105
+ fd = source.fd;
106
+ reader = source.reader;
107
+ ymin = source.ymin;
108
+ ymax = source.ymax;
109
+
110
+ source.captured = TRUE; //source now captured
111
+ source.fd = -1;
112
+
113
+ return *this;
114
+ }
115
+
116
+
117
+ /**********************************************************************
118
+ * create
119
+ *
120
+ * Create an image (allocate memory) of a specific size and bpp.
121
+ **********************************************************************/
122
+
123
+ inT8 IMAGE::create( //get rest of image
124
+ inT32 x, //x size required
125
+ inT32 y, //ysize required
126
+ inT8 bits_per_pixel //bpp required
127
+ ) {
128
+ uinT8 *pixels; //memory for image
129
+
130
+ xdim = check_legal_image_size (x, y, bits_per_pixel);
131
+ if (xdim < 0)
132
+ return -1;
133
+ pixels = (uinT8 *) alloc_big_zeros ((size_t) (xdim * y * sizeof (uinT8)));
134
+ if (pixels == NULL) {
135
+ MEMORY_OUT.error ("IMAGE::create", ABORT, "Size=(%d,%d)", xdim, y);
136
+ return -1;
137
+ }
138
+ //allocate to image
139
+ this->capture (pixels, x, y, bits_per_pixel);
140
+ captured = FALSE;
141
+ res = image_default_resolution;
142
+ return 0; //success
143
+ }
144
+
145
+
146
+ /**********************************************************************
147
+ * destroy
148
+ *
149
+ * Destroy an image, freeing memory and closing any open file.
150
+ **********************************************************************/
151
+
152
+ void IMAGE::destroy() { //get rid of image
153
+ if (image != NULL && !captured) {
154
+ free_big_mem(image);
155
+ }
156
+ image = NULL;
157
+ if (fd >= 0) {
158
+ close(fd);
159
+ fd = -1;
160
+ }
161
+ bpp = 0;
162
+ }
163
+
164
+
165
+ /**********************************************************************
166
+ * capture
167
+ *
168
+ * Assign a given memory area to an image to use as an image of
169
+ * given size and bpp.
170
+ **********************************************************************/
171
+
172
+ inT8 IMAGE::capture( //get rest of image
173
+ uinT8 *pixels, //image memory
174
+ inT32 x, //x size required
175
+ inT32 y, //ysize required
176
+ inT8 bits_per_pixel //bpp required
177
+ ) {
178
+ destroy();
179
+ xdim = check_legal_image_size (x, y, bits_per_pixel);
180
+ if (xdim < 0)
181
+ return -1;
182
+ xsize = x;
183
+ ysize = y;
184
+ bufheight = y;
185
+ bpp = bits_per_pixel;
186
+ bps = bpp == 24 ? 8 : bpp;
187
+ photo_interp = 1;
188
+ bytespp = (bpp + 7) / 8;
189
+ image = pixels; //assign image area
190
+ ymin = 0;
191
+ ymax = bufheight; //read it all
192
+ captured = TRUE;
193
+ res = image_default_resolution;
194
+ return 0; //success
195
+ }
196
+
197
+
198
+ /**********************************************************************
199
+ * pixel
200
+ *
201
+ * Get a single pixel out of the image.
202
+ **********************************************************************/
203
+
204
+ uinT8 IMAGE::pixel( //get rest of image
205
+ inT32 x, //x coord
206
+ inT32 y //y coord
207
+ ) {
208
+ if (x < 0)
209
+ x = 0; //silently clip
210
+ else if (x >= xsize)
211
+ x = xsize - 1;
212
+ if (y < 0)
213
+ y = 0;
214
+ else if (y >= ysize)
215
+ y = ysize - 1;
216
+ check_legal_access (x, y, 1);
217
+ switch (bpp) {
218
+ case 5:
219
+ case 6:
220
+ case 8:
221
+ return image[(ymax - 1 - y) * xdim + x];
222
+ case 4:
223
+ return bpp4table[image[(ymax - 1 - y) * xdim + x / 2]][x & 1];
224
+ case 2:
225
+ return bpp2table[image[(ymax - 1 - y) * xdim + x / 4]][x & 3];
226
+ case 1:
227
+ return bpp1table[image[(ymax - 1 - y) * xdim + x / 8]][x & 7];
228
+ default:
229
+ tprintf ("Unexpected bits per pixel %d\n", bpp);
230
+ return 0;
231
+ }
232
+ }
233
+
234
+
235
+ /**********************************************************************
236
+ * check_legal_image_size
237
+ *
238
+ * Check that the supplied image sizes are legal. If they are,
239
+ * the xdim is returned, else -1.
240
+ **********************************************************************/
241
+
242
+ inT32 check_legal_image_size( //get rest of image
243
+ inT32 x, //x size required
244
+ inT32 y, //ysize required
245
+ inT8 bits_per_pixel //bpp required
246
+ ) {
247
+ if (x <= 0 || y <= 0) {
248
+ BADIMAGESIZE.error ("check_legal_image_size", TESSLOG, "(%d,%d)", x, y);
249
+ return -1; //failed
250
+ }
251
+ if (bits_per_pixel != 1 && bits_per_pixel != 2
252
+ && bits_per_pixel != 4 && bits_per_pixel != 5
253
+ && bits_per_pixel != 6 && bits_per_pixel != 8 && bits_per_pixel != 24) {
254
+ BADBPP.error ("check_legal_image_size", TESSLOG, "%d", bits_per_pixel);
255
+ return -1;
256
+ }
257
+ //bytes per line
258
+ return COMPUTE_IMAGE_XDIM (x, bits_per_pixel);
259
+ }
260
+
261
+
262
+ /**********************************************************************
263
+ * copy_sub_image
264
+ *
265
+ * Copy a portion of one image to a portion of another image.
266
+ * If the bpps are different, the position of the most significant
267
+ * bit is preserved.
268
+ **********************************************************************/
269
+
270
+ DLLSYM void copy_sub_image( //copy rectangle
271
+ IMAGE *source, //source image
272
+ inT32 xstart, //start coords
273
+ inT32 ystart,
274
+ inT32 xext, //extent to copy
275
+ inT32 yext,
276
+ IMAGE *dest, //destination image
277
+ inT32 xdest, //destination coords
278
+ inT32 ydest,
279
+ BOOL8 adjust_grey //shift to new bpp
280
+ ) {
281
+ IMAGELINE copyline; //copy of line
282
+ uinT8 *copy; //source pointer
283
+ inT8 shift; //shift factor
284
+ inT32 pixel; //pixel index
285
+ inT32 y; //line index
286
+ inT32 yoffset; //current adjusted offset
287
+ inT32 bytesize; //no of bytes to copy
288
+ inT32 srcppb; //pixels per byte
289
+ BOOL8 aligned;
290
+
291
+ if (xstart < 0 || ystart < 0 || xdest < 0 || ydest < 0)
292
+ return;
293
+ if (xext <= 0)
294
+ xext = source->xsize; //default to all
295
+ if (xext > source->xsize - xstart)
296
+ //clip to smallest
297
+ xext = source->xsize - xstart;
298
+ if (xext > dest->xsize - xdest)
299
+ xext = dest->xsize - xdest;
300
+ if (yext <= 0)
301
+ yext = source->ysize; //default to all
302
+ if (yext > source->ysize - ystart)
303
+ //clip to smallest
304
+ yext = source->ysize - ystart;
305
+ if (yext > dest->ysize - ydest)
306
+ yext = dest->ysize - ydest;
307
+ if (xext <= 0 || yext <= 0)
308
+ return; //nothing to do
309
+
310
+ srcppb = 8 / source->bpp; //pixels per byte
311
+ if (source->bpp == dest->bpp || !adjust_grey)
312
+ shift = 0; //no adjustment
313
+ else {
314
+ shift = source->bps - dest->bps;
315
+ if (shift < 0)
316
+ shift = -shift; //keep positive
317
+ }
318
+ aligned = source->bpp == dest->bpp;
319
+ if (aligned && srcppb != 0) {
320
+ aligned = xstart % srcppb == 0
321
+ && xdest % srcppb == 0
322
+ && (xext % srcppb == 0 || xdest + xext == dest->xsize);
323
+ }
324
+ for (y = 0; y < yext; y++) {
325
+ if (ystart >= ydest)
326
+ yoffset = y; //top down
327
+ else
328
+ yoffset = yext - y - 1; //bottom up
329
+ source->check_legal_access (xstart, ystart + yoffset, xext);
330
+ dest->check_legal_access (xdest, ydest + yoffset, xext);
331
+ if (aligned) {
332
+ bytesize = COMPUTE_IMAGE_XDIM (xext, source->bpp);
333
+ //get bytes per line
334
+ if (srcppb == 0)
335
+ //do cheap move
336
+ memmove (dest->image + (dest->ymax - 1 - ydest - yoffset) * dest->xdim + xdest * 3, source->image + (source->ymax - 1 - ystart - yoffset) * source->xdim + xstart * 3, (unsigned) bytesize);
337
+ else
338
+ //do cheap move
339
+ memmove (dest->image + (dest->ymax - 1 - ydest - yoffset) * dest->xdim + xdest / srcppb, source->image + (source->ymax - 1 - ystart - yoffset) * source->xdim + xstart / srcppb, (unsigned) bytesize);
340
+ }
341
+ else {
342
+ if (shift == 0) {
343
+ source->fast_get_line (xstart, ystart + yoffset, xext,
344
+ &copyline);
345
+ }
346
+ else if (source->bpp < dest->bpp) {
347
+ source->get_line (xstart, ystart + yoffset, xext, &copyline, 0);
348
+ if (source->bpp <= shift
349
+ && (source->bpp == 1 || source->bpp == 4)) {
350
+ if (source->bpp == 1) {
351
+ for (pixel = 0, copy = copyline.pixels; pixel < xext;
352
+ pixel++, copy++)
353
+ if (*copy)
354
+ *copy = 0xff;
355
+ }
356
+ else {
357
+ for (pixel = 0, copy = copyline.pixels; pixel < xext;
358
+ pixel++, copy++)
359
+ //scale up
360
+ *copy = (*copy << shift) | *copy;
361
+ }
362
+ }
363
+ else {
364
+ for (pixel = 0, copy = copyline.pixels; pixel < xext;
365
+ pixel++)
366
+ *copy++ <<= shift; //scale up
367
+ }
368
+ }
369
+ else {
370
+ source->get_line (xstart, ystart + yoffset, xext, &copyline, 0);
371
+ if (source->bpp == 24) {
372
+ for (pixel = 0, copy = copyline.pixels + 1; pixel < xext;
373
+ pixel++) {
374
+ *copy >>= shift;
375
+ copy += 3;
376
+ }
377
+ }
378
+ else {
379
+ for (pixel = 0, copy = copyline.pixels; pixel < xext;
380
+ pixel++)
381
+ *copy++ >>= shift; //scale down
382
+ }
383
+ }
384
+ dest->put_line (xdest, ydest + yoffset, xext, &copyline, 0);
385
+ }
386
+ }
387
+ }
388
+
389
+
390
+ /**********************************************************************
391
+ * enlarge_sub_image
392
+ *
393
+ * Enlarge a portion of one image to a portion of another image.
394
+ * If the bpps are different, the position of the most significant
395
+ * bit is preserved.
396
+ **********************************************************************/
397
+
398
+ DLLSYM void enlarge_sub_image( //enlarge rectangle
399
+ IMAGE *source, //source image
400
+ inT32 xstart, //scaled start coords
401
+ inT32 ystart,
402
+ IMAGE *dest, //destination image
403
+ inT32 xdest, //dest coords
404
+ inT32 ydest,
405
+ inT32 xext, //destination extent
406
+ inT32 yext,
407
+ inT32 scale, //scale factor
408
+ BOOL8 adjust_grey //shift to new bpp
409
+ ) {
410
+ inT8 shift; //shift factor
411
+ uinT8 pixel; //current pixel
412
+ inT32 srcext; //source extent
413
+ inT32 xoffset; //column index
414
+ inT32 yoffset; //line index
415
+ inT32 xindex, yindex; //index in super pixel
416
+ inT32 startxindex; //initial x index
417
+ inT32 xscale; //x scale factor
418
+ uinT8 *src; //source pixels
419
+ uinT8 *destpix; //dest pixels
420
+ IMAGELINE copyline; //copy of line
421
+ IMAGELINE bigline; //expanded line
422
+
423
+ if (xstart < 0 || ystart < 0 || xdest < 0 || ydest < 0)
424
+ return;
425
+
426
+ if (xext <= 0)
427
+ xext = dest->xsize; //default to all
428
+ if (xext > source->xsize * scale - xstart)
429
+ //clip to smallest
430
+ xext = source->xsize * scale - xstart;
431
+ if (xext > dest->xsize - xdest)
432
+ xext = dest->xsize - xdest;
433
+ if (yext <= 0)
434
+ yext = dest->ysize; //default to all
435
+ if (yext > source->ysize * scale - ystart)
436
+ yext = source->ysize * scale - ystart;
437
+ if (yext > dest->ysize - ydest)
438
+ yext = dest->ysize - ydest;
439
+ if (xext <= 0 || yext <= 0)
440
+ return; //nothing to do
441
+
442
+ xindex = xstart % scale; //offset in super pixel
443
+ startxindex = xindex;
444
+ yindex = ystart % scale;
445
+ //no of source pixels
446
+ srcext = (xext + xindex + scale - 1) / scale;
447
+ xstart /= scale; //actual start
448
+ ystart /= scale;
449
+ if (adjust_grey) {
450
+ shift = dest->bps - source->bps;
451
+ }
452
+ else
453
+ shift = 0; //no adjustment
454
+ bigline.init (xext * 3);
455
+ bigline.bpp = dest->bpp == 24 ? source->bpp : dest->bpp;
456
+
457
+ for (yoffset = 0; yoffset < yext; ystart++) {
458
+ source->check_legal_access (xstart, ystart, srcext);
459
+ dest->check_legal_access (xdest, ydest + yoffset, xext);
460
+ source->fast_get_line (xstart, ystart, srcext, &copyline);
461
+ src = copyline.pixels;
462
+ destpix = bigline.pixels;
463
+ xscale = scale; //enlargement factor
464
+ if (source->bpp == 24 && dest->bpp == 24) {
465
+ for (xoffset = 0, xindex = startxindex; xoffset < xext;
466
+ src += source->bytespp) {
467
+ xoffset += xscale - xindex;
468
+ if (xoffset > xext)
469
+ xscale -= xoffset - xext;
470
+ for (; xindex < xscale; xindex++) {
471
+ *destpix++ = *src;
472
+ *destpix++ = *(src + 1);
473
+ *destpix++ = *(src + 2);
474
+ }
475
+ xindex = 0;
476
+ }
477
+ }
478
+ else {
479
+ if (source->bpp == 24)
480
+ src++;
481
+ for (xoffset = 0, xindex = startxindex; xoffset < xext;
482
+ src += source->bytespp) {
483
+ xoffset += xscale - xindex;
484
+ if (xoffset > xext)
485
+ //clip to dest limit
486
+ xscale -= xoffset - xext;
487
+ if (shift == 0)
488
+ pixel = *src;
489
+ else if (shift > 0)
490
+ pixel = *src << shift;
491
+ else
492
+ pixel = *src >> (-shift);
493
+ for (; xindex < xscale; xindex++)
494
+ *destpix++ = pixel; //duplicate pixel
495
+ xindex = 0;
496
+ }
497
+ }
498
+ for (; yoffset < yext && yindex < scale; yindex++, yoffset++) {
499
+ dest->put_line (xdest, ydest + yoffset, xext, &bigline, 0);
500
+ }
501
+ yindex = 0;
502
+ }
503
+ }
504
+
505
+
506
+ /**********************************************************************
507
+ * fast_reduce_sub_image
508
+ *
509
+ * Reduce a portion of one image to a portion of another image.
510
+ * If the bpps are different, the position of the most significant
511
+ * bit is preserved.
512
+ * This is a fast but dirty version, which simply sub-samples.
513
+ * It does not smooth as it reduces.
514
+ **********************************************************************/
515
+
516
+ DLLSYM void fast_reduce_sub_image( //reduce rectangle
517
+ IMAGE *source, //source image
518
+ inT32 xstart, //start coords
519
+ inT32 ystart,
520
+ inT32 xext, //extent to copy
521
+ inT32 yext,
522
+ IMAGE *dest, //destination image
523
+ inT32 xdest, //destination coords
524
+ inT32 ydest,
525
+ inT32 scale, //reduction factor
526
+ BOOL8 adjust_grey //shift to new bpp
527
+ ) {
528
+ inT8 shift; //shift factor
529
+ inT32 xfactor; //run on x coord
530
+ inT32 divisor; //total cell area
531
+ inT32 xindex, yindex; //into averaging square
532
+ inT32 xcoord; //current x coord
533
+ inT32 destext; //destination size
534
+ inT32 yoffset; //current adjusted offset
535
+ uinT8 *pixel; //ptr to source pixels
536
+ inT32 *sums; //ptr to sums array
537
+ IMAGELINE copyline; //copy of line
538
+ inT32 *linesums; //averaging sums
539
+
540
+ if (xstart < 0 || ystart < 0 || xdest < 0 || ydest < 0)
541
+ return;
542
+ if (xext <= 0)
543
+ xext = source->xsize; //default to all
544
+ if (xext > source->xsize - xstart)
545
+ //clip to smallest
546
+ xext = source->xsize - xstart;
547
+ if (xext > (dest->xsize - xdest) * scale)
548
+ xext = (dest->xsize - xdest) * scale;
549
+ if (yext <= 0)
550
+ yext = source->ysize; //default to all
551
+ if (yext > source->ysize - ystart)
552
+ //clip to smallest
553
+ yext = source->ysize - ystart;
554
+ if (yext > (dest->ysize - ydest) * scale)
555
+ yext = (dest->ysize - ydest) * scale;
556
+ if (xext <= 0 || yext <= 0)
557
+ return; //nothing to do
558
+
559
+ xfactor = xext % scale; //left overs
560
+ if (xfactor == 0)
561
+ xfactor = scale;
562
+ //destination pixels
563
+ destext = (xext + scale - 1) / scale;
564
+ if (adjust_grey)
565
+ //shift factor
566
+ shift = dest->bps - source->bps;
567
+ else
568
+ shift = 0; //no adjustment
569
+ linesums = new inT32[destext * source->bytespp];
570
+
571
+ for (yoffset = 0; yoffset < yext; ydest++) {
572
+ source->check_legal_access (xstart, ystart + yoffset, xext);
573
+ dest->check_legal_access (xdest, ydest, destext);
574
+ for (xindex = destext * source->bytespp - 1; xindex >= 0; xindex--)
575
+ linesums[xindex] = 0; //zero sums
576
+ for (yindex = 0; yindex < scale
577
+ && ystart + yoffset < source->ysize; yindex += 3) {
578
+ source->fast_get_line (xstart, ystart + yoffset, xext, &copyline);
579
+ pixel = copyline.pixels; //start of line
580
+ if (source->bpp == 24) {
581
+ for (xcoord = 1, sums = linesums; xcoord < destext;
582
+ xcoord++, sums += 3) {
583
+ for (xindex = 0; xindex < scale; xindex += 2) {
584
+ *sums += *pixel++;
585
+ *(sums + 1) += *pixel++;
586
+ *(sums + 2) += *pixel++;
587
+ pixel += 3;
588
+ }
589
+ if (scale & 1)
590
+ pixel -= 3; //correct position
591
+ }
592
+ for (xindex = 0; xindex < xfactor; xindex += 2) {
593
+ *sums += *pixel++;
594
+ *(sums + 1) += *pixel++;
595
+ *(sums + 2) += *pixel++;
596
+ pixel += 3;
597
+ }
598
+ }
599
+ else {
600
+ for (xcoord = 1, sums = linesums; xcoord < destext;
601
+ xcoord++, sums++) {
602
+ for (xindex = 0; xindex < scale; xindex += 2) {
603
+ *sums += *pixel;
604
+ pixel += 2;
605
+ }
606
+ if (scale & 1)
607
+ pixel--; //correct position
608
+ }
609
+ for (xindex = 0; xindex < xfactor; xindex += 2) {
610
+ *sums += *pixel;
611
+ pixel += 2;
612
+ }
613
+ }
614
+ yoffset += 3; //every 3 lines
615
+ }
616
+ if (yindex > scale)
617
+ yoffset -= yindex - scale; //back on right scale
618
+ copyline.init (); //set pixels back to array
619
+ copyline.bpp = source->bpp;
620
+ pixel = copyline.pixels;
621
+ //pixels in block
622
+ divisor = ((yindex + 2) / 3) * ((scale + 1) / 2);
623
+ if (shift <= 0) {
624
+ divisor <<= (-shift); //do greyscale correction
625
+ for (sums = linesums, xindex = (destext - 1) * source->bytespp;
626
+ xindex > 0; xindex--)
627
+ //turn to destination value
628
+ *pixel++ = (uinT8) (*sums++ / divisor);
629
+ for (xindex = source->bytespp; xindex > 0; xindex--)
630
+ *pixel++ = *sums++
631
+ / (((yindex + 2) / 3) * ((xfactor + 1) / 2) << (-shift));
632
+ //lastone different
633
+ }
634
+ else {
635
+ for (sums = linesums, xindex = (destext - 1) * source->bytespp;
636
+ xindex > 0; xindex--)
637
+ *pixel++ = (uinT8) ((*sums++ << shift) / divisor);
638
+ //destination value
639
+ for (xindex = source->bytespp; xindex > 0; xindex--)
640
+ //last one different
641
+ *pixel++ = (*(sums++) << shift) / (((yindex + 2) / 3) * ((xfactor + 1) / 2));
642
+ }
643
+ //put in destination
644
+ dest->put_line (xdest, ydest, destext, &copyline, 0);
645
+ }
646
+ delete linesums;
647
+ }
648
+
649
+
650
+ /**********************************************************************
651
+ * reduce_sub_image
652
+ *
653
+ * Reduce a portion of one image to a portion of another image.
654
+ * If the bpps are different, the position of the most significant
655
+ * bit is preserved.
656
+ **********************************************************************/
657
+
658
+ DLLSYM void reduce_sub_image( //reduce rectangle
659
+ IMAGE *source, //source image
660
+ inT32 xstart, //start coords
661
+ inT32 ystart,
662
+ inT32 xext, //extent to copy
663
+ inT32 yext,
664
+ IMAGE *dest, //destination image
665
+ inT32 xdest, //destination coords
666
+ inT32 ydest,
667
+ inT32 scale, //reduction factor
668
+ BOOL8 adjust_grey //shift to new bpp
669
+ ) {
670
+ inT8 shift; //shift factor
671
+ inT32 xfactor; //run on x coord
672
+ inT32 divisor; //total cell area
673
+ inT32 div2; //total cell area divided by 2
674
+ inT32 xindex, yindex; //into averaging square
675
+ inT32 xcoord; //current x coord
676
+ inT32 destext; //destination size
677
+ inT32 yoffset; //current adjusted offset
678
+ uinT8 *pixel; //ptr to source pixels
679
+ inT32 *sums; //ptr to sums array
680
+ IMAGELINE copyline; //copy of line
681
+ inT32 *linesums; //averaging sums
682
+
683
+ if (xstart < 0 || ystart < 0 || xdest < 0 || ydest < 0)
684
+ return;
685
+ if (xext <= 0)
686
+ xext = source->xsize; //default to all
687
+ if (xext > source->xsize - xstart)
688
+ //clip to smallest
689
+ xext = source->xsize - xstart;
690
+ if (xext > (dest->xsize - xdest) * scale)
691
+ xext = (dest->xsize - xdest) * scale;
692
+ if (yext <= 0)
693
+ yext = source->ysize; //default to all
694
+ if (yext > source->ysize - ystart)
695
+ //clip to smallest
696
+ yext = source->ysize - ystart;
697
+ if (yext > (dest->ysize - ydest) * scale)
698
+ yext = (dest->ysize - ydest) * scale;
699
+ if (xext <= 0 || yext <= 0)
700
+ return; //nothing to do
701
+
702
+ xfactor = xext % scale; //left overs
703
+ if (xfactor == 0)
704
+ xfactor = scale;
705
+ //destination pixels
706
+ destext = (xext + scale - 1) / scale;
707
+ if (adjust_grey)
708
+ //shift factor
709
+ shift = dest->bps - source->bps;
710
+ else
711
+ shift = 0; //no adjustment
712
+ linesums = new inT32[destext * source->bytespp];
713
+
714
+ for (yoffset = 0; yoffset < yext; ydest++) {
715
+ source->check_legal_access (xstart, ystart + yoffset, xext);
716
+ dest->check_legal_access (xdest, ydest, destext);
717
+ for (xindex = 0; xindex < (destext) * source->bytespp; xindex++)
718
+ linesums[xindex] = 0; //zero sums
719
+ for (yindex = 0; yindex < scale && ystart + yoffset < source->ysize;
720
+ yindex++) {
721
+ source->fast_get_line (xstart, ystart + yoffset, xext, &copyline);
722
+ pixel = copyline.pixels; //start of line
723
+ if (source->bpp == 24) {
724
+ for (xcoord = 1, sums = linesums; xcoord < destext;
725
+ xcoord++, sums += 3) {
726
+ for (xindex = 0; xindex < scale; xindex++) {
727
+ *sums += *pixel++;
728
+ *(sums + 1) += *pixel++;
729
+ *(sums + 2) += *pixel++;
730
+ }
731
+ }
732
+ for (xindex = 0; xindex < xfactor; xindex++) {
733
+ *sums += *pixel++;
734
+ *(sums + 1) += *pixel++;
735
+ *(sums + 2) += *pixel++;
736
+ }
737
+ }
738
+ else {
739
+ for (xcoord = 1, sums = linesums; xcoord < destext;
740
+ xcoord++, sums++) {
741
+ for (xindex = 0; xindex < scale; xindex++)
742
+ *sums += *pixel++;
743
+ }
744
+ for (xindex = 0; xindex < xfactor; xindex++)
745
+ *sums += *pixel++;
746
+ }
747
+ yoffset++; //next line
748
+ }
749
+ copyline.init (); //set pixels back to array
750
+ copyline.set_bpp (source->bpp);
751
+ pixel = copyline.pixels;
752
+ divisor = yindex * scale;
753
+ if (divisor == 0) {
754
+ tprintf
755
+ ("Impossible:divisor=0!, yindex=%d, scale=%d, yoffset=%d,yext=%d\n",
756
+ yindex, scale, yoffset, yext);
757
+ break;
758
+ }
759
+ if (shift <= 0) {
760
+ divisor <<= (-shift); //do greyscale correction
761
+ div2 = divisor / 2;
762
+ for (sums = linesums, xindex = (destext - 1) * source->bytespp;
763
+ xindex > 0; xindex--)
764
+ *pixel++ = (uinT8) ((div2 + *sums++) / divisor);
765
+ //turn to destination value
766
+ div2 = (yindex * xfactor << (-shift)) / 2;
767
+ for (xindex = source->bytespp; xindex > 0; xindex--)
768
+ *pixel++ =
769
+ (uinT8) ((div2 + *sums++) / (yindex * xfactor << (-shift)));
770
+ //lastone different
771
+ }
772
+ else {
773
+ div2 = divisor / 2;
774
+ for (sums = linesums, xindex = (destext - 1) * source->bytespp;
775
+ xindex > 0; xindex--)
776
+ *pixel++ = (uinT8) ((div2 + (*sums++ << shift)) / divisor);
777
+ //destination value
778
+ div2 = (yindex * xfactor) / 2;
779
+ for (xindex = source->bytespp; xindex > 0; xindex--)
780
+ *pixel++ =
781
+ (uinT8) ((div2 + (*sums++ << shift)) / (yindex * xfactor));
782
+ //last one different
783
+ }
784
+ //put in destination
785
+ dest->put_line (xdest, ydest, destext, &copyline, 0);
786
+ }
787
+ delete linesums;
788
+ }
789
+
790
+
791
+ /**********************************************************************
792
+ * invert_image
793
+ *
794
+ * Invert the given image (the slow way.)
795
+ **********************************************************************/
796
+
797
+ DLLSYM void invert_image( /*invert the image */
798
+ IMAGE *image /*image ot invert */
799
+ ) {
800
+ uinT8 mask; //bit mask
801
+ uinT8 bytespp; //bytes per pixel
802
+ inT32 xsize, ysize; /*size of image */
803
+ inT32 xindex, yindex; /*index into image */
804
+ uinT8 *pixel; /*current pixel */
805
+ IMAGELINE line; /*line of image */
806
+
807
+ bytespp = image->get_bpp () == 24 ? 3 : 1;
808
+ xsize = image->get_xsize (); /*find sizes */
809
+ ysize = image->get_ysize ();
810
+ //pixel mask
811
+ mask = (1 << image->get_bpp ()) - 1;
812
+ /*do each line */
813
+ for (yindex = ysize - 1; yindex >= 0; yindex--) {
814
+ image->fast_get_line (0, yindex, xsize, &line);
815
+ for (pixel = line.pixels, xindex = xsize * bytespp; xindex > 0;
816
+ xindex--) {
817
+ *pixel = (*pixel) ^ mask; //invert image only
818
+ ++pixel;
819
+ }
820
+ /*put it back */
821
+ image->fast_put_line (0, yindex, xsize, &line);
822
+ }
823
+ }
824
+
825
+
826
+ /**********************************************************************
827
+ * bias_sub_image
828
+ *
829
+ * Add a constant to a portion of an image.
830
+ **********************************************************************/
831
+
832
+ DLLSYM void bias_sub_image( //bias rectangle
833
+ IMAGE *source, //source image
834
+ inT32 xstart, //start coords
835
+ inT32 ystart,
836
+ inT32 xext, //extent to copy
837
+ inT32 yext,
838
+ uinT8 bias //number to add
839
+ ) {
840
+ IMAGELINE copyline; //copy of line
841
+ uinT8 *copy; //source pointer
842
+ inT32 pixel; //pixel index
843
+ inT32 y; //line index
844
+ uinT8 bytespp; //bytes per pixel
845
+
846
+ if (xstart < 0 || ystart < 0)
847
+ return;
848
+ if (xext <= 0)
849
+ xext = source->get_xsize (); //default to all
850
+ if (xext > source->get_xsize () - xstart)
851
+ //clip to smallest
852
+ xext = source->get_xsize () - xstart;
853
+ if (yext <= 0)
854
+ yext = source->get_ysize (); //default to all
855
+ if (yext > source->get_ysize () - ystart)
856
+ //clip to smallest
857
+ yext = source->get_ysize () - ystart;
858
+ if (xext <= 0 || yext <= 0)
859
+ return; //nothing to do
860
+
861
+ bytespp = source->get_bpp () == 24 ? 3 : 1;
862
+ for (y = 0; y < yext; y++) {
863
+ source->check_legal_access (xstart, ystart + y, xext);
864
+ source->fast_get_line (xstart, ystart + y, xext, &copyline);
865
+ for (pixel = xext * bytespp, copy = copyline.pixels; pixel > 0;
866
+ pixel--, copy++)
867
+ *copy += bias; //add bias
868
+
869
+ source->fast_put_line (xstart, ystart + y, xext, &copyline);
870
+ }
871
+ }
872
+
873
+
874
+ /**********************************************************************
875
+ * starbase_to_normal
876
+ *
877
+ * Copy a portion of one image to a portion of another image.
878
+ * This function maps the colour tables used on the screen to
879
+ * greyscale values in the way "normally" expected.
880
+ **********************************************************************/
881
+
882
+ DLLSYM void starbase_to_normal( //copy rectangle
883
+ IMAGE *source, //source image
884
+ inT32 xstart, //start coords
885
+ inT32 ystart,
886
+ inT32 xext, //extent to copy
887
+ inT32 yext,
888
+ IMAGE *dest, //destination image
889
+ inT32 xdest, //destination coords
890
+ inT32 ydest,
891
+ BOOL8 preserve_grey //shift to new bpp
892
+ ) {
893
+ IMAGELINE copyline; //copy of line
894
+ uinT8 *copy; //source pointer
895
+ inT8 shift4; //shift factor
896
+ inT8 shift6; //shift factor
897
+ inT8 colour_shift; //shift of colours
898
+ uinT8 white_level; //dest white value
899
+ inT32 pixel; //pixel index
900
+ inT32 y; //line index
901
+ inT32 yoffset; //current adjusted offset
902
+ inT8 srcppb; //pixels per byte
903
+
904
+ if (xstart < 0 || ystart < 0 || xdest < 0 || ydest < 0)
905
+ return;
906
+ if (xext <= 0)
907
+ xext = source->get_xsize (); //default to all
908
+ if (xext > source->get_xsize () - xstart)
909
+ //clip to smallest
910
+ xext = source->get_xsize () - xstart;
911
+ if (xext > dest->get_xsize () - xdest)
912
+ xext = dest->get_xsize () - xdest;
913
+ if (yext <= 0)
914
+ yext = source->get_ysize (); //default to all
915
+ if (yext > source->get_ysize () - ystart)
916
+ //clip to smallest
917
+ yext = source->get_ysize () - ystart;
918
+ if (yext > dest->get_ysize () - ydest)
919
+ yext = dest->get_ysize () - ydest;
920
+ if (xext <= 0 || yext <= 0)
921
+ return; //nothing to do
922
+
923
+ //pixels per byte
924
+ srcppb = 8 / source->get_bpp ();
925
+ shift4 = 4 - dest->get_bpp (); //for different bpps
926
+ shift6 = 6 - dest->get_bpp ();
927
+ //for grey preserve
928
+ colour_shift = 8 - dest->get_bpp ();
929
+ white_level = dest->get_white_level ();
930
+ for (y = 0; y < yext; y++) {
931
+ if (ystart >= ydest)
932
+ yoffset = y; //top down
933
+ else
934
+ yoffset = yext - y - 1; //bottom up
935
+ source->check_legal_access (xstart, ystart + yoffset, xext);
936
+ dest->check_legal_access (xdest, ydest + yoffset, xext);
937
+ source->get_line (xstart, ystart + yoffset, xext, &copyline, 0);
938
+ for (pixel = 0, copy = copyline.pixels; pixel < xext; pixel++) {
939
+ if (*copy < FIXED_COLOURS && preserve_grey)
940
+ *copy = grey_scales[*copy] >> colour_shift;
941
+ else if (*copy < FIXED_COLOURS) {
942
+ if (*copy == BLACK_PIX)
943
+ *copy = white_level; //black->white
944
+ else
945
+ *copy = 0; //others->black
946
+ }
947
+ else if (*copy >= MIN_4BIT && *copy < MAX_4BIT) {
948
+ if (shift4 < 0)
949
+ *copy = (*copy - MIN_4BIT) << (-shift4);
950
+ else
951
+ *copy = (*copy - MIN_4BIT) >> shift4;
952
+ }
953
+ else if (*copy >= MIN_6BIT && *copy < MAX_6BIT) {
954
+ if (shift6 < 0)
955
+ *copy = (*copy - MIN_6BIT) << (-shift6);
956
+ else
957
+ *copy = (*copy - MIN_6BIT) >> shift6;
958
+ }
959
+ else {
960
+ *copy = white_level; //white the rest
961
+ }
962
+ copy++;
963
+ }
964
+ dest->put_line (xdest, ydest + yoffset, xext, &copyline, 0);
965
+ }
966
+ }
967
+
968
+
969
+ /**********************************************************************
970
+ * fast_get_line
971
+ *
972
+ * Get a line of image into the supplied image line buffer.
973
+ * The image is converted to 8bpp by simple assignment.
974
+ * If the image is aleady 8 or 6bpp, no copy is done and a pointer
975
+ * to the correct image section is put in the line buffer.
976
+ **********************************************************************/
977
+
978
+ void IMAGE::fast_get_line( //get image line
979
+ inT32 x, //coord to start at
980
+ inT32 y, //line to get
981
+ inT32 width, //no of pixels to get
982
+ IMAGELINE *linebuf //line to copy to
983
+ ) {
984
+ if (width > 0 && bpp > 4) {
985
+ check_legal_access(x, y, width);
986
+ //get pointer only
987
+ linebuf->pixels = image + xdim * (ymax - 1 - y) + x * bytespp;
988
+ }
989
+ else
990
+ //just copy it
991
+ this->get_line (x, y, width, linebuf, 0);
992
+ linebuf->bpp = bpp;
993
+ }
994
+
995
+
996
+ /**********************************************************************
997
+ * get_line
998
+ *
999
+ * Get a line of image into the supplied image line buffer.
1000
+ * The image is converted to 8bpp by simple assignment.
1001
+ **********************************************************************/
1002
+
1003
+ void IMAGE::get_line( //get image line
1004
+ inT32 x, //coord to start at
1005
+ inT32 y, //line to get
1006
+ inT32 width, //no of pixels to get
1007
+ IMAGELINE *linebuf, //line to copy to
1008
+ inT32 margins //size of margins
1009
+ ) {
1010
+ uinT8 *src; //source pointer
1011
+ uinT8 *dest; //destination pointer
1012
+ uinT8 *unpacksrc; //unpacking pointer
1013
+ inT8 bit; //bit index
1014
+ inT8 pixperbyte; //pixels per byte
1015
+ uinT8 white; //white colour
1016
+ inT32 pixel; //pixel index
1017
+
1018
+ //test coords
1019
+ this->check_legal_access (x, y, width);
1020
+ if (width > xsize - x)
1021
+ width = xsize - x; //clip to image
1022
+ width *= bytespp;
1023
+ linebuf->init (width + margins * bytespp * 2);
1024
+ linebuf->bpp = bpp;
1025
+ //start of line
1026
+ src = image + xdim * (ymax - 1 - y);
1027
+ dest = linebuf->line; //destination line
1028
+ linebuf->pixels = dest;
1029
+ white = (1 << bpp) - 1; //max value of pixel
1030
+ for (pixel = margins * bytespp; pixel > 0; pixel--) {
1031
+ *dest++ = white; //margins are white
1032
+ }
1033
+ if (width > 0) {
1034
+ if (bpp > 4) {
1035
+ src += x; //offset
1036
+ //easy way
1037
+ memmove (dest, src, (unsigned) width);
1038
+ }
1039
+ else if (bpp == 4) {
1040
+ src += x / 2; //offset on line
1041
+ if (x & 1) {
1042
+ //get coded nibble
1043
+ *dest++ = bpp4table[*src++][1];
1044
+ width--;
1045
+ }
1046
+ while (width >= 2) {
1047
+ //get coded bits
1048
+ unpacksrc = bpp4table[*src++];
1049
+ *dest++ = *unpacksrc++;
1050
+ *dest++ = *unpacksrc++; //copy nibbles
1051
+ width -= 2;
1052
+ }
1053
+ if (width) {
1054
+ //get coded nibble
1055
+ *dest++ = bpp4table[*src++][0];
1056
+ }
1057
+ }
1058
+ else if (bpp == 2) {
1059
+ pixperbyte = 4;
1060
+ src += x / 4; //offset on line
1061
+ bit = (inT8) (x % 4); //offset in byte
1062
+ width += bit;
1063
+ while (width > 0) { //until all done
1064
+ if (width < pixperbyte)
1065
+ //less on last byte
1066
+ pixperbyte = (inT8) width;
1067
+ //get coded bits
1068
+ unpacksrc = &bpp2table[*src++][bit];
1069
+ for (; bit < pixperbyte; bit++)
1070
+ *dest++ = *unpacksrc++;//copy bytes
1071
+ width -= pixperbyte;
1072
+ bit = 0;
1073
+ }
1074
+ }
1075
+ else {
1076
+ pixperbyte = 8;
1077
+ src += x / 8; //offset on line
1078
+ bit = (inT8) (x % 8); //offset in byte
1079
+ width += bit;
1080
+ while (width > 0) { //until all done
1081
+ if (width < pixperbyte)
1082
+ //less on last byte
1083
+ pixperbyte = (inT8) width;
1084
+ //get coded bits
1085
+ unpacksrc = &bpp1table[*src++][bit];
1086
+ for (; bit < pixperbyte; bit++)
1087
+ *dest++ = *unpacksrc++;//copy bytes
1088
+ width -= pixperbyte;
1089
+ bit = 0;
1090
+ }
1091
+ }
1092
+ }
1093
+ for (pixel = margins * bytespp; pixel > 0; pixel--) {
1094
+ *dest++ = white; //margins are white
1095
+ }
1096
+ }
1097
+
1098
+
1099
+ /**********************************************************************
1100
+ * get_column
1101
+ *
1102
+ * Get a column of image into the supplied image line buffer.
1103
+ * The image is converted to 8bpp by simple assignment.
1104
+ **********************************************************************/
1105
+
1106
+ void IMAGE::get_column( //get image column
1107
+ inT32 x, //coord to start at
1108
+ inT32 y, //line to get
1109
+ inT32 height, //no of pixels to get
1110
+ IMAGELINE *linebuf, //line to copy to
1111
+ inT32 margins //size of margins
1112
+ ) {
1113
+ uinT8 *src; //source pointer
1114
+ uinT8 *dest; //destination pointer
1115
+ inT8 bit; //bit index
1116
+ inT8 pixperbyte; //pixels per byte
1117
+ uinT8 white; //white colour
1118
+ inT32 pixel; //pixel index
1119
+
1120
+ //test coords
1121
+ this->check_legal_access (x, y, 1);
1122
+ //test coords
1123
+ this->check_legal_access (x, y + height - 1, 1);
1124
+ if (height > ysize - y)
1125
+ height = ysize - y; //clip to image
1126
+ linebuf->init (height * bytespp + margins * bytespp * 2);
1127
+ //start of line
1128
+ src = image + xdim * (ymax - 1 - y);
1129
+ dest = linebuf->line; //destination line
1130
+ linebuf->pixels = dest;
1131
+ white = (1 << bpp) - 1; //max value of pixel
1132
+ for (pixel = margins * bytespp; pixel > 0; pixel--) {
1133
+ *dest++ = white; //margins are white
1134
+ }
1135
+ if (height > 0) {
1136
+ if (bpp == 24) {
1137
+ src += x * bytespp; //offset
1138
+ for (; height > 0; --height) {
1139
+ *dest++ = *src; //copy bytes
1140
+ *dest++ = *(src + 1);
1141
+ *dest++ = *(src + 2);
1142
+ src -= xdim;
1143
+ }
1144
+ }
1145
+ else if (bpp > 4) {
1146
+ src += x;
1147
+ for (; height > 0; --height) {
1148
+ *dest++ = *src; //copy bytes
1149
+ src -= xdim;
1150
+ }
1151
+ }
1152
+ else if (bpp == 4) {
1153
+ src += x / 2; //offset on line
1154
+ if (x & 1) {
1155
+ for (; height > 0; --height) {
1156
+ //get coded nibble
1157
+ *dest++ = bpp4table[*src][1];
1158
+ src -= xdim;
1159
+ }
1160
+ }
1161
+ else {
1162
+ for (; height > 0; --height) {
1163
+ //get coded nibble
1164
+ *dest++ = bpp4table[*src][0];
1165
+ src -= xdim;
1166
+ }
1167
+ }
1168
+ }
1169
+ else if (bpp == 2) {
1170
+ pixperbyte = 4;
1171
+ src += x / 4; //offset on line
1172
+ bit = (inT8) (x % 4); //offset in byte
1173
+ for (; height > 0; --height) {
1174
+ //get coded bits
1175
+ *dest++ = bpp2table[*src][bit];
1176
+ src -= xdim;
1177
+ }
1178
+ }
1179
+ else {
1180
+ pixperbyte = 8;
1181
+ src += x / 8; //offset on line
1182
+ bit = (inT8) (x % 8); //offset in byte
1183
+ for (; height > 0; --height) {
1184
+ //get coded bits
1185
+ *dest++ = bpp1table[*src][bit];
1186
+ src -= xdim;
1187
+ }
1188
+ }
1189
+ }
1190
+ for (pixel = margins * bytespp; pixel > 0; pixel--) {
1191
+ *dest++ = white; //margins are white
1192
+ }
1193
+ }
1194
+
1195
+
1196
+ /**********************************************************************
1197
+ * fast_put_line
1198
+ *
1199
+ * Put a line buffer back into the image.
1200
+ * If the line buffer merely points back into the image, nothing is done.
1201
+ * Otherwise, put_line is used to copy the line back.
1202
+ **********************************************************************/
1203
+
1204
+ void IMAGE::fast_put_line( //put image line
1205
+ inT32 x, //coord to start at
1206
+ inT32 y, //line to get
1207
+ inT32 width, //no of pixels to put
1208
+ IMAGELINE *linebuf //line to copy to
1209
+ ) {
1210
+ if (width > 0 && (bpp <= 4 || linebuf->pixels == linebuf->line))
1211
+ //just copy it
1212
+ put_line (x, y, width, linebuf, 0);
1213
+ }
1214
+
1215
+
1216
+ /**********************************************************************
1217
+ * put_line
1218
+ *
1219
+ * Put the supplied line buffer into the image.
1220
+ * The image is converted from 8bpp by simple assignment.
1221
+ **********************************************************************/
1222
+
1223
+ void IMAGE::put_line( //put image line
1224
+ inT32 x, //coord to start at
1225
+ inT32 y, //line to get
1226
+ inT32 width, //no of pixels to get
1227
+ IMAGELINE *linebuf, //line to copy to
1228
+ inT32 margins //margins in buffer
1229
+ ) {
1230
+ uinT8 *src; //source pointer
1231
+ uinT8 *dest; //destination pointer
1232
+ inT8 bit; //bit index
1233
+ uinT8 pixel; //collected bits
1234
+ inT8 pixperbyte; //pixels in a byte
1235
+ inT8 bytesperpix; //in source
1236
+
1237
+ this->check_legal_access (x, y, width);
1238
+ if (width > xsize - x)
1239
+ width = xsize - x; //clip to image
1240
+ if (width <= 0)
1241
+ return; //nothing to do
1242
+ //source line
1243
+ src = linebuf->pixels + margins;
1244
+ //start of line
1245
+ dest = image + xdim * (ymax - 1 - y);
1246
+
1247
+ if (linebuf->bpp == 24) {
1248
+ src++;
1249
+ bytesperpix = 3;
1250
+ }
1251
+ else
1252
+ bytesperpix = 1;
1253
+ if (bpp == 24 && linebuf->bpp == 24) {
1254
+ dest += x * bytespp;
1255
+ width *= bytespp;
1256
+ memmove (dest, src - 1, (unsigned) width);
1257
+ }
1258
+ else if (bpp == 24) {
1259
+ src--;
1260
+ dest += x * bytespp;
1261
+ while (width > 0) {
1262
+ pixel = *src++;
1263
+ *dest++ = pixel;
1264
+ *dest++ = pixel;
1265
+ *dest++ = pixel;
1266
+ width--;
1267
+ }
1268
+ }
1269
+ else if (bpp > 4) {
1270
+ dest += x; //offset
1271
+ if (linebuf->bpp == 24) {
1272
+ while (width > 0) {
1273
+ *dest++ = *src;
1274
+ src += 3;
1275
+ width--;
1276
+ }
1277
+ }
1278
+ else
1279
+ //easy way
1280
+ memmove (dest, src, (unsigned) width);
1281
+ }
1282
+ else if (bpp == 4) {
1283
+ dest += x / 2; //offset on line
1284
+ if (x & 1) {
1285
+ *dest &= 0xf0; //clean odd byte
1286
+ *dest++ |= *src & 0x0f; //and copy it
1287
+ src += bytesperpix;
1288
+ width--;
1289
+ }
1290
+ while (width >= 2) {
1291
+ pixel = *src << 4; //left pixel
1292
+ src += bytesperpix;
1293
+ pixel |= *src & 0x0f; //right pixel
1294
+ src += bytesperpix;
1295
+ *dest++ = pixel;
1296
+ width -= 2;
1297
+ }
1298
+ if (width) {
1299
+ *dest &= 0x0f; //clean odd byte
1300
+ *dest |= *src << 4;
1301
+ }
1302
+ }
1303
+ else if (bpp == 2) {
1304
+ pixperbyte = 4;
1305
+ dest += x / 4; //offset on line
1306
+ bit = (inT8) (x % 4); //offset in byte
1307
+ width += bit;
1308
+ pixel = *dest >> (8 - bit - bit);
1309
+ while (width >= 4) { //until all done
1310
+ for (; bit < 4; bit++) {
1311
+ pixel <<= 2; //make space for new one
1312
+ pixel |= *src & 3;
1313
+ src += bytesperpix;
1314
+ }
1315
+ *dest++ = pixel; //new pixel
1316
+ width -= 4;
1317
+ bit = 0;
1318
+ }
1319
+ if (width > 0) { //until all done
1320
+ for (bit = 0; bit < width; bit++) {
1321
+ pixel <<= 2; //make space for new one
1322
+ pixel |= *src & 3;
1323
+ src += bytesperpix;
1324
+ }
1325
+ pixel <<= (8 - bit - bit); //shift rest
1326
+ //keep trainling bits
1327
+ pixel |= *dest & ((1 << (8 - bit - bit)) - 1);
1328
+ *dest++ = pixel; //new pixel
1329
+ }
1330
+ }
1331
+ else {
1332
+ pixperbyte = 8;
1333
+ dest += x / 8; //offset on line
1334
+ bit = (inT8) (x % 8); //offset in byte
1335
+ width += bit;
1336
+ pixel = *dest >> (8 - bit);
1337
+ while (width >= 8) { //until all done
1338
+ for (; bit < 8; bit++) {
1339
+ pixel <<= 1; //make space for new one
1340
+ pixel |= *src & 1;
1341
+ src += bytesperpix;
1342
+ }
1343
+ *dest++ = pixel; //new pixel
1344
+ width -= 8;
1345
+ bit = 0;
1346
+ }
1347
+ width -= bit;
1348
+ if (width > 0) { //until all done
1349
+ while (width > 0) {
1350
+ pixel <<= 1; //make space for new one
1351
+ pixel |= *src & 1;
1352
+ src += bytesperpix;
1353
+ bit++;
1354
+ width--;
1355
+ }
1356
+ pixel <<= (8 - bit); //shift rest
1357
+ //keep trainling bits
1358
+ pixel |= *dest & ((1 << (8 - bit)) - 1);
1359
+ *dest++ = pixel; //new pixel
1360
+ }
1361
+ }
1362
+ }
1363
+
1364
+
1365
+ /**********************************************************************
1366
+ * put_column
1367
+ *
1368
+ * Put the supplied column buffer into the image.
1369
+ * The image is converted from 8bpp by simple assignment.
1370
+ **********************************************************************/
1371
+
1372
+ void IMAGE::put_column( //put image column
1373
+ inT32 x, //coord to start at
1374
+ inT32 y, //line to get
1375
+ inT32 height, //no of pixels to get
1376
+ IMAGELINE *linebuf, //line to copy to
1377
+ inT32 margins //margins in buffer
1378
+ ) {
1379
+ uinT8 *src; //source pointer
1380
+ uinT8 *dest; //destination pointer
1381
+ inT8 bit; //bit index
1382
+ uinT8 pixel; //collected bits
1383
+ inT8 bytesperpix; //in source
1384
+
1385
+ this->check_legal_access (x, y, 1);
1386
+ this->check_legal_access (x, y + height - 1, 1);
1387
+ if (height > ysize - y)
1388
+ height = ysize - y; //clip to image
1389
+ if (height <= 0)
1390
+ return; //nothing to do
1391
+ //source line
1392
+ src = linebuf->pixels + margins;
1393
+ //start of line
1394
+ dest = image + xdim * (ymax - 1 - y);
1395
+
1396
+ if (linebuf->bpp == 24) {
1397
+ src++;
1398
+ bytesperpix = 3;
1399
+ }
1400
+ else
1401
+ bytesperpix = 1;
1402
+
1403
+ if (bpp == 24 && linebuf->bpp == 24) {
1404
+ dest += x * bytesperpix;
1405
+ src--;
1406
+ for (; height > 0; --height) {
1407
+ *dest = *src++;
1408
+ *(dest + 1) = *src++;
1409
+ *(dest + 2) = *src++;
1410
+ dest -= xdim;
1411
+ }
1412
+ }
1413
+ else if (bpp == 24) {
1414
+ src--;
1415
+ dest += x * bytesperpix;
1416
+ for (; height > 0; --height) {
1417
+ pixel = *src++;
1418
+ *dest = pixel;
1419
+ *(dest + 1) = pixel;
1420
+ *(dest + 2) = pixel;
1421
+ dest -= xdim;
1422
+ }
1423
+ }
1424
+ else if (bpp > 4) {
1425
+ dest += x; //offset
1426
+ for (; height > 0; --height) {
1427
+ *dest = *src;
1428
+ src += bytesperpix;
1429
+ dest -= xdim;
1430
+ }
1431
+ }
1432
+ else if (bpp == 4) {
1433
+ dest += x / 2; //offset on line
1434
+ if (x & 1) {
1435
+ for (; height > 0; --height) {
1436
+ *dest &= 0xf0; //clean odd byte
1437
+ *dest |= *src & 0x0f; //and copy it
1438
+ src += bytesperpix;
1439
+ dest -= xdim;
1440
+ }
1441
+ }
1442
+ else {
1443
+ for (; height > 0; --height) {
1444
+ *dest &= 0x0f; //clean odd byte
1445
+ *dest |= *src << 4;
1446
+ src += bytesperpix;
1447
+ dest -= xdim;
1448
+ }
1449
+ }
1450
+ }
1451
+ else if (bpp == 2) {
1452
+ dest += x / 4; //offset on line
1453
+ bit = (inT8) (x % 4); //offset in byte
1454
+ bit = 6 - bit - bit; //bit shift
1455
+ pixel = ~(3 << bit); //mask
1456
+ for (; height > 0; --height) {
1457
+ //change 2 bits
1458
+ *dest = (*dest & pixel) | ((*src & 3) << bit);
1459
+ src += bytesperpix;
1460
+ dest -= xdim;
1461
+ }
1462
+ }
1463
+ else {
1464
+ dest += x / 8; //offset on line
1465
+ bit = (inT8) (x % 8); //offset in byte
1466
+ bit = 7 - bit;
1467
+ pixel = ~(1 << bit);
1468
+ for (; height > 0; --height) {
1469
+ //change 1 bit
1470
+ *dest = (*dest & pixel) | ((*src & 1) << bit);
1471
+ src += bytesperpix;
1472
+ dest -= xdim;
1473
+ }
1474
+ }
1475
+ }
1476
+
1477
+
1478
+ /**********************************************************************
1479
+ * check_legal_access
1480
+ *
1481
+ * Check that x,y are within the bounds of the image.
1482
+ * Call bufread if necessary to get the image into memory.
1483
+ **********************************************************************/
1484
+
1485
+ void IMAGE::check_legal_access( //check coords are legal
1486
+ inT32 x, //coords to check
1487
+ inT32 y,
1488
+ inT32 xext //xextent
1489
+ ) {
1490
+ if (x < 0 || x >= xsize || y < 0 || y >= ysize || x + xext > xsize)
1491
+ BADIMAGECOORDS.error ("IMAGE::check_legal_access",
1492
+ ABORT, "(%d+%d,%d)", x, xext, y);
1493
+ if (y >= ymax)
1494
+ BADIMAGESEEK.error ("IMAGE::check_legal_access", ABORT, "(%d,%d)", x, y);
1495
+ if (y < ymin)
1496
+ bufread(y); //read some more
1497
+ }
1498
+
1499
+ #ifdef HAVE_LIBLEPT
1500
+ // ONLY available if you have Leptonica installed.
1501
+ /**********************************************************************
1502
+ * ToPix
1503
+ *
1504
+ * Make a Pix from this image.
1505
+ **********************************************************************/
1506
+ Pix* IMAGE::ToPix() {
1507
+ int width = this->get_xsize();
1508
+ int height = this->get_ysize();
1509
+ int bpp = this->get_bpp();
1510
+ Pix* pix = pixCreate(width, height, bpp == 24 ? 32 : bpp);
1511
+ uint32* data = pixGetData(pix);
1512
+ IMAGELINE line;
1513
+ if (bpp == 24) {
1514
+ line.init(width * 3);
1515
+ line.set_bpp(24);
1516
+ } else {
1517
+ line.init(width);
1518
+ }
1519
+ switch (bpp) {
1520
+ case 1:
1521
+ for (int y = height - 1 ; y >= 0; --y) {
1522
+ this->get_line(0, y, width, &line, 0);
1523
+ for (int x = 0; x < width; ++x) {
1524
+ if (line.pixels[x])
1525
+ CLEAR_DATA_BIT(data, x);
1526
+ else
1527
+ SET_DATA_BIT(data, x);
1528
+ }
1529
+ data += pixGetWpl(pix);
1530
+ }
1531
+ break;
1532
+
1533
+ case 8:
1534
+ // Greyscale just copies the bytes in the right order.
1535
+ for (int y = height - 1 ; y >= 0; --y) {
1536
+ this->get_line(0, y, width, &line, 0);
1537
+ for (int x = 0; x < width; ++x)
1538
+ SET_DATA_BYTE(data, x, line.pixels[x]);
1539
+ data += pixGetWpl(pix);
1540
+ }
1541
+ break;
1542
+
1543
+ case 24:
1544
+ // Put the colors in the correct places in the line buffer.
1545
+ for (int y = height - 1 ; y >= 0; --y) {
1546
+ this->get_line(0, y, width, &line, 0);
1547
+ for (int x = 0; x < width; ++x, ++data) {
1548
+ SET_DATA_BYTE(data, COLOR_RED, line[x][RED_PIX]);
1549
+ SET_DATA_BYTE(data, COLOR_GREEN, line[x][GREEN_PIX]);
1550
+ SET_DATA_BYTE(data, COLOR_BLUE, line[x][BLUE_PIX]);
1551
+ }
1552
+ }
1553
+ break;
1554
+
1555
+ default:
1556
+ tprintf("Cannot convert image to Pix with bpp = %d\n", bpp);
1557
+ }
1558
+ return pix;
1559
+ }
1560
+
1561
+ /**********************************************************************
1562
+ * FromPix
1563
+ *
1564
+ * Copy from the given Pix into this image.
1565
+ **********************************************************************/
1566
+ void IMAGE::FromPix(const Pix* src_pix) {
1567
+ // Leptonica doesn't const its inputs, but we don't change the input.
1568
+ Pix* pix = const_cast<Pix*>(src_pix);
1569
+ Pix* destroy_this_pix = NULL;
1570
+
1571
+ int depth = pixGetDepth(pix);
1572
+ if (depth > 1 && depth < 8) {
1573
+ // Convert funny depths to 8 bit.
1574
+ destroy_this_pix = pixConvertTo8(pix, false);
1575
+ pix = destroy_this_pix;
1576
+ depth = pixGetDepth(pix);
1577
+ }
1578
+ int width = pixGetWidth(pix);
1579
+ int height = pixGetHeight(pix);
1580
+ const uint32* data = pixGetData(pix);
1581
+ this->create(width, height, depth == 32 ? 24 : depth);
1582
+ // For each line in the image, fill the IMAGELINE class and put it into the
1583
+ // destination image. Note that Tesseract stores images with the
1584
+ // bottom at y=0 and 0 is always black in grey and binary.
1585
+ IMAGELINE line;
1586
+ if (depth == 32) {
1587
+ line.init(width * 3);
1588
+ line.set_bpp(24);
1589
+ } else {
1590
+ line.init(width);
1591
+ }
1592
+ switch (depth) {
1593
+ case 1:
1594
+ // Binary images just flip the data bit.
1595
+ for (int y = height - 1 ; y >= 0; --y) {
1596
+ for (int x = 0; x < width; ++x)
1597
+ line.pixels[x] = GET_DATA_BIT(data, x) ^ 1;
1598
+ this->put_line(0, y, width, &line, 0);
1599
+ data += pixGetWpl(pix);
1600
+ }
1601
+ break;
1602
+
1603
+ case 8:
1604
+ // Greyscale just copies the bytes in the right order.
1605
+ for (int y = height - 1 ; y >= 0; --y) {
1606
+ for (int x = 0; x < width; ++x)
1607
+ line.pixels[x] = GET_DATA_BYTE(data, x);
1608
+ this->put_line(0, y, width, &line, 0);
1609
+ data += pixGetWpl(pix);
1610
+ }
1611
+ break;
1612
+
1613
+ case 32:
1614
+ // Put the colors in the correct places in the line buffer.
1615
+ for (int y = height - 1 ; y >= 0; --y) {
1616
+ for (int x = 0; x < width; ++x, ++data) {
1617
+ line[x][RED_PIX] = GET_DATA_BYTE(data, COLOR_RED);
1618
+ line[x][GREEN_PIX] = GET_DATA_BYTE(data, COLOR_GREEN);
1619
+ line[x][BLUE_PIX] = GET_DATA_BYTE(data, COLOR_BLUE);
1620
+ }
1621
+ this->put_line(0, y, width, &line, 0);
1622
+ }
1623
+ break;
1624
+
1625
+ default:
1626
+ tprintf("Cannot convert Pix to image with bpp = %d\n", depth);
1627
+ }
1628
+ if (destroy_this_pix != NULL)
1629
+ pixDestroy(&destroy_this_pix);
1630
+ }
1631
+ #endif // HAVE_LIBLEPT
1632
+
1633
+ /*************************************************************************
1634
+ * convolver()
1635
+ *
1636
+ * Calls the specified function for each pixel in the image, passing in an m x n
1637
+ * window of the image, centred on the pixel. The convolution function returns
1638
+ * a new value for the pixel, based on the window.
1639
+ *
1640
+ * At the edges of the image, the window is padded to white pixels.
1641
+ *************************************************************************/
1642
+
1643
+ void
1644
+ IMAGE::convolver ( //Map fn over window
1645
+ inT32 win_width, //Window width
1646
+ inT32 win_height, //Window height
1647
+ void (*convolve) ( //Conv Function
1648
+ uinT8 ** pixels, //Of window
1649
+ uinT8 bytespp, //1 or 3 for colour
1650
+ inT32 win_wd, //Window width
1651
+ inT32 win_ht, //Window height
1652
+ uinT8 ret_white_value, //White value to RETURN
1653
+ uinT8 * result) //Ptr to result pix
1654
+ ) {
1655
+ IMAGELINE new_row; //Replacement pixels
1656
+ IMAGELINE *old_rows; //Rows being processed
1657
+ inT32 oldest_imline; //Next imline to replace
1658
+ uinT8 **window; //ptrs to pixel rows
1659
+ uinT8 **winmax; //ptrs to pixel rows
1660
+ uinT8 **win; //ptrs to pixel rows
1661
+ inT32 current_row; //Row being calculated
1662
+ inT32 current_col; //Col being calculated
1663
+ inT32 row = 0; //Next row to get
1664
+
1665
+ inT32 i, j;
1666
+ uinT8 *pix;
1667
+ uinT8 *max;
1668
+ inT32 xmargin = win_width / 2;
1669
+ inT32 ymargin = win_height / 2;
1670
+ uinT8 white = get_white_level ();
1671
+ const uinT8 max_white = 255;
1672
+ float white_scale = (float) 255 / get_white_level ();
1673
+
1674
+ if (((win_width % 2) == 0) ||
1675
+ ((win_height % 2) == 0) ||
1676
+ (win_height < 3) ||
1677
+ (win_width < 3) || (win_height > ysize / 2) || (win_width > xsize / 2))
1678
+ BADWINDOW.error ("IMAGE::convolver",
1679
+ ABORT, "(%d x %d)", win_width, win_height);
1680
+
1681
+ new_row.init (xsize * bytespp);
1682
+ new_row.set_bpp (bpp);
1683
+ old_rows = new IMAGELINE[win_height];
1684
+ for (i = 0; i < win_height; i++) {
1685
+ old_rows[i].init ((xsize + 2 * xmargin) * bytespp);
1686
+ old_rows[i].set_bpp (bpp);
1687
+ }
1688
+
1689
+ window = (uinT8 **) alloc_mem (win_height * sizeof (uinT8 *));
1690
+ winmax = window + win_height;
1691
+
1692
+ /* Make bottom border */
1693
+ for (oldest_imline = 0; oldest_imline < ymargin; oldest_imline++) {
1694
+ pix = old_rows[oldest_imline].pixels;
1695
+ max = pix + (xsize + 2 * xmargin) * bytespp;
1696
+ while (pix < max)
1697
+ *pix++ = max_white;
1698
+ }
1699
+ /* Initialise remaining rows but one*/
1700
+ for (; oldest_imline < win_height - 1; oldest_imline++) {
1701
+ get_line (0, row++, xsize, &old_rows[oldest_imline], xmargin);
1702
+ if (max_white != white) {
1703
+ pix = old_rows[oldest_imline].pixels;
1704
+ max = pix + (xsize + 2 * xmargin) * bytespp;
1705
+ while (pix < max) {
1706
+ *pix = (uinT8) (*pix * white_scale);
1707
+ ++pix;
1708
+ }
1709
+ }
1710
+ }
1711
+
1712
+ /* Image Processing */
1713
+
1714
+ for (current_row = 0; current_row < ysize;) {
1715
+ /* Get next row and re-initialise window array */
1716
+ if (row < ysize) {
1717
+ get_line (0, row++, xsize, &old_rows[oldest_imline], xmargin);
1718
+ if (max_white != white) {
1719
+ pix = old_rows[oldest_imline].pixels;
1720
+ max = pix + (xsize + 2 * xmargin) * bytespp;
1721
+ while (pix < max) {
1722
+ *pix = (uinT8) (*pix * white_scale);
1723
+ ++pix;
1724
+ }
1725
+ }
1726
+ }
1727
+ else {
1728
+ pix = old_rows[oldest_imline].pixels;
1729
+ max = pix + (xsize + 2 * xmargin) * bytespp;
1730
+ while (pix < max)
1731
+ *pix++ = max_white;
1732
+ }
1733
+ oldest_imline++;
1734
+ if (oldest_imline >= win_height)
1735
+ oldest_imline = 0;
1736
+
1737
+ /* Process line */
1738
+ pix = new_row.pixels;
1739
+ for (current_col = 0; current_col < xsize;) {
1740
+ /* Set up window ptrs */
1741
+ if (current_col == 0) {
1742
+ j = oldest_imline;
1743
+ for (i = 0; i < win_height; i++) {
1744
+ window[i] = old_rows[j++].pixels;
1745
+ if (j >= win_height)
1746
+ j = 0;
1747
+ }
1748
+ }
1749
+ else {
1750
+ for (win = window; win < winmax; (*win++) += bytespp);
1751
+ //Move along rows
1752
+ }
1753
+
1754
+ convolve(window, bytespp, win_width, win_height, white, pix);
1755
+ pix += bytespp;
1756
+ current_col++;
1757
+ }
1758
+
1759
+ put_line (0, current_row, xsize, &new_row, 0);
1760
+ new_row.init ();
1761
+ new_row.set_bpp (bpp);
1762
+ current_row++;
1763
+ }
1764
+ }