tesseract_bin 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +5 -0
- data/Gemfile +14 -0
- data/Gemfile.lock +23 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +19 -0
- data/Rakefile +46 -0
- data/VERSION +1 -0
- data/ext/tesseract_bin/extconf.rb +17 -0
- data/lib/tesseract_bin.rb +12 -0
- data/tesseract_bin.gemspec +660 -0
- data/test/helper.rb +18 -0
- data/test/test_tesseract_bin.rb +7 -0
- data/vendor/tesseract-2.04/AUTHORS +8 -0
- data/vendor/tesseract-2.04/COPYING +23 -0
- data/vendor/tesseract-2.04/ChangeLog +71 -0
- data/vendor/tesseract-2.04/INSTALL +229 -0
- data/vendor/tesseract-2.04/Makefile.am +20 -0
- data/vendor/tesseract-2.04/Makefile.in +641 -0
- data/vendor/tesseract-2.04/NEWS +1 -0
- data/vendor/tesseract-2.04/README +138 -0
- data/vendor/tesseract-2.04/ReleaseNotes +213 -0
- data/vendor/tesseract-2.04/StdAfx.cpp +8 -0
- data/vendor/tesseract-2.04/StdAfx.h +24 -0
- data/vendor/tesseract-2.04/ccmain/Makefile.am +63 -0
- data/vendor/tesseract-2.04/ccmain/Makefile.in +735 -0
- data/vendor/tesseract-2.04/ccmain/adaptions.cpp +1082 -0
- data/vendor/tesseract-2.04/ccmain/adaptions.h +109 -0
- data/vendor/tesseract-2.04/ccmain/applybox.cpp +891 -0
- data/vendor/tesseract-2.04/ccmain/applybox.h +73 -0
- data/vendor/tesseract-2.04/ccmain/baseapi.cpp +1105 -0
- data/vendor/tesseract-2.04/ccmain/baseapi.h +256 -0
- data/vendor/tesseract-2.04/ccmain/blobcmp.cpp +76 -0
- data/vendor/tesseract-2.04/ccmain/blobcmp.h +29 -0
- data/vendor/tesseract-2.04/ccmain/callnet.cpp +93 -0
- data/vendor/tesseract-2.04/ccmain/callnet.h +32 -0
- data/vendor/tesseract-2.04/ccmain/charcut.cpp +704 -0
- data/vendor/tesseract-2.04/ccmain/charcut.h +120 -0
- data/vendor/tesseract-2.04/ccmain/charsample.cpp +699 -0
- data/vendor/tesseract-2.04/ccmain/control.cpp +1842 -0
- data/vendor/tesseract-2.04/ccmain/control.h +198 -0
- data/vendor/tesseract-2.04/ccmain/docqual.cpp +1481 -0
- data/vendor/tesseract-2.04/ccmain/docqual.h +155 -0
- data/vendor/tesseract-2.04/ccmain/expandblob.cpp +82 -0
- data/vendor/tesseract-2.04/ccmain/expandblob.h +13 -0
- data/vendor/tesseract-2.04/ccmain/fixspace.cpp +989 -0
- data/vendor/tesseract-2.04/ccmain/fixspace.h +72 -0
- data/vendor/tesseract-2.04/ccmain/fixxht.cpp +825 -0
- data/vendor/tesseract-2.04/ccmain/fixxht.h +93 -0
- data/vendor/tesseract-2.04/ccmain/imgscale.cpp +154 -0
- data/vendor/tesseract-2.04/ccmain/imgscale.h +32 -0
- data/vendor/tesseract-2.04/ccmain/matmatch.cpp +391 -0
- data/vendor/tesseract-2.04/ccmain/matmatch.h +48 -0
- data/vendor/tesseract-2.04/ccmain/output.cpp +1273 -0
- data/vendor/tesseract-2.04/ccmain/output.h +116 -0
- data/vendor/tesseract-2.04/ccmain/pagewalk.cpp +666 -0
- data/vendor/tesseract-2.04/ccmain/pagewalk.h +155 -0
- data/vendor/tesseract-2.04/ccmain/paircmp.cpp +107 -0
- data/vendor/tesseract-2.04/ccmain/paircmp.h +43 -0
- data/vendor/tesseract-2.04/ccmain/pgedit.cpp +1867 -0
- data/vendor/tesseract-2.04/ccmain/pgedit.h +181 -0
- data/vendor/tesseract-2.04/ccmain/reject.cpp +1775 -0
- data/vendor/tesseract-2.04/ccmain/reject.h +181 -0
- data/vendor/tesseract-2.04/ccmain/scaleimg.cpp +366 -0
- data/vendor/tesseract-2.04/ccmain/scaleimg.h +35 -0
- data/vendor/tesseract-2.04/ccmain/tessbox.cpp +375 -0
- data/vendor/tesseract-2.04/ccmain/tessbox.h +110 -0
- data/vendor/tesseract-2.04/ccmain/tessedit.cpp +278 -0
- data/vendor/tesseract-2.04/ccmain/tessedit.h +49 -0
- data/vendor/tesseract-2.04/ccmain/tessembedded.cpp +110 -0
- data/vendor/tesseract-2.04/ccmain/tessembedded.h +38 -0
- data/vendor/tesseract-2.04/ccmain/tesseractfull.cc +37 -0
- data/vendor/tesseract-2.04/ccmain/tesseractmain.cpp +387 -0
- data/vendor/tesseract-2.04/ccmain/tesseractmain.h +58 -0
- data/vendor/tesseract-2.04/ccmain/tessio.h +110 -0
- data/vendor/tesseract-2.04/ccmain/tessvars.cpp +38 -0
- data/vendor/tesseract-2.04/ccmain/tessvars.h +48 -0
- data/vendor/tesseract-2.04/ccmain/tfacep.h +62 -0
- data/vendor/tesseract-2.04/ccmain/tfacepp.cpp +443 -0
- data/vendor/tesseract-2.04/ccmain/tfacepp.h +85 -0
- data/vendor/tesseract-2.04/ccmain/tstruct.cpp +549 -0
- data/vendor/tesseract-2.04/ccmain/tstruct.h +108 -0
- data/vendor/tesseract-2.04/ccmain/varabled.cpp +346 -0
- data/vendor/tesseract-2.04/ccmain/varabled.h +125 -0
- data/vendor/tesseract-2.04/ccmain/werdit.cpp +193 -0
- data/vendor/tesseract-2.04/ccmain/werdit.h +67 -0
- data/vendor/tesseract-2.04/ccstruct/Makefile.am +25 -0
- data/vendor/tesseract-2.04/ccstruct/Makefile.in +650 -0
- data/vendor/tesseract-2.04/ccstruct/blckerr.h +29 -0
- data/vendor/tesseract-2.04/ccstruct/blobbox.cpp +778 -0
- data/vendor/tesseract-2.04/ccstruct/blobbox.h +381 -0
- data/vendor/tesseract-2.04/ccstruct/blobs.cpp +247 -0
- data/vendor/tesseract-2.04/ccstruct/blobs.h +119 -0
- data/vendor/tesseract-2.04/ccstruct/blread.cpp +537 -0
- data/vendor/tesseract-2.04/ccstruct/blread.h +63 -0
- data/vendor/tesseract-2.04/ccstruct/callcpp.cpp +252 -0
- data/vendor/tesseract-2.04/ccstruct/coutln.cpp +650 -0
- data/vendor/tesseract-2.04/ccstruct/coutln.h +186 -0
- data/vendor/tesseract-2.04/ccstruct/crakedge.h +39 -0
- data/vendor/tesseract-2.04/ccstruct/genblob.cpp +133 -0
- data/vendor/tesseract-2.04/ccstruct/genblob.h +52 -0
- data/vendor/tesseract-2.04/ccstruct/hpddef.h +39 -0
- data/vendor/tesseract-2.04/ccstruct/hpdsizes.h +8 -0
- data/vendor/tesseract-2.04/ccstruct/ipoints.h +479 -0
- data/vendor/tesseract-2.04/ccstruct/labls.cpp +188 -0
- data/vendor/tesseract-2.04/ccstruct/labls.h +38 -0
- data/vendor/tesseract-2.04/ccstruct/linlsq.cpp +249 -0
- data/vendor/tesseract-2.04/ccstruct/linlsq.h +102 -0
- data/vendor/tesseract-2.04/ccstruct/lmedsq.cpp +453 -0
- data/vendor/tesseract-2.04/ccstruct/lmedsq.h +84 -0
- data/vendor/tesseract-2.04/ccstruct/mod128.cpp +100 -0
- data/vendor/tesseract-2.04/ccstruct/mod128.h +85 -0
- data/vendor/tesseract-2.04/ccstruct/normalis.cpp +176 -0
- data/vendor/tesseract-2.04/ccstruct/normalis.h +108 -0
- data/vendor/tesseract-2.04/ccstruct/ocrblock.cpp +369 -0
- data/vendor/tesseract-2.04/ccstruct/ocrblock.h +235 -0
- data/vendor/tesseract-2.04/ccstruct/ocrrow.cpp +216 -0
- data/vendor/tesseract-2.04/ccstruct/ocrrow.h +133 -0
- data/vendor/tesseract-2.04/ccstruct/pageblk.cpp +879 -0
- data/vendor/tesseract-2.04/ccstruct/pageblk.h +318 -0
- data/vendor/tesseract-2.04/ccstruct/pageres.cpp +330 -0
- data/vendor/tesseract-2.04/ccstruct/pageres.h +313 -0
- data/vendor/tesseract-2.04/ccstruct/pdblock.cpp +361 -0
- data/vendor/tesseract-2.04/ccstruct/pdblock.h +181 -0
- data/vendor/tesseract-2.04/ccstruct/pdclass.h +54 -0
- data/vendor/tesseract-2.04/ccstruct/points.cpp +102 -0
- data/vendor/tesseract-2.04/ccstruct/points.h +299 -0
- data/vendor/tesseract-2.04/ccstruct/polyaprx.cpp +588 -0
- data/vendor/tesseract-2.04/ccstruct/polyaprx.h +51 -0
- data/vendor/tesseract-2.04/ccstruct/polyblk.cpp +398 -0
- data/vendor/tesseract-2.04/ccstruct/polyblk.h +122 -0
- data/vendor/tesseract-2.04/ccstruct/polyblob.cpp +357 -0
- data/vendor/tesseract-2.04/ccstruct/polyblob.h +102 -0
- data/vendor/tesseract-2.04/ccstruct/polyvert.cpp +23 -0
- data/vendor/tesseract-2.04/ccstruct/polyvert.h +58 -0
- data/vendor/tesseract-2.04/ccstruct/poutline.cpp +441 -0
- data/vendor/tesseract-2.04/ccstruct/poutline.h +125 -0
- data/vendor/tesseract-2.04/ccstruct/quadlsq.cpp +147 -0
- data/vendor/tesseract-2.04/ccstruct/quadlsq.h +67 -0
- data/vendor/tesseract-2.04/ccstruct/quadratc.cpp +21 -0
- data/vendor/tesseract-2.04/ccstruct/quadratc.h +63 -0
- data/vendor/tesseract-2.04/ccstruct/quspline.cpp +382 -0
- data/vendor/tesseract-2.04/ccstruct/quspline.h +113 -0
- data/vendor/tesseract-2.04/ccstruct/ratngs.cpp +372 -0
- data/vendor/tesseract-2.04/ccstruct/ratngs.h +198 -0
- data/vendor/tesseract-2.04/ccstruct/rect.cpp +229 -0
- data/vendor/tesseract-2.04/ccstruct/rect.h +320 -0
- data/vendor/tesseract-2.04/ccstruct/rejctmap.cpp +545 -0
- data/vendor/tesseract-2.04/ccstruct/rejctmap.h +284 -0
- data/vendor/tesseract-2.04/ccstruct/rwpoly.cpp +89 -0
- data/vendor/tesseract-2.04/ccstruct/rwpoly.h +45 -0
- data/vendor/tesseract-2.04/ccstruct/statistc.cpp +905 -0
- data/vendor/tesseract-2.04/ccstruct/statistc.h +135 -0
- data/vendor/tesseract-2.04/ccstruct/stepblob.cpp +296 -0
- data/vendor/tesseract-2.04/ccstruct/stepblob.h +88 -0
- data/vendor/tesseract-2.04/ccstruct/txtregn.cpp +230 -0
- data/vendor/tesseract-2.04/ccstruct/txtregn.h +155 -0
- data/vendor/tesseract-2.04/ccstruct/vecfuncs.cpp +63 -0
- data/vendor/tesseract-2.04/ccstruct/vecfuncs.h +91 -0
- data/vendor/tesseract-2.04/ccstruct/werd.cpp +967 -0
- data/vendor/tesseract-2.04/ccstruct/werd.h +277 -0
- data/vendor/tesseract-2.04/ccutil/Makefile.am +19 -0
- data/vendor/tesseract-2.04/ccutil/Makefile.in +626 -0
- data/vendor/tesseract-2.04/ccutil/basedir.cpp +118 -0
- data/vendor/tesseract-2.04/ccutil/basedir.h +32 -0
- data/vendor/tesseract-2.04/ccutil/bits16.cpp +30 -0
- data/vendor/tesseract-2.04/ccutil/bits16.h +61 -0
- data/vendor/tesseract-2.04/ccutil/boxread.cpp +105 -0
- data/vendor/tesseract-2.04/ccutil/boxread.h +44 -0
- data/vendor/tesseract-2.04/ccutil/clst.cpp +626 -0
- data/vendor/tesseract-2.04/ccutil/clst.h +1085 -0
- data/vendor/tesseract-2.04/ccutil/debugwin.cpp +500 -0
- data/vendor/tesseract-2.04/ccutil/debugwin.h +103 -0
- data/vendor/tesseract-2.04/ccutil/elst.cpp +593 -0
- data/vendor/tesseract-2.04/ccutil/elst.h +1125 -0
- data/vendor/tesseract-2.04/ccutil/elst2.cpp +606 -0
- data/vendor/tesseract-2.04/ccutil/elst2.h +1121 -0
- data/vendor/tesseract-2.04/ccutil/errcode.cpp +104 -0
- data/vendor/tesseract-2.04/ccutil/errcode.h +104 -0
- data/vendor/tesseract-2.04/ccutil/fileerr.h +34 -0
- data/vendor/tesseract-2.04/ccutil/globaloc.cpp +115 -0
- data/vendor/tesseract-2.04/ccutil/globaloc.h +40 -0
- data/vendor/tesseract-2.04/ccutil/hashfn.cpp +57 -0
- data/vendor/tesseract-2.04/ccutil/hashfn.h +30 -0
- data/vendor/tesseract-2.04/ccutil/host.h +180 -0
- data/vendor/tesseract-2.04/ccutil/hosthplb.h +1 -0
- data/vendor/tesseract-2.04/ccutil/lsterr.h +43 -0
- data/vendor/tesseract-2.04/ccutil/mainblk.cpp +126 -0
- data/vendor/tesseract-2.04/ccutil/mainblk.h +39 -0
- data/vendor/tesseract-2.04/ccutil/memblk.cpp +1106 -0
- data/vendor/tesseract-2.04/ccutil/memblk.h +189 -0
- data/vendor/tesseract-2.04/ccutil/memry.cpp +532 -0
- data/vendor/tesseract-2.04/ccutil/memry.h +192 -0
- data/vendor/tesseract-2.04/ccutil/memryerr.h +38 -0
- data/vendor/tesseract-2.04/ccutil/mfcpch.cpp +5 -0
- data/vendor/tesseract-2.04/ccutil/mfcpch.h +37 -0
- data/vendor/tesseract-2.04/ccutil/ndminx.h +31 -0
- data/vendor/tesseract-2.04/ccutil/notdll.h +28 -0
- data/vendor/tesseract-2.04/ccutil/nwmain.h +176 -0
- data/vendor/tesseract-2.04/ccutil/ocrclass.h +345 -0
- data/vendor/tesseract-2.04/ccutil/ocrshell.cpp +772 -0
- data/vendor/tesseract-2.04/ccutil/ocrshell.h +191 -0
- data/vendor/tesseract-2.04/ccutil/platform.h +18 -0
- data/vendor/tesseract-2.04/ccutil/scanutils.cpp +543 -0
- data/vendor/tesseract-2.04/ccutil/scanutils.h +55 -0
- data/vendor/tesseract-2.04/ccutil/secname.h +9 -0
- data/vendor/tesseract-2.04/ccutil/serialis.cpp +117 -0
- data/vendor/tesseract-2.04/ccutil/serialis.h +93 -0
- data/vendor/tesseract-2.04/ccutil/stderr.h +26 -0
- data/vendor/tesseract-2.04/ccutil/strngs.cpp +495 -0
- data/vendor/tesseract-2.04/ccutil/strngs.h +138 -0
- data/vendor/tesseract-2.04/ccutil/tessclas.h +135 -0
- data/vendor/tesseract-2.04/ccutil/tessopt.cpp +61 -0
- data/vendor/tesseract-2.04/ccutil/tessopt.h +30 -0
- data/vendor/tesseract-2.04/ccutil/tprintf.cpp +122 -0
- data/vendor/tesseract-2.04/ccutil/tprintf.h +35 -0
- data/vendor/tesseract-2.04/ccutil/unichar.cpp +144 -0
- data/vendor/tesseract-2.04/ccutil/unichar.h +84 -0
- data/vendor/tesseract-2.04/ccutil/unicharmap.cpp +172 -0
- data/vendor/tesseract-2.04/ccutil/unicharmap.h +82 -0
- data/vendor/tesseract-2.04/ccutil/unicharset.cpp +307 -0
- data/vendor/tesseract-2.04/ccutil/unicharset.h +267 -0
- data/vendor/tesseract-2.04/ccutil/varable.cpp +672 -0
- data/vendor/tesseract-2.04/ccutil/varable.h +419 -0
- data/vendor/tesseract-2.04/classify/Makefile.am +24 -0
- data/vendor/tesseract-2.04/classify/Makefile.in +647 -0
- data/vendor/tesseract-2.04/classify/adaptive.cpp +535 -0
- data/vendor/tesseract-2.04/classify/adaptive.h +199 -0
- data/vendor/tesseract-2.04/classify/adaptmatch.cpp +2958 -0
- data/vendor/tesseract-2.04/classify/adaptmatch.h +86 -0
- data/vendor/tesseract-2.04/classify/baseline.cpp +58 -0
- data/vendor/tesseract-2.04/classify/baseline.h +91 -0
- data/vendor/tesseract-2.04/classify/blobclass.cpp +123 -0
- data/vendor/tesseract-2.04/classify/blobclass.h +49 -0
- data/vendor/tesseract-2.04/classify/chartoname.cpp +74 -0
- data/vendor/tesseract-2.04/classify/chartoname.h +21 -0
- data/vendor/tesseract-2.04/classify/cluster.cpp +2834 -0
- data/vendor/tesseract-2.04/classify/cluster.h +158 -0
- data/vendor/tesseract-2.04/classify/clusttool.cpp +507 -0
- data/vendor/tesseract-2.04/classify/clusttool.h +70 -0
- data/vendor/tesseract-2.04/classify/cutoffs.cpp +73 -0
- data/vendor/tesseract-2.04/classify/cutoffs.h +49 -0
- data/vendor/tesseract-2.04/classify/extern.h +32 -0
- data/vendor/tesseract-2.04/classify/extract.cpp +100 -0
- data/vendor/tesseract-2.04/classify/extract.h +36 -0
- data/vendor/tesseract-2.04/classify/featdefs.cpp +244 -0
- data/vendor/tesseract-2.04/classify/featdefs.h +71 -0
- data/vendor/tesseract-2.04/classify/flexfx.cpp +87 -0
- data/vendor/tesseract-2.04/classify/flexfx.h +34 -0
- data/vendor/tesseract-2.04/classify/float2int.cpp +126 -0
- data/vendor/tesseract-2.04/classify/float2int.h +65 -0
- data/vendor/tesseract-2.04/classify/fpoint.cpp +73 -0
- data/vendor/tesseract-2.04/classify/fpoint.h +63 -0
- data/vendor/tesseract-2.04/classify/fxdefs.cpp +74 -0
- data/vendor/tesseract-2.04/classify/fxdefs.h +93 -0
- data/vendor/tesseract-2.04/classify/fxid.h +69 -0
- data/vendor/tesseract-2.04/classify/hideedge.cpp +35 -0
- data/vendor/tesseract-2.04/classify/hideedge.h +76 -0
- data/vendor/tesseract-2.04/classify/intfx.cpp +608 -0
- data/vendor/tesseract-2.04/classify/intfx.h +63 -0
- data/vendor/tesseract-2.04/classify/intmatcher.cpp +1524 -0
- data/vendor/tesseract-2.04/classify/intmatcher.h +199 -0
- data/vendor/tesseract-2.04/classify/intproto.cpp +1823 -0
- data/vendor/tesseract-2.04/classify/intproto.h +320 -0
- data/vendor/tesseract-2.04/classify/kdtree.cpp +884 -0
- data/vendor/tesseract-2.04/classify/kdtree.h +118 -0
- data/vendor/tesseract-2.04/classify/mf.cpp +106 -0
- data/vendor/tesseract-2.04/classify/mf.h +43 -0
- data/vendor/tesseract-2.04/classify/mfdefs.cpp +58 -0
- data/vendor/tesseract-2.04/classify/mfdefs.h +60 -0
- data/vendor/tesseract-2.04/classify/mfoutline.cpp +1087 -0
- data/vendor/tesseract-2.04/classify/mfoutline.h +277 -0
- data/vendor/tesseract-2.04/classify/mfx.cpp +436 -0
- data/vendor/tesseract-2.04/classify/mfx.h +52 -0
- data/vendor/tesseract-2.04/classify/normfeat.cpp +132 -0
- data/vendor/tesseract-2.04/classify/normfeat.h +63 -0
- data/vendor/tesseract-2.04/classify/normmatch.cpp +305 -0
- data/vendor/tesseract-2.04/classify/normmatch.h +38 -0
- data/vendor/tesseract-2.04/classify/ocrfeatures.cpp +310 -0
- data/vendor/tesseract-2.04/classify/ocrfeatures.h +148 -0
- data/vendor/tesseract-2.04/classify/outfeat.cpp +262 -0
- data/vendor/tesseract-2.04/classify/outfeat.h +76 -0
- data/vendor/tesseract-2.04/classify/picofeat.cpp +297 -0
- data/vendor/tesseract-2.04/classify/picofeat.h +65 -0
- data/vendor/tesseract-2.04/classify/protos.cpp +472 -0
- data/vendor/tesseract-2.04/classify/protos.h +258 -0
- data/vendor/tesseract-2.04/classify/sigmenu.cpp +225 -0
- data/vendor/tesseract-2.04/classify/sigmenu.h +39 -0
- data/vendor/tesseract-2.04/classify/speckle.cpp +127 -0
- data/vendor/tesseract-2.04/classify/speckle.h +69 -0
- data/vendor/tesseract-2.04/classify/xform2d.cpp +120 -0
- data/vendor/tesseract-2.04/classify/xform2d.h +60 -0
- data/vendor/tesseract-2.04/config/config.guess +1466 -0
- data/vendor/tesseract-2.04/config/config.h.in +188 -0
- data/vendor/tesseract-2.04/config/config.sub +1579 -0
- data/vendor/tesseract-2.04/config/depcomp +530 -0
- data/vendor/tesseract-2.04/config/install-sh +269 -0
- data/vendor/tesseract-2.04/config/missing +198 -0
- data/vendor/tesseract-2.04/config/mkinstalldirs +40 -0
- data/vendor/tesseract-2.04/config/stamp-h.in +0 -0
- data/vendor/tesseract-2.04/configure +10424 -0
- data/vendor/tesseract-2.04/cutil/Makefile.am +14 -0
- data/vendor/tesseract-2.04/cutil/Makefile.in +612 -0
- data/vendor/tesseract-2.04/cutil/bitvec.cpp +115 -0
- data/vendor/tesseract-2.04/cutil/bitvec.h +100 -0
- data/vendor/tesseract-2.04/cutil/callcpp.h +190 -0
- data/vendor/tesseract-2.04/cutil/const.h +108 -0
- data/vendor/tesseract-2.04/cutil/cutil.cpp +92 -0
- data/vendor/tesseract-2.04/cutil/cutil.h +159 -0
- data/vendor/tesseract-2.04/cutil/danerror.cpp +144 -0
- data/vendor/tesseract-2.04/cutil/danerror.h +41 -0
- data/vendor/tesseract-2.04/cutil/debug.cpp +97 -0
- data/vendor/tesseract-2.04/cutil/debug.h +348 -0
- data/vendor/tesseract-2.04/cutil/efio.cpp +62 -0
- data/vendor/tesseract-2.04/cutil/efio.h +32 -0
- data/vendor/tesseract-2.04/cutil/emalloc.cpp +91 -0
- data/vendor/tesseract-2.04/cutil/emalloc.h +44 -0
- data/vendor/tesseract-2.04/cutil/freelist.cpp +75 -0
- data/vendor/tesseract-2.04/cutil/freelist.h +45 -0
- data/vendor/tesseract-2.04/cutil/funcdefs.h +35 -0
- data/vendor/tesseract-2.04/cutil/general.h +33 -0
- data/vendor/tesseract-2.04/cutil/globals.cpp +69 -0
- data/vendor/tesseract-2.04/cutil/globals.h +70 -0
- data/vendor/tesseract-2.04/cutil/listio.cpp +68 -0
- data/vendor/tesseract-2.04/cutil/listio.h +43 -0
- data/vendor/tesseract-2.04/cutil/minmax.h +40 -0
- data/vendor/tesseract-2.04/cutil/oldheap.cpp +337 -0
- data/vendor/tesseract-2.04/cutil/oldheap.h +126 -0
- data/vendor/tesseract-2.04/cutil/oldlist.cpp +393 -0
- data/vendor/tesseract-2.04/cutil/oldlist.h +350 -0
- data/vendor/tesseract-2.04/cutil/structures.cpp +66 -0
- data/vendor/tesseract-2.04/cutil/structures.h +112 -0
- data/vendor/tesseract-2.04/cutil/tessarray.cpp +115 -0
- data/vendor/tesseract-2.04/cutil/tessarray.h +166 -0
- data/vendor/tesseract-2.04/cutil/tordvars.cpp +95 -0
- data/vendor/tesseract-2.04/cutil/tordvars.h +61 -0
- data/vendor/tesseract-2.04/cutil/variables.cpp +317 -0
- data/vendor/tesseract-2.04/cutil/variables.h +170 -0
- data/vendor/tesseract-2.04/dict/Makefile.am +13 -0
- data/vendor/tesseract-2.04/dict/Makefile.in +609 -0
- data/vendor/tesseract-2.04/dict/choicearr.h +96 -0
- data/vendor/tesseract-2.04/dict/choices.cpp +210 -0
- data/vendor/tesseract-2.04/dict/choices.h +241 -0
- data/vendor/tesseract-2.04/dict/context.cpp +270 -0
- data/vendor/tesseract-2.04/dict/context.h +82 -0
- data/vendor/tesseract-2.04/dict/dawg.cpp +363 -0
- data/vendor/tesseract-2.04/dict/dawg.h +394 -0
- data/vendor/tesseract-2.04/dict/hyphen.cpp +84 -0
- data/vendor/tesseract-2.04/dict/hyphen.h +125 -0
- data/vendor/tesseract-2.04/dict/lookdawg.cpp +228 -0
- data/vendor/tesseract-2.04/dict/lookdawg.h +76 -0
- data/vendor/tesseract-2.04/dict/makedawg.cpp +449 -0
- data/vendor/tesseract-2.04/dict/makedawg.h +83 -0
- data/vendor/tesseract-2.04/dict/matchdefs.h +145 -0
- data/vendor/tesseract-2.04/dict/permdawg.cpp +415 -0
- data/vendor/tesseract-2.04/dict/permdawg.h +98 -0
- data/vendor/tesseract-2.04/dict/permngram.cpp +358 -0
- data/vendor/tesseract-2.04/dict/permngram.h +33 -0
- data/vendor/tesseract-2.04/dict/permnum.cpp +522 -0
- data/vendor/tesseract-2.04/dict/permnum.h +83 -0
- data/vendor/tesseract-2.04/dict/permute.cpp +1704 -0
- data/vendor/tesseract-2.04/dict/permute.h +93 -0
- data/vendor/tesseract-2.04/dict/reduce.cpp +424 -0
- data/vendor/tesseract-2.04/dict/reduce.h +112 -0
- data/vendor/tesseract-2.04/dict/states.cpp +382 -0
- data/vendor/tesseract-2.04/dict/states.h +111 -0
- data/vendor/tesseract-2.04/dict/stopper.cpp +1458 -0
- data/vendor/tesseract-2.04/dict/stopper.h +103 -0
- data/vendor/tesseract-2.04/dict/trie.cpp +683 -0
- data/vendor/tesseract-2.04/dict/trie.h +190 -0
- data/vendor/tesseract-2.04/dlltest/Makefile.am +2 -0
- data/vendor/tesseract-2.04/dlltest/Makefile.in +388 -0
- data/vendor/tesseract-2.04/dlltest/dlltest.cpp +163 -0
- data/vendor/tesseract-2.04/dlltest/dlltest.dsp +186 -0
- data/vendor/tesseract-2.04/dlltest/dlltest.vcproj +637 -0
- data/vendor/tesseract-2.04/eurotext.tif +0 -0
- data/vendor/tesseract-2.04/image/Makefile.am +10 -0
- data/vendor/tesseract-2.04/image/Makefile.in +596 -0
- data/vendor/tesseract-2.04/image/bitstrm.cpp +157 -0
- data/vendor/tesseract-2.04/image/bitstrm.h +73 -0
- data/vendor/tesseract-2.04/image/img.h +336 -0
- data/vendor/tesseract-2.04/image/imgbmp.cpp +223 -0
- data/vendor/tesseract-2.04/image/imgbmp.h +50 -0
- data/vendor/tesseract-2.04/image/imgerrs.h +35 -0
- data/vendor/tesseract-2.04/image/imgio.cpp +321 -0
- data/vendor/tesseract-2.04/image/imgio.h +22 -0
- data/vendor/tesseract-2.04/image/imgs.cpp +1764 -0
- data/vendor/tesseract-2.04/image/imgs.h +102 -0
- data/vendor/tesseract-2.04/image/imgtiff.cpp +723 -0
- data/vendor/tesseract-2.04/image/imgtiff.h +89 -0
- data/vendor/tesseract-2.04/image/imgunpk.h +1377 -0
- data/vendor/tesseract-2.04/image/svshowim.cpp +40 -0
- data/vendor/tesseract-2.04/image/svshowim.h +25 -0
- data/vendor/tesseract-2.04/java/Makefile.am +4 -0
- data/vendor/tesseract-2.04/java/Makefile.in +473 -0
- data/vendor/tesseract-2.04/java/com/Makefile.am +1 -0
- data/vendor/tesseract-2.04/java/com/Makefile.in +470 -0
- data/vendor/tesseract-2.04/java/com/google/Makefile.am +1 -0
- data/vendor/tesseract-2.04/java/com/google/Makefile.in +470 -0
- data/vendor/tesseract-2.04/java/com/google/scrollview/Makefile.am +4 -0
- data/vendor/tesseract-2.04/java/com/google/scrollview/Makefile.in +473 -0
- data/vendor/tesseract-2.04/java/com/google/scrollview/ScrollView.java +421 -0
- data/vendor/tesseract-2.04/java/com/google/scrollview/events/Makefile.am +5 -0
- data/vendor/tesseract-2.04/java/com/google/scrollview/events/Makefile.in +474 -0
- data/vendor/tesseract-2.04/java/com/google/scrollview/events/SVEvent.java +87 -0
- data/vendor/tesseract-2.04/java/com/google/scrollview/events/SVEventHandler.java +296 -0
- data/vendor/tesseract-2.04/java/com/google/scrollview/events/SVEventType.java +31 -0
- data/vendor/tesseract-2.04/java/com/google/scrollview/ui/Makefile.am +7 -0
- data/vendor/tesseract-2.04/java/com/google/scrollview/ui/Makefile.in +476 -0
- data/vendor/tesseract-2.04/java/com/google/scrollview/ui/SVAbstractMenuItem.java +58 -0
- data/vendor/tesseract-2.04/java/com/google/scrollview/ui/SVCheckboxMenuItem.java +60 -0
- data/vendor/tesseract-2.04/java/com/google/scrollview/ui/SVEmptyMenuItem.java +48 -0
- data/vendor/tesseract-2.04/java/com/google/scrollview/ui/SVImageHandler.java +228 -0
- data/vendor/tesseract-2.04/java/com/google/scrollview/ui/SVMenuBar.java +130 -0
- data/vendor/tesseract-2.04/java/com/google/scrollview/ui/SVMenuItem.java +61 -0
- data/vendor/tesseract-2.04/java/com/google/scrollview/ui/SVPopupMenu.java +142 -0
- data/vendor/tesseract-2.04/java/com/google/scrollview/ui/SVSubMenuItem.java +41 -0
- data/vendor/tesseract-2.04/java/com/google/scrollview/ui/SVWindow.java +643 -0
- data/vendor/tesseract-2.04/java/makefile +55 -0
- data/vendor/tesseract-2.04/pageseg/Makefile.am +13 -0
- data/vendor/tesseract-2.04/pageseg/Makefile.in +596 -0
- data/vendor/tesseract-2.04/pageseg/leptonica_pageseg.cpp +363 -0
- data/vendor/tesseract-2.04/pageseg/leptonica_pageseg.h +90 -0
- data/vendor/tesseract-2.04/pageseg/leptonica_pageseg_interface.cpp +82 -0
- data/vendor/tesseract-2.04/pageseg/leptonica_pageseg_interface.h +30 -0
- data/vendor/tesseract-2.04/pageseg/pageseg.cpp +170 -0
- data/vendor/tesseract-2.04/pageseg/pageseg.h +29 -0
- data/vendor/tesseract-2.04/phototest.tif +0 -0
- data/vendor/tesseract-2.04/tessdata/Makefile.am +31 -0
- data/vendor/tesseract-2.04/tessdata/Makefile.in +529 -0
- data/vendor/tesseract-2.04/tessdata/configs/Makefile.am +3 -0
- data/vendor/tesseract-2.04/tessdata/configs/Makefile.in +344 -0
- data/vendor/tesseract-2.04/tessdata/configs/api_config +1 -0
- data/vendor/tesseract-2.04/tessdata/configs/box.train +19 -0
- data/vendor/tesseract-2.04/tessdata/configs/box.train.stderr +18 -0
- data/vendor/tesseract-2.04/tessdata/configs/inter +4 -0
- data/vendor/tesseract-2.04/tessdata/configs/kannada +4 -0
- data/vendor/tesseract-2.04/tessdata/configs/makebox +1 -0
- data/vendor/tesseract-2.04/tessdata/configs/unlv +3 -0
- data/vendor/tesseract-2.04/tessdata/confsets +3 -0
- data/vendor/tesseract-2.04/tessdata/eng.DangAmbigs +39 -0
- data/vendor/tesseract-2.04/tessdata/eng.freq-dawg +0 -0
- data/vendor/tesseract-2.04/tessdata/eng.inttemp +0 -0
- data/vendor/tesseract-2.04/tessdata/eng.normproto +1247 -0
- data/vendor/tesseract-2.04/tessdata/eng.pffmtable +111 -0
- data/vendor/tesseract-2.04/tessdata/eng.unicharset +113 -0
- data/vendor/tesseract-2.04/tessdata/eng.user-words +921 -0
- data/vendor/tesseract-2.04/tessdata/eng.word-dawg +0 -0
- data/vendor/tesseract-2.04/tessdata/makedummies +8 -0
- data/vendor/tesseract-2.04/tessdata/tessconfigs/Makefile.am +3 -0
- data/vendor/tesseract-2.04/tessdata/tessconfigs/Makefile.in +344 -0
- data/vendor/tesseract-2.04/tessdata/tessconfigs/batch +2 -0
- data/vendor/tesseract-2.04/tessdata/tessconfigs/batch.nochop +2 -0
- data/vendor/tesseract-2.04/tessdata/tessconfigs/matdemo +7 -0
- data/vendor/tesseract-2.04/tessdata/tessconfigs/msdemo +13 -0
- data/vendor/tesseract-2.04/tessdata/tessconfigs/nobatch +2 -0
- data/vendor/tesseract-2.04/tessdata/tessconfigs/segdemo +9 -0
- data/vendor/tesseract-2.04/tessdll.cpp +351 -0
- data/vendor/tesseract-2.04/tessdll.dsp +2050 -0
- data/vendor/tesseract-2.04/tessdll.h +143 -0
- data/vendor/tesseract-2.04/tessdll.vcproj +5495 -0
- data/vendor/tesseract-2.04/tesseract.dsp +2124 -0
- data/vendor/tesseract-2.04/tesseract.dsw +116 -0
- data/vendor/tesseract-2.04/tesseract.sln +59 -0
- data/vendor/tesseract-2.04/tesseract.spec +188 -0
- data/vendor/tesseract-2.04/tesseract.vcproj +5859 -0
- data/vendor/tesseract-2.04/testing/Makefile.am +2 -0
- data/vendor/tesseract-2.04/testing/Makefile.in +312 -0
- data/vendor/tesseract-2.04/testing/README +43 -0
- data/vendor/tesseract-2.04/testing/counttestset.sh +61 -0
- data/vendor/tesseract-2.04/testing/reorgdata.sh +44 -0
- data/vendor/tesseract-2.04/testing/reports/1995.bus.3B.sum +1 -0
- data/vendor/tesseract-2.04/testing/reports/1995.doe3.3B.sum +1 -0
- data/vendor/tesseract-2.04/testing/reports/1995.mag.3B.sum +1 -0
- data/vendor/tesseract-2.04/testing/reports/1995.news.3B.sum +1 -0
- data/vendor/tesseract-2.04/testing/reports/2.03.summary +9 -0
- data/vendor/tesseract-2.04/testing/reports/2.04.summary +9 -0
- data/vendor/tesseract-2.04/testing/runalltests.sh +110 -0
- data/vendor/tesseract-2.04/testing/runtestset.sh +61 -0
- data/vendor/tesseract-2.04/textord/Makefile.am +20 -0
- data/vendor/tesseract-2.04/textord/Makefile.in +624 -0
- data/vendor/tesseract-2.04/textord/blkocc.cpp +809 -0
- data/vendor/tesseract-2.04/textord/blkocc.h +327 -0
- data/vendor/tesseract-2.04/textord/blobcmpl.h +31 -0
- data/vendor/tesseract-2.04/textord/drawedg.cpp +77 -0
- data/vendor/tesseract-2.04/textord/drawedg.h +34 -0
- data/vendor/tesseract-2.04/textord/drawtord.cpp +469 -0
- data/vendor/tesseract-2.04/textord/drawtord.h +107 -0
- data/vendor/tesseract-2.04/textord/edgblob.cpp +412 -0
- data/vendor/tesseract-2.04/textord/edgblob.h +100 -0
- data/vendor/tesseract-2.04/textord/edgloop.cpp +211 -0
- data/vendor/tesseract-2.04/textord/edgloop.h +66 -0
- data/vendor/tesseract-2.04/textord/fpchop.cpp +1641 -0
- data/vendor/tesseract-2.04/textord/fpchop.h +238 -0
- data/vendor/tesseract-2.04/textord/gap_map.cpp +166 -0
- data/vendor/tesseract-2.04/textord/gap_map.h +40 -0
- data/vendor/tesseract-2.04/textord/makerow.cpp +2628 -0
- data/vendor/tesseract-2.04/textord/makerow.h +295 -0
- data/vendor/tesseract-2.04/textord/oldbasel.cpp +1761 -0
- data/vendor/tesseract-2.04/textord/oldbasel.h +195 -0
- data/vendor/tesseract-2.04/textord/pithsync.cpp +696 -0
- data/vendor/tesseract-2.04/textord/pithsync.h +134 -0
- data/vendor/tesseract-2.04/textord/pitsync1.cpp +425 -0
- data/vendor/tesseract-2.04/textord/pitsync1.h +135 -0
- data/vendor/tesseract-2.04/textord/scanedg.cpp +452 -0
- data/vendor/tesseract-2.04/textord/scanedg.h +74 -0
- data/vendor/tesseract-2.04/textord/sortflts.cpp +80 -0
- data/vendor/tesseract-2.04/textord/sortflts.h +64 -0
- data/vendor/tesseract-2.04/textord/tessout.h +76 -0
- data/vendor/tesseract-2.04/textord/topitch.cpp +2019 -0
- data/vendor/tesseract-2.04/textord/topitch.h +195 -0
- data/vendor/tesseract-2.04/textord/tordmain.cpp +907 -0
- data/vendor/tesseract-2.04/textord/tordmain.h +132 -0
- data/vendor/tesseract-2.04/textord/tospace.cpp +1939 -0
- data/vendor/tesseract-2.04/textord/tospace.h +193 -0
- data/vendor/tesseract-2.04/textord/tovars.cpp +87 -0
- data/vendor/tesseract-2.04/textord/tovars.h +94 -0
- data/vendor/tesseract-2.04/textord/underlin.cpp +312 -0
- data/vendor/tesseract-2.04/textord/underlin.h +53 -0
- data/vendor/tesseract-2.04/textord/wordseg.cpp +620 -0
- data/vendor/tesseract-2.04/textord/wordseg.h +70 -0
- data/vendor/tesseract-2.04/training/Makefile.am +54 -0
- data/vendor/tesseract-2.04/training/Makefile.in +720 -0
- data/vendor/tesseract-2.04/training/cnTraining.cpp +855 -0
- data/vendor/tesseract-2.04/training/cntraining.dsp +243 -0
- data/vendor/tesseract-2.04/training/cntraining.vcproj +950 -0
- data/vendor/tesseract-2.04/training/mergenf.cpp +451 -0
- data/vendor/tesseract-2.04/training/mergenf.h +106 -0
- data/vendor/tesseract-2.04/training/mfTraining.cpp +1341 -0
- data/vendor/tesseract-2.04/training/mftraining.dsp +285 -0
- data/vendor/tesseract-2.04/training/mftraining.vcproj +1055 -0
- data/vendor/tesseract-2.04/training/name2char.cpp +166 -0
- data/vendor/tesseract-2.04/training/name2char.h +38 -0
- data/vendor/tesseract-2.04/training/training.cpp +190 -0
- data/vendor/tesseract-2.04/training/training.h +130 -0
- data/vendor/tesseract-2.04/training/unicharset_extractor.cpp +140 -0
- data/vendor/tesseract-2.04/training/unicharset_extractor.dsp +335 -0
- data/vendor/tesseract-2.04/training/unicharset_extractor.vcproj +769 -0
- data/vendor/tesseract-2.04/training/wordlist2dawg.cpp +69 -0
- data/vendor/tesseract-2.04/training/wordlist2dawg.dsp +319 -0
- data/vendor/tesseract-2.04/training/wordlist2dawg.vcproj +1113 -0
- data/vendor/tesseract-2.04/viewer/Makefile.am +9 -0
- data/vendor/tesseract-2.04/viewer/Makefile.in +591 -0
- data/vendor/tesseract-2.04/viewer/scrollview.cpp +825 -0
- data/vendor/tesseract-2.04/viewer/scrollview.h +414 -0
- data/vendor/tesseract-2.04/viewer/svmnode.cpp +140 -0
- data/vendor/tesseract-2.04/viewer/svmnode.h +94 -0
- data/vendor/tesseract-2.04/viewer/svpaint.cpp +220 -0
- data/vendor/tesseract-2.04/viewer/svutil.cpp +347 -0
- data/vendor/tesseract-2.04/viewer/svutil.h +138 -0
- data/vendor/tesseract-2.04/wordrec/Makefile.am +23 -0
- data/vendor/tesseract-2.04/wordrec/Makefile.in +641 -0
- data/vendor/tesseract-2.04/wordrec/associate.cpp +62 -0
- data/vendor/tesseract-2.04/wordrec/associate.h +93 -0
- data/vendor/tesseract-2.04/wordrec/badwords.cpp +106 -0
- data/vendor/tesseract-2.04/wordrec/badwords.h +51 -0
- data/vendor/tesseract-2.04/wordrec/bestfirst.cpp +526 -0
- data/vendor/tesseract-2.04/wordrec/bestfirst.h +203 -0
- data/vendor/tesseract-2.04/wordrec/charsample.h +208 -0
- data/vendor/tesseract-2.04/wordrec/chop.cpp +458 -0
- data/vendor/tesseract-2.04/wordrec/chop.h +153 -0
- data/vendor/tesseract-2.04/wordrec/chopper.cpp +750 -0
- data/vendor/tesseract-2.04/wordrec/chopper.h +104 -0
- data/vendor/tesseract-2.04/wordrec/closed.cpp +136 -0
- data/vendor/tesseract-2.04/wordrec/closed.h +65 -0
- data/vendor/tesseract-2.04/wordrec/djmenus.cpp +118 -0
- data/vendor/tesseract-2.04/wordrec/djmenus.h +33 -0
- data/vendor/tesseract-2.04/wordrec/drawfx.cpp +92 -0
- data/vendor/tesseract-2.04/wordrec/drawfx.h +33 -0
- data/vendor/tesseract-2.04/wordrec/findseam.cpp +566 -0
- data/vendor/tesseract-2.04/wordrec/findseam.h +69 -0
- data/vendor/tesseract-2.04/wordrec/gradechop.cpp +226 -0
- data/vendor/tesseract-2.04/wordrec/gradechop.h +91 -0
- data/vendor/tesseract-2.04/wordrec/heuristic.cpp +194 -0
- data/vendor/tesseract-2.04/wordrec/heuristic.h +120 -0
- data/vendor/tesseract-2.04/wordrec/makechop.cpp +281 -0
- data/vendor/tesseract-2.04/wordrec/makechop.h +69 -0
- data/vendor/tesseract-2.04/wordrec/matchtab.cpp +191 -0
- data/vendor/tesseract-2.04/wordrec/matchtab.h +45 -0
- data/vendor/tesseract-2.04/wordrec/matrix.cpp +118 -0
- data/vendor/tesseract-2.04/wordrec/matrix.h +104 -0
- data/vendor/tesseract-2.04/wordrec/measure.h +135 -0
- data/vendor/tesseract-2.04/wordrec/metrics.cpp +363 -0
- data/vendor/tesseract-2.04/wordrec/metrics.h +130 -0
- data/vendor/tesseract-2.04/wordrec/mfvars.cpp +51 -0
- data/vendor/tesseract-2.04/wordrec/mfvars.h +27 -0
- data/vendor/tesseract-2.04/wordrec/msmenus.cpp +110 -0
- data/vendor/tesseract-2.04/wordrec/msmenus.h +45 -0
- data/vendor/tesseract-2.04/wordrec/olutil.cpp +153 -0
- data/vendor/tesseract-2.04/wordrec/olutil.h +128 -0
- data/vendor/tesseract-2.04/wordrec/outlines.cpp +172 -0
- data/vendor/tesseract-2.04/wordrec/outlines.h +148 -0
- data/vendor/tesseract-2.04/wordrec/pieces.cpp +410 -0
- data/vendor/tesseract-2.04/wordrec/pieces.h +154 -0
- data/vendor/tesseract-2.04/wordrec/plotedges.cpp +134 -0
- data/vendor/tesseract-2.04/wordrec/plotedges.h +71 -0
- data/vendor/tesseract-2.04/wordrec/plotseg.cpp +116 -0
- data/vendor/tesseract-2.04/wordrec/plotseg.h +73 -0
- data/vendor/tesseract-2.04/wordrec/render.cpp +152 -0
- data/vendor/tesseract-2.04/wordrec/render.h +58 -0
- data/vendor/tesseract-2.04/wordrec/seam.cpp +482 -0
- data/vendor/tesseract-2.04/wordrec/seam.h +136 -0
- data/vendor/tesseract-2.04/wordrec/split.cpp +182 -0
- data/vendor/tesseract-2.04/wordrec/split.h +115 -0
- data/vendor/tesseract-2.04/wordrec/tally.cpp +68 -0
- data/vendor/tesseract-2.04/wordrec/tally.h +94 -0
- data/vendor/tesseract-2.04/wordrec/tessinit.cpp +108 -0
- data/vendor/tesseract-2.04/wordrec/tessinit.h +46 -0
- data/vendor/tesseract-2.04/wordrec/tface.cpp +272 -0
- data/vendor/tesseract-2.04/wordrec/tface.h +35 -0
- data/vendor/tesseract-2.04/wordrec/wordclass.cpp +284 -0
- data/vendor/tesseract-2.04/wordrec/wordclass.h +64 -0
- metadata +708 -0
|
@@ -0,0 +1,1867 @@
|
|
|
1
|
+
/**********************************************************************
|
|
2
|
+
* File: pgedit.cpp (Formerly pgeditor.c)
|
|
3
|
+
* Description: Page structure file editor
|
|
4
|
+
* Author: Phil Cheatle
|
|
5
|
+
* Created: Thu Oct 10 16:25:24 BST 1991
|
|
6
|
+
*
|
|
7
|
+
*(C) Copyright 1991, 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 "pgedit.h"
|
|
21
|
+
|
|
22
|
+
#include <ctype.h>
|
|
23
|
+
#include <math.h>
|
|
24
|
+
|
|
25
|
+
#include "genblob.h"
|
|
26
|
+
#include "tessio.h"
|
|
27
|
+
#include "tessout.h"
|
|
28
|
+
#include "tordmain.h"
|
|
29
|
+
#include "statistc.h"
|
|
30
|
+
#include "debugwin.h"
|
|
31
|
+
#include "svshowim.h"
|
|
32
|
+
#include "mainblk.h"
|
|
33
|
+
#include "varabled.h"
|
|
34
|
+
#include "string.h"
|
|
35
|
+
|
|
36
|
+
#include "scrollview.h"
|
|
37
|
+
#include "svmnode.h"
|
|
38
|
+
|
|
39
|
+
#include "control.h"
|
|
40
|
+
|
|
41
|
+
#ifndef GRAPHICS_DISABLED
|
|
42
|
+
#define ASC_HEIGHT (2 * bln_baseline_offset + bln_x_height)
|
|
43
|
+
#define X_HEIGHT (bln_baseline_offset + bln_x_height)
|
|
44
|
+
#define BL_HEIGHT bln_baseline_offset
|
|
45
|
+
#define DESC_HEIGHT 0
|
|
46
|
+
#define MAXSPACING 128 /*max expected spacing in pix */
|
|
47
|
+
|
|
48
|
+
const ERRCODE EMPTYBLOCKLIST = "No blocks to edit";
|
|
49
|
+
extern IMAGE page_image;
|
|
50
|
+
|
|
51
|
+
enum CMD_EVENTS
|
|
52
|
+
{
|
|
53
|
+
NULL_CMD_EVENT,
|
|
54
|
+
DELETE_CMD_EVENT,
|
|
55
|
+
COPY_CMD_EVENT,
|
|
56
|
+
CHANGE_DISP_CMD_EVENT,
|
|
57
|
+
CHANGE_TEXT_CMD_EVENT,
|
|
58
|
+
TOGGLE_SEG_CMD_EVENT,
|
|
59
|
+
DUMP_WERD_CMD_EVENT,
|
|
60
|
+
SHOW_POINT_CMD_EVENT,
|
|
61
|
+
ROW_SPACE_STAT_CMD_EVENT,
|
|
62
|
+
BLOCK_SPACE_STAT_CMD_EVENT,
|
|
63
|
+
SHOW_BLN_WERD_CMD_EVENT,
|
|
64
|
+
SEGMENT_WERD_CMD_EVENT,
|
|
65
|
+
BOUNDING_BOX_CMD_EVENT,
|
|
66
|
+
CORRECT_TEXT_CMD_EVENT,
|
|
67
|
+
POLYGONAL_CMD_EVENT,
|
|
68
|
+
BL_NORM_CMD_EVENT,
|
|
69
|
+
BITMAP_CMD_EVENT,
|
|
70
|
+
TIDY_CMD_EVENT,
|
|
71
|
+
VIEW_CMD_EVENT,
|
|
72
|
+
IMAGE_CMD_EVENT,
|
|
73
|
+
BLOCKS_CMD_EVENT,
|
|
74
|
+
BASELINES_CMD_EVENT,
|
|
75
|
+
WRITE_CMD_EVENT,
|
|
76
|
+
NEW_SOURCE_CMD_EVENT,
|
|
77
|
+
UNIFORM_DISP_CMD_EVENT,
|
|
78
|
+
REFRESH_CMD_EVENT,
|
|
79
|
+
QUIT_CMD_EVENT,
|
|
80
|
+
RECOG_WERDS,
|
|
81
|
+
RECOG_PSEUDO
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
/**********************************************************************
|
|
85
|
+
*
|
|
86
|
+
* Some global data
|
|
87
|
+
*
|
|
88
|
+
**********************************************************************/
|
|
89
|
+
|
|
90
|
+
ScrollView* image_win;
|
|
91
|
+
VariablesEditor* ve;
|
|
92
|
+
bool stillRunning = false;
|
|
93
|
+
|
|
94
|
+
#ifdef __UNIX__
|
|
95
|
+
FILE *debug_window = NULL; // opened on demand
|
|
96
|
+
#endif
|
|
97
|
+
// baseline norm words
|
|
98
|
+
ScrollView* bln_word_window = NULL;
|
|
99
|
+
|
|
100
|
+
CMD_EVENTS mode = CHANGE_DISP_CMD_EVENT;
|
|
101
|
+
// Selected words op
|
|
102
|
+
|
|
103
|
+
BITS16 word_display_mode;
|
|
104
|
+
BOOL8 display_image = FALSE;
|
|
105
|
+
BOOL8 display_blocks = FALSE;
|
|
106
|
+
BOOL8 display_baselines = FALSE;
|
|
107
|
+
BOOL8 viewing_source = TRUE;
|
|
108
|
+
|
|
109
|
+
BLOCK_LIST *source_block_list = NULL; // image blocks
|
|
110
|
+
BLOCK_LIST target_block_list; // target blocks
|
|
111
|
+
BLOCK_LIST *other_block_list = &target_block_list;
|
|
112
|
+
|
|
113
|
+
BOOL8 source_changed = FALSE; // Changes not saved
|
|
114
|
+
BOOL8 target_changed = FALSE; // Changes not saved
|
|
115
|
+
BOOL8 *other_image_changed = &target_changed;
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
/* Public globals */
|
|
119
|
+
|
|
120
|
+
#define EXTERN
|
|
121
|
+
|
|
122
|
+
EXTERN BLOCK_LIST *current_block_list = NULL;
|
|
123
|
+
EXTERN BOOL8 *current_image_changed = &source_changed;
|
|
124
|
+
|
|
125
|
+
/* Variables */
|
|
126
|
+
|
|
127
|
+
EXTERN STRING_VAR(editor_image_win_name, "EditorImage",
|
|
128
|
+
"Editor image window name");
|
|
129
|
+
EXTERN INT_VAR(editor_image_xpos, 590, "Editor image X Pos");
|
|
130
|
+
EXTERN INT_VAR(editor_image_ypos, 10, "Editor image Y Pos");
|
|
131
|
+
EXTERN INT_VAR(editor_image_menuheight, 50, "Add to image height for menu bar");
|
|
132
|
+
EXTERN INT_VAR(editor_image_word_bb_color, ScrollView::BLUE,
|
|
133
|
+
"Word bounding box colour");
|
|
134
|
+
EXTERN INT_VAR(editor_image_blob_bb_color, ScrollView::YELLOW,
|
|
135
|
+
"Blob bounding box colour");
|
|
136
|
+
EXTERN INT_VAR(editor_image_text_color, ScrollView::WHITE,
|
|
137
|
+
"Correct text colour");
|
|
138
|
+
|
|
139
|
+
EXTERN STRING_VAR(editor_dbwin_name, "EditorDBWin",
|
|
140
|
+
"Editor debug window name");
|
|
141
|
+
EXTERN INT_VAR(editor_dbwin_xpos, 50, "Editor debug window X Pos");
|
|
142
|
+
EXTERN INT_VAR(editor_dbwin_ypos, 500, "Editor debug window Y Pos");
|
|
143
|
+
EXTERN INT_VAR(editor_dbwin_height, 24, "Editor debug window height");
|
|
144
|
+
EXTERN INT_VAR(editor_dbwin_width, 80, "Editor debug window width");
|
|
145
|
+
|
|
146
|
+
EXTERN STRING_VAR(editor_word_name, "BlnWords", "BL normalised word window");
|
|
147
|
+
EXTERN INT_VAR(editor_word_xpos, 60, "Word window X Pos");
|
|
148
|
+
EXTERN INT_VAR(editor_word_ypos, 510, "Word window Y Pos");
|
|
149
|
+
EXTERN INT_VAR(editor_word_height, 240, "Word window height");
|
|
150
|
+
EXTERN INT_VAR(editor_word_width, 655, "Word window width");
|
|
151
|
+
|
|
152
|
+
EXTERN double_VAR(editor_smd_scale_factor, 1.0, "Scaling for smd image");
|
|
153
|
+
|
|
154
|
+
/**********************************************************************
|
|
155
|
+
* add_word()
|
|
156
|
+
*
|
|
157
|
+
* Inserts the a word into a specified block list. The list is searched for a
|
|
158
|
+
* block and row of the same file as those of the word to be added, which
|
|
159
|
+
* contain the bounding box of the word. If such a row is found, the new
|
|
160
|
+
* word is inserted into the row in the correct X order. If the
|
|
161
|
+
* block is found, but not the row, a copy of the word's old row is added to
|
|
162
|
+
* the block in the correct Y order, and the word is put in that row.
|
|
163
|
+
* If neither the row nor the block are found, then the word's old block is
|
|
164
|
+
* copied with only the word's row. It is added to the block list in the
|
|
165
|
+
* correct Y order.
|
|
166
|
+
**********************************************************************/
|
|
167
|
+
|
|
168
|
+
void add_word( // to block list
|
|
169
|
+
WERD *word, // word to be added
|
|
170
|
+
ROW *src_row, // source row
|
|
171
|
+
BLOCK *src_block, // source block
|
|
172
|
+
BLOCK_LIST *dest_block_list // add to this
|
|
173
|
+
) {
|
|
174
|
+
BLOCK_IT block_it(dest_block_list);
|
|
175
|
+
BLOCK *block; // current block
|
|
176
|
+
BLOCK *dest_block = NULL; // destination block
|
|
177
|
+
ROW_IT row_it;
|
|
178
|
+
ROW *row; // destination row
|
|
179
|
+
ROW *dest_row = NULL; // destination row
|
|
180
|
+
WERD_IT word_it;
|
|
181
|
+
TBOX word_box = word->bounding_box();
|
|
182
|
+
TBOX insert_point_word_box;
|
|
183
|
+
BOOL8 seen_blocks_for_current_file = FALSE;
|
|
184
|
+
|
|
185
|
+
block_it.mark_cycle_pt();
|
|
186
|
+
while(!block_it.cycled_list() &&(dest_block == NULL)) {
|
|
187
|
+
block = block_it.data();
|
|
188
|
+
if ((block->bounding_box().contains(word_box)) &&
|
|
189
|
+
(strcmp(block->name(), src_block->name()) == 0)) {
|
|
190
|
+
dest_block = block; // found dest block
|
|
191
|
+
row_it.set_to_list(block->row_list());
|
|
192
|
+
row_it.mark_cycle_pt();
|
|
193
|
+
while((!row_it.cycled_list()) &&(dest_row == NULL)) {
|
|
194
|
+
row = row_it.data();
|
|
195
|
+
if (row->bounding_box().contains(word_box))
|
|
196
|
+
dest_row = row; // found dest row
|
|
197
|
+
else
|
|
198
|
+
row_it.forward();
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
else
|
|
202
|
+
block_it.forward();
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
if (dest_block == NULL) { // make a new one
|
|
206
|
+
dest_block = new BLOCK;
|
|
207
|
+
*dest_block = *src_block;
|
|
208
|
+
|
|
209
|
+
block_it.set_to_list(dest_block_list);
|
|
210
|
+
for (block_it.mark_cycle_pt();
|
|
211
|
+
!block_it.cycled_list(); block_it.forward()) {
|
|
212
|
+
block = block_it.data();
|
|
213
|
+
|
|
214
|
+
if (!seen_blocks_for_current_file &&
|
|
215
|
+
(strcmp(block->name(), dest_block->name()) == 0))
|
|
216
|
+
seen_blocks_for_current_file = TRUE;
|
|
217
|
+
|
|
218
|
+
if (seen_blocks_for_current_file &&
|
|
219
|
+
((strcmp(block->name(), dest_block->name()) != 0) ||
|
|
220
|
+
(block->bounding_box().top() <
|
|
221
|
+
dest_block->bounding_box().top())))
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
if (block_it.cycled_list())
|
|
226
|
+
// didn't find insrt pt
|
|
227
|
+
block_it.add_to_end(dest_block);
|
|
228
|
+
else
|
|
229
|
+
// did find insert pt
|
|
230
|
+
block_it.add_before_stay_put(dest_block);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
if (dest_row == NULL) { // make a new one
|
|
234
|
+
dest_row = new ROW;
|
|
235
|
+
*dest_row = *src_row;
|
|
236
|
+
|
|
237
|
+
row_it.set_to_list(dest_block->row_list());
|
|
238
|
+
for (row_it.mark_cycle_pt(); !row_it.cycled_list(); row_it.forward()) {
|
|
239
|
+
if (row_it.data()->bounding_box().top() <
|
|
240
|
+
dest_row->bounding_box().top())
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
if (row_it.cycled_list())
|
|
245
|
+
// didn't find insrt pt
|
|
246
|
+
row_it.add_to_end(dest_row);
|
|
247
|
+
else
|
|
248
|
+
// did find insert pt
|
|
249
|
+
row_it.add_before_stay_put(dest_row);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/* dest_block and dest_row are now found or built and inserted as necessesary
|
|
253
|
+
so add the word to dest row */
|
|
254
|
+
|
|
255
|
+
word_it.set_to_list(dest_row->word_list());
|
|
256
|
+
for (word_it.mark_cycle_pt(); !word_it.cycled_list(); word_it.forward()) {
|
|
257
|
+
if (word_it.data()->bounding_box().right() >= word_box.left())
|
|
258
|
+
break;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
if (word_it.cycled_list())
|
|
262
|
+
word_it.add_to_end(word); // didn't find insrt pt
|
|
263
|
+
else { // did find insert pt
|
|
264
|
+
insert_point_word_box = word_it.data()->bounding_box();
|
|
265
|
+
if (insert_point_word_box.contains(word_box) ||
|
|
266
|
+
word_box.contains(insert_point_word_box))
|
|
267
|
+
image_win->AddMessage("Refusing to add words which obliterate,"
|
|
268
|
+
" or are obliterated by, others");
|
|
269
|
+
else {
|
|
270
|
+
if (word_it.data()->bounding_box().left() >
|
|
271
|
+
word->bounding_box().left())
|
|
272
|
+
// infront of insert pt
|
|
273
|
+
word_it.add_before_stay_put(word);
|
|
274
|
+
else
|
|
275
|
+
// behind insert pt
|
|
276
|
+
word_it.add_after_stay_put(word);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
/**********************************************************************
|
|
283
|
+
* bln_word_window_handle()
|
|
284
|
+
*
|
|
285
|
+
* Return a WINDOW for the word window, creating it if necessary
|
|
286
|
+
**********************************************************************/
|
|
287
|
+
|
|
288
|
+
class BlnEventHandler : public SVEventHandler {
|
|
289
|
+
public:
|
|
290
|
+
void Notify(const SVEvent* sv_event) {
|
|
291
|
+
if (sv_event->type == SVET_DESTROY)
|
|
292
|
+
bln_word_window = NULL;
|
|
293
|
+
else if (sv_event->type == SVET_CLICK)
|
|
294
|
+
show_point(current_block_list, sv_event->x, sv_event->y);
|
|
295
|
+
}
|
|
296
|
+
};
|
|
297
|
+
|
|
298
|
+
ScrollView* bln_word_window_handle() { // return handle
|
|
299
|
+
// not opened yet
|
|
300
|
+
if (bln_word_window == NULL) {
|
|
301
|
+
pgeditor_msg("Creating BLN word window...");
|
|
302
|
+
bln_word_window = new ScrollView(editor_word_name.string(),
|
|
303
|
+
editor_word_xpos, editor_word_ypos, editor_word_width,
|
|
304
|
+
editor_word_height, 4000, 4000, true);
|
|
305
|
+
BlnEventHandler* a = new BlnEventHandler();
|
|
306
|
+
bln_word_window->AddEventHandler(a);
|
|
307
|
+
pgeditor_msg("Creating BLN word window...Done");
|
|
308
|
+
}
|
|
309
|
+
return bln_word_window;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/**********************************************************************
|
|
313
|
+
* build_image_window()
|
|
314
|
+
*
|
|
315
|
+
* Destroy the existing image window if there is one. Work out how big the
|
|
316
|
+
* new window needs to be. Create it and re-display.
|
|
317
|
+
**********************************************************************/
|
|
318
|
+
|
|
319
|
+
void build_image_window(TBOX page_bounding_box) {
|
|
320
|
+
if (image_win != NULL) { delete image_win; }
|
|
321
|
+
image_win = new ScrollView(editor_image_win_name.string(),
|
|
322
|
+
editor_image_xpos, editor_image_ypos,
|
|
323
|
+
page_bounding_box.right() + 1,
|
|
324
|
+
page_bounding_box.top() +
|
|
325
|
+
editor_image_menuheight + 1,
|
|
326
|
+
page_bounding_box.right() + 1,
|
|
327
|
+
page_bounding_box.top() + 1,
|
|
328
|
+
true);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
/**********************************************************************
|
|
333
|
+
* build_menu()
|
|
334
|
+
*
|
|
335
|
+
* Construct the menu tree used by the command window
|
|
336
|
+
**********************************************************************/
|
|
337
|
+
|
|
338
|
+
SVMenuNode *build_menu_new() {
|
|
339
|
+
|
|
340
|
+
SVMenuNode* parent_menu;
|
|
341
|
+
SVMenuNode* root_menu_item = new SVMenuNode();
|
|
342
|
+
|
|
343
|
+
SVMenuNode* modes_menu_item = root_menu_item->AddChild("MODES");
|
|
344
|
+
|
|
345
|
+
modes_menu_item->AddChild("Change Display",
|
|
346
|
+
CHANGE_DISP_CMD_EVENT);
|
|
347
|
+
modes_menu_item->AddChild("Delete",
|
|
348
|
+
DELETE_CMD_EVENT);
|
|
349
|
+
modes_menu_item->AddChild("Copy to TARGET",
|
|
350
|
+
COPY_CMD_EVENT);
|
|
351
|
+
modes_menu_item->AddChild("Change Text",
|
|
352
|
+
CHANGE_TEXT_CMD_EVENT);
|
|
353
|
+
modes_menu_item->AddChild("Toggle Correct Seg Flg",
|
|
354
|
+
TOGGLE_SEG_CMD_EVENT);
|
|
355
|
+
modes_menu_item->AddChild("Dump Word",
|
|
356
|
+
DUMP_WERD_CMD_EVENT);
|
|
357
|
+
modes_menu_item->AddChild("Show Point",
|
|
358
|
+
SHOW_POINT_CMD_EVENT);
|
|
359
|
+
modes_menu_item->AddChild("Row gaps hist",
|
|
360
|
+
ROW_SPACE_STAT_CMD_EVENT);
|
|
361
|
+
modes_menu_item->AddChild("Block gaps hist",
|
|
362
|
+
BLOCK_SPACE_STAT_CMD_EVENT);
|
|
363
|
+
modes_menu_item->AddChild("Show BL Norm Word",
|
|
364
|
+
SHOW_BLN_WERD_CMD_EVENT);
|
|
365
|
+
modes_menu_item->AddChild("Re-Segment Word",
|
|
366
|
+
SEGMENT_WERD_CMD_EVENT);
|
|
367
|
+
modes_menu_item->AddChild("Recog Words",
|
|
368
|
+
RECOG_WERDS);
|
|
369
|
+
modes_menu_item->AddChild("Recog Blobs",
|
|
370
|
+
RECOG_PSEUDO);
|
|
371
|
+
|
|
372
|
+
parent_menu = root_menu_item->AddChild("DISPLAY");
|
|
373
|
+
|
|
374
|
+
parent_menu->AddChild("Bounding Boxes",
|
|
375
|
+
BOUNDING_BOX_CMD_EVENT, TRUE);
|
|
376
|
+
parent_menu->AddChild("Correct Text",
|
|
377
|
+
CORRECT_TEXT_CMD_EVENT, FALSE);
|
|
378
|
+
parent_menu->AddChild("Polygonal Approx",
|
|
379
|
+
POLYGONAL_CMD_EVENT, FALSE);
|
|
380
|
+
parent_menu->AddChild("Baseline Normalised",
|
|
381
|
+
BL_NORM_CMD_EVENT, FALSE);
|
|
382
|
+
parent_menu->AddChild("Edge Steps",
|
|
383
|
+
BITMAP_CMD_EVENT, FALSE);
|
|
384
|
+
|
|
385
|
+
parent_menu = root_menu_item->AddChild("OTHER");
|
|
386
|
+
|
|
387
|
+
parent_menu->AddChild("Quit",
|
|
388
|
+
QUIT_CMD_EVENT);
|
|
389
|
+
parent_menu->AddChild("Tidy Target",
|
|
390
|
+
TIDY_CMD_EVENT);
|
|
391
|
+
|
|
392
|
+
parent_menu->AddChild("View TARGET",
|
|
393
|
+
VIEW_CMD_EVENT, FALSE);
|
|
394
|
+
parent_menu->AddChild("Show Image",
|
|
395
|
+
IMAGE_CMD_EVENT, FALSE);
|
|
396
|
+
parent_menu->AddChild("ShowBlock Outlines",
|
|
397
|
+
BLOCKS_CMD_EVENT, FALSE);
|
|
398
|
+
parent_menu->AddChild("Show Baselines",
|
|
399
|
+
BASELINES_CMD_EVENT, FALSE);
|
|
400
|
+
parent_menu->AddChild("Write File",
|
|
401
|
+
WRITE_CMD_EVENT, imagebasename.string());
|
|
402
|
+
parent_menu->AddChild("New Source File",
|
|
403
|
+
NEW_SOURCE_CMD_EVENT, imagebasename.string());
|
|
404
|
+
parent_menu->AddChild("Uniform Display",
|
|
405
|
+
UNIFORM_DISP_CMD_EVENT);
|
|
406
|
+
parent_menu->AddChild("Refresh Display",
|
|
407
|
+
REFRESH_CMD_EVENT);
|
|
408
|
+
|
|
409
|
+
return root_menu_item;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
|
|
413
|
+
/**********************************************************************
|
|
414
|
+
* display_bln_lines()
|
|
415
|
+
*
|
|
416
|
+
* Display normalised baseline, x-height, ascender limit and descender limit
|
|
417
|
+
**********************************************************************/
|
|
418
|
+
|
|
419
|
+
void display_bln_lines(ScrollView* window,
|
|
420
|
+
ScrollView::Color colour,
|
|
421
|
+
float scale_factor,
|
|
422
|
+
float y_offset,
|
|
423
|
+
float minx,
|
|
424
|
+
float maxx) {
|
|
425
|
+
window->Pen(colour);
|
|
426
|
+
window->Line(minx, y_offset + scale_factor * DESC_HEIGHT,
|
|
427
|
+
maxx, y_offset + scale_factor * DESC_HEIGHT);
|
|
428
|
+
window->Line(minx, y_offset + scale_factor * BL_HEIGHT,
|
|
429
|
+
maxx, y_offset + scale_factor * BL_HEIGHT);
|
|
430
|
+
window->Line(minx, y_offset + scale_factor * X_HEIGHT,
|
|
431
|
+
maxx, y_offset + scale_factor * X_HEIGHT);
|
|
432
|
+
window->Line(minx, y_offset + scale_factor * ASC_HEIGHT,
|
|
433
|
+
maxx, y_offset + scale_factor * ASC_HEIGHT);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
/**********************************************************************
|
|
438
|
+
* do_new_source()
|
|
439
|
+
*
|
|
440
|
+
* Change to another source file. Automatically tidy page first
|
|
441
|
+
*
|
|
442
|
+
**********************************************************************/
|
|
443
|
+
|
|
444
|
+
void do_new_source( // serialise
|
|
445
|
+
) {
|
|
446
|
+
FILE *infp; // input file
|
|
447
|
+
|
|
448
|
+
char* name = image_win->ShowInputDialog("New Source File name");
|
|
449
|
+
|
|
450
|
+
STRING name_str(name);
|
|
451
|
+
delete[] name;
|
|
452
|
+
|
|
453
|
+
if (source_changed) {
|
|
454
|
+
|
|
455
|
+
int a = image_win->ShowYesNoDialog(
|
|
456
|
+
"Source changes will be LOST. Continue?(Y/N)");
|
|
457
|
+
if (a != 'y') { image_win->AddMessage("Write cancelled"); return; }
|
|
458
|
+
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
// if not file exists
|
|
462
|
+
if (!(infp = fopen(name_str.string(), "r"))) {
|
|
463
|
+
|
|
464
|
+
image_win->AddMessage("Cant open file " "%s" "", name_str.string());
|
|
465
|
+
return;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
fclose(infp);
|
|
469
|
+
|
|
470
|
+
image_win->AddMessage("Reading file " "%s" "...", name_str.string());
|
|
471
|
+
source_block_list->clear();
|
|
472
|
+
// appends to SOURCE
|
|
473
|
+
pgeditor_read_file(name_str, source_block_list);
|
|
474
|
+
source_changed = FALSE;
|
|
475
|
+
|
|
476
|
+
image_win->AddMessage("Doing automatic Tidy Target...");
|
|
477
|
+
viewing_source = FALSE; // Force viewing source
|
|
478
|
+
do_tidy_cmd();
|
|
479
|
+
|
|
480
|
+
image_win->AddMessage("Doing automatic Tidy Target...Done");
|
|
481
|
+
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
|
|
485
|
+
/**********************************************************************
|
|
486
|
+
* do_re_display()
|
|
487
|
+
*
|
|
488
|
+
* Redisplay page
|
|
489
|
+
**********************************************************************/
|
|
490
|
+
|
|
491
|
+
void
|
|
492
|
+
// function to call
|
|
493
|
+
do_re_display(BOOL8 word_painter(
|
|
494
|
+
BLOCK *, ROW *, WERD *)) {
|
|
495
|
+
BLOCK_IT block_it(current_block_list);
|
|
496
|
+
BLOCK *block;
|
|
497
|
+
int block_count = 1;
|
|
498
|
+
|
|
499
|
+
ROW_IT row_it;
|
|
500
|
+
ROW *row;
|
|
501
|
+
|
|
502
|
+
WERD_IT word_it;
|
|
503
|
+
WERD *word;
|
|
504
|
+
|
|
505
|
+
image_win->Clear();
|
|
506
|
+
if (display_image != 0) {
|
|
507
|
+
sv_show_sub_image(&page_image, 0, 0,
|
|
508
|
+
page_image.get_xsize(), page_image.get_ysize(),
|
|
509
|
+
image_win, 0, 0);
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
for (block_it.mark_cycle_pt();
|
|
513
|
+
!block_it.cycled_list(); block_it.forward()) {
|
|
514
|
+
block = block_it.data();
|
|
515
|
+
row_it.set_to_list(block->row_list());
|
|
516
|
+
for (row_it.mark_cycle_pt(); !row_it.cycled_list(); row_it.forward()) {
|
|
517
|
+
row = row_it.data();
|
|
518
|
+
word_it.set_to_list(row->word_list());
|
|
519
|
+
for (word_it.mark_cycle_pt();
|
|
520
|
+
!word_it.cycled_list(); word_it.forward()) {
|
|
521
|
+
word = word_it.data();
|
|
522
|
+
word_painter(block, row, word);
|
|
523
|
+
}
|
|
524
|
+
if (display_baselines)
|
|
525
|
+
row->plot_baseline(image_win, ScrollView::GREEN);
|
|
526
|
+
}
|
|
527
|
+
if (display_blocks)
|
|
528
|
+
block->plot(image_win, block_count++, ScrollView::RED);
|
|
529
|
+
}
|
|
530
|
+
image_win->Update();
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
|
|
534
|
+
/**********************************************************************
|
|
535
|
+
* do_tidy_cmd()
|
|
536
|
+
*
|
|
537
|
+
* Tidy TARGET page
|
|
538
|
+
**********************************************************************/
|
|
539
|
+
|
|
540
|
+
const TBOX do_tidy_cmd() { // tidy
|
|
541
|
+
ICOORD shift_vector;
|
|
542
|
+
TBOX tidy_box; // Just the tidy area
|
|
543
|
+
TBOX source_box; // source file area
|
|
544
|
+
|
|
545
|
+
source_box = block_list_bounding_box(source_block_list);
|
|
546
|
+
// find src area
|
|
547
|
+
|
|
548
|
+
if (!target_block_list.empty()) {
|
|
549
|
+
tidy_box = block_list_compress(&target_block_list);
|
|
550
|
+
|
|
551
|
+
/* Shift tidied target above the source image area. */
|
|
552
|
+
|
|
553
|
+
shift_vector = ICOORD(0, source_box.top() + BLOCK_SPACING)
|
|
554
|
+
- tidy_box.botleft();
|
|
555
|
+
block_list_move(&target_block_list, shift_vector);
|
|
556
|
+
tidy_box.move(shift_vector);
|
|
557
|
+
}
|
|
558
|
+
source_box += tidy_box;
|
|
559
|
+
// big enough for both
|
|
560
|
+
build_image_window(source_box);
|
|
561
|
+
do_view_cmd();
|
|
562
|
+
return tidy_box;
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
|
|
566
|
+
/**********************************************************************
|
|
567
|
+
* do_view_cmd()
|
|
568
|
+
*
|
|
569
|
+
* View TARGET/View SOURCE command
|
|
570
|
+
**********************************************************************/
|
|
571
|
+
|
|
572
|
+
void do_view_cmd() {
|
|
573
|
+
viewing_source = !viewing_source;
|
|
574
|
+
image_win->Clear();
|
|
575
|
+
if (viewing_source) {
|
|
576
|
+
current_block_list = source_block_list;
|
|
577
|
+
current_image_changed = &source_changed;
|
|
578
|
+
other_block_list = &target_block_list;
|
|
579
|
+
other_image_changed = &target_changed;
|
|
580
|
+
do_re_display(&word_display);
|
|
581
|
+
}
|
|
582
|
+
else {
|
|
583
|
+
current_block_list = &target_block_list;
|
|
584
|
+
current_image_changed = &target_changed;
|
|
585
|
+
other_block_list = source_block_list;
|
|
586
|
+
other_image_changed = &source_changed;
|
|
587
|
+
do_re_display(&word_display);
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
|
|
592
|
+
/**********************************************************************
|
|
593
|
+
* do_write_file()
|
|
594
|
+
*
|
|
595
|
+
* Serialise a block list to file
|
|
596
|
+
*
|
|
597
|
+
* If writing image, tidy page and move to(0,0) first
|
|
598
|
+
**********************************************************************/
|
|
599
|
+
|
|
600
|
+
void do_write_file( // serialise
|
|
601
|
+
) {
|
|
602
|
+
|
|
603
|
+
char* name = image_win->ShowInputDialog("File Name");
|
|
604
|
+
|
|
605
|
+
FILE *infp; // input file
|
|
606
|
+
char msg_str[80];
|
|
607
|
+
|
|
608
|
+
TBOX enclosing_box;
|
|
609
|
+
|
|
610
|
+
// if file exists
|
|
611
|
+
if ((infp = fopen(name, "r")) != NULL) {
|
|
612
|
+
fclose(infp);
|
|
613
|
+
sprintf(msg_str, "Overwrite file " "%s" "?(Y/N)", name);
|
|
614
|
+
|
|
615
|
+
int a = image_win->ShowYesNoDialog(msg_str);
|
|
616
|
+
if (a != 'y') { image_win->AddMessage("Write cancelled"); delete[] name; return; }
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
infp = fopen(name, "w"); // can we write to it?
|
|
620
|
+
if (infp == NULL) {
|
|
621
|
+
|
|
622
|
+
image_win->AddMessage("Cant write to file " "%s" "", name);
|
|
623
|
+
delete[] name;
|
|
624
|
+
return;
|
|
625
|
+
}
|
|
626
|
+
fclose(infp);
|
|
627
|
+
|
|
628
|
+
delete [] name;
|
|
629
|
+
|
|
630
|
+
if (!viewing_source && !target_block_list.empty()) {
|
|
631
|
+
// Tidy & move to(0,0)
|
|
632
|
+
image_win->AddMessage("Automatic tidy...");
|
|
633
|
+
viewing_source = TRUE; // Stay viewing target!
|
|
634
|
+
enclosing_box = do_tidy_cmd();
|
|
635
|
+
block_list_move(&target_block_list, -enclosing_box.botleft());
|
|
636
|
+
image_win->AddMessage("Writing file...");
|
|
637
|
+
pgeditor_write_file(name, &target_block_list);
|
|
638
|
+
// move back
|
|
639
|
+
block_list_move(&target_block_list,
|
|
640
|
+
enclosing_box.botleft());
|
|
641
|
+
}
|
|
642
|
+
else {
|
|
643
|
+
image_win->AddMessage("Writing file...");
|
|
644
|
+
pgeditor_write_file(name, current_block_list);
|
|
645
|
+
}
|
|
646
|
+
image_win->AddMessage("Writing file...Done");
|
|
647
|
+
*current_image_changed = FALSE;
|
|
648
|
+
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
/**********************************************************************
|
|
652
|
+
* notify()
|
|
653
|
+
*
|
|
654
|
+
* Event handler that processes incoming events, either forwarding
|
|
655
|
+
* them to process_cmd_win_event or process_image_event.
|
|
656
|
+
*
|
|
657
|
+
**********************************************************************/
|
|
658
|
+
|
|
659
|
+
void PGEventHandler::Notify(const SVEvent* event) {
|
|
660
|
+
char myval = '0';
|
|
661
|
+
if (event->type == SVET_POPUP) {
|
|
662
|
+
ve->Notify(event);
|
|
663
|
+
} // These are handled by Var. Editor
|
|
664
|
+
else if (event->type == SVET_EXIT) { stillRunning = false; }
|
|
665
|
+
else if (event->type == SVET_MENU) {
|
|
666
|
+
if (strcmp(event->parameter, "true") == 0) { myval = 'T'; }
|
|
667
|
+
else if (strcmp(event->parameter, "false") == 0) { myval = 'F'; }
|
|
668
|
+
process_cmd_win_event(event->command_id, &myval);
|
|
669
|
+
}
|
|
670
|
+
else {
|
|
671
|
+
process_image_event(*event);
|
|
672
|
+
// else pgeditor_show_point(*event);
|
|
673
|
+
}
|
|
674
|
+
current_word_quit.set_value(FALSE);
|
|
675
|
+
selection_quit.set_value(FALSE);
|
|
676
|
+
// replot all var wins
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
|
|
680
|
+
/**********************************************************************
|
|
681
|
+
* pgeditor_main()
|
|
682
|
+
*
|
|
683
|
+
* Top level editor operation:
|
|
684
|
+
* Setup a new window and an according event handler
|
|
685
|
+
*
|
|
686
|
+
**********************************************************************/
|
|
687
|
+
|
|
688
|
+
void pgeditor_main(BLOCK_LIST *blocks) {
|
|
689
|
+
|
|
690
|
+
source_block_list = blocks;
|
|
691
|
+
current_block_list = blocks;
|
|
692
|
+
if (current_block_list->empty())
|
|
693
|
+
return;
|
|
694
|
+
|
|
695
|
+
stillRunning = true;
|
|
696
|
+
|
|
697
|
+
build_image_window(block_list_bounding_box(source_block_list));
|
|
698
|
+
do_re_display(&word_display);
|
|
699
|
+
word_display_mode.turn_on_bit(DF_BOX);
|
|
700
|
+
#ifndef GRAPHICS_DISABLED
|
|
701
|
+
ve = new VariablesEditor(image_win);
|
|
702
|
+
#endif
|
|
703
|
+
PGEventHandler pgEventHandler;
|
|
704
|
+
|
|
705
|
+
image_win->AddEventHandler(&pgEventHandler);
|
|
706
|
+
image_win->AddMessageBox();
|
|
707
|
+
|
|
708
|
+
SVMenuNode* svMenuRoot = build_menu_new();
|
|
709
|
+
|
|
710
|
+
svMenuRoot->BuildMenu(image_win);
|
|
711
|
+
image_win->SetVisible(true);
|
|
712
|
+
|
|
713
|
+
image_win->AwaitEvent(SVET_DESTROY);
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
|
|
717
|
+
/**********************************************************************
|
|
718
|
+
* pgeditor_msg()
|
|
719
|
+
*
|
|
720
|
+
* Display a message - in the command window if there is one, or to stdout
|
|
721
|
+
**********************************************************************/
|
|
722
|
+
|
|
723
|
+
void pgeditor_msg( // message display
|
|
724
|
+
const char *msg) {
|
|
725
|
+
image_win->AddMessage(msg);
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
#endif // GRAPHCICS_DISABLED
|
|
729
|
+
/**********************************************************************
|
|
730
|
+
* pgeditor_read_file()
|
|
731
|
+
*
|
|
732
|
+
* Deserialise source file
|
|
733
|
+
**********************************************************************/
|
|
734
|
+
|
|
735
|
+
void pgeditor_read_file( // of serialised file
|
|
736
|
+
STRING &name,
|
|
737
|
+
BLOCK_LIST *blocks // block list to add to
|
|
738
|
+
) {
|
|
739
|
+
#ifdef GRAPHICS_DISABLED
|
|
740
|
+
edges_and_textord(name.string(), blocks);
|
|
741
|
+
}
|
|
742
|
+
#else
|
|
743
|
+
int c; // input character
|
|
744
|
+
FILE *infp; // input file
|
|
745
|
+
BLOCK_IT block_it(blocks); // iterator
|
|
746
|
+
BLOCK *block; // current block
|
|
747
|
+
|
|
748
|
+
ICOORD page_tr; // topright of page
|
|
749
|
+
|
|
750
|
+
const char *filename_extension;
|
|
751
|
+
|
|
752
|
+
block_it.move_to_last();
|
|
753
|
+
|
|
754
|
+
// ptr to last dot
|
|
755
|
+
filename_extension = strrchr(name.string(), '.');
|
|
756
|
+
#ifdef __UNIX__
|
|
757
|
+
/* TEXTROW* tessrows;
|
|
758
|
+
TBLOB* tessblobs;
|
|
759
|
+
TPOINT tess_tr;
|
|
760
|
+
|
|
761
|
+
if (strcmp(filename_extension, ".r" ) == 0)
|
|
762
|
+
{
|
|
763
|
+
tprintf("Converting from .r file format.\n" );
|
|
764
|
+
tessrows = get_tess_row_file(name.string(), // get the row file
|
|
765
|
+
&tess_tr );
|
|
766
|
+
page_tr = ICOORD(tess_tr.x, tess_tr.y );
|
|
767
|
+
make_blocks_from_rows(tessrows, name.string(), // reconstruct blocks
|
|
768
|
+
page_tr, TRUE, &block_it );
|
|
769
|
+
}
|
|
770
|
+
else if (strcmp(filename_extension, ".b" ) == 0)
|
|
771
|
+
{
|
|
772
|
+
tprintf("Converting from .b file format.\n" );
|
|
773
|
+
tessblobs = get_tess_blob_file(name.string(), // get the blob file
|
|
774
|
+
&tess_tr );
|
|
775
|
+
page_tr = ICOORD(tess_tr.x, tess_tr.y );
|
|
776
|
+
make_blocks_from_blobs(tessblobs, name.string(),
|
|
777
|
+
// reconstruct blocks
|
|
778
|
+
page_tr, FALSE,blocks);
|
|
779
|
+
}
|
|
780
|
+
else*/
|
|
781
|
+
if (strcmp(filename_extension, ".pb") == 0) {
|
|
782
|
+
tprintf("Converting from .pb file format.\n");
|
|
783
|
+
// construct blocks
|
|
784
|
+
read_and_textord(name.string(), blocks);
|
|
785
|
+
}
|
|
786
|
+
else
|
|
787
|
+
#endif
|
|
788
|
+
if ((strcmp(filename_extension, ".pg") == 0) ||
|
|
789
|
+
// read a .pg file
|
|
790
|
+
// or a .sp file
|
|
791
|
+
(strcmp(filename_extension, ".sp") == 0)) {
|
|
792
|
+
tprintf("Reading %s file format.\n", filename_extension);
|
|
793
|
+
infp = fopen(name.string(), "r");
|
|
794
|
+
if (infp == NULL)
|
|
795
|
+
CANTOPENFILE.error("pgeditor_read_file", EXIT, name.string());
|
|
796
|
+
// can't open file
|
|
797
|
+
|
|
798
|
+
while(((c = fgetc(infp)) != EOF) &&(ungetc(c, infp) != EOF)) {
|
|
799
|
+
// get one
|
|
800
|
+
block = BLOCK::de_serialise(infp);
|
|
801
|
+
// add to list
|
|
802
|
+
block_it.add_after_then_move(block);
|
|
803
|
+
}
|
|
804
|
+
fclose(infp);
|
|
805
|
+
} else {
|
|
806
|
+
edges_and_textord(name.string(), blocks);
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
|
|
811
|
+
/**********************************************************************
|
|
812
|
+
* pgeditor_show_point()
|
|
813
|
+
*
|
|
814
|
+
* Display the coordinates of a point in the command window
|
|
815
|
+
**********************************************************************/
|
|
816
|
+
|
|
817
|
+
void pgeditor_show_point( // display coords
|
|
818
|
+
SVEvent *event) {
|
|
819
|
+
image_win->AddMessage("Pointing at(%d, %d)", event->x, event->y);
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
|
|
823
|
+
/**********************************************************************
|
|
824
|
+
* pgeditor_write_file()
|
|
825
|
+
*
|
|
826
|
+
* Serialise a block list to file
|
|
827
|
+
*
|
|
828
|
+
**********************************************************************/
|
|
829
|
+
|
|
830
|
+
void pgeditor_write_file( // serialise
|
|
831
|
+
char *name, // file name
|
|
832
|
+
BLOCK_LIST *blocks // block list to write
|
|
833
|
+
) {
|
|
834
|
+
FILE *infp; // input file
|
|
835
|
+
BLOCK_IT block_it(blocks); // block iterator
|
|
836
|
+
BLOCK *block; // current block
|
|
837
|
+
ROW_IT row_it; // row iterator
|
|
838
|
+
|
|
839
|
+
infp = fopen(name, "w"); // create output file
|
|
840
|
+
if (infp == NULL)
|
|
841
|
+
CANTCREATEFILE.error("pgeditor_write_file", EXIT, name);
|
|
842
|
+
|
|
843
|
+
for (block_it.mark_cycle_pt();
|
|
844
|
+
!block_it.cycled_list(); block_it.forward()) {
|
|
845
|
+
block = block_it.extract();
|
|
846
|
+
|
|
847
|
+
row_it.set_to_list(block->row_list());
|
|
848
|
+
for (row_it.mark_cycle_pt(); !row_it.cycled_list(); row_it.forward())
|
|
849
|
+
// ensure correct
|
|
850
|
+
row_it.data()->recalc_bounding_box();
|
|
851
|
+
|
|
852
|
+
block->serialise(infp); // serialize non-empty
|
|
853
|
+
block_it.add_after_then_move(block);
|
|
854
|
+
}
|
|
855
|
+
fclose(infp);
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
|
|
859
|
+
/**********************************************************************
|
|
860
|
+
* process_cmd_win_event()
|
|
861
|
+
*
|
|
862
|
+
* Process a command returned from the command window
|
|
863
|
+
* (Just call the appropriate command handler)
|
|
864
|
+
**********************************************************************/
|
|
865
|
+
|
|
866
|
+
BOOL8 process_cmd_win_event( // UI command semantics
|
|
867
|
+
inT32 cmd_event, // which menu item?
|
|
868
|
+
char *new_value // any prompt data
|
|
869
|
+
) {
|
|
870
|
+
char msg[160];
|
|
871
|
+
BOOL8 exit = FALSE;
|
|
872
|
+
|
|
873
|
+
switch(cmd_event) {
|
|
874
|
+
case NULL_CMD_EVENT:
|
|
875
|
+
break;
|
|
876
|
+
|
|
877
|
+
case VIEW_CMD_EVENT:
|
|
878
|
+
do_view_cmd();
|
|
879
|
+
break;
|
|
880
|
+
case CHANGE_DISP_CMD_EVENT:
|
|
881
|
+
case DELETE_CMD_EVENT:
|
|
882
|
+
case CHANGE_TEXT_CMD_EVENT:
|
|
883
|
+
case TOGGLE_SEG_CMD_EVENT:
|
|
884
|
+
case DUMP_WERD_CMD_EVENT:
|
|
885
|
+
case SHOW_POINT_CMD_EVENT:
|
|
886
|
+
case ROW_SPACE_STAT_CMD_EVENT:
|
|
887
|
+
case BLOCK_SPACE_STAT_CMD_EVENT:
|
|
888
|
+
case SHOW_BLN_WERD_CMD_EVENT:
|
|
889
|
+
case SEGMENT_WERD_CMD_EVENT:
|
|
890
|
+
mode =(CMD_EVENTS) cmd_event;
|
|
891
|
+
break;
|
|
892
|
+
case COPY_CMD_EVENT:
|
|
893
|
+
mode =(CMD_EVENTS) cmd_event;
|
|
894
|
+
if (!viewing_source)
|
|
895
|
+
image_win->AddMessage("Can't COPY while viewing target!");
|
|
896
|
+
break;
|
|
897
|
+
case BOUNDING_BOX_CMD_EVENT:
|
|
898
|
+
if (new_value[0] == 'T')
|
|
899
|
+
word_display_mode.turn_on_bit(DF_BOX);
|
|
900
|
+
else
|
|
901
|
+
word_display_mode.turn_off_bit(DF_BOX);
|
|
902
|
+
mode = CHANGE_DISP_CMD_EVENT;
|
|
903
|
+
break;
|
|
904
|
+
case CORRECT_TEXT_CMD_EVENT:
|
|
905
|
+
if (new_value[0] == 'T')
|
|
906
|
+
word_display_mode.turn_on_bit(DF_TEXT);
|
|
907
|
+
else
|
|
908
|
+
word_display_mode.turn_off_bit(DF_TEXT);
|
|
909
|
+
mode = CHANGE_DISP_CMD_EVENT;
|
|
910
|
+
break;
|
|
911
|
+
case POLYGONAL_CMD_EVENT:
|
|
912
|
+
if (new_value[0] == 'T')
|
|
913
|
+
word_display_mode.turn_on_bit(DF_POLYGONAL);
|
|
914
|
+
else
|
|
915
|
+
word_display_mode.turn_off_bit(DF_POLYGONAL);
|
|
916
|
+
mode = CHANGE_DISP_CMD_EVENT;
|
|
917
|
+
break;
|
|
918
|
+
case BL_NORM_CMD_EVENT:
|
|
919
|
+
if (new_value[0] == 'T')
|
|
920
|
+
word_display_mode.turn_on_bit(DF_BN_POLYGONAL);
|
|
921
|
+
else
|
|
922
|
+
word_display_mode.turn_off_bit(DF_BN_POLYGONAL);
|
|
923
|
+
mode = CHANGE_DISP_CMD_EVENT;
|
|
924
|
+
break;
|
|
925
|
+
case BITMAP_CMD_EVENT:
|
|
926
|
+
if (new_value[0] == 'T')
|
|
927
|
+
word_display_mode.turn_on_bit(DF_EDGE_STEP);
|
|
928
|
+
else
|
|
929
|
+
word_display_mode.turn_off_bit(DF_EDGE_STEP);
|
|
930
|
+
mode = CHANGE_DISP_CMD_EVENT;
|
|
931
|
+
break;
|
|
932
|
+
case UNIFORM_DISP_CMD_EVENT:
|
|
933
|
+
do_re_display(&word_set_display);
|
|
934
|
+
*current_image_changed = TRUE;
|
|
935
|
+
break;
|
|
936
|
+
case WRITE_CMD_EVENT:
|
|
937
|
+
do_write_file();
|
|
938
|
+
break;
|
|
939
|
+
case TIDY_CMD_EVENT:
|
|
940
|
+
if (!target_block_list.empty()) {
|
|
941
|
+
viewing_source = TRUE; // Force viewing target
|
|
942
|
+
do_tidy_cmd();
|
|
943
|
+
}
|
|
944
|
+
break;
|
|
945
|
+
case NEW_SOURCE_CMD_EVENT:
|
|
946
|
+
do_new_source();
|
|
947
|
+
break;
|
|
948
|
+
case IMAGE_CMD_EVENT:
|
|
949
|
+
display_image =(new_value[0] == 'T');
|
|
950
|
+
do_re_display(&word_display);
|
|
951
|
+
break;
|
|
952
|
+
case BLOCKS_CMD_EVENT:
|
|
953
|
+
display_blocks =(new_value[0] == 'T');
|
|
954
|
+
do_re_display(&word_display);
|
|
955
|
+
break;
|
|
956
|
+
case BASELINES_CMD_EVENT:
|
|
957
|
+
display_baselines =(new_value[0] == 'T');
|
|
958
|
+
do_re_display(&word_display);
|
|
959
|
+
break;
|
|
960
|
+
case REFRESH_CMD_EVENT:
|
|
961
|
+
do_re_display(&word_display);
|
|
962
|
+
break;
|
|
963
|
+
case QUIT_CMD_EVENT:
|
|
964
|
+
if (source_changed || target_changed) {
|
|
965
|
+
int a = image_win->ShowYesNoDialog(
|
|
966
|
+
"Changes not saved. Exit anyway?(Y/N)");
|
|
967
|
+
if (a == 'y') { exit = TRUE; ScrollView::Exit(); }
|
|
968
|
+
}
|
|
969
|
+
else {
|
|
970
|
+
exit = TRUE;
|
|
971
|
+
ScrollView::Exit();
|
|
972
|
+
}
|
|
973
|
+
break;
|
|
974
|
+
case RECOG_WERDS:
|
|
975
|
+
mode = RECOG_WERDS;
|
|
976
|
+
break;
|
|
977
|
+
case RECOG_PSEUDO:
|
|
978
|
+
mode = RECOG_PSEUDO;
|
|
979
|
+
break;
|
|
980
|
+
|
|
981
|
+
default:
|
|
982
|
+
sprintf(msg, "Unrecognised event " INT32FORMAT "(%s)",
|
|
983
|
+
cmd_event, new_value);
|
|
984
|
+
image_win->AddMessage(msg);
|
|
985
|
+
break;
|
|
986
|
+
}
|
|
987
|
+
return exit;
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
|
|
991
|
+
/**********************************************************************
|
|
992
|
+
* process_image_event()
|
|
993
|
+
*
|
|
994
|
+
* User has done something in the image window - mouse down or up. Work out
|
|
995
|
+
* what it is and do something with it.
|
|
996
|
+
* If DOWN - just remember where it was.
|
|
997
|
+
* If UP - for each word in the selected area do the operation defined by
|
|
998
|
+
* the current mode.
|
|
999
|
+
**********************************************************************/
|
|
1000
|
+
|
|
1001
|
+
void process_image_event( // action in image win
|
|
1002
|
+
const SVEvent &event) {
|
|
1003
|
+
static ICOORD down;
|
|
1004
|
+
ICOORD up;
|
|
1005
|
+
TBOX selection_box;
|
|
1006
|
+
char msg[80];
|
|
1007
|
+
|
|
1008
|
+
switch(event.type) {
|
|
1009
|
+
|
|
1010
|
+
case SVET_SELECTION:
|
|
1011
|
+
if (event.type == SVET_SELECTION) {
|
|
1012
|
+
down.set_x(event.x - event.x_size);
|
|
1013
|
+
down.set_y(event.y + event.y_size);
|
|
1014
|
+
if (mode == SHOW_POINT_CMD_EVENT)
|
|
1015
|
+
show_point(current_block_list, event.x, event.y);
|
|
1016
|
+
}
|
|
1017
|
+
|
|
1018
|
+
up.set_x(event.x);
|
|
1019
|
+
up.set_y(event.y);
|
|
1020
|
+
|
|
1021
|
+
selection_box = TBOX(down, up);
|
|
1022
|
+
|
|
1023
|
+
switch(mode) {
|
|
1024
|
+
case CHANGE_DISP_CMD_EVENT:
|
|
1025
|
+
process_selected_words(current_block_list,
|
|
1026
|
+
selection_box,
|
|
1027
|
+
&word_blank_and_set_display);
|
|
1028
|
+
break;
|
|
1029
|
+
case COPY_CMD_EVENT:
|
|
1030
|
+
if (!viewing_source)
|
|
1031
|
+
image_win->AddMessage("Can't COPY while viewing target!");
|
|
1032
|
+
else
|
|
1033
|
+
process_selected_words(current_block_list,
|
|
1034
|
+
selection_box,
|
|
1035
|
+
&word_copy);
|
|
1036
|
+
break;
|
|
1037
|
+
case DELETE_CMD_EVENT:
|
|
1038
|
+
process_selected_words_it(current_block_list,
|
|
1039
|
+
selection_box,
|
|
1040
|
+
&word_delete);
|
|
1041
|
+
break;
|
|
1042
|
+
case CHANGE_TEXT_CMD_EVENT:
|
|
1043
|
+
process_selected_words(current_block_list,
|
|
1044
|
+
selection_box,
|
|
1045
|
+
&word_change_text);
|
|
1046
|
+
break;
|
|
1047
|
+
case TOGGLE_SEG_CMD_EVENT:
|
|
1048
|
+
process_selected_words(current_block_list,
|
|
1049
|
+
selection_box,
|
|
1050
|
+
&word_toggle_seg);
|
|
1051
|
+
break;
|
|
1052
|
+
case DUMP_WERD_CMD_EVENT:
|
|
1053
|
+
process_selected_words(current_block_list,
|
|
1054
|
+
selection_box,
|
|
1055
|
+
&word_dumper);
|
|
1056
|
+
break;
|
|
1057
|
+
case SHOW_BLN_WERD_CMD_EVENT:
|
|
1058
|
+
process_selected_words(current_block_list,
|
|
1059
|
+
selection_box,
|
|
1060
|
+
&word_bln_display);
|
|
1061
|
+
break;
|
|
1062
|
+
case SEGMENT_WERD_CMD_EVENT:
|
|
1063
|
+
re_segment_word(current_block_list, selection_box);
|
|
1064
|
+
break;
|
|
1065
|
+
case ROW_SPACE_STAT_CMD_EVENT:
|
|
1066
|
+
row_space_stat(current_block_list, selection_box);
|
|
1067
|
+
break;
|
|
1068
|
+
case BLOCK_SPACE_STAT_CMD_EVENT:
|
|
1069
|
+
block_space_stat(current_block_list, selection_box);
|
|
1070
|
+
break;
|
|
1071
|
+
case SHOW_POINT_CMD_EVENT:
|
|
1072
|
+
break; // ignore up event
|
|
1073
|
+
|
|
1074
|
+
case RECOG_WERDS:
|
|
1075
|
+
image_win->AddMessage("Recogging selected words");
|
|
1076
|
+
process_selected_words(current_block_list,
|
|
1077
|
+
selection_box, &recog_interactive);
|
|
1078
|
+
break;
|
|
1079
|
+
case RECOG_PSEUDO:
|
|
1080
|
+
image_win->AddMessage("Recogging selected blobs");
|
|
1081
|
+
recog_pseudo_word(current_block_list, selection_box);
|
|
1082
|
+
break;
|
|
1083
|
+
|
|
1084
|
+
default:
|
|
1085
|
+
sprintf(msg, "Mode %d not yet implemented", mode);
|
|
1086
|
+
image_win->AddMessage(msg);
|
|
1087
|
+
break;
|
|
1088
|
+
}
|
|
1089
|
+
default:
|
|
1090
|
+
break;
|
|
1091
|
+
}
|
|
1092
|
+
}
|
|
1093
|
+
|
|
1094
|
+
|
|
1095
|
+
/**********************************************************************
|
|
1096
|
+
* re_scale_and_move_bln_word()
|
|
1097
|
+
*
|
|
1098
|
+
* Scale and move a bln word so that it fits in a specified bounding box.
|
|
1099
|
+
* Scale by width or height to generate the largest image
|
|
1100
|
+
**********************************************************************/
|
|
1101
|
+
|
|
1102
|
+
float re_scale_and_move_bln_word( // put bln word in box
|
|
1103
|
+
WERD *norm_word, // BL normalised word
|
|
1104
|
+
const TBOX &box // destination box
|
|
1105
|
+
) {
|
|
1106
|
+
TBOX norm_box = norm_word->bounding_box();
|
|
1107
|
+
float width_scale_factor;
|
|
1108
|
+
float height_scale_factor;
|
|
1109
|
+
float selected_scale_factor;
|
|
1110
|
+
|
|
1111
|
+
width_scale_factor = box.width() /(float) norm_box.width();
|
|
1112
|
+
height_scale_factor = box.height() /(float) ASC_HEIGHT;
|
|
1113
|
+
|
|
1114
|
+
if ((ASC_HEIGHT * width_scale_factor) <= box.height())
|
|
1115
|
+
selected_scale_factor = width_scale_factor;
|
|
1116
|
+
else
|
|
1117
|
+
selected_scale_factor = height_scale_factor;
|
|
1118
|
+
|
|
1119
|
+
norm_word->scale(selected_scale_factor);
|
|
1120
|
+
norm_word->move(ICOORD((box.left() + box.width() / 2), box.bottom()));
|
|
1121
|
+
return selected_scale_factor;
|
|
1122
|
+
}
|
|
1123
|
+
|
|
1124
|
+
|
|
1125
|
+
/**********************************************************************
|
|
1126
|
+
* re_segment_word()
|
|
1127
|
+
*
|
|
1128
|
+
* If all selected blobs are in the same row, remove them from their current
|
|
1129
|
+
* word(s) and put them in a new word. Insert the new word in the row at the
|
|
1130
|
+
* appropriate point. Delete any empty words.
|
|
1131
|
+
*
|
|
1132
|
+
**********************************************************************/
|
|
1133
|
+
|
|
1134
|
+
void re_segment_word( // break/join words
|
|
1135
|
+
BLOCK_LIST *block_list, // blocks to check
|
|
1136
|
+
TBOX &selection_box) {
|
|
1137
|
+
BLOCK_IT block_it(block_list);
|
|
1138
|
+
BLOCK *block;
|
|
1139
|
+
BLOCK *block_to_process = NULL;
|
|
1140
|
+
ROW_IT row_it;
|
|
1141
|
+
ROW *row;
|
|
1142
|
+
ROW *row_to_process = NULL;
|
|
1143
|
+
WERD_IT word_it;
|
|
1144
|
+
WERD *word;
|
|
1145
|
+
WERD *new_word = NULL;
|
|
1146
|
+
BOOL8 polyg = false;
|
|
1147
|
+
PBLOB_IT blob_it;
|
|
1148
|
+
PBLOB_LIST dummy; // Just to initialize new_blob_it.
|
|
1149
|
+
PBLOB_IT new_blob_it = &dummy;
|
|
1150
|
+
PBLOB *blob;
|
|
1151
|
+
|
|
1152
|
+
/* Find row to process - error if selections from more than one row */
|
|
1153
|
+
|
|
1154
|
+
for (block_it.mark_cycle_pt();
|
|
1155
|
+
!block_it.cycled_list(); block_it.forward()) {
|
|
1156
|
+
block = block_it.data();
|
|
1157
|
+
if (block->bounding_box().overlap(selection_box)) {
|
|
1158
|
+
row_it.set_to_list(block->row_list());
|
|
1159
|
+
for (row_it.mark_cycle_pt();
|
|
1160
|
+
!row_it.cycled_list(); row_it.forward()) {
|
|
1161
|
+
row = row_it.data();
|
|
1162
|
+
if (row->bounding_box().overlap(selection_box)) {
|
|
1163
|
+
if (row_to_process == NULL) {
|
|
1164
|
+
block_to_process = block;
|
|
1165
|
+
row_to_process = row;
|
|
1166
|
+
}
|
|
1167
|
+
else {
|
|
1168
|
+
image_win->AddMessage("Cant resegment words "
|
|
1169
|
+
"in more than one row");
|
|
1170
|
+
return;
|
|
1171
|
+
}
|
|
1172
|
+
}
|
|
1173
|
+
}
|
|
1174
|
+
}
|
|
1175
|
+
}
|
|
1176
|
+
/* Continue with row_to_process */
|
|
1177
|
+
|
|
1178
|
+
word_it.set_to_list(row_to_process->word_list());
|
|
1179
|
+
for (word_it.mark_cycle_pt(); !word_it.cycled_list(); word_it.forward()) {
|
|
1180
|
+
word = word_it.data();
|
|
1181
|
+
polyg = word->flag(W_POLYGON);
|
|
1182
|
+
if (word->bounding_box().overlap(selection_box)) {
|
|
1183
|
+
blob_it.set_to_list(word->gblob_list());
|
|
1184
|
+
for (blob_it.mark_cycle_pt();
|
|
1185
|
+
!blob_it.cycled_list(); blob_it.forward()) {
|
|
1186
|
+
blob = blob_it.data();
|
|
1187
|
+
if (gblob_bounding_box(blob, polyg).overlap(selection_box)) {
|
|
1188
|
+
if (new_word == NULL) {
|
|
1189
|
+
new_word = word->shallow_copy();
|
|
1190
|
+
new_blob_it.set_to_list(new_word->gblob_list());
|
|
1191
|
+
}
|
|
1192
|
+
new_blob_it.add_to_end(blob_it.extract());
|
|
1193
|
+
// move blob
|
|
1194
|
+
}
|
|
1195
|
+
}
|
|
1196
|
+
if (blob_it.empty()) { // no blobs in word
|
|
1197
|
+
// so delete word
|
|
1198
|
+
delete word_it.extract();
|
|
1199
|
+
}
|
|
1200
|
+
}
|
|
1201
|
+
}
|
|
1202
|
+
if (new_word != NULL) {
|
|
1203
|
+
gblob_sort_list(new_word->gblob_list(), polyg);
|
|
1204
|
+
word_it.add_to_end(new_word);
|
|
1205
|
+
word_it.sort(word_comparator);
|
|
1206
|
+
row_to_process->bounding_box().plot(image_win,
|
|
1207
|
+
ScrollView::BLACK, ScrollView::BLACK);
|
|
1208
|
+
word_it.set_to_list(row_to_process->word_list());
|
|
1209
|
+
for (word_it.mark_cycle_pt();
|
|
1210
|
+
!word_it.cycled_list(); word_it.forward())
|
|
1211
|
+
word_display(block_to_process, row_to_process, word_it.data());
|
|
1212
|
+
*current_image_changed = TRUE;
|
|
1213
|
+
}
|
|
1214
|
+
}
|
|
1215
|
+
|
|
1216
|
+
|
|
1217
|
+
void block_space_stat( // show space stats
|
|
1218
|
+
BLOCK_LIST *block_list, // blocks to check
|
|
1219
|
+
TBOX &selection_box) {
|
|
1220
|
+
BLOCK_IT block_it(block_list);
|
|
1221
|
+
BLOCK *block;
|
|
1222
|
+
ROW_IT row_it;
|
|
1223
|
+
ROW *row;
|
|
1224
|
+
int block_idx = 0;
|
|
1225
|
+
STATS all_gap_stats(0, MAXSPACING);
|
|
1226
|
+
WERD_IT word_it;
|
|
1227
|
+
WERD *word;
|
|
1228
|
+
PBLOB_IT blob_it;
|
|
1229
|
+
PBLOB *blob;
|
|
1230
|
+
C_BLOB_IT cblob_it;
|
|
1231
|
+
C_BLOB *cblob;
|
|
1232
|
+
TBOX box;
|
|
1233
|
+
inT16 prev_box_right;
|
|
1234
|
+
inT16 gap_width;
|
|
1235
|
+
inT16 min_inter_word_gap;
|
|
1236
|
+
inT16 max_inter_char_gap;
|
|
1237
|
+
|
|
1238
|
+
/* Find blocks to process */
|
|
1239
|
+
|
|
1240
|
+
for (block_it.mark_cycle_pt();
|
|
1241
|
+
!block_it.cycled_list(); block_it.forward()) {
|
|
1242
|
+
block_idx++;
|
|
1243
|
+
block = block_it.data();
|
|
1244
|
+
if (block->bounding_box().overlap(selection_box)) {
|
|
1245
|
+
/* Process a block */
|
|
1246
|
+
tprintf("\nBlock %d\n", block_idx);
|
|
1247
|
+
min_inter_word_gap = 3000;
|
|
1248
|
+
max_inter_char_gap = 0;
|
|
1249
|
+
all_gap_stats.clear();
|
|
1250
|
+
row_it.set_to_list(block->row_list());
|
|
1251
|
+
for (row_it.mark_cycle_pt();
|
|
1252
|
+
!row_it.cycled_list(); row_it.forward()) {
|
|
1253
|
+
row = row_it.data();
|
|
1254
|
+
prev_box_right = -1;
|
|
1255
|
+
word_it.set_to_list(row->word_list());
|
|
1256
|
+
for (word_it.mark_cycle_pt();
|
|
1257
|
+
!word_it.cycled_list(); word_it.forward()) {
|
|
1258
|
+
word = word_it.data();
|
|
1259
|
+
if (word->flag(W_POLYGON)) {
|
|
1260
|
+
blob_it.set_to_list(word->blob_list());
|
|
1261
|
+
for (blob_it.mark_cycle_pt();
|
|
1262
|
+
!blob_it.cycled_list(); blob_it.forward()) {
|
|
1263
|
+
blob = blob_it.data();
|
|
1264
|
+
box = blob->bounding_box();
|
|
1265
|
+
if (prev_box_right > -1) {
|
|
1266
|
+
gap_width = box.left() - prev_box_right;
|
|
1267
|
+
all_gap_stats.add(gap_width, 1);
|
|
1268
|
+
if (blob_it.at_first()) {
|
|
1269
|
+
if (gap_width < min_inter_word_gap)
|
|
1270
|
+
min_inter_word_gap = gap_width;
|
|
1271
|
+
}
|
|
1272
|
+
else {
|
|
1273
|
+
if (gap_width > max_inter_char_gap)
|
|
1274
|
+
max_inter_char_gap = gap_width;
|
|
1275
|
+
}
|
|
1276
|
+
}
|
|
1277
|
+
prev_box_right = box.right();
|
|
1278
|
+
}
|
|
1279
|
+
}
|
|
1280
|
+
else {
|
|
1281
|
+
cblob_it.set_to_list(word->cblob_list());
|
|
1282
|
+
for (cblob_it.mark_cycle_pt();
|
|
1283
|
+
!cblob_it.cycled_list(); cblob_it.forward()) {
|
|
1284
|
+
cblob = cblob_it.data();
|
|
1285
|
+
box = cblob->bounding_box();
|
|
1286
|
+
if (prev_box_right > -1) {
|
|
1287
|
+
gap_width = box.left() - prev_box_right;
|
|
1288
|
+
all_gap_stats.add(gap_width, 1);
|
|
1289
|
+
if (cblob_it.at_first()) {
|
|
1290
|
+
if (gap_width < min_inter_word_gap)
|
|
1291
|
+
min_inter_word_gap = gap_width;
|
|
1292
|
+
}
|
|
1293
|
+
else {
|
|
1294
|
+
if (gap_width > max_inter_char_gap)
|
|
1295
|
+
max_inter_char_gap = gap_width;
|
|
1296
|
+
}
|
|
1297
|
+
}
|
|
1298
|
+
prev_box_right = box.right();
|
|
1299
|
+
}
|
|
1300
|
+
}
|
|
1301
|
+
}
|
|
1302
|
+
}
|
|
1303
|
+
tprintf("Max inter char gap = %d.\nMin inter word gap = %d.\n",
|
|
1304
|
+
max_inter_char_gap, min_inter_word_gap);
|
|
1305
|
+
all_gap_stats.short_print(NULL, TRUE);
|
|
1306
|
+
all_gap_stats.smooth(2);
|
|
1307
|
+
tprintf("SMOOTHED DATA...\n");
|
|
1308
|
+
all_gap_stats.short_print(NULL, TRUE);
|
|
1309
|
+
}
|
|
1310
|
+
}
|
|
1311
|
+
}
|
|
1312
|
+
|
|
1313
|
+
|
|
1314
|
+
void row_space_stat( // show space stats
|
|
1315
|
+
BLOCK_LIST *block_list, // blocks to check
|
|
1316
|
+
TBOX &selection_box) {
|
|
1317
|
+
BLOCK_IT block_it(block_list);
|
|
1318
|
+
BLOCK *block;
|
|
1319
|
+
ROW_IT row_it;
|
|
1320
|
+
ROW *row;
|
|
1321
|
+
int block_idx = 0;
|
|
1322
|
+
int row_idx;
|
|
1323
|
+
STATS all_gap_stats(0, MAXSPACING);
|
|
1324
|
+
WERD_IT word_it;
|
|
1325
|
+
WERD *word;
|
|
1326
|
+
PBLOB_IT blob_it;
|
|
1327
|
+
PBLOB *blob;
|
|
1328
|
+
C_BLOB_IT cblob_it;
|
|
1329
|
+
C_BLOB *cblob;
|
|
1330
|
+
TBOX box;
|
|
1331
|
+
inT16 prev_box_right;
|
|
1332
|
+
inT16 gap_width;
|
|
1333
|
+
inT16 min_inter_word_gap;
|
|
1334
|
+
inT16 max_inter_char_gap;
|
|
1335
|
+
|
|
1336
|
+
/* Find rows to process */
|
|
1337
|
+
|
|
1338
|
+
for (block_it.mark_cycle_pt();
|
|
1339
|
+
!block_it.cycled_list(); block_it.forward()) {
|
|
1340
|
+
block_idx++;
|
|
1341
|
+
block = block_it.data();
|
|
1342
|
+
if (block->bounding_box().overlap(selection_box)) {
|
|
1343
|
+
row_it.set_to_list(block->row_list());
|
|
1344
|
+
row_idx = 0;
|
|
1345
|
+
for (row_it.mark_cycle_pt();
|
|
1346
|
+
!row_it.cycled_list(); row_it.forward()) {
|
|
1347
|
+
row_idx++;
|
|
1348
|
+
row = row_it.data();
|
|
1349
|
+
if (row->bounding_box().overlap(selection_box)) {
|
|
1350
|
+
/* Process a row */
|
|
1351
|
+
|
|
1352
|
+
tprintf("\nBlock %d Row %d\n", block_idx, row_idx);
|
|
1353
|
+
min_inter_word_gap = 3000;
|
|
1354
|
+
max_inter_char_gap = 0;
|
|
1355
|
+
prev_box_right = -1;
|
|
1356
|
+
all_gap_stats.clear();
|
|
1357
|
+
word_it.set_to_list(row->word_list());
|
|
1358
|
+
for (word_it.mark_cycle_pt();
|
|
1359
|
+
!word_it.cycled_list(); word_it.forward()) {
|
|
1360
|
+
word = word_it.data();
|
|
1361
|
+
if (word->flag(W_POLYGON)) {
|
|
1362
|
+
blob_it.set_to_list(word->blob_list());
|
|
1363
|
+
for (blob_it.mark_cycle_pt();
|
|
1364
|
+
!blob_it.cycled_list(); blob_it.forward()) {
|
|
1365
|
+
blob = blob_it.data();
|
|
1366
|
+
box = blob->bounding_box();
|
|
1367
|
+
if (prev_box_right > -1) {
|
|
1368
|
+
gap_width = box.left() - prev_box_right;
|
|
1369
|
+
all_gap_stats.add(gap_width, 1);
|
|
1370
|
+
if (blob_it.at_first()) {
|
|
1371
|
+
if (gap_width < min_inter_word_gap)
|
|
1372
|
+
min_inter_word_gap = gap_width;
|
|
1373
|
+
}
|
|
1374
|
+
else {
|
|
1375
|
+
if (gap_width > max_inter_char_gap)
|
|
1376
|
+
max_inter_char_gap = gap_width;
|
|
1377
|
+
}
|
|
1378
|
+
}
|
|
1379
|
+
prev_box_right = box.right();
|
|
1380
|
+
}
|
|
1381
|
+
}
|
|
1382
|
+
else {
|
|
1383
|
+
cblob_it.set_to_list(word->cblob_list());
|
|
1384
|
+
for (cblob_it.mark_cycle_pt();
|
|
1385
|
+
!cblob_it.cycled_list(); cblob_it.forward()) {
|
|
1386
|
+
cblob = cblob_it.data();
|
|
1387
|
+
box = cblob->bounding_box();
|
|
1388
|
+
if (prev_box_right > -1) {
|
|
1389
|
+
gap_width = box.left() - prev_box_right;
|
|
1390
|
+
all_gap_stats.add(gap_width, 1);
|
|
1391
|
+
if (cblob_it.at_first()) {
|
|
1392
|
+
if (gap_width < min_inter_word_gap)
|
|
1393
|
+
min_inter_word_gap = gap_width;
|
|
1394
|
+
}
|
|
1395
|
+
else {
|
|
1396
|
+
if (gap_width > max_inter_char_gap)
|
|
1397
|
+
max_inter_char_gap = gap_width;
|
|
1398
|
+
}
|
|
1399
|
+
}
|
|
1400
|
+
prev_box_right = box.right();
|
|
1401
|
+
}
|
|
1402
|
+
}
|
|
1403
|
+
}
|
|
1404
|
+
tprintf
|
|
1405
|
+
("Max inter char gap = %d.\nMin inter word gap = %d.\n",
|
|
1406
|
+
max_inter_char_gap, min_inter_word_gap);
|
|
1407
|
+
all_gap_stats.short_print(NULL, TRUE);
|
|
1408
|
+
all_gap_stats.smooth(2);
|
|
1409
|
+
tprintf("SMOOTHED DATA...\n");
|
|
1410
|
+
all_gap_stats.short_print(NULL, TRUE);
|
|
1411
|
+
}
|
|
1412
|
+
}
|
|
1413
|
+
}
|
|
1414
|
+
}
|
|
1415
|
+
}
|
|
1416
|
+
|
|
1417
|
+
|
|
1418
|
+
/**********************************************************************
|
|
1419
|
+
* show_point()
|
|
1420
|
+
*
|
|
1421
|
+
* Show coords of point, blob bounding box, word bounding box and offset from
|
|
1422
|
+
* row baseline
|
|
1423
|
+
**********************************************************************/
|
|
1424
|
+
|
|
1425
|
+
void show_point( // display posn of bloba word
|
|
1426
|
+
BLOCK_LIST *block_list, // blocks to check
|
|
1427
|
+
float x,
|
|
1428
|
+
float y) {
|
|
1429
|
+
FCOORD pt(x, y);
|
|
1430
|
+
TBOX box;
|
|
1431
|
+
BLOCK_IT block_it(block_list);
|
|
1432
|
+
BLOCK *block;
|
|
1433
|
+
ROW_IT row_it;
|
|
1434
|
+
ROW *row;
|
|
1435
|
+
WERD_IT word_it;
|
|
1436
|
+
WERD *word;
|
|
1437
|
+
PBLOB_IT blob_it;
|
|
1438
|
+
PBLOB *blob;
|
|
1439
|
+
C_BLOB_IT cblob_it;
|
|
1440
|
+
C_BLOB *cblob;
|
|
1441
|
+
|
|
1442
|
+
char msg[160];
|
|
1443
|
+
char *msg_ptr = msg;
|
|
1444
|
+
|
|
1445
|
+
msg_ptr += sprintf(msg_ptr, "Pt:(%0.3f, %0.3f) ", x, y);
|
|
1446
|
+
|
|
1447
|
+
for (block_it.mark_cycle_pt();
|
|
1448
|
+
!block_it.cycled_list(); block_it.forward()) {
|
|
1449
|
+
block = block_it.data();
|
|
1450
|
+
if (block->bounding_box().contains(pt)) {
|
|
1451
|
+
row_it.set_to_list(block->row_list());
|
|
1452
|
+
for (row_it.mark_cycle_pt();
|
|
1453
|
+
!row_it.cycled_list(); row_it.forward()) {
|
|
1454
|
+
row = row_it.data();
|
|
1455
|
+
if (row->bounding_box().contains(pt)) {
|
|
1456
|
+
msg_ptr += sprintf(msg_ptr, "BL(x)=%0.3f ",
|
|
1457
|
+
row->base_line(x));
|
|
1458
|
+
|
|
1459
|
+
word_it.set_to_list(row->word_list());
|
|
1460
|
+
for (word_it.mark_cycle_pt();
|
|
1461
|
+
!word_it.cycled_list(); word_it.forward()) {
|
|
1462
|
+
word = word_it.data();
|
|
1463
|
+
box = word->bounding_box();
|
|
1464
|
+
if (box.contains(pt)) {
|
|
1465
|
+
msg_ptr += sprintf(msg_ptr,
|
|
1466
|
+
"Wd(%d, %d)/(%d, %d) ",
|
|
1467
|
+
box.left(), box.bottom(),
|
|
1468
|
+
box.right(), box.top());
|
|
1469
|
+
|
|
1470
|
+
if (word->flag(W_POLYGON)) {
|
|
1471
|
+
blob_it.set_to_list(word->blob_list());
|
|
1472
|
+
for (blob_it.mark_cycle_pt();
|
|
1473
|
+
!blob_it.cycled_list();
|
|
1474
|
+
blob_it.forward()) {
|
|
1475
|
+
blob = blob_it.data();
|
|
1476
|
+
box = blob->bounding_box();
|
|
1477
|
+
if (box.contains(pt)) {
|
|
1478
|
+
msg_ptr += sprintf(msg_ptr,
|
|
1479
|
+
"Blb(%d, %d)/(%d, %d) ",
|
|
1480
|
+
box.left(),
|
|
1481
|
+
box.bottom(),
|
|
1482
|
+
box.right(),
|
|
1483
|
+
box.top());
|
|
1484
|
+
}
|
|
1485
|
+
}
|
|
1486
|
+
}
|
|
1487
|
+
else {
|
|
1488
|
+
cblob_it.set_to_list(word->cblob_list());
|
|
1489
|
+
for (cblob_it.mark_cycle_pt();
|
|
1490
|
+
!cblob_it.cycled_list();
|
|
1491
|
+
cblob_it.forward()) {
|
|
1492
|
+
cblob = cblob_it.data();
|
|
1493
|
+
box = cblob->bounding_box();
|
|
1494
|
+
if (box.contains(pt)) {
|
|
1495
|
+
msg_ptr += sprintf(msg_ptr,
|
|
1496
|
+
"CBlb(%d, %d)/(%d, %d) ",
|
|
1497
|
+
box.left(),
|
|
1498
|
+
box.bottom(),
|
|
1499
|
+
box.right(),
|
|
1500
|
+
box.top());
|
|
1501
|
+
}
|
|
1502
|
+
}
|
|
1503
|
+
}
|
|
1504
|
+
}
|
|
1505
|
+
}
|
|
1506
|
+
}
|
|
1507
|
+
}
|
|
1508
|
+
}
|
|
1509
|
+
}
|
|
1510
|
+
image_win->AddMessage(msg);
|
|
1511
|
+
}
|
|
1512
|
+
|
|
1513
|
+
|
|
1514
|
+
/**********************************************************************
|
|
1515
|
+
* WERD PROCESSOR FUNCTIONS
|
|
1516
|
+
* ========================
|
|
1517
|
+
*
|
|
1518
|
+
* These routines are invoked by one or mode of:
|
|
1519
|
+
* process_all_words()
|
|
1520
|
+
* process_selected_words()
|
|
1521
|
+
* or
|
|
1522
|
+
* process_all_words_it()
|
|
1523
|
+
* process_selected_words_it()
|
|
1524
|
+
* for each word to be processed
|
|
1525
|
+
**********************************************************************/
|
|
1526
|
+
|
|
1527
|
+
/**********************************************************************
|
|
1528
|
+
* word_blank_and_set_display() Word processor
|
|
1529
|
+
*
|
|
1530
|
+
* Blank display of word then redisplay word according to current display mode
|
|
1531
|
+
* settings
|
|
1532
|
+
**********************************************************************/
|
|
1533
|
+
|
|
1534
|
+
BOOL8 word_blank_and_set_display( // display a word
|
|
1535
|
+
BLOCK *block, // block holding word
|
|
1536
|
+
ROW *row, // row holding word
|
|
1537
|
+
WERD *word // word to be processed
|
|
1538
|
+
) {
|
|
1539
|
+
word->bounding_box().plot(image_win, ScrollView::BLACK, ScrollView::BLACK);
|
|
1540
|
+
return word_set_display(block, row, word);
|
|
1541
|
+
}
|
|
1542
|
+
|
|
1543
|
+
|
|
1544
|
+
/**********************************************************************
|
|
1545
|
+
* word_bln_display()
|
|
1546
|
+
*
|
|
1547
|
+
* Normalise word and display in word window
|
|
1548
|
+
**********************************************************************/
|
|
1549
|
+
|
|
1550
|
+
BOOL8 word_bln_display( // bln & display
|
|
1551
|
+
BLOCK *, // block holding word
|
|
1552
|
+
ROW *row, // row holding word
|
|
1553
|
+
WERD *word // word to be processed
|
|
1554
|
+
) {
|
|
1555
|
+
WERD *bln_word;
|
|
1556
|
+
|
|
1557
|
+
bln_word = word->poly_copy(row->x_height());
|
|
1558
|
+
bln_word->baseline_normalise(row);
|
|
1559
|
+
bln_word_window_handle()->Clear();
|
|
1560
|
+
display_bln_lines(bln_word_window_handle(), ScrollView::CYAN,
|
|
1561
|
+
1.0, 0.0f, -1000.0f, 1000.0f);
|
|
1562
|
+
bln_word->plot(bln_word_window_handle(), ScrollView::RED);
|
|
1563
|
+
delete bln_word;
|
|
1564
|
+
return TRUE;
|
|
1565
|
+
}
|
|
1566
|
+
|
|
1567
|
+
|
|
1568
|
+
/**********************************************************************
|
|
1569
|
+
* word_change_text()
|
|
1570
|
+
*
|
|
1571
|
+
* Change the correct text of a word
|
|
1572
|
+
**********************************************************************/
|
|
1573
|
+
|
|
1574
|
+
BOOL8 word_change_text( // change correct text
|
|
1575
|
+
BLOCK *block, // block holding word
|
|
1576
|
+
ROW *row, // row holding word
|
|
1577
|
+
WERD *word // word to be processed
|
|
1578
|
+
) {
|
|
1579
|
+
char* cp = image_win->ShowInputDialog(
|
|
1580
|
+
"Enter/edit the correct text and press <<RETURN>>");
|
|
1581
|
+
word->set_text(cp);
|
|
1582
|
+
delete[] cp;
|
|
1583
|
+
|
|
1584
|
+
if (word_display_mode.bit(DF_TEXT) || word->display_flag(DF_TEXT)) {
|
|
1585
|
+
word_blank_and_set_display(block, row, word);
|
|
1586
|
+
ScrollView::Update();
|
|
1587
|
+
}
|
|
1588
|
+
|
|
1589
|
+
*current_image_changed = TRUE;
|
|
1590
|
+
return TRUE;
|
|
1591
|
+
}
|
|
1592
|
+
|
|
1593
|
+
|
|
1594
|
+
/**********************************************************************
|
|
1595
|
+
* word_copy()
|
|
1596
|
+
*
|
|
1597
|
+
* Copy a word to other display list
|
|
1598
|
+
**********************************************************************/
|
|
1599
|
+
|
|
1600
|
+
BOOL8 word_copy( // copy a word
|
|
1601
|
+
BLOCK *block, // block holding word
|
|
1602
|
+
ROW *row, // row holding word
|
|
1603
|
+
WERD *word // word to be processed
|
|
1604
|
+
) {
|
|
1605
|
+
WERD *copy_word = new WERD;
|
|
1606
|
+
|
|
1607
|
+
*copy_word = *word;
|
|
1608
|
+
add_word(copy_word, row, block, other_block_list);
|
|
1609
|
+
*other_image_changed = TRUE;
|
|
1610
|
+
return TRUE;
|
|
1611
|
+
}
|
|
1612
|
+
|
|
1613
|
+
|
|
1614
|
+
/**********************************************************************
|
|
1615
|
+
* word_delete()
|
|
1616
|
+
*
|
|
1617
|
+
* Delete a word
|
|
1618
|
+
**********************************************************************/
|
|
1619
|
+
|
|
1620
|
+
BOOL8 word_delete( // delete a word
|
|
1621
|
+
BLOCK *block, // block holding word
|
|
1622
|
+
ROW *row, // row holding word
|
|
1623
|
+
WERD *word, // word to be processed
|
|
1624
|
+
BLOCK_IT &block_it, // block list iterator
|
|
1625
|
+
ROW_IT &row_it, // row list iterator
|
|
1626
|
+
WERD_IT &word_it // word list iterator
|
|
1627
|
+
) {
|
|
1628
|
+
word_it.extract();
|
|
1629
|
+
word->bounding_box().plot(image_win, ScrollView::BLACK, ScrollView::BLACK);
|
|
1630
|
+
delete(word);
|
|
1631
|
+
|
|
1632
|
+
if (word_it.empty()) { // no words left in row
|
|
1633
|
+
// so delete row
|
|
1634
|
+
row_it.extract();
|
|
1635
|
+
row->bounding_box().plot(image_win, ScrollView::BLACK, ScrollView::BLACK);
|
|
1636
|
+
delete(row);
|
|
1637
|
+
|
|
1638
|
+
if (row_it.empty()) { // no rows left in blk
|
|
1639
|
+
// so delete block
|
|
1640
|
+
block_it.extract();
|
|
1641
|
+
block->bounding_box().plot(image_win, ScrollView::BLACK, ScrollView::BLACK);
|
|
1642
|
+
delete(block);
|
|
1643
|
+
}
|
|
1644
|
+
}
|
|
1645
|
+
*current_image_changed = TRUE;
|
|
1646
|
+
return TRUE;
|
|
1647
|
+
}
|
|
1648
|
+
|
|
1649
|
+
|
|
1650
|
+
/**********************************************************************
|
|
1651
|
+
* word_display() Word Processor
|
|
1652
|
+
*
|
|
1653
|
+
* Display a word according to its display modes
|
|
1654
|
+
**********************************************************************/
|
|
1655
|
+
|
|
1656
|
+
BOOL8 word_display( // display a word
|
|
1657
|
+
BLOCK *, // block holding word
|
|
1658
|
+
ROW *row, // row holding word
|
|
1659
|
+
WERD *word // word to be processed
|
|
1660
|
+
) {
|
|
1661
|
+
TBOX word_bb; // word bounding box
|
|
1662
|
+
int word_height; // ht of word BB
|
|
1663
|
+
BOOL8 displayed_something = FALSE;
|
|
1664
|
+
BOOL8 displayed_rainbow = FALSE;
|
|
1665
|
+
float shift; // from bot left
|
|
1666
|
+
PBLOB_IT it; // blob iterator
|
|
1667
|
+
C_BLOB_IT c_it; // cblob iterator
|
|
1668
|
+
WERD *word_ptr; // poly copy
|
|
1669
|
+
WERD temp_word;
|
|
1670
|
+
float scale_factor; // for BN_POLYGON
|
|
1671
|
+
|
|
1672
|
+
/*
|
|
1673
|
+
Note the double coercions of(COLOUR)((inT32)editor_image_word_bb_color)
|
|
1674
|
+
etc. are to keep the compiler happy.
|
|
1675
|
+
*/
|
|
1676
|
+
|
|
1677
|
+
// display bounding box
|
|
1678
|
+
if (word->display_flag(DF_BOX)) {
|
|
1679
|
+
word->bounding_box().plot(image_win,
|
|
1680
|
+
(ScrollView::Color)((inT32)
|
|
1681
|
+
editor_image_word_bb_color),
|
|
1682
|
+
(ScrollView::Color)((inT32)
|
|
1683
|
+
editor_image_word_bb_color));
|
|
1684
|
+
|
|
1685
|
+
ScrollView::Color c = (ScrollView::Color)
|
|
1686
|
+
((inT32) editor_image_blob_bb_color);
|
|
1687
|
+
image_win->Pen(c);
|
|
1688
|
+
if (word->flag(W_POLYGON)) {
|
|
1689
|
+
it.set_to_list(word->blob_list());
|
|
1690
|
+
for (it.mark_cycle_pt(); !it.cycled_list(); it.forward())
|
|
1691
|
+
it.data()->bounding_box().plot(image_win);
|
|
1692
|
+
}
|
|
1693
|
+
else {
|
|
1694
|
+
c_it.set_to_list(word->cblob_list());
|
|
1695
|
+
for (c_it.mark_cycle_pt(); !c_it.cycled_list(); c_it.forward())
|
|
1696
|
+
c_it.data()->bounding_box().plot(image_win);
|
|
1697
|
+
}
|
|
1698
|
+
displayed_something = TRUE;
|
|
1699
|
+
}
|
|
1700
|
+
|
|
1701
|
+
// display edge steps
|
|
1702
|
+
if (word->display_flag(DF_EDGE_STEP) &&
|
|
1703
|
+
!word->flag(W_POLYGON)) { // edgesteps available
|
|
1704
|
+
word->plot(image_win); // rainbow colors
|
|
1705
|
+
displayed_something = TRUE;
|
|
1706
|
+
displayed_rainbow = TRUE;
|
|
1707
|
+
}
|
|
1708
|
+
|
|
1709
|
+
// display poly approx
|
|
1710
|
+
if (word->display_flag(DF_POLYGONAL)) {
|
|
1711
|
+
// need to convert
|
|
1712
|
+
if (!word->flag(W_POLYGON)) {
|
|
1713
|
+
word_ptr = word->poly_copy(row->x_height());
|
|
1714
|
+
|
|
1715
|
+
/* CALL POLYGONAL APPROXIMATOR WHEN AVAILABLE - on a temp_word */
|
|
1716
|
+
|
|
1717
|
+
if (displayed_rainbow)
|
|
1718
|
+
// ensure its visible
|
|
1719
|
+
word_ptr->plot(image_win, ScrollView::WHITE);
|
|
1720
|
+
else
|
|
1721
|
+
// rainbow colors
|
|
1722
|
+
word_ptr->plot(image_win);
|
|
1723
|
+
delete word_ptr;
|
|
1724
|
+
}
|
|
1725
|
+
else {
|
|
1726
|
+
if (displayed_rainbow)
|
|
1727
|
+
// ensure its visible
|
|
1728
|
+
word->plot(image_win, ScrollView::WHITE);
|
|
1729
|
+
else
|
|
1730
|
+
word->plot(image_win); // rainbow colors
|
|
1731
|
+
}
|
|
1732
|
+
|
|
1733
|
+
displayed_rainbow = TRUE;
|
|
1734
|
+
displayed_something = TRUE;
|
|
1735
|
+
}
|
|
1736
|
+
|
|
1737
|
+
// disp BN poly approx
|
|
1738
|
+
if (word->display_flag(DF_BN_POLYGONAL)) {
|
|
1739
|
+
// need to convert
|
|
1740
|
+
if (!word->flag(W_POLYGON)) {
|
|
1741
|
+
word_ptr = word->poly_copy(row->x_height());
|
|
1742
|
+
temp_word = *word_ptr;
|
|
1743
|
+
delete word_ptr;
|
|
1744
|
+
|
|
1745
|
+
/* CALL POLYGONAL APPROXIMATOR WHEN AVAILABLE - on a temp_word */
|
|
1746
|
+
|
|
1747
|
+
}
|
|
1748
|
+
else
|
|
1749
|
+
temp_word = *word; // copy word
|
|
1750
|
+
word_bb = word->bounding_box();
|
|
1751
|
+
if (!temp_word.flag(W_NORMALIZED))
|
|
1752
|
+
temp_word.baseline_normalise(row);
|
|
1753
|
+
|
|
1754
|
+
scale_factor = re_scale_and_move_bln_word(&temp_word, word_bb);
|
|
1755
|
+
display_bln_lines(image_win, ScrollView::CYAN, scale_factor,
|
|
1756
|
+
word_bb.bottom(), word_bb.left(), word_bb.right());
|
|
1757
|
+
|
|
1758
|
+
if (displayed_rainbow)
|
|
1759
|
+
// ensure its visible
|
|
1760
|
+
temp_word.plot(image_win, ScrollView::WHITE);
|
|
1761
|
+
else
|
|
1762
|
+
temp_word.plot(image_win); // rainbow colors
|
|
1763
|
+
|
|
1764
|
+
displayed_rainbow = TRUE;
|
|
1765
|
+
displayed_something = TRUE;
|
|
1766
|
+
}
|
|
1767
|
+
|
|
1768
|
+
// display correct text
|
|
1769
|
+
if (word->display_flag(DF_TEXT)) {
|
|
1770
|
+
word_bb = word->bounding_box();
|
|
1771
|
+
ScrollView::Color c =(ScrollView::Color)
|
|
1772
|
+
((inT32) editor_image_blob_bb_color);
|
|
1773
|
+
image_win->Pen(c);
|
|
1774
|
+
word_height = word_bb.height();
|
|
1775
|
+
image_win->TextAttributes("Times", 0.75 * word_height,
|
|
1776
|
+
false, false, false);
|
|
1777
|
+
if (word_height < word_bb.width())
|
|
1778
|
+
shift = 0.25 * word_height;
|
|
1779
|
+
else
|
|
1780
|
+
shift = 0.0f;
|
|
1781
|
+
|
|
1782
|
+
image_win->Text(word_bb.left() + shift,
|
|
1783
|
+
word_bb.bottom() + 0.25 * word_height, word->text());
|
|
1784
|
+
|
|
1785
|
+
if (strlen(word->text()) > 0)
|
|
1786
|
+
displayed_something = TRUE;
|
|
1787
|
+
}
|
|
1788
|
+
|
|
1789
|
+
if (!displayed_something) // display BBox anyway
|
|
1790
|
+
word->bounding_box().plot(image_win,
|
|
1791
|
+
(ScrollView::Color)((inT32) editor_image_word_bb_color),
|
|
1792
|
+
(ScrollView::Color)((inT32)
|
|
1793
|
+
editor_image_word_bb_color));
|
|
1794
|
+
return TRUE;
|
|
1795
|
+
}
|
|
1796
|
+
|
|
1797
|
+
|
|
1798
|
+
/**********************************************************************
|
|
1799
|
+
* word_dumper()
|
|
1800
|
+
*
|
|
1801
|
+
* Dump members to the debug window
|
|
1802
|
+
**********************************************************************/
|
|
1803
|
+
|
|
1804
|
+
BOOL8 word_dumper( // dump word
|
|
1805
|
+
BLOCK *block, // block holding word
|
|
1806
|
+
ROW *row, // row holding word
|
|
1807
|
+
WERD *word // word to be processed
|
|
1808
|
+
) {
|
|
1809
|
+
|
|
1810
|
+
tprintf("\nBlock data...\n");
|
|
1811
|
+
block->print(NULL, FALSE);
|
|
1812
|
+
tprintf("\nRow data...\n");
|
|
1813
|
+
row->print(NULL);
|
|
1814
|
+
tprintf("\nWord data...\n");
|
|
1815
|
+
word->print(NULL);
|
|
1816
|
+
return TRUE;
|
|
1817
|
+
}
|
|
1818
|
+
|
|
1819
|
+
|
|
1820
|
+
/**********************************************************************
|
|
1821
|
+
* word_set_display() Word processor
|
|
1822
|
+
*
|
|
1823
|
+
* Display word according to current display mode settings
|
|
1824
|
+
**********************************************************************/
|
|
1825
|
+
|
|
1826
|
+
BOOL8 word_set_display( // display a word
|
|
1827
|
+
BLOCK *block, // block holding word
|
|
1828
|
+
ROW *row, // row holding word
|
|
1829
|
+
WERD *word // word to be processed
|
|
1830
|
+
) {
|
|
1831
|
+
TBOX word_bb; // word bounding box
|
|
1832
|
+
|
|
1833
|
+
word->set_display_flag(DF_BOX, word_display_mode.bit(DF_BOX));
|
|
1834
|
+
word->set_display_flag(DF_TEXT, word_display_mode.bit(DF_TEXT));
|
|
1835
|
+
word->set_display_flag(DF_POLYGONAL, word_display_mode.bit(DF_POLYGONAL));
|
|
1836
|
+
word->set_display_flag(DF_EDGE_STEP, word_display_mode.bit(DF_EDGE_STEP));
|
|
1837
|
+
word->set_display_flag(DF_BN_POLYGONAL,
|
|
1838
|
+
word_display_mode.bit(DF_BN_POLYGONAL));
|
|
1839
|
+
*current_image_changed = TRUE;
|
|
1840
|
+
return word_display(block, row, word);
|
|
1841
|
+
}
|
|
1842
|
+
|
|
1843
|
+
|
|
1844
|
+
/**********************************************************************
|
|
1845
|
+
* word_toggle_seg()
|
|
1846
|
+
*
|
|
1847
|
+
* Toggle the correct segmentation flag
|
|
1848
|
+
**********************************************************************/
|
|
1849
|
+
|
|
1850
|
+
BOOL8 word_toggle_seg( // toggle seg flag
|
|
1851
|
+
BLOCK *, // block holding word
|
|
1852
|
+
ROW *, // row holding word
|
|
1853
|
+
WERD *word // word to be processed
|
|
1854
|
+
) {
|
|
1855
|
+
word->set_flag(W_SEGMENTED, !word->flag(W_SEGMENTED));
|
|
1856
|
+
*current_image_changed = TRUE;
|
|
1857
|
+
return TRUE;
|
|
1858
|
+
}
|
|
1859
|
+
|
|
1860
|
+
#endif // GRAPHICS_DISABLED
|
|
1861
|
+
|
|
1862
|
+
/* DEBUG ONLY */
|
|
1863
|
+
|
|
1864
|
+
void do_check_mem( // do it
|
|
1865
|
+
inT32 level) {
|
|
1866
|
+
check_mem("Doing it", level);
|
|
1867
|
+
}
|