tesseract_bin 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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
+ }