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,1823 @@
|
|
|
1
|
+
/******************************************************************************
|
|
2
|
+
** Filename: intproto.c
|
|
3
|
+
** Purpose: Definition of data structures for integer protos.
|
|
4
|
+
** Author: Dan Johnson
|
|
5
|
+
** History: Thu Feb 7 14:38:16 1991, DSJ, Created.
|
|
6
|
+
**
|
|
7
|
+
** (c) Copyright Hewlett-Packard Company, 1988.
|
|
8
|
+
** Licensed under the Apache License, Version 2.0 (the "License");
|
|
9
|
+
** you may not use this file except in compliance with the License.
|
|
10
|
+
** You may obtain a copy of the License at
|
|
11
|
+
** http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
** Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
** distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
** See the License for the specific language governing permissions and
|
|
16
|
+
** limitations under the License.
|
|
17
|
+
******************************************************************************/
|
|
18
|
+
/**----------------------------------------------------------------------------
|
|
19
|
+
Include Files and Type Defines
|
|
20
|
+
----------------------------------------------------------------------------**/
|
|
21
|
+
#include "intproto.h"
|
|
22
|
+
#include "picofeat.h"
|
|
23
|
+
#include "debug.h"
|
|
24
|
+
#include "mfoutline.h"
|
|
25
|
+
#include "emalloc.h"
|
|
26
|
+
#include "const.h"
|
|
27
|
+
#include "ndminx.h"
|
|
28
|
+
#include "svmnode.h"
|
|
29
|
+
#include "adaptmatch.h"
|
|
30
|
+
#include "globals.h"
|
|
31
|
+
|
|
32
|
+
//extern GetPicoFeatureLength();
|
|
33
|
+
|
|
34
|
+
#include <math.h>
|
|
35
|
+
#include <stdio.h>
|
|
36
|
+
#include <assert.h>
|
|
37
|
+
#ifdef __UNIX__
|
|
38
|
+
#include <unistd.h>
|
|
39
|
+
#endif
|
|
40
|
+
|
|
41
|
+
/* match debug display constants*/
|
|
42
|
+
#define DISPLAY_OFFSET (0.5 * INT_CHAR_NORM_RANGE)
|
|
43
|
+
#define PROTO_PRUNER_SCALE (4.0)
|
|
44
|
+
|
|
45
|
+
#define INT_DESCENDER (0.0 * INT_CHAR_NORM_RANGE - DISPLAY_OFFSET)
|
|
46
|
+
#define INT_BASELINE (0.25 * INT_CHAR_NORM_RANGE - DISPLAY_OFFSET)
|
|
47
|
+
#define INT_XHEIGHT (0.75 * INT_CHAR_NORM_RANGE - DISPLAY_OFFSET)
|
|
48
|
+
#define INT_CAPHEIGHT (1.0 * INT_CHAR_NORM_RANGE - DISPLAY_OFFSET)
|
|
49
|
+
|
|
50
|
+
#define INT_XCENTER (0.5 * INT_CHAR_NORM_RANGE - DISPLAY_OFFSET)
|
|
51
|
+
#define INT_YCENTER (0.5 * INT_CHAR_NORM_RANGE - DISPLAY_OFFSET)
|
|
52
|
+
#define INT_XRADIUS (0.2 * INT_CHAR_NORM_RANGE)
|
|
53
|
+
#define INT_YRADIUS (0.2 * INT_CHAR_NORM_RANGE)
|
|
54
|
+
#define INT_MIN_X (- DISPLAY_OFFSET)
|
|
55
|
+
#define INT_MIN_Y (- DISPLAY_OFFSET)
|
|
56
|
+
#define INT_MAX_X ( DISPLAY_OFFSET)
|
|
57
|
+
#define INT_MAX_Y ( DISPLAY_OFFSET)
|
|
58
|
+
#define DOUBLE_OFFSET 0.095
|
|
59
|
+
|
|
60
|
+
/* define pad used to snap near horiz/vertical protos to horiz/vertical */
|
|
61
|
+
#define HV_TOLERANCE (0.0025) /* approx 0.9 degrees */
|
|
62
|
+
|
|
63
|
+
typedef enum
|
|
64
|
+
{ StartSwitch, EndSwitch, LastSwitch }
|
|
65
|
+
SWITCH_TYPE;
|
|
66
|
+
#define MAX_NUM_SWITCHES 3
|
|
67
|
+
|
|
68
|
+
typedef struct
|
|
69
|
+
{
|
|
70
|
+
SWITCH_TYPE Type;
|
|
71
|
+
inT8 X, Y;
|
|
72
|
+
inT16 YInit;
|
|
73
|
+
inT16 Delta;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
FILL_SWITCH;
|
|
78
|
+
|
|
79
|
+
typedef struct
|
|
80
|
+
{
|
|
81
|
+
uinT8 NextSwitch;
|
|
82
|
+
uinT8 AngleStart, AngleEnd;
|
|
83
|
+
inT8 X;
|
|
84
|
+
inT16 YStart, YEnd;
|
|
85
|
+
inT16 StartDelta, EndDelta;
|
|
86
|
+
FILL_SWITCH Switch[MAX_NUM_SWITCHES];
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
TABLE_FILLER;
|
|
91
|
+
|
|
92
|
+
typedef struct
|
|
93
|
+
{
|
|
94
|
+
inT8 X;
|
|
95
|
+
inT8 YStart, YEnd;
|
|
96
|
+
uinT8 AngleStart, AngleEnd;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
FILL_SPEC;
|
|
101
|
+
|
|
102
|
+
enum IntmatcherDebugAction {
|
|
103
|
+
IDA_ADAPTIVE,
|
|
104
|
+
IDA_STATIC,
|
|
105
|
+
IDA_BOTH
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
/**----------------------------------------------------------------------------
|
|
109
|
+
Macros
|
|
110
|
+
----------------------------------------------------------------------------**/
|
|
111
|
+
/* macro for performing circular increments of bucket indices */
|
|
112
|
+
#define CircularIncrement(i,r) (((i) < (r) - 1)?((i)++):((i) = 0))
|
|
113
|
+
|
|
114
|
+
/* macro for mapping floats to ints without bounds checking */
|
|
115
|
+
#define MapParam(P,O,N) (floor (((P) + (O)) * (N)))
|
|
116
|
+
|
|
117
|
+
/*---------------------------------------------------------------------------
|
|
118
|
+
Private Function Prototypes
|
|
119
|
+
----------------------------------------------------------------------------*/
|
|
120
|
+
FLOAT32 BucketStart(int Bucket, FLOAT32 Offset, int NumBuckets);
|
|
121
|
+
|
|
122
|
+
FLOAT32 BucketEnd(int Bucket, FLOAT32 Offset, int NumBuckets);
|
|
123
|
+
|
|
124
|
+
void DoFill(FILL_SPEC *FillSpec,
|
|
125
|
+
CLASS_PRUNER Pruner,
|
|
126
|
+
register uinT32 ClassMask,
|
|
127
|
+
register uinT32 ClassCount,
|
|
128
|
+
register uinT32 WordIndex);
|
|
129
|
+
|
|
130
|
+
BOOL8 FillerDone(TABLE_FILLER *Filler);
|
|
131
|
+
|
|
132
|
+
void FillPPCircularBits (uinT32
|
|
133
|
+
ParamTable[NUM_PP_BUCKETS][WERDS_PER_PP_VECTOR],
|
|
134
|
+
int Bit, FLOAT32 Center, FLOAT32 Spread);
|
|
135
|
+
|
|
136
|
+
void FillPPLinearBits (uinT32 ParamTable[NUM_PP_BUCKETS][WERDS_PER_PP_VECTOR],
|
|
137
|
+
int Bit, FLOAT32 Center, FLOAT32 Spread);
|
|
138
|
+
|
|
139
|
+
#ifndef GRAPHICS_DISABLED
|
|
140
|
+
CLASS_ID GetClassToDebug(const char *Prompt);
|
|
141
|
+
#endif
|
|
142
|
+
|
|
143
|
+
void GetCPPadsForLevel(int Level,
|
|
144
|
+
FLOAT32 *EndPad,
|
|
145
|
+
FLOAT32 *SidePad,
|
|
146
|
+
FLOAT32 *AnglePad);
|
|
147
|
+
|
|
148
|
+
C_COL GetMatchColorFor(FLOAT32 Evidence);
|
|
149
|
+
|
|
150
|
+
void GetNextFill(TABLE_FILLER *Filler, FILL_SPEC *Fill);
|
|
151
|
+
|
|
152
|
+
void InitTableFiller(FLOAT32 EndPad,
|
|
153
|
+
FLOAT32 SidePad,
|
|
154
|
+
FLOAT32 AnglePad,
|
|
155
|
+
PROTO Proto,
|
|
156
|
+
TABLE_FILLER *Filler);
|
|
157
|
+
|
|
158
|
+
#ifndef GRAPHICS_DISABLED
|
|
159
|
+
void RenderIntFeature(void *window, INT_FEATURE Feature, C_COL Color);
|
|
160
|
+
|
|
161
|
+
void RenderIntProto(void *window,
|
|
162
|
+
INT_CLASS Class,
|
|
163
|
+
PROTO_ID ProtoId,
|
|
164
|
+
C_COL Color);
|
|
165
|
+
#endif
|
|
166
|
+
|
|
167
|
+
int TruncateParam(FLOAT32 Param, int Min, int Max, char *Id);
|
|
168
|
+
|
|
169
|
+
/*
|
|
170
|
+
#if defined(__STDC__) || defined(__cplusplus)
|
|
171
|
+
# define _ARGS(s) s
|
|
172
|
+
#else
|
|
173
|
+
# define _ARGS(s) ()
|
|
174
|
+
#endif*/
|
|
175
|
+
|
|
176
|
+
/* /users/danj/wiseowl/src/danj/microfeatures/intproto.c
|
|
177
|
+
FLOAT32 BucketStart
|
|
178
|
+
_ARGS((int Bucket,
|
|
179
|
+
FLOAT32 Offset,
|
|
180
|
+
int NumBuckets));
|
|
181
|
+
|
|
182
|
+
FLOAT32 BucketEnd
|
|
183
|
+
_ARGS((int Bucket,
|
|
184
|
+
FLOAT32 Offset,
|
|
185
|
+
int NumBuckets));
|
|
186
|
+
|
|
187
|
+
void DoFill
|
|
188
|
+
_ARGS((FILL_SPEC *FillSpec,
|
|
189
|
+
CLASS_PRUNER Pruner,
|
|
190
|
+
uinT32 ClassMask,
|
|
191
|
+
uinT32 ClassCount,
|
|
192
|
+
uinT32 WordIndex));
|
|
193
|
+
|
|
194
|
+
BOOL8 FillerDone
|
|
195
|
+
_ARGS((TABLE_FILLER *Filler));
|
|
196
|
+
|
|
197
|
+
void FillPPCircularBits
|
|
198
|
+
_ARGS((uinT32 ParamTable [NUM_PP_BUCKETS ][WERDS_PER_PP_VECTOR ],
|
|
199
|
+
int Bit,
|
|
200
|
+
FLOAT32 Center,
|
|
201
|
+
FLOAT32 Spread));
|
|
202
|
+
|
|
203
|
+
void FillPPLinearBits
|
|
204
|
+
_ARGS((uinT32 ParamTable [NUM_PP_BUCKETS ][WERDS_PER_PP_VECTOR ],
|
|
205
|
+
int Bit,
|
|
206
|
+
FLOAT32 Center,
|
|
207
|
+
FLOAT32 Spread));
|
|
208
|
+
|
|
209
|
+
void GetCPPadsForLevel
|
|
210
|
+
_ARGS((int Level,
|
|
211
|
+
FLOAT32 *EndPad,
|
|
212
|
+
FLOAT32 *SidePad,
|
|
213
|
+
FLOAT32 *AnglePad));
|
|
214
|
+
|
|
215
|
+
C_COL GetMatchColorFor
|
|
216
|
+
_ARGS((FLOAT32 Evidence));
|
|
217
|
+
|
|
218
|
+
void GetNextFill
|
|
219
|
+
_ARGS((TABLE_FILLER *Filler,
|
|
220
|
+
FILL_SPEC *Fill));
|
|
221
|
+
|
|
222
|
+
void InitTableFiller
|
|
223
|
+
_ARGS((FLOAT32 EndPad,
|
|
224
|
+
FLOAT32 SidePad,
|
|
225
|
+
FLOAT32 AnglePad,
|
|
226
|
+
PROTO Proto,
|
|
227
|
+
TABLE_FILLER *Filler));
|
|
228
|
+
|
|
229
|
+
void RenderIntFeature
|
|
230
|
+
_ARGS((SHAPE_LIST ShapeList,
|
|
231
|
+
INT_FEATURE Feature,
|
|
232
|
+
char *Color));
|
|
233
|
+
|
|
234
|
+
void RenderIntProto
|
|
235
|
+
_ARGS((SHAPE_LIST ShapeList,
|
|
236
|
+
INT_CLASS Class,
|
|
237
|
+
PROTO_ID ProtoId,
|
|
238
|
+
char *Color));
|
|
239
|
+
|
|
240
|
+
int TruncateParam
|
|
241
|
+
_ARGS((FLOAT32 Param,
|
|
242
|
+
int Min,
|
|
243
|
+
int Max,
|
|
244
|
+
char *Id));
|
|
245
|
+
|
|
246
|
+
#undef _ARGS
|
|
247
|
+
*/
|
|
248
|
+
|
|
249
|
+
/**----------------------------------------------------------------------------
|
|
250
|
+
Global Data Definitions and Declarations
|
|
251
|
+
----------------------------------------------------------------------------**/
|
|
252
|
+
/* control knobs */
|
|
253
|
+
make_int_const (NumCPLevels, 3, MakeNumCPLevels);
|
|
254
|
+
make_float_const (CPAnglePadLoose, 45.0, MakeCPAnglePadLoose);
|
|
255
|
+
make_float_const (CPAnglePadMedium, 20.0, MakeCPAnglePadMedium);
|
|
256
|
+
make_float_const (CPAnglePadTight, 10.0, MakeCPAnglePadTight);
|
|
257
|
+
make_float_const (CPEndPadLoose, 0.5, MakeCPEndPadLoose);
|
|
258
|
+
make_float_const (CPEndPadMedium, 0.5, MakeCPEndPadMedium);
|
|
259
|
+
make_float_const (CPEndPadTight, 0.5, MakeCPEndPadTight);
|
|
260
|
+
make_float_const (CPSidePadLoose, 2.5, MakeCPSidePadLoose);
|
|
261
|
+
make_float_const (CPSidePadMedium, 1.2, MakeCPSidePadMedium);
|
|
262
|
+
make_float_const (CPSidePadTight, 0.6, MakeCPSidePadTight);
|
|
263
|
+
make_float_const (PPAnglePad, 45.0, MakePPAnglePad);
|
|
264
|
+
make_float_const (PPEndPad, 0.5, MakePPEndPad);
|
|
265
|
+
make_float_const (PPSidePad, 2.5, MakePPSidePad);
|
|
266
|
+
|
|
267
|
+
/* global display lists used to display proto and feature match information*/
|
|
268
|
+
ScrollView *IntMatchWindow = NULL;
|
|
269
|
+
//extern int LearningDebugLevel;
|
|
270
|
+
|
|
271
|
+
/**----------------------------------------------------------------------------
|
|
272
|
+
Public Code
|
|
273
|
+
----------------------------------------------------------------------------**/
|
|
274
|
+
/*---------------------------------------------------------------------------*/
|
|
275
|
+
int AddIntClass(INT_TEMPLATES Templates, CLASS_ID ClassId, INT_CLASS Class) {
|
|
276
|
+
/*
|
|
277
|
+
** Parameters:
|
|
278
|
+
** Templates templates to add new class to
|
|
279
|
+
** ClassId class id to associate new class with
|
|
280
|
+
** Class class data structure to add to templates
|
|
281
|
+
** Globals: none
|
|
282
|
+
** Operation: This routine adds a new class structure to a set of
|
|
283
|
+
** templates.
|
|
284
|
+
** Return: The class index of the new class.
|
|
285
|
+
** Exceptions: none
|
|
286
|
+
** History: Mon Feb 11 11:52:08 1991, DSJ, Created.
|
|
287
|
+
*/
|
|
288
|
+
int Index;
|
|
289
|
+
int Pruner;
|
|
290
|
+
uinT32 *Word;
|
|
291
|
+
|
|
292
|
+
assert (LegalClassId (ClassId));
|
|
293
|
+
assert (UnusedClassIdIn (Templates, ClassId));
|
|
294
|
+
|
|
295
|
+
Index = Templates->NumClasses;
|
|
296
|
+
Templates->IndexFor[ClassId] = Index;
|
|
297
|
+
Templates->ClassIdFor[Index] = ClassId;
|
|
298
|
+
|
|
299
|
+
Templates->NumClasses++;
|
|
300
|
+
Templates->Class[Index] = Class;
|
|
301
|
+
|
|
302
|
+
if (Templates->NumClasses > MaxNumClassesIn (Templates)) {
|
|
303
|
+
Pruner = Templates->NumClassPruners;
|
|
304
|
+
Templates->NumClassPruners++;
|
|
305
|
+
Templates->ClassPruner[Pruner] =
|
|
306
|
+
(CLASS_PRUNER) Emalloc (sizeof (CLASS_PRUNER_STRUCT));
|
|
307
|
+
|
|
308
|
+
for (Word = (uinT32 *) (Templates->ClassPruner[Pruner]);
|
|
309
|
+
Word < (uinT32 *) (Templates->ClassPruner[Pruner]) + WERDS_PER_CP;
|
|
310
|
+
*Word++ = 0);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
return (Index);
|
|
314
|
+
|
|
315
|
+
} /* AddIntClass */
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
/*---------------------------------------------------------------------------*/
|
|
319
|
+
int AddIntConfig(INT_CLASS Class) {
|
|
320
|
+
/*
|
|
321
|
+
** Parameters:
|
|
322
|
+
** Class class to add new configuration to
|
|
323
|
+
** Globals: none
|
|
324
|
+
** Operation: This routine returns the index of the next free config
|
|
325
|
+
** in Class.
|
|
326
|
+
** Return: Index of next free config.
|
|
327
|
+
** Exceptions: none
|
|
328
|
+
** History: Mon Feb 11 14:44:40 1991, DSJ, Created.
|
|
329
|
+
*/
|
|
330
|
+
int Index;
|
|
331
|
+
|
|
332
|
+
assert (Class->NumConfigs < MAX_NUM_CONFIGS);
|
|
333
|
+
|
|
334
|
+
Index = Class->NumConfigs;
|
|
335
|
+
Class->NumConfigs++;
|
|
336
|
+
Class->ConfigLengths[Index] = 0;
|
|
337
|
+
return (Index);
|
|
338
|
+
} /* AddIntConfig */
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
/*---------------------------------------------------------------------------*/
|
|
342
|
+
int AddIntProto(INT_CLASS Class) {
|
|
343
|
+
/*
|
|
344
|
+
** Parameters:
|
|
345
|
+
** Class class to add new proto to
|
|
346
|
+
** Globals: none
|
|
347
|
+
** Operation: This routine allocates the next free proto in Class and
|
|
348
|
+
** returns its index.
|
|
349
|
+
** Return: Proto index of new proto.
|
|
350
|
+
** Exceptions: none
|
|
351
|
+
** History: Mon Feb 11 13:26:41 1991, DSJ, Created.
|
|
352
|
+
*/
|
|
353
|
+
int Index;
|
|
354
|
+
int ProtoSetId;
|
|
355
|
+
PROTO_SET ProtoSet;
|
|
356
|
+
INT_PROTO Proto;
|
|
357
|
+
register uinT32 *Word;
|
|
358
|
+
|
|
359
|
+
if (Class->NumProtos >= MAX_NUM_PROTOS)
|
|
360
|
+
return (NO_PROTO);
|
|
361
|
+
|
|
362
|
+
Index = Class->NumProtos++;
|
|
363
|
+
|
|
364
|
+
if (Class->NumProtos > MaxNumIntProtosIn(Class)) {
|
|
365
|
+
ProtoSetId = Class->NumProtoSets++;
|
|
366
|
+
|
|
367
|
+
ProtoSet = (PROTO_SET) Emalloc (sizeof (PROTO_SET_STRUCT));
|
|
368
|
+
Class->ProtoSets[ProtoSetId] = ProtoSet;
|
|
369
|
+
for (Word = (uinT32 *) (ProtoSet->ProtoPruner);
|
|
370
|
+
Word < (uinT32 *) (ProtoSet->ProtoPruner) + WERDS_PER_PP;
|
|
371
|
+
*Word++ = 0);
|
|
372
|
+
|
|
373
|
+
/* reallocate space for the proto lengths and install in class */
|
|
374
|
+
Class->ProtoLengths = (uinT8 *) Erealloc (Class->ProtoLengths,
|
|
375
|
+
MaxNumIntProtosIn (Class) *
|
|
376
|
+
sizeof (uinT8));
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
/* initialize proto so its length is zero and it isn't in any configs */
|
|
380
|
+
Class->ProtoLengths[Index] = 0;
|
|
381
|
+
Proto = ProtoForProtoId (Class, Index);
|
|
382
|
+
for (Word = Proto->Configs;
|
|
383
|
+
Word < Proto->Configs + WERDS_PER_CONFIG_VEC; *Word++ = 0);
|
|
384
|
+
|
|
385
|
+
return (Index);
|
|
386
|
+
|
|
387
|
+
} /* AddIntProto */
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
/*---------------------------------------------------------------------------*/
|
|
391
|
+
void
|
|
392
|
+
AddProtoToClassPruner (PROTO Proto, CLASS_ID ClassId, INT_TEMPLATES Templates)
|
|
393
|
+
/*
|
|
394
|
+
** Parameters:
|
|
395
|
+
** Proto floating-pt proto to add to class pruner
|
|
396
|
+
** ClassId class id corresponding to Proto
|
|
397
|
+
** Templates set of templates containing class pruner
|
|
398
|
+
** Globals:
|
|
399
|
+
** NumCPLevels number of levels used in the class pruner
|
|
400
|
+
** Operation: This routine adds Proto to the class pruning tables
|
|
401
|
+
** for the specified class in Templates.
|
|
402
|
+
** Return: none
|
|
403
|
+
** Exceptions: none
|
|
404
|
+
** History: Wed Feb 13 08:49:54 1991, DSJ, Created.
|
|
405
|
+
*/
|
|
406
|
+
#define MAX_LEVEL 2
|
|
407
|
+
{
|
|
408
|
+
CLASS_PRUNER Pruner;
|
|
409
|
+
uinT32 ClassMask;
|
|
410
|
+
uinT32 ClassCount;
|
|
411
|
+
CLASS_INDEX ClassIndex;
|
|
412
|
+
uinT32 WordIndex;
|
|
413
|
+
int Level;
|
|
414
|
+
FLOAT32 EndPad, SidePad, AnglePad;
|
|
415
|
+
TABLE_FILLER TableFiller;
|
|
416
|
+
FILL_SPEC FillSpec;
|
|
417
|
+
|
|
418
|
+
ClassIndex = Templates->IndexFor[ClassId];
|
|
419
|
+
Pruner = Templates->ClassPruner [CPrunerIdFor (ClassIndex)];
|
|
420
|
+
WordIndex = CPrunerWordIndexFor (ClassIndex);
|
|
421
|
+
ClassMask = CPrunerMaskFor (MAX_LEVEL, ClassIndex);
|
|
422
|
+
|
|
423
|
+
for (Level = NumCPLevels - 1; Level >= 0; Level--) {
|
|
424
|
+
GetCPPadsForLevel(Level, &EndPad, &SidePad, &AnglePad);
|
|
425
|
+
ClassCount = CPrunerMaskFor (Level, ClassIndex);
|
|
426
|
+
InitTableFiller(EndPad, SidePad, AnglePad, Proto, &TableFiller);
|
|
427
|
+
|
|
428
|
+
while (!FillerDone (&TableFiller)) {
|
|
429
|
+
GetNextFill(&TableFiller, &FillSpec);
|
|
430
|
+
DoFill(&FillSpec, Pruner, ClassMask, ClassCount, WordIndex);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
} /* AddProtoToClassPruner */
|
|
434
|
+
|
|
435
|
+
|
|
436
|
+
/*---------------------------------------------------------------------------*/
|
|
437
|
+
void AddProtoToProtoPruner(PROTO Proto, int ProtoId, INT_CLASS Class) {
|
|
438
|
+
/*
|
|
439
|
+
** Parameters:
|
|
440
|
+
** Proto floating-pt proto to be added to proto pruner
|
|
441
|
+
** ProtoId id of proto
|
|
442
|
+
** Class integer class that contains desired proto pruner
|
|
443
|
+
** Globals: none
|
|
444
|
+
** Operation: This routine updates the proto pruner lookup tables
|
|
445
|
+
** for Class to include a new proto identified by ProtoId
|
|
446
|
+
** and described by Proto.
|
|
447
|
+
** Return: none
|
|
448
|
+
** Exceptions: none
|
|
449
|
+
** History: Fri Feb 8 13:07:19 1991, DSJ, Created.
|
|
450
|
+
*/
|
|
451
|
+
FLOAT32 Angle, X, Y, Length;
|
|
452
|
+
FLOAT32 Pad;
|
|
453
|
+
int Index;
|
|
454
|
+
PROTO_SET ProtoSet;
|
|
455
|
+
|
|
456
|
+
if (ProtoId >= Class->NumProtos)
|
|
457
|
+
cprintf ("AddProtoToProtoPruner:assert failed: %d < %d",
|
|
458
|
+
ProtoId, Class->NumProtos);
|
|
459
|
+
assert (ProtoId < Class->NumProtos);
|
|
460
|
+
|
|
461
|
+
Index = IndexForProto (ProtoId);
|
|
462
|
+
ProtoSet = Class->ProtoSets[SetForProto (ProtoId)];
|
|
463
|
+
|
|
464
|
+
Angle = Proto->Angle;
|
|
465
|
+
FillPPCircularBits (ProtoSet->ProtoPruner[PRUNER_ANGLE], Index,
|
|
466
|
+
Angle + ANGLE_SHIFT, PPAnglePad / 360.0);
|
|
467
|
+
|
|
468
|
+
Angle *= 2.0 * PI;
|
|
469
|
+
Length = Proto->Length;
|
|
470
|
+
|
|
471
|
+
X = Proto->X + X_SHIFT;
|
|
472
|
+
Pad = max (fabs (cos (Angle)) * (Length / 2.0 +
|
|
473
|
+
PPEndPad * GetPicoFeatureLength ()),
|
|
474
|
+
fabs (sin (Angle)) * (PPSidePad * GetPicoFeatureLength ()));
|
|
475
|
+
|
|
476
|
+
FillPPLinearBits (ProtoSet->ProtoPruner[PRUNER_X], Index, X, Pad);
|
|
477
|
+
|
|
478
|
+
Y = Proto->Y + Y_SHIFT;
|
|
479
|
+
Pad = max (fabs (sin (Angle)) * (Length / 2.0 +
|
|
480
|
+
PPEndPad * GetPicoFeatureLength ()),
|
|
481
|
+
fabs (cos (Angle)) * (PPSidePad * GetPicoFeatureLength ()));
|
|
482
|
+
|
|
483
|
+
FillPPLinearBits (ProtoSet->ProtoPruner[PRUNER_Y], Index, Y, Pad);
|
|
484
|
+
|
|
485
|
+
} /* AddProtoToProtoPruner */
|
|
486
|
+
|
|
487
|
+
|
|
488
|
+
/*---------------------------------------------------------------------------*/
|
|
489
|
+
int BucketFor(FLOAT32 Param, FLOAT32 Offset, int NumBuckets) {
|
|
490
|
+
/*
|
|
491
|
+
** Parameters:
|
|
492
|
+
** Param parameter value to map into a bucket number
|
|
493
|
+
** Offset amount to shift param before mapping it
|
|
494
|
+
** NumBuckets number of buckets to map param into
|
|
495
|
+
** Globals: none
|
|
496
|
+
** Operation: This routine maps a parameter value into a bucket between
|
|
497
|
+
** 0 and NumBuckets-1. Offset is added to the parameter
|
|
498
|
+
** before mapping it. Values which map to buckets outside
|
|
499
|
+
** the range are truncated to fit within the range. Mapping
|
|
500
|
+
** is done by truncating rather than rounding.
|
|
501
|
+
** Return: Bucket number corresponding to Param + Offset.
|
|
502
|
+
** Exceptions: none
|
|
503
|
+
** History: Thu Feb 14 13:24:33 1991, DSJ, Created.
|
|
504
|
+
*/
|
|
505
|
+
int Bucket;
|
|
506
|
+
|
|
507
|
+
Bucket = (int) MapParam (Param, Offset, NumBuckets);
|
|
508
|
+
if (Bucket < 0)
|
|
509
|
+
Bucket = 0;
|
|
510
|
+
else if (Bucket >= NumBuckets)
|
|
511
|
+
Bucket = NumBuckets - 1;
|
|
512
|
+
return (Bucket);
|
|
513
|
+
|
|
514
|
+
} /* BucketFor */
|
|
515
|
+
|
|
516
|
+
|
|
517
|
+
/*---------------------------------------------------------------------------*/
|
|
518
|
+
int CircBucketFor(FLOAT32 Param, FLOAT32 Offset, int NumBuckets) {
|
|
519
|
+
/*
|
|
520
|
+
** Parameters:
|
|
521
|
+
** Param parameter value to map into a circular bucket
|
|
522
|
+
** Offset amount to shift param before mapping it
|
|
523
|
+
** NumBuckets number of buckets to map param into
|
|
524
|
+
** Globals: none
|
|
525
|
+
** Operation: This routine maps a parameter value into a bucket between
|
|
526
|
+
** 0 and NumBuckets-1. Offset is added to the parameter
|
|
527
|
+
** before mapping it. Values which map to buckets outside
|
|
528
|
+
** the range are wrapped to a new value in a circular fashion.
|
|
529
|
+
** Mapping is done by truncating rather than rounding.
|
|
530
|
+
** Return: Bucket number corresponding to Param + Offset.
|
|
531
|
+
** Exceptions: none
|
|
532
|
+
** History: Thu Feb 14 13:24:33 1991, DSJ, Created.
|
|
533
|
+
*/
|
|
534
|
+
int Bucket;
|
|
535
|
+
|
|
536
|
+
Bucket = (int) MapParam (Param, Offset, NumBuckets);
|
|
537
|
+
if (Bucket < 0)
|
|
538
|
+
Bucket += NumBuckets;
|
|
539
|
+
else if (Bucket >= NumBuckets)
|
|
540
|
+
Bucket -= NumBuckets;
|
|
541
|
+
return (Bucket);
|
|
542
|
+
|
|
543
|
+
} /* CircBucketFor */
|
|
544
|
+
|
|
545
|
+
|
|
546
|
+
/*---------------------------------------------------------------------------*/
|
|
547
|
+
#ifndef GRAPHICS_DISABLED
|
|
548
|
+
void UpdateMatchDisplay() {
|
|
549
|
+
/*
|
|
550
|
+
** Parameters: none
|
|
551
|
+
** Globals:
|
|
552
|
+
** FeatureShapes display list for features
|
|
553
|
+
** ProtoShapes display list for protos
|
|
554
|
+
** Operation: This routine clears the global feature and proto
|
|
555
|
+
** display lists.
|
|
556
|
+
** Return: none
|
|
557
|
+
** Exceptions: none
|
|
558
|
+
** History: Thu Mar 21 15:40:19 1991, DSJ, Created.
|
|
559
|
+
*/
|
|
560
|
+
if (IntMatchWindow != NULL)
|
|
561
|
+
c_make_current(IntMatchWindow);
|
|
562
|
+
} /* ClearMatchDisplay */
|
|
563
|
+
#endif
|
|
564
|
+
|
|
565
|
+
/*---------------------------------------------------------------------------*/
|
|
566
|
+
void ConvertConfig(BIT_VECTOR Config, int ConfigId, INT_CLASS Class) {
|
|
567
|
+
/*
|
|
568
|
+
** Parameters:
|
|
569
|
+
** Config config to be added to class
|
|
570
|
+
** ConfigId id to be used for new config
|
|
571
|
+
** Class class to add new config to
|
|
572
|
+
** Globals: none
|
|
573
|
+
** Operation: This operation updates the config vectors of all protos
|
|
574
|
+
** in Class to indicate that the protos with 1's in Config
|
|
575
|
+
** belong to a new configuration identified by ConfigId.
|
|
576
|
+
** It is assumed that the length of the Config bit vector is
|
|
577
|
+
** equal to the number of protos in Class.
|
|
578
|
+
** Return: none
|
|
579
|
+
** Exceptions: none
|
|
580
|
+
** History: Mon Feb 11 14:57:31 1991, DSJ, Created.
|
|
581
|
+
*/
|
|
582
|
+
int ProtoId;
|
|
583
|
+
INT_PROTO Proto;
|
|
584
|
+
int TotalLength;
|
|
585
|
+
|
|
586
|
+
for (ProtoId = 0, TotalLength = 0;
|
|
587
|
+
ProtoId < Class->NumProtos; ProtoId++)
|
|
588
|
+
if (test_bit (Config, ProtoId)) {
|
|
589
|
+
Proto = ProtoForProtoId (Class, ProtoId);
|
|
590
|
+
SET_BIT (Proto->Configs, ConfigId);
|
|
591
|
+
TotalLength += Class->ProtoLengths[ProtoId];
|
|
592
|
+
}
|
|
593
|
+
Class->ConfigLengths[ConfigId] = TotalLength;
|
|
594
|
+
} /* ConvertConfig */
|
|
595
|
+
|
|
596
|
+
|
|
597
|
+
/*---------------------------------------------------------------------------*/
|
|
598
|
+
void ConvertProto(PROTO Proto, int ProtoId, INT_CLASS Class) {
|
|
599
|
+
/*
|
|
600
|
+
** Parameters:
|
|
601
|
+
** Proto floating-pt proto to be converted to integer format
|
|
602
|
+
** ProtoId id of proto
|
|
603
|
+
** Class integer class to add converted proto to
|
|
604
|
+
** Globals: none
|
|
605
|
+
** Operation: This routine converts Proto to integer format and
|
|
606
|
+
** installs it as ProtoId in Class.
|
|
607
|
+
** Return: none
|
|
608
|
+
** Exceptions: none
|
|
609
|
+
** History: Fri Feb 8 11:22:43 1991, DSJ, Created.
|
|
610
|
+
*/
|
|
611
|
+
INT_PROTO P;
|
|
612
|
+
FLOAT32 Param;
|
|
613
|
+
|
|
614
|
+
assert (ProtoId < Class->NumProtos);
|
|
615
|
+
|
|
616
|
+
P = ProtoForProtoId (Class, ProtoId);
|
|
617
|
+
|
|
618
|
+
Param = Proto->A * 128;
|
|
619
|
+
P->A = TruncateParam (Param, -128, 127, NULL);
|
|
620
|
+
|
|
621
|
+
Param = -Proto->B * 256;
|
|
622
|
+
P->B = TruncateParam (Param, 0, 255, NULL);
|
|
623
|
+
|
|
624
|
+
Param = Proto->C * 128;
|
|
625
|
+
P->C = TruncateParam (Param, -128, 127, NULL);
|
|
626
|
+
|
|
627
|
+
Param = Proto->Angle * 256;
|
|
628
|
+
if (Param < 0 || Param >= 256)
|
|
629
|
+
P->Angle = 0;
|
|
630
|
+
else
|
|
631
|
+
P->Angle = (uinT8) Param;
|
|
632
|
+
|
|
633
|
+
/* round proto length to nearest integer number of pico-features */
|
|
634
|
+
Param = (Proto->Length / GetPicoFeatureLength ()) + 0.5;
|
|
635
|
+
Class->ProtoLengths[ProtoId] = TruncateParam (Param, 1, 255, NULL);
|
|
636
|
+
if (LearningDebugLevel >= 2)
|
|
637
|
+
cprintf ("Converted ffeat to (A=%d,B=%d,C=%d,L=%d)",
|
|
638
|
+
P->A, P->B, P->C, Class->ProtoLengths[ProtoId]);
|
|
639
|
+
} /* ConvertProto */
|
|
640
|
+
|
|
641
|
+
|
|
642
|
+
/*---------------------------------------------------------------------------*/
|
|
643
|
+
INT_TEMPLATES CreateIntTemplates(CLASSES FloatProtos,
|
|
644
|
+
const UNICHARSET& target_unicharset) {
|
|
645
|
+
/*
|
|
646
|
+
** Parameters:
|
|
647
|
+
** FloatProtos prototypes in old floating pt format
|
|
648
|
+
** Globals: none
|
|
649
|
+
** Operation: This routine converts from the old floating point format
|
|
650
|
+
** to the new integer format.
|
|
651
|
+
** Return: New set of training templates in integer format.
|
|
652
|
+
** Exceptions: none
|
|
653
|
+
** History: Thu Feb 7 14:40:42 1991, DSJ, Created.
|
|
654
|
+
*/
|
|
655
|
+
INT_TEMPLATES IntTemplates;
|
|
656
|
+
CLASS_TYPE FClass;
|
|
657
|
+
INT_CLASS IClass;
|
|
658
|
+
int ClassId;
|
|
659
|
+
int ProtoId;
|
|
660
|
+
int ConfigId;
|
|
661
|
+
|
|
662
|
+
IntTemplates = NewIntTemplates ();
|
|
663
|
+
|
|
664
|
+
for (ClassId = 0; ClassId < target_unicharset.size(); ClassId++) {
|
|
665
|
+
FClass = &(FloatProtos[ClassId]);
|
|
666
|
+
if (FClass->NumProtos > 0) {
|
|
667
|
+
assert (UnusedClassIdIn (IntTemplates, ClassId));
|
|
668
|
+
IClass = NewIntClass (FClass->NumProtos, FClass->NumConfigs);
|
|
669
|
+
AddIntClass(IntTemplates, ClassId, IClass);
|
|
670
|
+
|
|
671
|
+
for (ProtoId = 0; ProtoId < FClass->NumProtos; ProtoId++) {
|
|
672
|
+
AddIntProto(IClass);
|
|
673
|
+
ConvertProto (ProtoIn (FClass, ProtoId), ProtoId, IClass);
|
|
674
|
+
AddProtoToProtoPruner (ProtoIn (FClass, ProtoId), ProtoId,
|
|
675
|
+
IClass);
|
|
676
|
+
AddProtoToClassPruner (ProtoIn (FClass, ProtoId), ClassId,
|
|
677
|
+
IntTemplates);
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
for (ConfigId = 0; ConfigId < FClass->NumConfigs; ConfigId++) {
|
|
681
|
+
AddIntConfig(IClass);
|
|
682
|
+
ConvertConfig (FClass->Configurations[ConfigId], ConfigId, IClass);
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
return (IntTemplates);
|
|
687
|
+
} /* CreateIntTemplates */
|
|
688
|
+
|
|
689
|
+
|
|
690
|
+
/*---------------------------------------------------------------------------*/
|
|
691
|
+
#ifndef GRAPHICS_DISABLED
|
|
692
|
+
void DisplayIntFeature(INT_FEATURE Feature, FLOAT32 Evidence) {
|
|
693
|
+
/*
|
|
694
|
+
** Parameters:
|
|
695
|
+
** Feature pico-feature to be displayed
|
|
696
|
+
** Evidence best evidence for this feature (0-1)
|
|
697
|
+
** Globals:
|
|
698
|
+
** FeatureShapes global display list for features
|
|
699
|
+
** Operation: This routine renders the specified feature into a
|
|
700
|
+
** global display list.
|
|
701
|
+
** Return: none
|
|
702
|
+
** Exceptions: none
|
|
703
|
+
** History: Thu Mar 21 14:45:04 1991, DSJ, Created.
|
|
704
|
+
*/
|
|
705
|
+
C_COL Color;
|
|
706
|
+
|
|
707
|
+
Color = GetMatchColorFor (Evidence);
|
|
708
|
+
RenderIntFeature(IntMatchWindow, Feature, Color);
|
|
709
|
+
} /* DisplayIntFeature */
|
|
710
|
+
|
|
711
|
+
|
|
712
|
+
/*---------------------------------------------------------------------------*/
|
|
713
|
+
void DisplayIntProto(INT_CLASS Class, PROTO_ID ProtoId, FLOAT32 Evidence) {
|
|
714
|
+
/*
|
|
715
|
+
** Parameters:
|
|
716
|
+
** Class class to take proto from
|
|
717
|
+
** ProtoId id of proto in Class to be displayed
|
|
718
|
+
** Evidence total evidence for proto (0-1)
|
|
719
|
+
** Globals:
|
|
720
|
+
** ProtoShapes global display list for protos
|
|
721
|
+
** Operation: This routine renders the specified proto into a
|
|
722
|
+
** global display list.
|
|
723
|
+
** Return: none
|
|
724
|
+
** Exceptions: none
|
|
725
|
+
** History: Thu Mar 21 14:45:04 1991, DSJ, Created.
|
|
726
|
+
*/
|
|
727
|
+
C_COL Color;
|
|
728
|
+
|
|
729
|
+
Color = GetMatchColorFor (Evidence);
|
|
730
|
+
RenderIntProto(IntMatchWindow, Class, ProtoId, Color);
|
|
731
|
+
|
|
732
|
+
} /* DisplayIntProto */
|
|
733
|
+
#endif
|
|
734
|
+
|
|
735
|
+
/*---------------------------------------------------------------------------*/
|
|
736
|
+
void InitIntProtoVars() {
|
|
737
|
+
/*
|
|
738
|
+
** Parameters: none
|
|
739
|
+
** Globals: none
|
|
740
|
+
** Operation: Initialize the control variables for the integer proto
|
|
741
|
+
** routines.
|
|
742
|
+
** Return: none
|
|
743
|
+
** Exceptions: none
|
|
744
|
+
** History: Tue Feb 12 08:04:34 1991, DSJ, Created.
|
|
745
|
+
*/
|
|
746
|
+
MakeNumCPLevels();
|
|
747
|
+
MakeCPAnglePadLoose();
|
|
748
|
+
MakeCPAnglePadMedium();
|
|
749
|
+
MakeCPAnglePadTight();
|
|
750
|
+
MakeCPEndPadLoose();
|
|
751
|
+
MakeCPEndPadMedium();
|
|
752
|
+
MakeCPEndPadTight();
|
|
753
|
+
MakeCPSidePadLoose();
|
|
754
|
+
MakeCPSidePadMedium();
|
|
755
|
+
MakeCPSidePadTight();
|
|
756
|
+
MakePPAnglePad();
|
|
757
|
+
MakePPEndPad();
|
|
758
|
+
MakePPSidePad();
|
|
759
|
+
} /* InitIntProtoVars */
|
|
760
|
+
|
|
761
|
+
|
|
762
|
+
/*---------------------------------------------------------------------------*/
|
|
763
|
+
INT_CLASS NewIntClass(int MaxNumProtos, int MaxNumConfigs) {
|
|
764
|
+
/*
|
|
765
|
+
** Parameters:
|
|
766
|
+
** MaxNumProtos number of protos to allocate space for
|
|
767
|
+
** MaxNumConfigs number of configs to allocate space for
|
|
768
|
+
** Globals: none
|
|
769
|
+
** Operation: This routine creates a new integer class data structure
|
|
770
|
+
** and returns it. Sufficient space is allocated
|
|
771
|
+
** to handle the specified number of protos and configs.
|
|
772
|
+
** Return: New class created.
|
|
773
|
+
** Exceptions: none
|
|
774
|
+
** History: Fri Feb 8 10:51:23 1991, DSJ, Created.
|
|
775
|
+
*/
|
|
776
|
+
INT_CLASS Class;
|
|
777
|
+
PROTO_SET ProtoSet;
|
|
778
|
+
int i;
|
|
779
|
+
register uinT32 *Word;
|
|
780
|
+
|
|
781
|
+
assert (MaxNumConfigs <= MAX_NUM_CONFIGS);
|
|
782
|
+
|
|
783
|
+
Class = (INT_CLASS) Emalloc (sizeof (INT_CLASS_STRUCT));
|
|
784
|
+
Class->NumProtoSets = ((MaxNumProtos + PROTOS_PER_PROTO_SET - 1) /
|
|
785
|
+
PROTOS_PER_PROTO_SET);
|
|
786
|
+
|
|
787
|
+
assert(Class->NumProtoSets <= MAX_NUM_PROTO_SETS);
|
|
788
|
+
|
|
789
|
+
Class->NumProtos = 0;
|
|
790
|
+
Class->NumConfigs = 0;
|
|
791
|
+
|
|
792
|
+
for (i = 0; i < Class->NumProtoSets; i++) {
|
|
793
|
+
/* allocate space for a proto set, install in class, and initialize */
|
|
794
|
+
ProtoSet = (PROTO_SET) Emalloc (sizeof (PROTO_SET_STRUCT));
|
|
795
|
+
Class->ProtoSets[i] = ProtoSet;
|
|
796
|
+
for (Word = (uinT32 *) (ProtoSet->ProtoPruner);
|
|
797
|
+
Word < (uinT32 *) (ProtoSet->ProtoPruner) + WERDS_PER_PP;
|
|
798
|
+
*Word++ = 0);
|
|
799
|
+
|
|
800
|
+
/* allocate space for the proto lengths and install in class */
|
|
801
|
+
}
|
|
802
|
+
Class->ProtoLengths = (uinT8 *) Emalloc (MaxNumIntProtosIn (Class) *
|
|
803
|
+
sizeof (uinT8));
|
|
804
|
+
|
|
805
|
+
return (Class);
|
|
806
|
+
|
|
807
|
+
} /* NewIntClass */
|
|
808
|
+
|
|
809
|
+
|
|
810
|
+
/*-------------------------------------------------------------------------*/
|
|
811
|
+
void free_int_class( /*class to free */
|
|
812
|
+
INT_CLASS int_class) {
|
|
813
|
+
int i;
|
|
814
|
+
|
|
815
|
+
for (i = 0; i < int_class->NumProtoSets; i++) {
|
|
816
|
+
Efree (int_class->ProtoSets[i]);
|
|
817
|
+
}
|
|
818
|
+
Efree (int_class->ProtoLengths);
|
|
819
|
+
Efree(int_class);
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
|
|
823
|
+
/*---------------------------------------------------------------------------*/
|
|
824
|
+
INT_TEMPLATES NewIntTemplates() {
|
|
825
|
+
/*
|
|
826
|
+
** Parameters: none
|
|
827
|
+
** Globals: none
|
|
828
|
+
** Operation: This routine allocates a new set of integer templates
|
|
829
|
+
** initialized to hold 0 classes.
|
|
830
|
+
** Return: The integer templates created.
|
|
831
|
+
** Exceptions: none
|
|
832
|
+
** History: Fri Feb 8 08:38:51 1991, DSJ, Created.
|
|
833
|
+
*/
|
|
834
|
+
INT_TEMPLATES T;
|
|
835
|
+
int i;
|
|
836
|
+
|
|
837
|
+
T = (INT_TEMPLATES) Emalloc (sizeof (INT_TEMPLATES_STRUCT));
|
|
838
|
+
T->NumClasses = 0;
|
|
839
|
+
T->NumClassPruners = 0;
|
|
840
|
+
|
|
841
|
+
/* initialize mapping tables */
|
|
842
|
+
for (i = 0; i <= MAX_CLASS_ID; i++)
|
|
843
|
+
T->IndexFor[i] = ILLEGAL_CLASS;
|
|
844
|
+
for (i = 0; i < MAX_NUM_CLASSES; i++)
|
|
845
|
+
T->ClassIdFor[i] = NO_CLASS;
|
|
846
|
+
|
|
847
|
+
return (T);
|
|
848
|
+
|
|
849
|
+
} /* NewIntTemplates */
|
|
850
|
+
|
|
851
|
+
|
|
852
|
+
/*---------------------------------------------------------------------------*/
|
|
853
|
+
void free_int_templates(INT_TEMPLATES templates) {
|
|
854
|
+
int i;
|
|
855
|
+
|
|
856
|
+
for (i = 0; i < templates->NumClasses; i++)
|
|
857
|
+
free_int_class (templates->Class[i]);
|
|
858
|
+
for (i = 0; i < templates->NumClassPruners; i++)
|
|
859
|
+
Efree (templates->ClassPruner[i]);
|
|
860
|
+
Efree(templates);
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
|
|
864
|
+
/*---------------------------------------------------------------------------*/
|
|
865
|
+
INT_TEMPLATES ReadIntTemplates(FILE *File, BOOL8 swap) {
|
|
866
|
+
/*
|
|
867
|
+
** Parameters:
|
|
868
|
+
** File open file to read templates from
|
|
869
|
+
** Globals: none
|
|
870
|
+
** Operation: This routine reads a set of integer templates from
|
|
871
|
+
** File. File must already be open and must be in the
|
|
872
|
+
** correct binary format.
|
|
873
|
+
** Return: Pointer to integer templates read from File.
|
|
874
|
+
** Exceptions: none
|
|
875
|
+
** History: Wed Feb 27 11:48:46 1991, DSJ, Created.
|
|
876
|
+
*/
|
|
877
|
+
int i, j, x, y, z;
|
|
878
|
+
int nread;
|
|
879
|
+
int unicharset_size;
|
|
880
|
+
int version_id = 0;
|
|
881
|
+
INT_TEMPLATES Templates;
|
|
882
|
+
CLASS_PRUNER Pruner;
|
|
883
|
+
INT_CLASS Class;
|
|
884
|
+
uinT8 *Lengths;
|
|
885
|
+
PROTO_SET ProtoSet;
|
|
886
|
+
|
|
887
|
+
/* first read the high level template struct */
|
|
888
|
+
Templates = NewIntTemplates ();
|
|
889
|
+
// Read Templates in parts for 64 bit compatibility.
|
|
890
|
+
if (fread(&unicharset_size, sizeof(int), 1, File) != 1)
|
|
891
|
+
cprintf ("Bad read of inttemp!\n");
|
|
892
|
+
if (fread(&Templates->NumClasses, sizeof(int), 1, File) != 1 ||
|
|
893
|
+
fread(&Templates->NumClassPruners, sizeof(int), 1, File) != 1)
|
|
894
|
+
cprintf ("Bad read of inttemp!\n");
|
|
895
|
+
// Swap status is determined automatically.
|
|
896
|
+
swap = Templates->NumClassPruners < 0 ||
|
|
897
|
+
Templates->NumClassPruners > MAX_NUM_CLASS_PRUNERS;
|
|
898
|
+
if (swap) {
|
|
899
|
+
reverse32 (&Templates->NumClassPruners);
|
|
900
|
+
reverse32 (&Templates->NumClasses);
|
|
901
|
+
reverse32 (&unicharset_size);
|
|
902
|
+
}
|
|
903
|
+
if (unicharset_size != unicharset.size()) {
|
|
904
|
+
cprintf("Error: %d classes in inttemp while "
|
|
905
|
+
"unicharset contains %d unichars.\n",
|
|
906
|
+
unicharset_size, unicharset.size());
|
|
907
|
+
exit(1);
|
|
908
|
+
}
|
|
909
|
+
if (Templates->NumClasses < 0) {
|
|
910
|
+
// This file has a version id!
|
|
911
|
+
version_id = -Templates->NumClasses;
|
|
912
|
+
if (fread(&Templates->NumClasses, sizeof(Templates->NumClasses),
|
|
913
|
+
1, File) != 1)
|
|
914
|
+
cprintf("Bad read of inttemp!\n");
|
|
915
|
+
if (swap)
|
|
916
|
+
reverse32 (&Templates->NumClasses);
|
|
917
|
+
}
|
|
918
|
+
for (i = 0; i < unicharset_size; ++i) {
|
|
919
|
+
if (fread(&Templates->IndexFor[i], sizeof(CLASS_INDEX), 1, File) != 1)
|
|
920
|
+
cprintf("Bad read of inttemp!\n");
|
|
921
|
+
}
|
|
922
|
+
for (i = 0; i < Templates->NumClasses; ++i) {
|
|
923
|
+
if (fread(&Templates->ClassIdFor[i], sizeof(CLASS_ID), 1, File) != 1)
|
|
924
|
+
cprintf("Bad read of inttemp!\n");
|
|
925
|
+
}
|
|
926
|
+
if (swap) {
|
|
927
|
+
for (i = 0; i < MAX_CLASS_ID + 1; i++)
|
|
928
|
+
reverse16 (&Templates->IndexFor[i]);
|
|
929
|
+
for (i = 0; i < MAX_NUM_CLASSES; i++)
|
|
930
|
+
reverse32 (&Templates->ClassIdFor[i]);
|
|
931
|
+
}
|
|
932
|
+
|
|
933
|
+
/* then read in the class pruners */
|
|
934
|
+
for (i = 0; i < Templates->NumClassPruners; i++) {
|
|
935
|
+
Pruner = (CLASS_PRUNER) Emalloc (sizeof (CLASS_PRUNER_STRUCT));
|
|
936
|
+
if ((nread =
|
|
937
|
+
fread ((char *) Pruner, 1, sizeof (CLASS_PRUNER_STRUCT),
|
|
938
|
+
File)) != sizeof (CLASS_PRUNER_STRUCT))
|
|
939
|
+
cprintf ("Bad read of inttemp!\n");
|
|
940
|
+
if (swap) {
|
|
941
|
+
for (j = 0; j < NUM_CP_BUCKETS; j++) {
|
|
942
|
+
for (x = 0; x < NUM_CP_BUCKETS; x++) {
|
|
943
|
+
for (y = 0; y < NUM_CP_BUCKETS; y++) {
|
|
944
|
+
for (z = 0; z < WERDS_PER_CP_VECTOR; z++) {
|
|
945
|
+
reverse32 (&Pruner[j][x][y][z]);
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
}
|
|
950
|
+
}
|
|
951
|
+
Templates->ClassPruner[i] = Pruner;
|
|
952
|
+
}
|
|
953
|
+
|
|
954
|
+
/* then read in each class */
|
|
955
|
+
for (i = 0; i < Templates->NumClasses; i++) {
|
|
956
|
+
/* first read in the high level struct for the class */
|
|
957
|
+
Class = (INT_CLASS) Emalloc (sizeof (INT_CLASS_STRUCT));
|
|
958
|
+
if (fread(&Class->NumProtos, sizeof(Class->NumProtos), 1, File) != 1 ||
|
|
959
|
+
fread(&Class->NumProtoSets, sizeof(Class->NumProtoSets), 1, File) != 1 ||
|
|
960
|
+
fread(&Class->NumConfigs, sizeof(Class->NumConfigs), 1, File) != 1)
|
|
961
|
+
cprintf ("Bad read of inttemp!\n");
|
|
962
|
+
if (version_id == 0) {
|
|
963
|
+
// Only version 0 writes 5 pointless pointers to the file.
|
|
964
|
+
for (j = 0; j < 5; ++j) {
|
|
965
|
+
int junk;
|
|
966
|
+
if (fread(&junk, sizeof(junk), 1, File) != 1)
|
|
967
|
+
cprintf ("Bad read of inttemp!\n");
|
|
968
|
+
}
|
|
969
|
+
}
|
|
970
|
+
for (j = 0; j < MAX_NUM_CONFIGS; ++j) {
|
|
971
|
+
if (fread(&Class->ConfigLengths[j], sizeof(uinT16), 1, File) != 1)
|
|
972
|
+
cprintf ("Bad read of inttemp!\n");
|
|
973
|
+
}
|
|
974
|
+
if (swap) {
|
|
975
|
+
reverse16 (&Class->NumProtos);
|
|
976
|
+
for (j = 0; j < MAX_NUM_CONFIGS; j++)
|
|
977
|
+
reverse16 (&Class->ConfigLengths[j]);
|
|
978
|
+
}
|
|
979
|
+
Templates->Class[i] = Class;
|
|
980
|
+
|
|
981
|
+
/* then read in the proto lengths */
|
|
982
|
+
Lengths = (uinT8 *) Emalloc (sizeof (uinT8) *
|
|
983
|
+
MaxNumIntProtosIn (Class));
|
|
984
|
+
if ((nread = fread ((char *) Lengths, sizeof (uinT8),
|
|
985
|
+
MaxNumIntProtosIn (Class),
|
|
986
|
+
File)) != MaxNumIntProtosIn (Class))
|
|
987
|
+
cprintf ("Bad read of inttemp!\n");
|
|
988
|
+
Class->ProtoLengths = Lengths;
|
|
989
|
+
|
|
990
|
+
/* then read in the proto sets */
|
|
991
|
+
for (j = 0; j < Class->NumProtoSets; j++) {
|
|
992
|
+
ProtoSet = (PROTO_SET) Emalloc (sizeof (PROTO_SET_STRUCT));
|
|
993
|
+
if ((nread =
|
|
994
|
+
fread ((char *) ProtoSet, 1, sizeof (PROTO_SET_STRUCT),
|
|
995
|
+
File)) != sizeof (PROTO_SET_STRUCT))
|
|
996
|
+
cprintf ("Bad read of inttemp!\n");
|
|
997
|
+
if (swap) {
|
|
998
|
+
for (x = 0; x < NUM_PP_PARAMS; x++)
|
|
999
|
+
for (y = 0; y < NUM_PP_BUCKETS; y++)
|
|
1000
|
+
for (z = 0; z < WERDS_PER_PP_VECTOR; z++)
|
|
1001
|
+
reverse32 (&ProtoSet->ProtoPruner[x][y][z]);
|
|
1002
|
+
for (x = 0; x < PROTOS_PER_PROTO_SET; x++)
|
|
1003
|
+
for (y = 0; y < WERDS_PER_CONFIG_VEC; y++)
|
|
1004
|
+
reverse32 (&ProtoSet->Protos[x].Configs[y]);
|
|
1005
|
+
}
|
|
1006
|
+
Class->ProtoSets[j] = ProtoSet;
|
|
1007
|
+
}
|
|
1008
|
+
}
|
|
1009
|
+
return (Templates);
|
|
1010
|
+
} /* ReadIntTemplates */
|
|
1011
|
+
|
|
1012
|
+
|
|
1013
|
+
/*---------------------------------------------------------------------------*/
|
|
1014
|
+
#ifndef GRAPHICS_DISABLED
|
|
1015
|
+
void ShowMatchDisplay() {
|
|
1016
|
+
/*
|
|
1017
|
+
** Parameters: none
|
|
1018
|
+
** Globals:
|
|
1019
|
+
** FeatureShapes display list containing feature matches
|
|
1020
|
+
** ProtoShapes display list containing proto matches
|
|
1021
|
+
** Operation: This routine sends the shapes in the global display
|
|
1022
|
+
** lists to the match debugger window.
|
|
1023
|
+
** Return: none
|
|
1024
|
+
** Exceptions: none
|
|
1025
|
+
** History: Thu Mar 21 15:47:33 1991, DSJ, Created.
|
|
1026
|
+
*/
|
|
1027
|
+
void *window;
|
|
1028
|
+
/* Size of drawable */
|
|
1029
|
+
if (IntMatchWindow == NULL) {
|
|
1030
|
+
IntMatchWindow = c_create_window ("IntMatchWindow", 50, 200,
|
|
1031
|
+
520, 520,
|
|
1032
|
+
-130.0, 130.0, -130.0, 130.0);
|
|
1033
|
+
SVMenuNode* popup_menu = new SVMenuNode();
|
|
1034
|
+
|
|
1035
|
+
popup_menu->AddChild("Debug Adapted classes", IDA_ADAPTIVE,
|
|
1036
|
+
"x", "Class to debug");
|
|
1037
|
+
popup_menu->AddChild("Debug Static classes", IDA_STATIC,
|
|
1038
|
+
"x", "Class to debug");
|
|
1039
|
+
popup_menu->AddChild("Debug Both", IDA_BOTH,
|
|
1040
|
+
"x", "Class to debug");
|
|
1041
|
+
popup_menu->BuildMenu(IntMatchWindow, false);
|
|
1042
|
+
}
|
|
1043
|
+
else
|
|
1044
|
+
c_clear_window(IntMatchWindow);
|
|
1045
|
+
|
|
1046
|
+
window = IntMatchWindow;
|
|
1047
|
+
c_line_color_index(window, Grey);
|
|
1048
|
+
/* Default size of drawing */
|
|
1049
|
+
if (NormMethod == baseline) {
|
|
1050
|
+
c_move (window, -1000.0, INT_BASELINE);
|
|
1051
|
+
c_draw (window, 1000.0, INT_BASELINE);
|
|
1052
|
+
c_move (window, -1000.0, INT_DESCENDER);
|
|
1053
|
+
c_draw (window, 1000.0, INT_DESCENDER);
|
|
1054
|
+
c_move (window, -1000.0, INT_XHEIGHT);
|
|
1055
|
+
c_draw (window, 1000.0, INT_XHEIGHT);
|
|
1056
|
+
c_move (window, -1000.0, INT_CAPHEIGHT);
|
|
1057
|
+
c_draw (window, 1000.0, INT_CAPHEIGHT);
|
|
1058
|
+
c_move (window, INT_MIN_X, -1000.0);
|
|
1059
|
+
c_draw (window, INT_MIN_X, 1000.0);
|
|
1060
|
+
c_move (window, INT_MAX_X, -1000.0);
|
|
1061
|
+
c_draw (window, INT_MAX_X, 1000.0);
|
|
1062
|
+
}
|
|
1063
|
+
else {
|
|
1064
|
+
c_move (window, INT_XCENTER - INT_XRADIUS, INT_YCENTER - INT_YRADIUS);
|
|
1065
|
+
c_draw (window, INT_XCENTER + INT_XRADIUS, INT_YCENTER - INT_YRADIUS);
|
|
1066
|
+
c_move (window, INT_XCENTER - INT_XRADIUS, INT_YCENTER + INT_YRADIUS);
|
|
1067
|
+
c_draw (window, INT_XCENTER + INT_XRADIUS, INT_YCENTER + INT_YRADIUS);
|
|
1068
|
+
c_move (window, INT_XCENTER - INT_XRADIUS, INT_YCENTER - INT_YRADIUS);
|
|
1069
|
+
c_draw (window, INT_XCENTER - INT_XRADIUS, INT_YCENTER + INT_YRADIUS);
|
|
1070
|
+
c_move (window, INT_XCENTER + INT_XRADIUS, INT_YCENTER - INT_YRADIUS);
|
|
1071
|
+
c_draw (window, INT_XCENTER + INT_XRADIUS, INT_YCENTER + INT_YRADIUS);
|
|
1072
|
+
c_move(window, INT_MIN_X, INT_MIN_Y);
|
|
1073
|
+
c_draw(window, INT_MIN_X, INT_MAX_Y);
|
|
1074
|
+
c_move(window, INT_MIN_X, INT_MIN_Y);
|
|
1075
|
+
c_draw(window, INT_MAX_X, INT_MIN_Y);
|
|
1076
|
+
c_move(window, INT_MAX_X, INT_MAX_Y);
|
|
1077
|
+
c_draw(window, INT_MIN_X, INT_MAX_Y);
|
|
1078
|
+
c_move(window, INT_MAX_X, INT_MAX_Y);
|
|
1079
|
+
c_draw(window, INT_MAX_X, INT_MIN_Y);
|
|
1080
|
+
}
|
|
1081
|
+
IntMatchWindow->ZoomToRectangle(INT_MIN_X, INT_MIN_Y,
|
|
1082
|
+
INT_MAX_X, INT_MAX_Y);
|
|
1083
|
+
} /* ShowMatchDisplay */
|
|
1084
|
+
#endif
|
|
1085
|
+
|
|
1086
|
+
/*---------------------------------------------------------------------------*/
|
|
1087
|
+
void WriteIntTemplates(FILE *File, INT_TEMPLATES Templates,
|
|
1088
|
+
const UNICHARSET& target_unicharset) {
|
|
1089
|
+
/*
|
|
1090
|
+
** Parameters:
|
|
1091
|
+
** File open file to write templates to
|
|
1092
|
+
** Templates templates to save into File
|
|
1093
|
+
** Globals: none
|
|
1094
|
+
** Operation: This routine writes Templates to File. The format
|
|
1095
|
+
** is an efficient binary format. File must already be open
|
|
1096
|
+
** for writing.
|
|
1097
|
+
** Return: none
|
|
1098
|
+
** Exceptions: none
|
|
1099
|
+
** History: Wed Feb 27 11:48:46 1991, DSJ, Created.
|
|
1100
|
+
*/
|
|
1101
|
+
int i, j;
|
|
1102
|
+
INT_CLASS Class;
|
|
1103
|
+
int unicharset_size = target_unicharset.size();
|
|
1104
|
+
int version_id = -1; // When negated by the reader -1 becomes +1 etc.
|
|
1105
|
+
|
|
1106
|
+
/* first write the high level template struct */
|
|
1107
|
+
fwrite(&unicharset_size, sizeof(unicharset_size), 1, File);
|
|
1108
|
+
fwrite(&version_id, sizeof(version_id), 1, File);
|
|
1109
|
+
fwrite(&Templates->NumClassPruners, sizeof(Templates->NumClassPruners),
|
|
1110
|
+
1, File);
|
|
1111
|
+
fwrite(&Templates->NumClasses, sizeof(Templates->NumClasses), 1, File);
|
|
1112
|
+
fwrite(&Templates->IndexFor[0], sizeof(Templates->IndexFor[0]),
|
|
1113
|
+
unicharset_size, File);
|
|
1114
|
+
fwrite(&Templates->ClassIdFor[0], sizeof(Templates->ClassIdFor[0]),
|
|
1115
|
+
Templates->NumClasses, File);
|
|
1116
|
+
|
|
1117
|
+
/* then write out the class pruners */
|
|
1118
|
+
for (i = 0; i < Templates->NumClassPruners; i++)
|
|
1119
|
+
fwrite(Templates->ClassPruner[i],
|
|
1120
|
+
sizeof(CLASS_PRUNER_STRUCT), 1, File);
|
|
1121
|
+
|
|
1122
|
+
/* then write out each class */
|
|
1123
|
+
for (i = 0; i < Templates->NumClasses; i++) {
|
|
1124
|
+
Class = Templates->Class[i];
|
|
1125
|
+
|
|
1126
|
+
/* first write out the high level struct for the class */
|
|
1127
|
+
fwrite(&Class->NumProtos, sizeof(Class->NumProtos), 1, File);
|
|
1128
|
+
fwrite(&Class->NumProtoSets, sizeof(Class->NumProtoSets), 1, File);
|
|
1129
|
+
fwrite(&Class->NumConfigs, sizeof(Class->NumConfigs), 1, File);
|
|
1130
|
+
for (j = 0; j < MAX_NUM_CONFIGS; ++j) {
|
|
1131
|
+
fwrite(&Class->ConfigLengths[j], sizeof(uinT16), 1, File);
|
|
1132
|
+
}
|
|
1133
|
+
|
|
1134
|
+
/* then write out the proto lengths */
|
|
1135
|
+
fwrite ((char *) (Class->ProtoLengths), sizeof (uinT8),
|
|
1136
|
+
MaxNumIntProtosIn (Class), File);
|
|
1137
|
+
|
|
1138
|
+
/* then write out the proto sets */
|
|
1139
|
+
for (j = 0; j < Class->NumProtoSets; j++)
|
|
1140
|
+
fwrite ((char *) Class->ProtoSets[j],
|
|
1141
|
+
sizeof (PROTO_SET_STRUCT), 1, File);
|
|
1142
|
+
}
|
|
1143
|
+
} /* WriteIntTemplates */
|
|
1144
|
+
|
|
1145
|
+
|
|
1146
|
+
/**----------------------------------------------------------------------------
|
|
1147
|
+
Private Code
|
|
1148
|
+
----------------------------------------------------------------------------**/
|
|
1149
|
+
/*---------------------------------------------------------------------------*/
|
|
1150
|
+
FLOAT32 BucketStart(int Bucket, FLOAT32 Offset, int NumBuckets) {
|
|
1151
|
+
/*
|
|
1152
|
+
** Parameters:
|
|
1153
|
+
** Bucket bucket whose start is to be computed
|
|
1154
|
+
** Offset offset used to map params to buckets
|
|
1155
|
+
** NumBuckets total number of buckets
|
|
1156
|
+
** Globals: none
|
|
1157
|
+
** Operation: This routine returns the parameter value which
|
|
1158
|
+
** corresponds to the beginning of the specified bucket.
|
|
1159
|
+
** The bucket number should have been generated using the
|
|
1160
|
+
** BucketFor() function with parameters Offset and NumBuckets.
|
|
1161
|
+
** Return: Param value corresponding to start position of Bucket.
|
|
1162
|
+
** Exceptions: none
|
|
1163
|
+
** History: Thu Feb 14 13:24:33 1991, DSJ, Created.
|
|
1164
|
+
*/
|
|
1165
|
+
return (((FLOAT32) Bucket / NumBuckets) - Offset);
|
|
1166
|
+
|
|
1167
|
+
} /* BucketStart */
|
|
1168
|
+
|
|
1169
|
+
|
|
1170
|
+
/*---------------------------------------------------------------------------*/
|
|
1171
|
+
FLOAT32 BucketEnd(int Bucket, FLOAT32 Offset, int NumBuckets) {
|
|
1172
|
+
/*
|
|
1173
|
+
** Parameters:
|
|
1174
|
+
** Bucket bucket whose end is to be computed
|
|
1175
|
+
** Offset offset used to map params to buckets
|
|
1176
|
+
** NumBuckets total number of buckets
|
|
1177
|
+
** Globals: none
|
|
1178
|
+
** Operation: This routine returns the parameter value which
|
|
1179
|
+
** corresponds to the end of the specified bucket.
|
|
1180
|
+
** The bucket number should have been generated using the
|
|
1181
|
+
** BucketFor() function with parameters Offset and NumBuckets.
|
|
1182
|
+
** Return: Param value corresponding to end position of Bucket.
|
|
1183
|
+
** Exceptions: none
|
|
1184
|
+
** History: Thu Feb 14 13:24:33 1991, DSJ, Created.
|
|
1185
|
+
*/
|
|
1186
|
+
return (((FLOAT32) (Bucket + 1) / NumBuckets) - Offset);
|
|
1187
|
+
} /* BucketEnd */
|
|
1188
|
+
|
|
1189
|
+
|
|
1190
|
+
/*---------------------------------------------------------------------------*/
|
|
1191
|
+
void DoFill(FILL_SPEC *FillSpec,
|
|
1192
|
+
CLASS_PRUNER Pruner,
|
|
1193
|
+
register uinT32 ClassMask,
|
|
1194
|
+
register uinT32 ClassCount,
|
|
1195
|
+
register uinT32 WordIndex) {
|
|
1196
|
+
/*
|
|
1197
|
+
** Parameters:
|
|
1198
|
+
** FillSpec specifies which bits to fill in pruner
|
|
1199
|
+
** Pruner class pruner to be filled
|
|
1200
|
+
** ClassMask indicates which bits to change in each word
|
|
1201
|
+
** ClassCount indicates what to change bits to
|
|
1202
|
+
** WordIndex indicates which word to change
|
|
1203
|
+
** Globals: none
|
|
1204
|
+
** Operation: This routine fills in the section of a class pruner
|
|
1205
|
+
** corresponding to a single x value for a single proto of
|
|
1206
|
+
** a class.
|
|
1207
|
+
** Return: none
|
|
1208
|
+
** Exceptions: none
|
|
1209
|
+
** History: Tue Feb 19 11:11:29 1991, DSJ, Created.
|
|
1210
|
+
*/
|
|
1211
|
+
register int X, Y, Angle;
|
|
1212
|
+
register uinT32 OldWord;
|
|
1213
|
+
|
|
1214
|
+
X = FillSpec->X;
|
|
1215
|
+
if (X < 0)
|
|
1216
|
+
X = 0;
|
|
1217
|
+
if (X >= NUM_CP_BUCKETS)
|
|
1218
|
+
X = NUM_CP_BUCKETS - 1;
|
|
1219
|
+
|
|
1220
|
+
if (FillSpec->YStart < 0)
|
|
1221
|
+
FillSpec->YStart = 0;
|
|
1222
|
+
if (FillSpec->YEnd >= NUM_CP_BUCKETS)
|
|
1223
|
+
FillSpec->YEnd = NUM_CP_BUCKETS - 1;
|
|
1224
|
+
|
|
1225
|
+
for (Y = FillSpec->YStart; Y <= FillSpec->YEnd; Y++)
|
|
1226
|
+
for (Angle = FillSpec->AngleStart;
|
|
1227
|
+
TRUE; CircularIncrement (Angle, NUM_CP_BUCKETS)) {
|
|
1228
|
+
OldWord = Pruner[X][Y][Angle][WordIndex];
|
|
1229
|
+
if (ClassCount > (OldWord & ClassMask)) {
|
|
1230
|
+
OldWord &= ~ClassMask;
|
|
1231
|
+
OldWord |= ClassCount;
|
|
1232
|
+
Pruner[X][Y][Angle][WordIndex] = OldWord;
|
|
1233
|
+
}
|
|
1234
|
+
if (Angle == FillSpec->AngleEnd)
|
|
1235
|
+
break;
|
|
1236
|
+
}
|
|
1237
|
+
} /* DoFill */
|
|
1238
|
+
|
|
1239
|
+
|
|
1240
|
+
/*---------------------------------------------------------------------------*/
|
|
1241
|
+
BOOL8 FillerDone(TABLE_FILLER *Filler) {
|
|
1242
|
+
/*
|
|
1243
|
+
** Parameters:
|
|
1244
|
+
** Filler table filler to check if done
|
|
1245
|
+
** Globals: none
|
|
1246
|
+
** Operation: Return TRUE if the specified table filler is done, i.e.
|
|
1247
|
+
** if it has no more lines to fill.
|
|
1248
|
+
** Return: TRUE if no more lines to fill, FALSE otherwise.
|
|
1249
|
+
** Exceptions: none
|
|
1250
|
+
** History: Tue Feb 19 10:08:05 1991, DSJ, Created.
|
|
1251
|
+
*/
|
|
1252
|
+
FILL_SWITCH *Next;
|
|
1253
|
+
|
|
1254
|
+
Next = &(Filler->Switch[Filler->NextSwitch]);
|
|
1255
|
+
|
|
1256
|
+
if (Filler->X > Next->X && Next->Type == LastSwitch)
|
|
1257
|
+
return (TRUE);
|
|
1258
|
+
else
|
|
1259
|
+
return (FALSE);
|
|
1260
|
+
|
|
1261
|
+
} /* FillerDone */
|
|
1262
|
+
|
|
1263
|
+
|
|
1264
|
+
/*---------------------------------------------------------------------------*/
|
|
1265
|
+
void
|
|
1266
|
+
FillPPCircularBits (uinT32 ParamTable[NUM_PP_BUCKETS][WERDS_PER_PP_VECTOR],
|
|
1267
|
+
int Bit, FLOAT32 Center, FLOAT32 Spread) {
|
|
1268
|
+
/*
|
|
1269
|
+
** Parameters:
|
|
1270
|
+
** ParamTable table of bit vectors, one per param bucket
|
|
1271
|
+
** Bit bit position in vectors to be filled
|
|
1272
|
+
** Center center of filled area
|
|
1273
|
+
** Spread spread of filled area
|
|
1274
|
+
** Globals: none
|
|
1275
|
+
** Operation: This routine sets Bit in each bit vector whose
|
|
1276
|
+
** bucket lies within the range Center +- Spread. The fill
|
|
1277
|
+
** is done for a circular dimension, i.e. bucket 0 is adjacent
|
|
1278
|
+
** to the last bucket. It is assumed that Center and Spread
|
|
1279
|
+
** are expressed in a circular coordinate system whose range
|
|
1280
|
+
** is 0 to 1.
|
|
1281
|
+
** Return: none
|
|
1282
|
+
** Exceptions: none
|
|
1283
|
+
** History: Tue Oct 16 09:26:54 1990, DSJ, Created.
|
|
1284
|
+
*/
|
|
1285
|
+
int i, FirstBucket, LastBucket;
|
|
1286
|
+
|
|
1287
|
+
if (Spread > 0.5)
|
|
1288
|
+
Spread = 0.5;
|
|
1289
|
+
|
|
1290
|
+
FirstBucket = (int) floor ((Center - Spread) * NUM_PP_BUCKETS);
|
|
1291
|
+
if (FirstBucket < 0)
|
|
1292
|
+
FirstBucket += NUM_PP_BUCKETS;
|
|
1293
|
+
|
|
1294
|
+
LastBucket = (int) floor ((Center + Spread) * NUM_PP_BUCKETS);
|
|
1295
|
+
if (LastBucket >= NUM_PP_BUCKETS)
|
|
1296
|
+
LastBucket -= NUM_PP_BUCKETS;
|
|
1297
|
+
if (LearningDebugLevel >= 2)
|
|
1298
|
+
cprintf ("Circular fill from %d to %d", FirstBucket, LastBucket);
|
|
1299
|
+
for (i = FirstBucket; TRUE; CircularIncrement (i, NUM_PP_BUCKETS)) {
|
|
1300
|
+
SET_BIT (ParamTable[i], Bit);
|
|
1301
|
+
|
|
1302
|
+
/* exit loop after we have set the bit for the last bucket */
|
|
1303
|
+
if (i == LastBucket)
|
|
1304
|
+
break;
|
|
1305
|
+
}
|
|
1306
|
+
|
|
1307
|
+
} /* FillPPCircularBits */
|
|
1308
|
+
|
|
1309
|
+
|
|
1310
|
+
/*---------------------------------------------------------------------------*/
|
|
1311
|
+
void
|
|
1312
|
+
FillPPLinearBits (uinT32 ParamTable[NUM_PP_BUCKETS][WERDS_PER_PP_VECTOR],
|
|
1313
|
+
int Bit, FLOAT32 Center, FLOAT32 Spread) {
|
|
1314
|
+
/*
|
|
1315
|
+
** Parameters:
|
|
1316
|
+
** ParamTable table of bit vectors, one per param bucket
|
|
1317
|
+
** Bit bit number being filled
|
|
1318
|
+
** Center center of filled area
|
|
1319
|
+
** Spread spread of filled area
|
|
1320
|
+
** Globals: none
|
|
1321
|
+
** Operation: This routine sets Bit in each bit vector whose
|
|
1322
|
+
** bucket lies within the range Center +- Spread. The fill
|
|
1323
|
+
** is done for a linear dimension, i.e. there is no wrap-around
|
|
1324
|
+
** for this dimension. It is assumed that Center and Spread
|
|
1325
|
+
** are expressed in a linear coordinate system whose range
|
|
1326
|
+
** is approximately 0 to 1. Values outside this range will
|
|
1327
|
+
** be clipped.
|
|
1328
|
+
** Return: none
|
|
1329
|
+
** Exceptions: none
|
|
1330
|
+
** History: Tue Oct 16 09:26:54 1990, DSJ, Created.
|
|
1331
|
+
*/
|
|
1332
|
+
int i, FirstBucket, LastBucket;
|
|
1333
|
+
|
|
1334
|
+
FirstBucket = (int) floor ((Center - Spread) * NUM_PP_BUCKETS);
|
|
1335
|
+
if (FirstBucket < 0)
|
|
1336
|
+
FirstBucket = 0;
|
|
1337
|
+
|
|
1338
|
+
LastBucket = (int) floor ((Center + Spread) * NUM_PP_BUCKETS);
|
|
1339
|
+
if (LastBucket >= NUM_PP_BUCKETS)
|
|
1340
|
+
LastBucket = NUM_PP_BUCKETS - 1;
|
|
1341
|
+
|
|
1342
|
+
if (LearningDebugLevel >= 2)
|
|
1343
|
+
cprintf ("Linear fill from %d to %d", FirstBucket, LastBucket);
|
|
1344
|
+
for (i = FirstBucket; i <= LastBucket; i++)
|
|
1345
|
+
SET_BIT (ParamTable[i], Bit);
|
|
1346
|
+
|
|
1347
|
+
} /* FillPPLinearBits */
|
|
1348
|
+
|
|
1349
|
+
|
|
1350
|
+
/*---------------------------------------------------------------------------*/
|
|
1351
|
+
#ifndef GRAPHICS_DISABLED
|
|
1352
|
+
CLASS_ID GetClassToDebug(const char *Prompt) {
|
|
1353
|
+
/*
|
|
1354
|
+
** Parameters:
|
|
1355
|
+
** Prompt prompt to print while waiting for input from window
|
|
1356
|
+
** Globals: none
|
|
1357
|
+
** Operation: This routine prompts the user with Prompt and waits
|
|
1358
|
+
** for the user to enter something in the debug window.
|
|
1359
|
+
** Return: Character entered in the debug window.
|
|
1360
|
+
** Exceptions: none
|
|
1361
|
+
** History: Thu Mar 21 16:55:13 1991, DSJ, Created.
|
|
1362
|
+
*/
|
|
1363
|
+
tprintf("%s\n", Prompt);
|
|
1364
|
+
SVEvent* ev;
|
|
1365
|
+
SVEventType ev_type;
|
|
1366
|
+
// Wait until a click or popup event.
|
|
1367
|
+
do {
|
|
1368
|
+
ev = IntMatchWindow->AwaitEvent(SVET_ANY);
|
|
1369
|
+
ev_type = ev->type;
|
|
1370
|
+
if (ev_type == SVET_POPUP) {
|
|
1371
|
+
// TODO(rays) must return which menu item was selected, but
|
|
1372
|
+
// that can't be done in this CL without dragging in a lot of
|
|
1373
|
+
// other changes.
|
|
1374
|
+
if (unicharset.contains_unichar(ev->parameter))
|
|
1375
|
+
return unicharset.unichar_to_id(ev->parameter);
|
|
1376
|
+
tprintf("Char class '%s' not found in unicharset",
|
|
1377
|
+
ev->parameter);
|
|
1378
|
+
}
|
|
1379
|
+
delete ev;
|
|
1380
|
+
} while (ev_type != SVET_CLICK);
|
|
1381
|
+
return 0;
|
|
1382
|
+
} /* GetClassToDebug */
|
|
1383
|
+
#endif
|
|
1384
|
+
|
|
1385
|
+
/*---------------------------------------------------------------------------*/
|
|
1386
|
+
void GetCPPadsForLevel(int Level,
|
|
1387
|
+
FLOAT32 *EndPad,
|
|
1388
|
+
FLOAT32 *SidePad,
|
|
1389
|
+
FLOAT32 *AnglePad) {
|
|
1390
|
+
/*
|
|
1391
|
+
** Parameters:
|
|
1392
|
+
** Level "tightness" level to return pads for
|
|
1393
|
+
** EndPad place to put end pad for Level
|
|
1394
|
+
** SidePad place to put side pad for Level
|
|
1395
|
+
** AnglePad place to put angle pad for Level
|
|
1396
|
+
** Globals: none
|
|
1397
|
+
** Operation: This routine copies the appropriate global pad variables
|
|
1398
|
+
** into EndPad, SidePad, and AnglePad. This is a kludge used
|
|
1399
|
+
** to get around the fact that global control variables cannot
|
|
1400
|
+
** be arrays. If the specified level is illegal, the tightest
|
|
1401
|
+
** possible pads are returned.
|
|
1402
|
+
** Return: none (results are returned in EndPad, SidePad, and AnglePad.
|
|
1403
|
+
** Exceptions: none
|
|
1404
|
+
** History: Thu Feb 14 08:26:49 1991, DSJ, Created.
|
|
1405
|
+
*/
|
|
1406
|
+
switch (Level) {
|
|
1407
|
+
case 0:
|
|
1408
|
+
*EndPad = CPEndPadLoose * GetPicoFeatureLength ();
|
|
1409
|
+
*SidePad = CPSidePadLoose * GetPicoFeatureLength ();
|
|
1410
|
+
*AnglePad = CPAnglePadLoose / 360.0;
|
|
1411
|
+
break;
|
|
1412
|
+
|
|
1413
|
+
case 1:
|
|
1414
|
+
*EndPad = CPEndPadMedium * GetPicoFeatureLength ();
|
|
1415
|
+
*SidePad = CPSidePadMedium * GetPicoFeatureLength ();
|
|
1416
|
+
*AnglePad = CPAnglePadMedium / 360.0;
|
|
1417
|
+
break;
|
|
1418
|
+
|
|
1419
|
+
case 2:
|
|
1420
|
+
*EndPad = CPEndPadTight * GetPicoFeatureLength ();
|
|
1421
|
+
*SidePad = CPSidePadTight * GetPicoFeatureLength ();
|
|
1422
|
+
*AnglePad = CPAnglePadTight / 360.0;
|
|
1423
|
+
break;
|
|
1424
|
+
|
|
1425
|
+
default:
|
|
1426
|
+
*EndPad = CPEndPadTight * GetPicoFeatureLength ();
|
|
1427
|
+
*SidePad = CPSidePadTight * GetPicoFeatureLength ();
|
|
1428
|
+
*AnglePad = CPAnglePadTight / 360.0;
|
|
1429
|
+
break;
|
|
1430
|
+
}
|
|
1431
|
+
if (*AnglePad > 0.5)
|
|
1432
|
+
*AnglePad = 0.5;
|
|
1433
|
+
|
|
1434
|
+
} /* GetCPPadsForLevel */
|
|
1435
|
+
|
|
1436
|
+
|
|
1437
|
+
/*---------------------------------------------------------------------------*/
|
|
1438
|
+
C_COL GetMatchColorFor(FLOAT32 Evidence) {
|
|
1439
|
+
/*
|
|
1440
|
+
** Parameters:
|
|
1441
|
+
** Evidence evidence value to return color for
|
|
1442
|
+
** Globals: none
|
|
1443
|
+
** Operation:
|
|
1444
|
+
** Return: Color which corresponds to specified Evidence value.
|
|
1445
|
+
** Exceptions: none
|
|
1446
|
+
** History: Thu Mar 21 15:24:52 1991, DSJ, Created.
|
|
1447
|
+
*/
|
|
1448
|
+
|
|
1449
|
+
assert (Evidence >= 0.0);
|
|
1450
|
+
assert (Evidence <= 1.0);
|
|
1451
|
+
|
|
1452
|
+
if (Evidence >= 0.90)
|
|
1453
|
+
return White;
|
|
1454
|
+
else if (Evidence >= 0.75)
|
|
1455
|
+
return Green;
|
|
1456
|
+
else if (Evidence >= 0.50)
|
|
1457
|
+
return Red;
|
|
1458
|
+
else
|
|
1459
|
+
return Blue;
|
|
1460
|
+
} /* GetMatchColorFor */
|
|
1461
|
+
|
|
1462
|
+
|
|
1463
|
+
/*---------------------------------------------------------------------------*/
|
|
1464
|
+
void GetNextFill(TABLE_FILLER *Filler, FILL_SPEC *Fill) {
|
|
1465
|
+
/*
|
|
1466
|
+
** Parameters:
|
|
1467
|
+
** Filler filler to get next fill spec from
|
|
1468
|
+
** Fill place to put spec for next fill
|
|
1469
|
+
** Globals: none
|
|
1470
|
+
** Operation: This routine returns (in Fill) the specification of
|
|
1471
|
+
** the next line to be filled from Filler. FillerDone() should
|
|
1472
|
+
** always be called before GetNextFill() to ensure that we
|
|
1473
|
+
** do not run past the end of the fill table.
|
|
1474
|
+
** Return: none (results are returned in Fill)
|
|
1475
|
+
** Exceptions: none
|
|
1476
|
+
** History: Tue Feb 19 10:17:42 1991, DSJ, Created.
|
|
1477
|
+
*/
|
|
1478
|
+
FILL_SWITCH *Next;
|
|
1479
|
+
|
|
1480
|
+
/* compute the fill assuming no switches will be encountered */
|
|
1481
|
+
Fill->AngleStart = Filler->AngleStart;
|
|
1482
|
+
Fill->AngleEnd = Filler->AngleEnd;
|
|
1483
|
+
Fill->X = Filler->X;
|
|
1484
|
+
Fill->YStart = Filler->YStart >> 8;
|
|
1485
|
+
Fill->YEnd = Filler->YEnd >> 8;
|
|
1486
|
+
|
|
1487
|
+
/* update the fill info and the filler for ALL switches at this X value */
|
|
1488
|
+
Next = &(Filler->Switch[Filler->NextSwitch]);
|
|
1489
|
+
while (Filler->X >= Next->X) {
|
|
1490
|
+
Fill->X = Filler->X = Next->X;
|
|
1491
|
+
if (Next->Type == StartSwitch) {
|
|
1492
|
+
Fill->YStart = Next->Y;
|
|
1493
|
+
Filler->StartDelta = Next->Delta;
|
|
1494
|
+
Filler->YStart = Next->YInit;
|
|
1495
|
+
}
|
|
1496
|
+
else if (Next->Type == EndSwitch) {
|
|
1497
|
+
Fill->YEnd = Next->Y;
|
|
1498
|
+
Filler->EndDelta = Next->Delta;
|
|
1499
|
+
Filler->YEnd = Next->YInit;
|
|
1500
|
+
}
|
|
1501
|
+
else { /* Type must be LastSwitch */
|
|
1502
|
+
break;
|
|
1503
|
+
}
|
|
1504
|
+
Filler->NextSwitch++;
|
|
1505
|
+
Next = &(Filler->Switch[Filler->NextSwitch]);
|
|
1506
|
+
}
|
|
1507
|
+
|
|
1508
|
+
/* prepare the filler for the next call to this routine */
|
|
1509
|
+
Filler->X++;
|
|
1510
|
+
Filler->YStart += Filler->StartDelta;
|
|
1511
|
+
Filler->YEnd += Filler->EndDelta;
|
|
1512
|
+
|
|
1513
|
+
} /* GetNextFill */
|
|
1514
|
+
|
|
1515
|
+
|
|
1516
|
+
/*---------------------------------------------------------------------------*/
|
|
1517
|
+
void
|
|
1518
|
+
InitTableFiller (FLOAT32 EndPad,
|
|
1519
|
+
FLOAT32 SidePad,
|
|
1520
|
+
FLOAT32 AnglePad, PROTO Proto, TABLE_FILLER * Filler)
|
|
1521
|
+
/*
|
|
1522
|
+
** Parameters:
|
|
1523
|
+
** EndPad, SidePad, AnglePad padding to add to proto
|
|
1524
|
+
** Proto proto to create a filler for
|
|
1525
|
+
** Filler place to put table filler
|
|
1526
|
+
** Globals: none
|
|
1527
|
+
** Operation: This routine computes a data structure (Filler)
|
|
1528
|
+
** which can be used to fill in a rectangle surrounding
|
|
1529
|
+
** the specified Proto.
|
|
1530
|
+
** Return: none (results are returned in Filler)
|
|
1531
|
+
** Exceptions: none
|
|
1532
|
+
** History: Thu Feb 14 09:27:05 1991, DSJ, Created.
|
|
1533
|
+
*/
|
|
1534
|
+
#define XS X_SHIFT
|
|
1535
|
+
#define YS Y_SHIFT
|
|
1536
|
+
#define AS ANGLE_SHIFT
|
|
1537
|
+
#define NB NUM_CP_BUCKETS
|
|
1538
|
+
{
|
|
1539
|
+
FLOAT32 Angle;
|
|
1540
|
+
FLOAT32 X, Y, HalfLength;
|
|
1541
|
+
FLOAT32 Cos, Sin;
|
|
1542
|
+
FLOAT32 XAdjust, YAdjust;
|
|
1543
|
+
FPOINT Start, Switch1, Switch2, End;
|
|
1544
|
+
int S1 = 0;
|
|
1545
|
+
int S2 = 1;
|
|
1546
|
+
|
|
1547
|
+
Angle = Proto->Angle;
|
|
1548
|
+
X = Proto->X;
|
|
1549
|
+
Y = Proto->Y;
|
|
1550
|
+
HalfLength = Proto->Length / 2.0;
|
|
1551
|
+
|
|
1552
|
+
Filler->AngleStart = CircBucketFor (Angle - AnglePad, AS, NB);
|
|
1553
|
+
Filler->AngleEnd = CircBucketFor (Angle + AnglePad, AS, NB);
|
|
1554
|
+
Filler->NextSwitch = 0;
|
|
1555
|
+
|
|
1556
|
+
if (fabs (Angle - 0.0) < HV_TOLERANCE || fabs (Angle - 0.5) < HV_TOLERANCE) {
|
|
1557
|
+
/* horizontal proto - handle as special case */
|
|
1558
|
+
Filler->X = BucketFor (X - HalfLength - EndPad, XS, NB);
|
|
1559
|
+
Filler->YStart = BucketFor (Y - SidePad, YS, NB * 256);
|
|
1560
|
+
Filler->YEnd = BucketFor (Y + SidePad, YS, NB * 256);
|
|
1561
|
+
Filler->StartDelta = 0;
|
|
1562
|
+
Filler->EndDelta = 0;
|
|
1563
|
+
Filler->Switch[0].Type = LastSwitch;
|
|
1564
|
+
Filler->Switch[0].X = BucketFor (X + HalfLength + EndPad, XS, NB);
|
|
1565
|
+
}
|
|
1566
|
+
else if (fabs (Angle - 0.25) < HV_TOLERANCE ||
|
|
1567
|
+
fabs (Angle - 0.75) < HV_TOLERANCE) {
|
|
1568
|
+
/* vertical proto - handle as special case */
|
|
1569
|
+
Filler->X = BucketFor (X - SidePad, XS, NB);
|
|
1570
|
+
Filler->YStart = BucketFor (Y - HalfLength - EndPad, YS, NB * 256);
|
|
1571
|
+
Filler->YEnd = BucketFor (Y + HalfLength + EndPad, YS, NB * 256);
|
|
1572
|
+
Filler->StartDelta = 0;
|
|
1573
|
+
Filler->EndDelta = 0;
|
|
1574
|
+
Filler->Switch[0].Type = LastSwitch;
|
|
1575
|
+
Filler->Switch[0].X = BucketFor (X + SidePad, XS, NB);
|
|
1576
|
+
}
|
|
1577
|
+
else {
|
|
1578
|
+
/* diagonal proto */
|
|
1579
|
+
|
|
1580
|
+
if ((Angle > 0.0 && Angle < 0.25) || (Angle > 0.5 && Angle < 0.75)) {
|
|
1581
|
+
/* rising diagonal proto */
|
|
1582
|
+
Angle *= 2.0 * PI;
|
|
1583
|
+
Cos = fabs (cos (Angle));
|
|
1584
|
+
Sin = fabs (sin (Angle));
|
|
1585
|
+
|
|
1586
|
+
/* compute the positions of the corners of the acceptance region */
|
|
1587
|
+
Start.x = X - (HalfLength + EndPad) * Cos - SidePad * Sin;
|
|
1588
|
+
Start.y = Y - (HalfLength + EndPad) * Sin + SidePad * Cos;
|
|
1589
|
+
End.x = 2.0 * X - Start.x;
|
|
1590
|
+
End.y = 2.0 * Y - Start.y;
|
|
1591
|
+
Switch1.x = X - (HalfLength + EndPad) * Cos + SidePad * Sin;
|
|
1592
|
+
Switch1.y = Y - (HalfLength + EndPad) * Sin - SidePad * Cos;
|
|
1593
|
+
Switch2.x = 2.0 * X - Switch1.x;
|
|
1594
|
+
Switch2.y = 2.0 * Y - Switch1.y;
|
|
1595
|
+
|
|
1596
|
+
if (Switch1.x > Switch2.x) {
|
|
1597
|
+
S1 = 1;
|
|
1598
|
+
S2 = 0;
|
|
1599
|
+
}
|
|
1600
|
+
|
|
1601
|
+
/* translate into bucket positions and deltas */
|
|
1602
|
+
Filler->X = (inT8) MapParam (Start.x, XS, NB);
|
|
1603
|
+
Filler->StartDelta = -(inT16) ((Cos / Sin) * 256);
|
|
1604
|
+
Filler->EndDelta = (inT16) ((Sin / Cos) * 256);
|
|
1605
|
+
|
|
1606
|
+
XAdjust = BucketEnd (Filler->X, XS, NB) - Start.x;
|
|
1607
|
+
YAdjust = XAdjust * Cos / Sin;
|
|
1608
|
+
Filler->YStart = (inT16) MapParam (Start.y - YAdjust, YS, NB * 256);
|
|
1609
|
+
YAdjust = XAdjust * Sin / Cos;
|
|
1610
|
+
Filler->YEnd = (inT16) MapParam (Start.y + YAdjust, YS, NB * 256);
|
|
1611
|
+
|
|
1612
|
+
Filler->Switch[S1].Type = StartSwitch;
|
|
1613
|
+
Filler->Switch[S1].X = (inT8) MapParam (Switch1.x, XS, NB);
|
|
1614
|
+
Filler->Switch[S1].Y = (inT8) MapParam (Switch1.y, YS, NB);
|
|
1615
|
+
XAdjust = Switch1.x - BucketStart (Filler->Switch[S1].X, XS, NB);
|
|
1616
|
+
YAdjust = XAdjust * Sin / Cos;
|
|
1617
|
+
Filler->Switch[S1].YInit =
|
|
1618
|
+
(inT16) MapParam (Switch1.y - YAdjust, YS, NB * 256);
|
|
1619
|
+
Filler->Switch[S1].Delta = Filler->EndDelta;
|
|
1620
|
+
|
|
1621
|
+
Filler->Switch[S2].Type = EndSwitch;
|
|
1622
|
+
Filler->Switch[S2].X = (inT8) MapParam (Switch2.x, XS, NB);
|
|
1623
|
+
Filler->Switch[S2].Y = (inT8) MapParam (Switch2.y, YS, NB);
|
|
1624
|
+
XAdjust = Switch2.x - BucketStart (Filler->Switch[S2].X, XS, NB);
|
|
1625
|
+
YAdjust = XAdjust * Cos / Sin;
|
|
1626
|
+
Filler->Switch[S2].YInit =
|
|
1627
|
+
(inT16) MapParam (Switch2.y + YAdjust, YS, NB * 256);
|
|
1628
|
+
Filler->Switch[S2].Delta = Filler->StartDelta;
|
|
1629
|
+
|
|
1630
|
+
Filler->Switch[2].Type = LastSwitch;
|
|
1631
|
+
Filler->Switch[2].X = (inT8) MapParam (End.x, XS, NB);
|
|
1632
|
+
}
|
|
1633
|
+
else {
|
|
1634
|
+
/* falling diagonal proto */
|
|
1635
|
+
Angle *= 2.0 * PI;
|
|
1636
|
+
Cos = fabs (cos (Angle));
|
|
1637
|
+
Sin = fabs (sin (Angle));
|
|
1638
|
+
|
|
1639
|
+
/* compute the positions of the corners of the acceptance region */
|
|
1640
|
+
Start.x = X - (HalfLength + EndPad) * Cos - SidePad * Sin;
|
|
1641
|
+
Start.y = Y + (HalfLength + EndPad) * Sin - SidePad * Cos;
|
|
1642
|
+
End.x = 2.0 * X - Start.x;
|
|
1643
|
+
End.y = 2.0 * Y - Start.y;
|
|
1644
|
+
Switch1.x = X - (HalfLength + EndPad) * Cos + SidePad * Sin;
|
|
1645
|
+
Switch1.y = Y + (HalfLength + EndPad) * Sin + SidePad * Cos;
|
|
1646
|
+
Switch2.x = 2.0 * X - Switch1.x;
|
|
1647
|
+
Switch2.y = 2.0 * Y - Switch1.y;
|
|
1648
|
+
|
|
1649
|
+
if (Switch1.x > Switch2.x) {
|
|
1650
|
+
S1 = 1;
|
|
1651
|
+
S2 = 0;
|
|
1652
|
+
}
|
|
1653
|
+
|
|
1654
|
+
/* translate into bucket positions and deltas */
|
|
1655
|
+
Filler->X = (inT8) MapParam (Start.x, XS, NB);
|
|
1656
|
+
Filler->StartDelta = -(inT16) ((Sin / Cos) * 256);
|
|
1657
|
+
Filler->EndDelta = (inT16) ((Cos / Sin) * 256);
|
|
1658
|
+
|
|
1659
|
+
XAdjust = BucketEnd (Filler->X, XS, NB) - Start.x;
|
|
1660
|
+
YAdjust = XAdjust * Sin / Cos;
|
|
1661
|
+
Filler->YStart = (inT16) MapParam (Start.y - YAdjust, YS, NB * 256);
|
|
1662
|
+
YAdjust = XAdjust * Cos / Sin;
|
|
1663
|
+
Filler->YEnd = (inT16) MapParam (Start.y + YAdjust, YS, NB * 256);
|
|
1664
|
+
|
|
1665
|
+
Filler->Switch[S1].Type = EndSwitch;
|
|
1666
|
+
Filler->Switch[S1].X = (inT8) MapParam (Switch1.x, XS, NB);
|
|
1667
|
+
Filler->Switch[S1].Y = (inT8) MapParam (Switch1.y, YS, NB);
|
|
1668
|
+
XAdjust = Switch1.x - BucketStart (Filler->Switch[S1].X, XS, NB);
|
|
1669
|
+
YAdjust = XAdjust * Sin / Cos;
|
|
1670
|
+
Filler->Switch[S1].YInit =
|
|
1671
|
+
(inT16) MapParam (Switch1.y + YAdjust, YS, NB * 256);
|
|
1672
|
+
Filler->Switch[S1].Delta = Filler->StartDelta;
|
|
1673
|
+
|
|
1674
|
+
Filler->Switch[S2].Type = StartSwitch;
|
|
1675
|
+
Filler->Switch[S2].X = (inT8) MapParam (Switch2.x, XS, NB);
|
|
1676
|
+
Filler->Switch[S2].Y = (inT8) MapParam (Switch2.y, YS, NB);
|
|
1677
|
+
XAdjust = Switch2.x - BucketStart (Filler->Switch[S2].X, XS, NB);
|
|
1678
|
+
YAdjust = XAdjust * Cos / Sin;
|
|
1679
|
+
Filler->Switch[S2].YInit =
|
|
1680
|
+
(inT16) MapParam (Switch2.y - YAdjust, YS, NB * 256);
|
|
1681
|
+
Filler->Switch[S2].Delta = Filler->EndDelta;
|
|
1682
|
+
|
|
1683
|
+
Filler->Switch[2].Type = LastSwitch;
|
|
1684
|
+
Filler->Switch[2].X = (inT8) MapParam (End.x, XS, NB);
|
|
1685
|
+
}
|
|
1686
|
+
}
|
|
1687
|
+
} /* InitTableFiller */
|
|
1688
|
+
|
|
1689
|
+
|
|
1690
|
+
/*---------------------------------------------------------------------------*/
|
|
1691
|
+
#ifndef GRAPHICS_DISABLED
|
|
1692
|
+
void RenderIntFeature(void *window, INT_FEATURE Feature, C_COL Color) {
|
|
1693
|
+
/*
|
|
1694
|
+
** Parameters:
|
|
1695
|
+
** ShapeList shape list to add feature rendering to
|
|
1696
|
+
** Feature feature to be rendered
|
|
1697
|
+
** Color color to use for feature rendering
|
|
1698
|
+
** Globals: none
|
|
1699
|
+
** Operation: This routine renders the specified feature into ShapeList.
|
|
1700
|
+
** Return: New shape list with rendering of Feature added.
|
|
1701
|
+
** Exceptions: none
|
|
1702
|
+
** History: Thu Mar 21 14:57:41 1991, DSJ, Created.
|
|
1703
|
+
*/
|
|
1704
|
+
FLOAT32 X, Y, Dx, Dy, Length;
|
|
1705
|
+
|
|
1706
|
+
c_line_color_index(window, Color);
|
|
1707
|
+
assert (Feature != NULL);
|
|
1708
|
+
assert (Color != 0);
|
|
1709
|
+
|
|
1710
|
+
X = Feature->X - DISPLAY_OFFSET;
|
|
1711
|
+
Y = Feature->Y - DISPLAY_OFFSET;
|
|
1712
|
+
Length = GetPicoFeatureLength () * 0.7 * INT_CHAR_NORM_RANGE;
|
|
1713
|
+
Dx = (Length / 2.0) * cos ((Feature->Theta / 256.0) * 2.0 * PI);
|
|
1714
|
+
Dy = (Length / 2.0) * sin ((Feature->Theta / 256.0) * 2.0 * PI);
|
|
1715
|
+
|
|
1716
|
+
c_move (window, X - Dx, Y - Dy);
|
|
1717
|
+
c_draw (window, X + Dx, Y + Dy);
|
|
1718
|
+
c_move (window, X - Dx - Dy * DOUBLE_OFFSET, Y - Dy + Dx * DOUBLE_OFFSET);
|
|
1719
|
+
c_draw (window, X + Dx - Dy * DOUBLE_OFFSET, Y + Dy + Dx * DOUBLE_OFFSET);
|
|
1720
|
+
} /* RenderIntFeature */
|
|
1721
|
+
|
|
1722
|
+
|
|
1723
|
+
/*---------------------------------------------------------------------------*/
|
|
1724
|
+
void RenderIntProto(void *window,
|
|
1725
|
+
INT_CLASS Class,
|
|
1726
|
+
PROTO_ID ProtoId,
|
|
1727
|
+
C_COL Color) {
|
|
1728
|
+
/*
|
|
1729
|
+
** Parameters:
|
|
1730
|
+
** ShapeList shape list to append proto rendering onto
|
|
1731
|
+
** Class class that proto is contained in
|
|
1732
|
+
** ProtoId id of proto to be rendered
|
|
1733
|
+
** Color color to render proto in
|
|
1734
|
+
** Globals: none
|
|
1735
|
+
** Operation: This routine extracts the parameters of the specified
|
|
1736
|
+
** proto from the class description and adds a rendering of
|
|
1737
|
+
** the proto onto the ShapeList.
|
|
1738
|
+
** Return: New shape list with a rendering of one proto added.
|
|
1739
|
+
** Exceptions: none
|
|
1740
|
+
** History: Thu Mar 21 10:21:09 1991, DSJ, Created.
|
|
1741
|
+
*/
|
|
1742
|
+
PROTO_SET ProtoSet;
|
|
1743
|
+
INT_PROTO Proto;
|
|
1744
|
+
int ProtoSetIndex;
|
|
1745
|
+
int ProtoWordIndex;
|
|
1746
|
+
FLOAT32 Length;
|
|
1747
|
+
int Xmin, Xmax, Ymin, Ymax;
|
|
1748
|
+
FLOAT32 X, Y, Dx, Dy;
|
|
1749
|
+
uinT32 ProtoMask;
|
|
1750
|
+
int Bucket;
|
|
1751
|
+
|
|
1752
|
+
assert (ProtoId >= 0);
|
|
1753
|
+
assert (Class != NULL);
|
|
1754
|
+
assert (ProtoId < Class->NumProtos);
|
|
1755
|
+
assert (Color != 0);
|
|
1756
|
+
c_line_color_index(window, Color);
|
|
1757
|
+
|
|
1758
|
+
ProtoSet = Class->ProtoSets[SetForProto (ProtoId)];
|
|
1759
|
+
ProtoSetIndex = IndexForProto (ProtoId);
|
|
1760
|
+
Proto = &(ProtoSet->Protos[ProtoSetIndex]);
|
|
1761
|
+
Length = (Class->ProtoLengths[ProtoId] *
|
|
1762
|
+
GetPicoFeatureLength () * INT_CHAR_NORM_RANGE);
|
|
1763
|
+
ProtoMask = PPrunerMaskFor (ProtoId);
|
|
1764
|
+
ProtoWordIndex = PPrunerWordIndexFor (ProtoId);
|
|
1765
|
+
|
|
1766
|
+
// find the x and y extent of the proto from the proto pruning table
|
|
1767
|
+
Xmin = Ymin = NUM_PP_BUCKETS;
|
|
1768
|
+
Xmax = Ymax = 0;
|
|
1769
|
+
for (Bucket = 0; Bucket < NUM_PP_BUCKETS; Bucket++) {
|
|
1770
|
+
if (ProtoMask & ProtoSet->ProtoPruner[PRUNER_X][Bucket][ProtoWordIndex]) {
|
|
1771
|
+
if (Bucket < Xmin)
|
|
1772
|
+
Xmin = Bucket;
|
|
1773
|
+
else if (Bucket > Xmax)
|
|
1774
|
+
Xmax = Bucket;
|
|
1775
|
+
}
|
|
1776
|
+
|
|
1777
|
+
if (ProtoMask & ProtoSet->ProtoPruner[PRUNER_Y][Bucket][ProtoWordIndex]) {
|
|
1778
|
+
if (Bucket < Ymin)
|
|
1779
|
+
Ymin = Bucket;
|
|
1780
|
+
else if (Bucket > Ymax)
|
|
1781
|
+
Ymax = Bucket;
|
|
1782
|
+
}
|
|
1783
|
+
}
|
|
1784
|
+
X = (Xmin + Xmax + 1) / 2.0 * PROTO_PRUNER_SCALE - DISPLAY_OFFSET;
|
|
1785
|
+
Y = (Ymin + Ymax + 1) / 2.0 * PROTO_PRUNER_SCALE - DISPLAY_OFFSET;
|
|
1786
|
+
Dx = (Length / 2.0) * cos ((Proto->Angle / 256.0) * 2.0 * PI);
|
|
1787
|
+
Dy = (Length / 2.0) * sin ((Proto->Angle / 256.0) * 2.0 * PI);
|
|
1788
|
+
|
|
1789
|
+
c_move (window, X - Dx, Y - Dy);
|
|
1790
|
+
c_draw (window, X + Dx, Y + Dy);
|
|
1791
|
+
} /* RenderIntProto */
|
|
1792
|
+
#endif
|
|
1793
|
+
|
|
1794
|
+
/*---------------------------------------------------------------------------*/
|
|
1795
|
+
int TruncateParam(FLOAT32 Param, int Min, int Max, char *Id) {
|
|
1796
|
+
/*
|
|
1797
|
+
** Parameters:
|
|
1798
|
+
** Param parameter value to be truncated
|
|
1799
|
+
** Min, Max parameter limits (inclusive)
|
|
1800
|
+
** Id string id of parameter for error messages
|
|
1801
|
+
** Globals: none
|
|
1802
|
+
** Operation: This routine truncates Param to lie within the range
|
|
1803
|
+
** of Min-Max inclusive. If a truncation is performed, and
|
|
1804
|
+
** Id is not null, an warning message is printed.
|
|
1805
|
+
** Return: Truncated parameter.
|
|
1806
|
+
** Exceptions: none
|
|
1807
|
+
** History: Fri Feb 8 11:54:28 1991, DSJ, Created.
|
|
1808
|
+
*/
|
|
1809
|
+
if (Param < Min) {
|
|
1810
|
+
if (Id)
|
|
1811
|
+
cprintf ("Warning: Param %s truncated from %f to %d!\n",
|
|
1812
|
+
Id, Param, Min);
|
|
1813
|
+
Param = Min;
|
|
1814
|
+
}
|
|
1815
|
+
else if (Param > Max) {
|
|
1816
|
+
if (Id)
|
|
1817
|
+
cprintf ("Warning: Param %s truncated from %f to %d!\n",
|
|
1818
|
+
Id, Param, Max);
|
|
1819
|
+
Param = Max;
|
|
1820
|
+
}
|
|
1821
|
+
return (int) floor (Param);
|
|
1822
|
+
|
|
1823
|
+
} /* TruncateParam */
|