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,1641 @@
|
|
|
1
|
+
/**********************************************************************
|
|
2
|
+
* File: fpchop.cpp (Formerly fp_chop.c)
|
|
3
|
+
* Description: Code to chop fixed pitch text into character cells.
|
|
4
|
+
* Author: Ray Smith
|
|
5
|
+
* Created: Thu Sep 16 11:14:15 BST 1993
|
|
6
|
+
*
|
|
7
|
+
* (C) Copyright 1993, Hewlett-Packard Ltd.
|
|
8
|
+
** Licensed under the Apache License, Version 2.0 (the "License");
|
|
9
|
+
** you may not use this file except in compliance with the License.
|
|
10
|
+
** You may obtain a copy of the License at
|
|
11
|
+
** http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
** Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
** distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
** See the License for the specific language governing permissions and
|
|
16
|
+
** limitations under the License.
|
|
17
|
+
*
|
|
18
|
+
**********************************************************************/
|
|
19
|
+
|
|
20
|
+
#include "mfcpch.h"
|
|
21
|
+
#ifdef __UNIX__
|
|
22
|
+
#include <assert.h>
|
|
23
|
+
#endif
|
|
24
|
+
#include "stderr.h"
|
|
25
|
+
#include "blobbox.h"
|
|
26
|
+
#include "lmedsq.h"
|
|
27
|
+
#include "statistc.h"
|
|
28
|
+
#include "drawtord.h"
|
|
29
|
+
#include "tovars.h"
|
|
30
|
+
#include "topitch.h"
|
|
31
|
+
#include "fpchop.h"
|
|
32
|
+
#include "notdll.h"
|
|
33
|
+
|
|
34
|
+
#define EXTERN
|
|
35
|
+
|
|
36
|
+
EXTERN INT_VAR (textord_fp_chop_error, 2,
|
|
37
|
+
"Max allowed bending of chop cells");
|
|
38
|
+
EXTERN double_VAR (textord_fp_chop_snap, 0.5,
|
|
39
|
+
"Max distance of chop pt from vertex");
|
|
40
|
+
|
|
41
|
+
ELISTIZE (OUTLINE_FRAG) ELISTIZE (C_OUTLINE_FRAG)
|
|
42
|
+
//#undef ASSERT_HOST
|
|
43
|
+
//#define ASSERT_HOST(x) if (!(x)) AfxMessageBox(#x);
|
|
44
|
+
/**********************************************************************
|
|
45
|
+
* fixed_pitch_words
|
|
46
|
+
*
|
|
47
|
+
* Make a ROW from a fixed pitch TO_ROW.
|
|
48
|
+
**********************************************************************/
|
|
49
|
+
ROW *fixed_pitch_words( //find lines
|
|
50
|
+
TO_ROW *row, //row to do
|
|
51
|
+
FCOORD rotation //for drawing
|
|
52
|
+
) {
|
|
53
|
+
BOOL8 bol; //start of line
|
|
54
|
+
uinT8 blanks; //in front of word
|
|
55
|
+
uinT8 new_blanks; //blanks in empty cell
|
|
56
|
+
inT16 chop_coord; //chop boundary
|
|
57
|
+
inT16 prev_chop_coord; //start of cell
|
|
58
|
+
inT16 rep_left; //left edge of rep word
|
|
59
|
+
ROW *real_row; //output row
|
|
60
|
+
OUTLINE_LIST left_outlines; //in current blob
|
|
61
|
+
OUTLINE_LIST right_outlines; //for next blob
|
|
62
|
+
C_OUTLINE_LIST left_coutlines;
|
|
63
|
+
C_OUTLINE_LIST right_coutlines;
|
|
64
|
+
PBLOB_LIST blobs; //blobs in word
|
|
65
|
+
C_BLOB_LIST cblobs;
|
|
66
|
+
PBLOB_IT blob_it = &blobs; //iterator
|
|
67
|
+
C_BLOB_IT cblob_it = &cblobs;
|
|
68
|
+
WERD_LIST words;
|
|
69
|
+
WERD_IT word_it = &words; //new words
|
|
70
|
+
//repeated blobs
|
|
71
|
+
WERD_IT rep_it = &row->rep_words;
|
|
72
|
+
WERD *word; //new word
|
|
73
|
+
inT32 xstarts[2]; //row ends
|
|
74
|
+
double coeffs[3]; //quadratic
|
|
75
|
+
inT32 prev_x; //end of prev blob
|
|
76
|
+
//iterator
|
|
77
|
+
BLOBNBOX_IT box_it = row->blob_list ();
|
|
78
|
+
//boundaries
|
|
79
|
+
ICOORDELT_IT cell_it = &row->char_cells;
|
|
80
|
+
|
|
81
|
+
#ifndef GRAPHICS_DISABLED
|
|
82
|
+
if (textord_show_page_cuts && to_win != NULL) {
|
|
83
|
+
plot_row_cells (to_win, ScrollView::RED, row, 0, &row->char_cells);
|
|
84
|
+
}
|
|
85
|
+
#endif
|
|
86
|
+
|
|
87
|
+
prev_x = -MAX_INT16;
|
|
88
|
+
bol = TRUE;
|
|
89
|
+
blanks = 0;
|
|
90
|
+
if (rep_it.empty ())
|
|
91
|
+
rep_left = MAX_INT16;
|
|
92
|
+
else
|
|
93
|
+
rep_left = rep_it.data ()->bounding_box ().left ();
|
|
94
|
+
if (box_it.empty ())
|
|
95
|
+
return NULL; //empty row
|
|
96
|
+
xstarts[0] = box_it.data ()->bounding_box ().left ();
|
|
97
|
+
if (rep_left < xstarts[0]) {
|
|
98
|
+
xstarts[0] = rep_left;
|
|
99
|
+
}
|
|
100
|
+
if (cell_it.empty () || row->char_cells.singleton ()) {
|
|
101
|
+
tprintf ("Row without enough char cells!\n");
|
|
102
|
+
tprintf ("Leftmost blob is at (%d,%d)\n",
|
|
103
|
+
box_it.data ()->bounding_box ().left (),
|
|
104
|
+
box_it.data ()->bounding_box ().bottom ());
|
|
105
|
+
return NULL;
|
|
106
|
+
}
|
|
107
|
+
ASSERT_HOST (!cell_it.empty () && !row->char_cells.singleton ());
|
|
108
|
+
prev_chop_coord = cell_it.data ()->x ();
|
|
109
|
+
word = NULL;
|
|
110
|
+
while (rep_left < cell_it.data ()->x ()) {
|
|
111
|
+
word = add_repeated_word (&rep_it, rep_left, prev_chop_coord,
|
|
112
|
+
blanks, row->fixed_pitch, &word_it);
|
|
113
|
+
}
|
|
114
|
+
cell_it.mark_cycle_pt ();
|
|
115
|
+
if (prev_chop_coord >= cell_it.data ()->x ())
|
|
116
|
+
cell_it.forward ();
|
|
117
|
+
for (; !cell_it.cycled_list (); cell_it.forward ()) {
|
|
118
|
+
chop_coord = cell_it.data ()->x ();
|
|
119
|
+
while (!box_it.empty ()
|
|
120
|
+
&& box_it.data ()->bounding_box ().left () <= chop_coord) {
|
|
121
|
+
if (box_it.data ()->bounding_box ().right () > prev_x)
|
|
122
|
+
prev_x = box_it.data ()->bounding_box ().right ();
|
|
123
|
+
split_to_blob (box_it.extract (), chop_coord,
|
|
124
|
+
textord_fp_chop_error + 0.5f,
|
|
125
|
+
&left_outlines, &left_coutlines,
|
|
126
|
+
&right_outlines, &right_coutlines);
|
|
127
|
+
box_it.forward ();
|
|
128
|
+
while (!box_it.empty ()
|
|
129
|
+
&& box_it.data ()->blob () == NULL
|
|
130
|
+
&& box_it.data ()->cblob () == NULL) {
|
|
131
|
+
delete box_it.extract ();
|
|
132
|
+
box_it.forward ();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
if ((!right_outlines.empty () || !right_coutlines.empty ())
|
|
136
|
+
&& left_outlines.empty () && left_coutlines.empty ())
|
|
137
|
+
split_to_blob (NULL, chop_coord,
|
|
138
|
+
textord_fp_chop_error + 0.5f,
|
|
139
|
+
&left_outlines, &left_coutlines,
|
|
140
|
+
&right_outlines, &right_coutlines);
|
|
141
|
+
if (!left_outlines.empty ())
|
|
142
|
+
blob_it.add_after_then_move (new PBLOB (&left_outlines));
|
|
143
|
+
else if (!left_coutlines.empty ())
|
|
144
|
+
cblob_it.add_after_then_move (new C_BLOB (&left_coutlines));
|
|
145
|
+
else {
|
|
146
|
+
if (rep_left < chop_coord) {
|
|
147
|
+
if (rep_left > prev_chop_coord)
|
|
148
|
+
new_blanks = (uinT8) floor ((rep_left - prev_chop_coord)
|
|
149
|
+
/ row->fixed_pitch + 0.5);
|
|
150
|
+
else
|
|
151
|
+
new_blanks = 0;
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
if (chop_coord > prev_chop_coord)
|
|
155
|
+
new_blanks = (uinT8) floor ((chop_coord - prev_chop_coord)
|
|
156
|
+
/ row->fixed_pitch + 0.5);
|
|
157
|
+
else
|
|
158
|
+
new_blanks = 0;
|
|
159
|
+
}
|
|
160
|
+
if (!blob_it.empty () || !cblob_it.empty ()) {
|
|
161
|
+
if (blanks < 1 && word != NULL && !word->flag (W_REP_CHAR))
|
|
162
|
+
blanks = 1;
|
|
163
|
+
if (!blob_it.empty ()) {
|
|
164
|
+
//make real word
|
|
165
|
+
word = new WERD (&blobs, blanks, NULL);
|
|
166
|
+
blob_it.set_to_list (&blobs);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
word = new WERD (&cblobs, blanks, NULL);
|
|
170
|
+
cblob_it.set_to_list (&cblobs);
|
|
171
|
+
}
|
|
172
|
+
word->set_flag (W_DONT_CHOP, TRUE);
|
|
173
|
+
word_it.add_after_then_move (word);
|
|
174
|
+
if (bol) {
|
|
175
|
+
word->set_flag (W_BOL, TRUE);
|
|
176
|
+
bol = FALSE;
|
|
177
|
+
}
|
|
178
|
+
blanks = new_blanks;
|
|
179
|
+
}
|
|
180
|
+
else
|
|
181
|
+
blanks += new_blanks;
|
|
182
|
+
while (rep_left < chop_coord) {
|
|
183
|
+
word = add_repeated_word (&rep_it, rep_left, prev_chop_coord,
|
|
184
|
+
blanks, row->fixed_pitch, &word_it);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
if (prev_chop_coord < chop_coord)
|
|
188
|
+
prev_chop_coord = chop_coord;
|
|
189
|
+
}
|
|
190
|
+
if (!blob_it.empty () || !cblob_it.empty ()) {
|
|
191
|
+
if (!blob_it.empty ())
|
|
192
|
+
//last word on line
|
|
193
|
+
word = new WERD (&blobs, blanks, NULL);
|
|
194
|
+
else
|
|
195
|
+
word = new WERD (&cblobs, blanks, NULL);
|
|
196
|
+
word->set_flag (W_DONT_CHOP, TRUE);
|
|
197
|
+
word_it.add_after_then_move (word);
|
|
198
|
+
if (bol)
|
|
199
|
+
word->set_flag (W_BOL, TRUE);
|
|
200
|
+
}
|
|
201
|
+
ASSERT_HOST (word != NULL);
|
|
202
|
+
while (!rep_it.empty ()) {
|
|
203
|
+
add_repeated_word (&rep_it, rep_left, prev_chop_coord,
|
|
204
|
+
blanks, row->fixed_pitch, &word_it);
|
|
205
|
+
}
|
|
206
|
+
//at end of line
|
|
207
|
+
word_it.data ()->set_flag (W_EOL, TRUE);
|
|
208
|
+
if (prev_chop_coord > prev_x)
|
|
209
|
+
prev_x = prev_chop_coord;
|
|
210
|
+
xstarts[1] = prev_x + 1;
|
|
211
|
+
coeffs[0] = 0;
|
|
212
|
+
coeffs[1] = row->line_m ();
|
|
213
|
+
coeffs[2] = row->line_c ();
|
|
214
|
+
real_row = new ROW (row, (inT16) row->kern_size, (inT16) row->space_size);
|
|
215
|
+
word_it.set_to_list (real_row->word_list ());
|
|
216
|
+
//put words in row
|
|
217
|
+
word_it.add_list_after (&words);
|
|
218
|
+
real_row->recalc_bounding_box ();
|
|
219
|
+
return real_row;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
/**********************************************************************
|
|
224
|
+
* add_repeated_word
|
|
225
|
+
*
|
|
226
|
+
* Add repeated word into the row at the given point.
|
|
227
|
+
**********************************************************************/
|
|
228
|
+
|
|
229
|
+
WERD *add_repeated_word( //move repeated word
|
|
230
|
+
WERD_IT *rep_it, //repeated words
|
|
231
|
+
inT16 &rep_left, //left edge of word
|
|
232
|
+
inT16 &prev_chop_coord, //previous word end
|
|
233
|
+
uinT8 &blanks, //no of blanks
|
|
234
|
+
float pitch, //char cell size
|
|
235
|
+
WERD_IT *word_it //list of words
|
|
236
|
+
) {
|
|
237
|
+
WERD *word; //word to move
|
|
238
|
+
inT16 new_blanks; //extra blanks
|
|
239
|
+
|
|
240
|
+
if (rep_left > prev_chop_coord) {
|
|
241
|
+
new_blanks = (uinT8) floor ((rep_left - prev_chop_coord) / pitch + 0.5);
|
|
242
|
+
blanks += new_blanks;
|
|
243
|
+
}
|
|
244
|
+
word = rep_it->extract ();
|
|
245
|
+
prev_chop_coord = word->bounding_box ().right ();
|
|
246
|
+
word_it->add_after_then_move (word);
|
|
247
|
+
word->set_blanks (blanks);
|
|
248
|
+
rep_it->forward ();
|
|
249
|
+
if (rep_it->empty ())
|
|
250
|
+
rep_left = MAX_INT16;
|
|
251
|
+
else
|
|
252
|
+
rep_left = rep_it->data ()->bounding_box ().left ();
|
|
253
|
+
blanks = 0;
|
|
254
|
+
return word;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
/**********************************************************************
|
|
259
|
+
* split_to_blob
|
|
260
|
+
*
|
|
261
|
+
* Split a BLOBNBOX across a vertical chop line and put the pieces
|
|
262
|
+
* into a left outline list and a right outline list.
|
|
263
|
+
**********************************************************************/
|
|
264
|
+
|
|
265
|
+
void split_to_blob( //split the blob
|
|
266
|
+
BLOBNBOX *blob, //blob to split
|
|
267
|
+
inT16 chop_coord, //place to chop
|
|
268
|
+
float pitch_error, //allowed deviation
|
|
269
|
+
OUTLINE_LIST *left_outlines, //left half of chop
|
|
270
|
+
C_OUTLINE_LIST *left_coutlines, //for cblobs
|
|
271
|
+
OUTLINE_LIST *right_outlines, //right half of chop
|
|
272
|
+
C_OUTLINE_LIST *right_coutlines) {
|
|
273
|
+
PBLOB *real_blob; //blob to chop
|
|
274
|
+
C_BLOB *real_cblob; //cblob to chop
|
|
275
|
+
|
|
276
|
+
if (blob != NULL) {
|
|
277
|
+
real_blob = blob->blob ();
|
|
278
|
+
real_cblob = blob->cblob ();
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
real_blob = NULL;
|
|
282
|
+
real_cblob = NULL;
|
|
283
|
+
}
|
|
284
|
+
if (!right_outlines->empty () || real_blob != NULL)
|
|
285
|
+
fixed_chop_blob(real_blob,
|
|
286
|
+
chop_coord,
|
|
287
|
+
pitch_error,
|
|
288
|
+
left_outlines,
|
|
289
|
+
right_outlines);
|
|
290
|
+
else if (!right_coutlines->empty () || real_cblob != NULL)
|
|
291
|
+
fixed_chop_cblob(real_cblob,
|
|
292
|
+
chop_coord,
|
|
293
|
+
pitch_error,
|
|
294
|
+
left_coutlines,
|
|
295
|
+
right_coutlines);
|
|
296
|
+
if (blob != NULL)
|
|
297
|
+
delete blob; //free it
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
/**********************************************************************
|
|
302
|
+
* fixed_chop_blob
|
|
303
|
+
*
|
|
304
|
+
* Chop the given blob (if any) and the existing right outlines to
|
|
305
|
+
* produce a list of outlines left of the chop point and more to the right.
|
|
306
|
+
**********************************************************************/
|
|
307
|
+
|
|
308
|
+
void fixed_chop_blob( //split the blob
|
|
309
|
+
PBLOB *blob, //blob to split
|
|
310
|
+
inT16 chop_coord, //place to chop
|
|
311
|
+
float pitch_error, //allowed deviation
|
|
312
|
+
OUTLINE_LIST *left_outlines, //left half of chop
|
|
313
|
+
OUTLINE_LIST *right_outlines //right half of chop
|
|
314
|
+
) {
|
|
315
|
+
OUTLINE *old_right; //already there
|
|
316
|
+
OUTLINE_LIST new_outlines; //new right ones
|
|
317
|
+
//ouput iterator
|
|
318
|
+
OUTLINE_IT left_it = left_outlines;
|
|
319
|
+
//in/out iterator
|
|
320
|
+
OUTLINE_IT right_it = right_outlines;
|
|
321
|
+
OUTLINE_IT new_it = &new_outlines;
|
|
322
|
+
OUTLINE_IT blob_it; //outlines in blob
|
|
323
|
+
|
|
324
|
+
if (!right_it.empty ()) {
|
|
325
|
+
while (!right_it.empty ()) {
|
|
326
|
+
old_right = right_it.extract ();
|
|
327
|
+
right_it.forward ();
|
|
328
|
+
fixed_split_outline(old_right,
|
|
329
|
+
chop_coord,
|
|
330
|
+
pitch_error,
|
|
331
|
+
&left_it,
|
|
332
|
+
&new_it);
|
|
333
|
+
}
|
|
334
|
+
right_it.add_list_before (&new_outlines);
|
|
335
|
+
}
|
|
336
|
+
if (blob != NULL) {
|
|
337
|
+
blob_it.set_to_list (blob->out_list ());
|
|
338
|
+
for (blob_it.mark_cycle_pt (); !blob_it.cycled_list ();
|
|
339
|
+
blob_it.forward ())
|
|
340
|
+
fixed_split_outline (blob_it.extract (), chop_coord, pitch_error,
|
|
341
|
+
&left_it, &right_it);
|
|
342
|
+
delete blob;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
/**********************************************************************
|
|
348
|
+
* fixed_split_outline
|
|
349
|
+
*
|
|
350
|
+
* Chop the given outline (if necessary) placing the fragments which
|
|
351
|
+
* fall either side of the chop line into the appropriate list.
|
|
352
|
+
**********************************************************************/
|
|
353
|
+
|
|
354
|
+
void fixed_split_outline( //chop the outline
|
|
355
|
+
OUTLINE *srcline, //source outline
|
|
356
|
+
inT16 chop_coord, //place to chop
|
|
357
|
+
float pitch_error, //allowed deviation
|
|
358
|
+
OUTLINE_IT *left_it, //left half of chop
|
|
359
|
+
OUTLINE_IT *right_it //right half of chop
|
|
360
|
+
) {
|
|
361
|
+
OUTLINE *child; //child outline
|
|
362
|
+
TBOX srcbox; //box of outline
|
|
363
|
+
OUTLINE_LIST left_ch; //left children
|
|
364
|
+
OUTLINE_LIST right_ch; //right children
|
|
365
|
+
OUTLINE_FRAG_LIST left_frags; //chopped fragments
|
|
366
|
+
OUTLINE_FRAG_LIST right_frags;;
|
|
367
|
+
OUTLINE_IT left_ch_it = &left_ch;
|
|
368
|
+
//for whole children
|
|
369
|
+
OUTLINE_IT right_ch_it = &right_ch;
|
|
370
|
+
//for holes
|
|
371
|
+
OUTLINE_IT child_it = srcline->child ();
|
|
372
|
+
|
|
373
|
+
srcbox = srcline->bounding_box ();
|
|
374
|
+
//left of line
|
|
375
|
+
if (srcbox.left () + srcbox.right () <= chop_coord * 2
|
|
376
|
+
//and not far over
|
|
377
|
+
&& srcbox.right () < chop_coord + pitch_error)
|
|
378
|
+
//stick whole in left
|
|
379
|
+
left_it->add_after_then_move (srcline);
|
|
380
|
+
else if (srcbox.left () + srcbox.right () > chop_coord * 2
|
|
381
|
+
&& srcbox.left () > chop_coord - pitch_error)
|
|
382
|
+
//stick whole in right
|
|
383
|
+
right_it->add_before_stay_put (srcline);
|
|
384
|
+
else {
|
|
385
|
+
//needs real chopping
|
|
386
|
+
if (fixed_chop_outline (srcline, chop_coord, pitch_error,
|
|
387
|
+
&left_frags, &right_frags)) {
|
|
388
|
+
for (child_it.mark_cycle_pt (); !child_it.cycled_list ();
|
|
389
|
+
child_it.forward ()) {
|
|
390
|
+
child = child_it.extract ();
|
|
391
|
+
srcbox = child->bounding_box ();
|
|
392
|
+
if (srcbox.right () < chop_coord)
|
|
393
|
+
left_ch_it.add_after_then_move (child);
|
|
394
|
+
else if (srcbox.left () > chop_coord)
|
|
395
|
+
right_ch_it.add_after_then_move (child);
|
|
396
|
+
else {
|
|
397
|
+
if (fixed_chop_outline (child, chop_coord, pitch_error,
|
|
398
|
+
&left_frags, &right_frags))
|
|
399
|
+
delete child;
|
|
400
|
+
else {
|
|
401
|
+
if (srcbox.left () + srcbox.right () <= chop_coord * 2)
|
|
402
|
+
left_ch_it.add_after_then_move (child);
|
|
403
|
+
else
|
|
404
|
+
right_ch_it.add_after_then_move (child);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
close_chopped_fragments(&left_frags, &left_ch, left_it);
|
|
409
|
+
close_chopped_fragments(&right_frags, &right_ch, right_it);
|
|
410
|
+
ASSERT_HOST (left_ch.empty () && right_ch.empty ());
|
|
411
|
+
//no children left
|
|
412
|
+
delete srcline; //smashed up
|
|
413
|
+
}
|
|
414
|
+
else {
|
|
415
|
+
if (srcbox.left () + srcbox.right () <= chop_coord * 2)
|
|
416
|
+
//stick whole in left
|
|
417
|
+
left_it->add_after_then_move (srcline);
|
|
418
|
+
else
|
|
419
|
+
right_it->add_before_stay_put (srcline);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
|
|
425
|
+
/**********************************************************************
|
|
426
|
+
* fixed_chop_outline
|
|
427
|
+
*
|
|
428
|
+
* Chop the given outline (if necessary) placing the fragments which
|
|
429
|
+
* fall either side of the chop line into the appropriate list.
|
|
430
|
+
* If the outline lies too heavily to one side to chop, FALSE is returned.
|
|
431
|
+
**********************************************************************/
|
|
432
|
+
|
|
433
|
+
BOOL8 fixed_chop_outline( //chop the outline
|
|
434
|
+
OUTLINE *srcline, //source outline
|
|
435
|
+
inT16 chop_coord, //place to chop
|
|
436
|
+
float pitch_error, //allowed deviation
|
|
437
|
+
OUTLINE_FRAG_LIST *left_frags, //left half of chop
|
|
438
|
+
OUTLINE_FRAG_LIST *right_frags //right half of chop
|
|
439
|
+
) {
|
|
440
|
+
BOOL8 not_first; //fragment
|
|
441
|
+
BOOL8 test_valid; //test pt valid
|
|
442
|
+
float left_edge; //of outline
|
|
443
|
+
FCOORD chop_pos; //coords of chop
|
|
444
|
+
float chop_starty; //test chop pt
|
|
445
|
+
POLYPT *startpt; //in first fragment
|
|
446
|
+
//general iterator
|
|
447
|
+
POLYPT_IT poly_it = srcline->polypts ();
|
|
448
|
+
POLYPT_IT head_it; //head of fragment
|
|
449
|
+
POLYPT_IT tail_it; //tail of fragment
|
|
450
|
+
POLYPT_IT test_tail; //possible chop pt
|
|
451
|
+
|
|
452
|
+
left_edge = poly_it.data ()->pos.x ();
|
|
453
|
+
tail_it = poly_it;
|
|
454
|
+
for (poly_it.mark_cycle_pt (); !poly_it.cycled_list (); poly_it.forward ()) {
|
|
455
|
+
if (poly_it.data ()->pos.x () < left_edge) {
|
|
456
|
+
left_edge = poly_it.data ()->pos.x ();
|
|
457
|
+
tail_it = poly_it; //find leftmost pt
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
if (left_edge >= chop_coord - pitch_error)
|
|
461
|
+
return FALSE; //not worth it
|
|
462
|
+
|
|
463
|
+
startpt = tail_it.data ();
|
|
464
|
+
not_first = FALSE;
|
|
465
|
+
head_it = tail_it;
|
|
466
|
+
chop_starty = tail_it.data ()->pos.y ();
|
|
467
|
+
do {
|
|
468
|
+
test_valid = FALSE;
|
|
469
|
+
do {
|
|
470
|
+
tail_it.forward ();
|
|
471
|
+
if (test_valid
|
|
472
|
+
&& tail_it.data ()->pos.x () >= chop_coord
|
|
473
|
+
&& tail_it.data ()->pos.x () + tail_it.data ()->vec.x () <=
|
|
474
|
+
chop_coord) {
|
|
475
|
+
chop_pos = find_chop_coords (&tail_it, chop_coord);
|
|
476
|
+
if (chop_pos.y () >= chop_starty)
|
|
477
|
+
test_valid = FALSE;
|
|
478
|
+
else {
|
|
479
|
+
tail_it = test_tail;
|
|
480
|
+
break; //must chop there
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
if (tail_it.data ()->pos.x () <= chop_coord
|
|
484
|
+
&& tail_it.data ()->pos.x () + tail_it.data ()->vec.x () >=
|
|
485
|
+
chop_coord) {
|
|
486
|
+
chop_pos = find_chop_coords (&tail_it, chop_coord);
|
|
487
|
+
chop_starty = chop_pos.y ();
|
|
488
|
+
test_tail = tail_it; //save possible chop pt
|
|
489
|
+
test_valid = TRUE;
|
|
490
|
+
if (tail_it.data ()->vec.x () == 0
|
|
491
|
+
&& tail_it.data ()->vec.y () < 0)
|
|
492
|
+
break; //must chop here
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
while (tail_it.data () != startpt
|
|
496
|
+
&& tail_it.data ()->pos.x () < chop_coord + pitch_error);
|
|
497
|
+
//back to start
|
|
498
|
+
if (tail_it.data () == startpt) {
|
|
499
|
+
if (not_first)
|
|
500
|
+
break;
|
|
501
|
+
else
|
|
502
|
+
return FALSE; //doesn't cross line
|
|
503
|
+
}
|
|
504
|
+
while (tail_it.data ()->pos.x () > chop_coord)
|
|
505
|
+
tail_it.backward ();
|
|
506
|
+
if (head_it.data () == tail_it.data ())
|
|
507
|
+
insert_extra_pt(&tail_it);
|
|
508
|
+
insert_chop_pt(&tail_it, chop_coord);
|
|
509
|
+
if (not_first) {
|
|
510
|
+
save_chop_fragment(&head_it, &tail_it, left_frags);
|
|
511
|
+
}
|
|
512
|
+
else {
|
|
513
|
+
tail_it.forward ();
|
|
514
|
+
head_it = tail_it;
|
|
515
|
+
}
|
|
516
|
+
test_valid = FALSE;
|
|
517
|
+
do {
|
|
518
|
+
tail_it.forward ();
|
|
519
|
+
if (test_valid
|
|
520
|
+
&& tail_it.data ()->pos.x () <= chop_coord
|
|
521
|
+
&& tail_it.data ()->pos.x () + tail_it.data ()->vec.x () >=
|
|
522
|
+
chop_coord) {
|
|
523
|
+
chop_pos = find_chop_coords (&tail_it, chop_coord);
|
|
524
|
+
if (chop_pos.y () <= chop_starty)
|
|
525
|
+
test_valid = FALSE;
|
|
526
|
+
else {
|
|
527
|
+
tail_it = test_tail;
|
|
528
|
+
break; //must chop there
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
if (tail_it.data ()->pos.x () >= chop_coord
|
|
532
|
+
&& tail_it.data ()->pos.x () + tail_it.data ()->vec.x () <=
|
|
533
|
+
chop_coord) {
|
|
534
|
+
chop_pos = find_chop_coords (&tail_it, chop_coord);
|
|
535
|
+
chop_starty = chop_pos.y ();
|
|
536
|
+
test_tail = tail_it;
|
|
537
|
+
test_valid = TRUE; //save possible chop pt
|
|
538
|
+
if (tail_it.data ()->vec.x () == 0
|
|
539
|
+
&& tail_it.data ()->vec.y () > 0)
|
|
540
|
+
break; //must chop here
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
while (tail_it.data () != startpt
|
|
544
|
+
&& tail_it.data ()->pos.x () > chop_coord - pitch_error);
|
|
545
|
+
while (tail_it.data ()->pos.x () < chop_coord)
|
|
546
|
+
tail_it.backward ();
|
|
547
|
+
if (head_it.data () == tail_it.data ())
|
|
548
|
+
insert_extra_pt(&tail_it);
|
|
549
|
+
insert_chop_pt(&tail_it, chop_coord);
|
|
550
|
+
save_chop_fragment(&head_it, &tail_it, right_frags);
|
|
551
|
+
not_first = TRUE;
|
|
552
|
+
}
|
|
553
|
+
while (tail_it.data () != startpt);
|
|
554
|
+
startpt = head_it.data_relative (-1);
|
|
555
|
+
while (tail_it.data () != startpt)
|
|
556
|
+
tail_it.forward ();
|
|
557
|
+
save_chop_fragment(&head_it, &tail_it, left_frags);
|
|
558
|
+
return TRUE; //did some chopping
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
|
|
562
|
+
/**********************************************************************
|
|
563
|
+
* save_chop_fragment
|
|
564
|
+
*
|
|
565
|
+
* Store the given fragment in the given fragment list.
|
|
566
|
+
**********************************************************************/
|
|
567
|
+
|
|
568
|
+
void save_chop_fragment( //chop the outline
|
|
569
|
+
POLYPT_IT *head_it, //head of fragment
|
|
570
|
+
POLYPT_IT *tail_it, //tail of fragment
|
|
571
|
+
OUTLINE_FRAG_LIST *frags //fragment list
|
|
572
|
+
) {
|
|
573
|
+
OUTLINE_FRAG *head; //head of fragment
|
|
574
|
+
OUTLINE_FRAG *tail; //tail of fragment
|
|
575
|
+
float tail_y; //ycoord of tail
|
|
576
|
+
|
|
577
|
+
tail_y = tail_it->data ()->pos.y ();
|
|
578
|
+
head = new OUTLINE_FRAG (head_it, tail_it);
|
|
579
|
+
tail = new OUTLINE_FRAG (head, tail_y);
|
|
580
|
+
head->other_end = tail;
|
|
581
|
+
add_frag_to_list(head, frags);
|
|
582
|
+
add_frag_to_list(tail, frags);
|
|
583
|
+
head_it->forward ();
|
|
584
|
+
tail_it->forward ();
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
|
|
588
|
+
/**********************************************************************
|
|
589
|
+
* OUTLINE_FRAG::OUTLINE_FRAG
|
|
590
|
+
*
|
|
591
|
+
* Constructors for OUTLINE_FRAG.
|
|
592
|
+
**********************************************************************/
|
|
593
|
+
|
|
594
|
+
OUTLINE_FRAG::OUTLINE_FRAG( //record fragment
|
|
595
|
+
POLYPT_IT *head_it, //head of fragment
|
|
596
|
+
POLYPT_IT *tail_it //tail of fragment
|
|
597
|
+
) {
|
|
598
|
+
ycoord = head_it->data ()->pos.y ();
|
|
599
|
+
other_end = NULL;
|
|
600
|
+
polypts.assign_to_sublist (head_it, tail_it);
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
|
|
604
|
+
OUTLINE_FRAG::OUTLINE_FRAG( //record fragment
|
|
605
|
+
OUTLINE_FRAG *head, //other end
|
|
606
|
+
float tail_y) {
|
|
607
|
+
ycoord = tail_y;
|
|
608
|
+
other_end = head;
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
|
|
612
|
+
/**********************************************************************
|
|
613
|
+
* add_frag_to_list
|
|
614
|
+
*
|
|
615
|
+
* Insert the fragment in the list at the appropriate place to keep
|
|
616
|
+
* them in ascending ycoord order.
|
|
617
|
+
**********************************************************************/
|
|
618
|
+
|
|
619
|
+
void add_frag_to_list( //ordered add
|
|
620
|
+
OUTLINE_FRAG *frag, //fragment to add
|
|
621
|
+
OUTLINE_FRAG_LIST *frags //fragment list
|
|
622
|
+
) {
|
|
623
|
+
//output list
|
|
624
|
+
OUTLINE_FRAG_IT frag_it = frags;
|
|
625
|
+
|
|
626
|
+
if (!frags->empty ()) {
|
|
627
|
+
for (frag_it.mark_cycle_pt (); !frag_it.cycled_list ();
|
|
628
|
+
frag_it.forward ()) {
|
|
629
|
+
if (frag_it.data ()->ycoord >= frag->ycoord) {
|
|
630
|
+
frag_it.add_before_then_move (frag);
|
|
631
|
+
return;
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
frag_it.add_to_end (frag);
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
|
|
639
|
+
/**********************************************************************
|
|
640
|
+
* insert_chop_pt
|
|
641
|
+
*
|
|
642
|
+
* Decide whether or not to use the actual point as chop coord.
|
|
643
|
+
* Insert either a duplicate of the current point or 2 copies
|
|
644
|
+
* of the new chop point. Position the iterator at the first.
|
|
645
|
+
**********************************************************************/
|
|
646
|
+
|
|
647
|
+
void insert_chop_pt( //make chop
|
|
648
|
+
POLYPT_IT *it, //iterator
|
|
649
|
+
inT16 chop_coord //required chop pt
|
|
650
|
+
) {
|
|
651
|
+
POLYPT *prev_pt; //point befor chop
|
|
652
|
+
POLYPT *chop_pt; //new vertex
|
|
653
|
+
FCOORD chop_pos; //coords of chop
|
|
654
|
+
FCOORD chop_vec; //vector to next
|
|
655
|
+
|
|
656
|
+
prev_pt = it->data ();
|
|
657
|
+
if (prev_pt->pos.x () + textord_fp_chop_snap >= chop_coord
|
|
658
|
+
&& prev_pt->pos.x () - textord_fp_chop_snap <= chop_coord) {
|
|
659
|
+
chop_pt = new POLYPT (prev_pt->pos, prev_pt->vec);
|
|
660
|
+
}
|
|
661
|
+
else {
|
|
662
|
+
chop_pos = FCOORD (chop_coord, prev_pt->pos.y ()
|
|
663
|
+
+ prev_pt->vec.y () * (chop_coord -
|
|
664
|
+
prev_pt->pos.x ()) /
|
|
665
|
+
prev_pt->vec.x ());
|
|
666
|
+
chop_vec = it->data_relative (1)->pos - chop_pos;
|
|
667
|
+
chop_pt = new POLYPT (chop_pos, chop_vec);
|
|
668
|
+
it->add_after_then_move (chop_pt);
|
|
669
|
+
chop_pt = new POLYPT (chop_pos, chop_vec);
|
|
670
|
+
}
|
|
671
|
+
it->add_after_stay_put (chop_pt);
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
|
|
675
|
+
/**********************************************************************
|
|
676
|
+
* find_chop_coords
|
|
677
|
+
*
|
|
678
|
+
* Decide whether or not to use the actual point as chop coord.
|
|
679
|
+
* Return the coords of the chop point.
|
|
680
|
+
**********************************************************************/
|
|
681
|
+
|
|
682
|
+
FCOORD find_chop_coords( //make chop
|
|
683
|
+
POLYPT_IT *it, //iterator
|
|
684
|
+
inT16 chop_coord //required chop pt
|
|
685
|
+
) {
|
|
686
|
+
POLYPT *prev_pt; //point befor chop
|
|
687
|
+
FCOORD chop_pos; //coords of chop
|
|
688
|
+
|
|
689
|
+
prev_pt = it->data ();
|
|
690
|
+
if (prev_pt->pos.x () + textord_fp_chop_snap >= chop_coord
|
|
691
|
+
&& prev_pt->pos.x () - textord_fp_chop_snap <= chop_coord) {
|
|
692
|
+
chop_pos = prev_pt->pos;
|
|
693
|
+
}
|
|
694
|
+
else {
|
|
695
|
+
chop_pos = FCOORD (chop_coord, prev_pt->pos.y ()
|
|
696
|
+
+ prev_pt->vec.y () * (chop_coord -
|
|
697
|
+
prev_pt->pos.x ()) /
|
|
698
|
+
prev_pt->vec.x ());
|
|
699
|
+
}
|
|
700
|
+
return chop_pos;
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
|
|
704
|
+
/**********************************************************************
|
|
705
|
+
* insert_extra_pt
|
|
706
|
+
*
|
|
707
|
+
* Add an extra pt to prevent single point fragments being made.
|
|
708
|
+
**********************************************************************/
|
|
709
|
+
|
|
710
|
+
void insert_extra_pt( //make extra
|
|
711
|
+
POLYPT_IT *it //iterator
|
|
712
|
+
) {
|
|
713
|
+
POLYPT *prev_pt; //point befor chop
|
|
714
|
+
POLYPT *chop_pt; //new vertex
|
|
715
|
+
FCOORD chop_pos; //coords of chop
|
|
716
|
+
FCOORD chop_vec; //vector to next
|
|
717
|
+
|
|
718
|
+
prev_pt = it->data ();
|
|
719
|
+
if (it->data_relative (1)->pos.y () > it->data_relative (-1)->pos.y ()) {
|
|
720
|
+
chop_pos = prev_pt->pos + FCOORD (0.0f,
|
|
721
|
+
static_cast<float>(textord_fp_chop_snap));
|
|
722
|
+
}
|
|
723
|
+
else {
|
|
724
|
+
chop_pos = prev_pt->pos - FCOORD (0.0f,
|
|
725
|
+
static_cast<float>(textord_fp_chop_snap));
|
|
726
|
+
}
|
|
727
|
+
chop_vec = it->data_relative (1)->pos - chop_pos;
|
|
728
|
+
prev_pt->vec = chop_pos - prev_pt->pos;
|
|
729
|
+
chop_pt = new POLYPT (chop_pos, chop_vec);
|
|
730
|
+
it->add_after_then_move (chop_pt);
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
|
|
734
|
+
/**********************************************************************
|
|
735
|
+
* close_chopped_fragments
|
|
736
|
+
*
|
|
737
|
+
* Clear the given list of fragments joining them up into outlines.
|
|
738
|
+
* Each outline made soaks up any of the child outlines which it encloses.
|
|
739
|
+
**********************************************************************/
|
|
740
|
+
|
|
741
|
+
void close_chopped_fragments( //chop the outline
|
|
742
|
+
OUTLINE_FRAG_LIST *frags, //list to clear
|
|
743
|
+
OUTLINE_LIST *children, //potential children
|
|
744
|
+
OUTLINE_IT *dest_it //output list
|
|
745
|
+
) {
|
|
746
|
+
//iterator
|
|
747
|
+
OUTLINE_FRAG_IT frag_it = frags;
|
|
748
|
+
OUTLINE_FRAG *bottom_frag; //bottom of cut
|
|
749
|
+
OUTLINE_FRAG *top_frag; //top of cut
|
|
750
|
+
OUTLINE *outline; //new outline
|
|
751
|
+
OUTLINE *child; //current child
|
|
752
|
+
OUTLINE_IT child_it = children;
|
|
753
|
+
OUTLINE_IT olchild_it; //children of outline
|
|
754
|
+
POLYPT_IT poly_it; //iterator for constr
|
|
755
|
+
|
|
756
|
+
while (!frag_it.empty ()) {
|
|
757
|
+
frag_it.move_to_first ();
|
|
758
|
+
//get bottom one
|
|
759
|
+
bottom_frag = frag_it.extract ();
|
|
760
|
+
frag_it.forward ();
|
|
761
|
+
//and one above it
|
|
762
|
+
top_frag = frag_it.extract ();
|
|
763
|
+
while (top_frag->other_end != bottom_frag) {
|
|
764
|
+
do {
|
|
765
|
+
frag_it.forward ();
|
|
766
|
+
}
|
|
767
|
+
//find other end
|
|
768
|
+
while (frag_it.data () != top_frag->other_end);
|
|
769
|
+
join_chopped_fragments(bottom_frag, top_frag);
|
|
770
|
+
delete top_frag;
|
|
771
|
+
delete frag_it.extract (); //remove middle section
|
|
772
|
+
frag_it.forward ();
|
|
773
|
+
top_frag = frag_it.extract ();
|
|
774
|
+
}
|
|
775
|
+
join_chopped_fragments(bottom_frag, top_frag);
|
|
776
|
+
if (bottom_frag->polypts.empty ())
|
|
777
|
+
poly_it.set_to_list (&top_frag->polypts);
|
|
778
|
+
else
|
|
779
|
+
poly_it.set_to_list (&bottom_frag->polypts);
|
|
780
|
+
outline = new OUTLINE (&poly_it);
|
|
781
|
+
olchild_it.set_to_list (outline->child ());
|
|
782
|
+
for (child_it.mark_cycle_pt (); !child_it.cycled_list ();
|
|
783
|
+
child_it.forward ()) {
|
|
784
|
+
child = child_it.data ();
|
|
785
|
+
if (*child < *outline)
|
|
786
|
+
olchild_it.add_to_end (child_it.extract ());
|
|
787
|
+
}
|
|
788
|
+
dest_it->add_after_then_move (outline);
|
|
789
|
+
}
|
|
790
|
+
while (!child_it.empty ()) {
|
|
791
|
+
dest_it->add_after_then_move (child_it.extract ());
|
|
792
|
+
child_it.forward ();
|
|
793
|
+
}
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
|
|
797
|
+
/**********************************************************************
|
|
798
|
+
* join_chopped_fragments
|
|
799
|
+
*
|
|
800
|
+
* Join the two lists of POLYPTs such that the first OUTLINE_FRAG
|
|
801
|
+
* operand keeps responsibility for the fragment.
|
|
802
|
+
**********************************************************************/
|
|
803
|
+
|
|
804
|
+
void join_chopped_fragments( //join pieces
|
|
805
|
+
OUTLINE_FRAG *bottom, //bottom of cut
|
|
806
|
+
OUTLINE_FRAG *top //top of cut
|
|
807
|
+
) {
|
|
808
|
+
POLYPT_IT master_it; //dest list
|
|
809
|
+
POLYPT_IT slave_it; //src list
|
|
810
|
+
POLYPT *cutpt; //vectors to change
|
|
811
|
+
POLYPT *nextpt; //other end of cut
|
|
812
|
+
|
|
813
|
+
if (bottom->polypts.empty ()) {
|
|
814
|
+
master_it.set_to_list (&bottom->other_end->polypts);
|
|
815
|
+
cutpt = master_it.data_relative (-1);
|
|
816
|
+
ASSERT_HOST (!top->polypts.empty ());
|
|
817
|
+
slave_it.set_to_list (&top->polypts);
|
|
818
|
+
nextpt = slave_it.data ();
|
|
819
|
+
if (bottom->other_end != top) {
|
|
820
|
+
master_it.move_to_last ();
|
|
821
|
+
master_it.add_list_after (&top->polypts);
|
|
822
|
+
}
|
|
823
|
+
}
|
|
824
|
+
else {
|
|
825
|
+
master_it.set_to_list (&bottom->polypts);
|
|
826
|
+
ASSERT_HOST (top->polypts.empty ());
|
|
827
|
+
slave_it.set_to_list (&top->other_end->polypts);
|
|
828
|
+
cutpt = slave_it.data_relative (-1);
|
|
829
|
+
nextpt = master_it.data ();
|
|
830
|
+
if (bottom->other_end != top)
|
|
831
|
+
master_it.add_list_before (&top->other_end->polypts);
|
|
832
|
+
}
|
|
833
|
+
cutpt->vec = nextpt->pos - cutpt->pos;
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
|
|
837
|
+
/**********************************************************************
|
|
838
|
+
* fixed_chop_cblob
|
|
839
|
+
*
|
|
840
|
+
* Chop the given cblob (if any) and the existing right outlines to
|
|
841
|
+
* produce a list of outlines left of the chop point and more to the right.
|
|
842
|
+
**********************************************************************/
|
|
843
|
+
|
|
844
|
+
void fixed_chop_cblob( //split the blob
|
|
845
|
+
C_BLOB *blob, //blob to split
|
|
846
|
+
inT16 chop_coord, //place to chop
|
|
847
|
+
float pitch_error, //allowed deviation
|
|
848
|
+
C_OUTLINE_LIST *left_outlines, //left half of chop
|
|
849
|
+
C_OUTLINE_LIST *right_outlines //right half of chop
|
|
850
|
+
) {
|
|
851
|
+
C_OUTLINE *old_right; //already there
|
|
852
|
+
C_OUTLINE_LIST new_outlines; //new right ones
|
|
853
|
+
//ouput iterator
|
|
854
|
+
C_OUTLINE_IT left_it = left_outlines;
|
|
855
|
+
//in/out iterator
|
|
856
|
+
C_OUTLINE_IT right_it = right_outlines;
|
|
857
|
+
C_OUTLINE_IT new_it = &new_outlines;
|
|
858
|
+
C_OUTLINE_IT blob_it; //outlines in blob
|
|
859
|
+
|
|
860
|
+
if (!right_it.empty ()) {
|
|
861
|
+
while (!right_it.empty ()) {
|
|
862
|
+
old_right = right_it.extract ();
|
|
863
|
+
right_it.forward ();
|
|
864
|
+
fixed_split_coutline(old_right,
|
|
865
|
+
chop_coord,
|
|
866
|
+
pitch_error,
|
|
867
|
+
&left_it,
|
|
868
|
+
&new_it);
|
|
869
|
+
}
|
|
870
|
+
right_it.add_list_before (&new_outlines);
|
|
871
|
+
}
|
|
872
|
+
if (blob != NULL) {
|
|
873
|
+
blob_it.set_to_list (blob->out_list ());
|
|
874
|
+
for (blob_it.mark_cycle_pt (); !blob_it.cycled_list ();
|
|
875
|
+
blob_it.forward ())
|
|
876
|
+
fixed_split_coutline (blob_it.extract (), chop_coord, pitch_error,
|
|
877
|
+
&left_it, &right_it);
|
|
878
|
+
delete blob;
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
|
|
882
|
+
|
|
883
|
+
/**********************************************************************
|
|
884
|
+
* fixed_split_outline
|
|
885
|
+
*
|
|
886
|
+
* Chop the given outline (if necessary) placing the fragments which
|
|
887
|
+
* fall either side of the chop line into the appropriate list.
|
|
888
|
+
**********************************************************************/
|
|
889
|
+
|
|
890
|
+
void fixed_split_coutline( //chop the outline
|
|
891
|
+
C_OUTLINE *srcline, //source outline
|
|
892
|
+
inT16 chop_coord, //place to chop
|
|
893
|
+
float pitch_error, //allowed deviation
|
|
894
|
+
C_OUTLINE_IT *left_it, //left half of chop
|
|
895
|
+
C_OUTLINE_IT *right_it //right half of chop
|
|
896
|
+
) {
|
|
897
|
+
C_OUTLINE *child; //child outline
|
|
898
|
+
TBOX srcbox; //box of outline
|
|
899
|
+
C_OUTLINE_LIST left_ch; //left children
|
|
900
|
+
C_OUTLINE_LIST right_ch; //right children
|
|
901
|
+
C_OUTLINE_FRAG_LIST left_frags;//chopped fragments
|
|
902
|
+
C_OUTLINE_FRAG_LIST right_frags;;
|
|
903
|
+
C_OUTLINE_IT left_ch_it = &left_ch;
|
|
904
|
+
//for whole children
|
|
905
|
+
C_OUTLINE_IT right_ch_it = &right_ch;
|
|
906
|
+
//for holes
|
|
907
|
+
C_OUTLINE_IT child_it = srcline->child ();
|
|
908
|
+
|
|
909
|
+
srcbox = srcline->bounding_box ();
|
|
910
|
+
//left of line
|
|
911
|
+
if (srcbox.left () + srcbox.right () <= chop_coord * 2
|
|
912
|
+
//and not far over
|
|
913
|
+
&& srcbox.right () < chop_coord + pitch_error)
|
|
914
|
+
//stick whole in left
|
|
915
|
+
left_it->add_after_then_move (srcline);
|
|
916
|
+
else if (srcbox.left () + srcbox.right () > chop_coord * 2
|
|
917
|
+
&& srcbox.left () > chop_coord - pitch_error)
|
|
918
|
+
//stick whole in right
|
|
919
|
+
right_it->add_before_stay_put (srcline);
|
|
920
|
+
else {
|
|
921
|
+
//needs real chopping
|
|
922
|
+
if (fixed_chop_coutline (srcline, chop_coord, pitch_error,
|
|
923
|
+
&left_frags, &right_frags)) {
|
|
924
|
+
for (child_it.mark_cycle_pt (); !child_it.cycled_list ();
|
|
925
|
+
child_it.forward ()) {
|
|
926
|
+
child = child_it.extract ();
|
|
927
|
+
srcbox = child->bounding_box ();
|
|
928
|
+
if (srcbox.right () < chop_coord)
|
|
929
|
+
left_ch_it.add_after_then_move (child);
|
|
930
|
+
else if (srcbox.left () > chop_coord)
|
|
931
|
+
right_ch_it.add_after_then_move (child);
|
|
932
|
+
else {
|
|
933
|
+
if (fixed_chop_coutline (child, chop_coord, pitch_error,
|
|
934
|
+
&left_frags, &right_frags))
|
|
935
|
+
delete child;
|
|
936
|
+
else {
|
|
937
|
+
if (srcbox.left () + srcbox.right () <= chop_coord * 2)
|
|
938
|
+
left_ch_it.add_after_then_move (child);
|
|
939
|
+
else
|
|
940
|
+
right_ch_it.add_after_then_move (child);
|
|
941
|
+
}
|
|
942
|
+
}
|
|
943
|
+
}
|
|
944
|
+
close_chopped_cfragments(&left_frags, &left_ch, pitch_error, left_it);
|
|
945
|
+
close_chopped_cfragments(&right_frags, &right_ch, pitch_error, right_it);
|
|
946
|
+
ASSERT_HOST (left_ch.empty () && right_ch.empty ());
|
|
947
|
+
//no children left
|
|
948
|
+
delete srcline; //smashed up
|
|
949
|
+
}
|
|
950
|
+
else {
|
|
951
|
+
if (srcbox.left () + srcbox.right () <= chop_coord * 2)
|
|
952
|
+
//stick whole in left
|
|
953
|
+
left_it->add_after_then_move (srcline);
|
|
954
|
+
else
|
|
955
|
+
right_it->add_before_stay_put (srcline);
|
|
956
|
+
}
|
|
957
|
+
}
|
|
958
|
+
}
|
|
959
|
+
|
|
960
|
+
|
|
961
|
+
/**********************************************************************
|
|
962
|
+
* fixed_chop_coutline
|
|
963
|
+
*
|
|
964
|
+
* Chop the given coutline (if necessary) placing the fragments which
|
|
965
|
+
* fall either side of the chop line into the appropriate list.
|
|
966
|
+
* If the coutline lies too heavily to one side to chop, FALSE is returned.
|
|
967
|
+
**********************************************************************/
|
|
968
|
+
|
|
969
|
+
BOOL8 fixed_chop_coutline( //chop the outline
|
|
970
|
+
C_OUTLINE *srcline, //source outline
|
|
971
|
+
inT16 chop_coord, //place to chop
|
|
972
|
+
float pitch_error, //allowed deviation
|
|
973
|
+
C_OUTLINE_FRAG_LIST *left_frags, //left half of chop
|
|
974
|
+
C_OUTLINE_FRAG_LIST *right_frags //right half of chop
|
|
975
|
+
) {
|
|
976
|
+
BOOL8 first_frag; //fragment
|
|
977
|
+
BOOL8 anticlock; //direction of loop
|
|
978
|
+
inT16 left_edge; //of outline
|
|
979
|
+
inT16 startindex; //in first fragment
|
|
980
|
+
inT32 length; //of outline
|
|
981
|
+
inT16 stepindex; //into outline
|
|
982
|
+
inT16 head_index; //start of fragment
|
|
983
|
+
ICOORD head_pos; //start of fragment
|
|
984
|
+
inT16 tail_index; //end of fragment
|
|
985
|
+
ICOORD tail_pos; //end of fragment
|
|
986
|
+
ICOORD pos; //current point
|
|
987
|
+
inT16 first_index = 0; //first tail
|
|
988
|
+
ICOORD first_pos; //first tail
|
|
989
|
+
|
|
990
|
+
length = srcline->pathlength ();
|
|
991
|
+
pos = srcline->start_pos ();
|
|
992
|
+
anticlock = srcline->turn_direction () > 0;
|
|
993
|
+
left_edge = pos.x ();
|
|
994
|
+
tail_index = 0;
|
|
995
|
+
tail_pos = pos;
|
|
996
|
+
for (stepindex = 0; stepindex < length; stepindex++) {
|
|
997
|
+
if (pos.x () < left_edge) {
|
|
998
|
+
left_edge = pos.x ();
|
|
999
|
+
tail_index = stepindex;
|
|
1000
|
+
tail_pos = pos;
|
|
1001
|
+
}
|
|
1002
|
+
pos += srcline->step (stepindex);
|
|
1003
|
+
}
|
|
1004
|
+
if (left_edge >= chop_coord - pitch_error)
|
|
1005
|
+
return FALSE; //not worth it
|
|
1006
|
+
|
|
1007
|
+
startindex = tail_index;
|
|
1008
|
+
first_frag = TRUE;
|
|
1009
|
+
head_index = tail_index;
|
|
1010
|
+
head_pos = tail_pos;
|
|
1011
|
+
do {
|
|
1012
|
+
do {
|
|
1013
|
+
tail_pos += srcline->step (tail_index);
|
|
1014
|
+
tail_index++;
|
|
1015
|
+
if (tail_index == length)
|
|
1016
|
+
tail_index = 0;
|
|
1017
|
+
}
|
|
1018
|
+
while (tail_pos.x () != chop_coord && tail_index != startindex);
|
|
1019
|
+
if (tail_index == startindex) {
|
|
1020
|
+
if (first_frag)
|
|
1021
|
+
return FALSE; //doesn't cross line
|
|
1022
|
+
else
|
|
1023
|
+
break;
|
|
1024
|
+
}
|
|
1025
|
+
//#ifdef __UNIX__
|
|
1026
|
+
ASSERT_HOST (head_index != tail_index);
|
|
1027
|
+
//#endif
|
|
1028
|
+
if (!first_frag) {
|
|
1029
|
+
save_chop_cfragment(head_index,
|
|
1030
|
+
head_pos,
|
|
1031
|
+
tail_index,
|
|
1032
|
+
tail_pos,
|
|
1033
|
+
srcline,
|
|
1034
|
+
left_frags);
|
|
1035
|
+
}
|
|
1036
|
+
else {
|
|
1037
|
+
first_index = tail_index;
|
|
1038
|
+
first_pos = tail_pos;
|
|
1039
|
+
first_frag = FALSE;
|
|
1040
|
+
}
|
|
1041
|
+
while (srcline->step (tail_index).x () == 0) {
|
|
1042
|
+
tail_pos += srcline->step (tail_index);
|
|
1043
|
+
tail_index++;
|
|
1044
|
+
if (tail_index == length)
|
|
1045
|
+
tail_index = 0;
|
|
1046
|
+
}
|
|
1047
|
+
head_index = tail_index;
|
|
1048
|
+
head_pos = tail_pos;
|
|
1049
|
+
while (srcline->step (tail_index).x () > 0) {
|
|
1050
|
+
do {
|
|
1051
|
+
tail_pos += srcline->step (tail_index);
|
|
1052
|
+
tail_index++;
|
|
1053
|
+
if (tail_index == length)
|
|
1054
|
+
tail_index = 0;
|
|
1055
|
+
}
|
|
1056
|
+
while (tail_pos.x () != chop_coord);
|
|
1057
|
+
//#ifdef __UNIX__
|
|
1058
|
+
ASSERT_HOST (head_index != tail_index);
|
|
1059
|
+
//#endif
|
|
1060
|
+
save_chop_cfragment(head_index,
|
|
1061
|
+
head_pos,
|
|
1062
|
+
tail_index,
|
|
1063
|
+
tail_pos,
|
|
1064
|
+
srcline,
|
|
1065
|
+
right_frags);
|
|
1066
|
+
while (srcline->step (tail_index).x () == 0) {
|
|
1067
|
+
tail_pos += srcline->step (tail_index);
|
|
1068
|
+
tail_index++;
|
|
1069
|
+
if (tail_index == length)
|
|
1070
|
+
tail_index = 0;
|
|
1071
|
+
}
|
|
1072
|
+
head_index = tail_index;
|
|
1073
|
+
head_pos = tail_pos;
|
|
1074
|
+
}
|
|
1075
|
+
}
|
|
1076
|
+
while (tail_index != startindex);
|
|
1077
|
+
save_chop_cfragment(head_index,
|
|
1078
|
+
head_pos,
|
|
1079
|
+
first_index,
|
|
1080
|
+
first_pos,
|
|
1081
|
+
srcline,
|
|
1082
|
+
left_frags);
|
|
1083
|
+
return TRUE; //did some chopping
|
|
1084
|
+
}
|
|
1085
|
+
|
|
1086
|
+
|
|
1087
|
+
/**********************************************************************
|
|
1088
|
+
* next_anti_left_seg
|
|
1089
|
+
*
|
|
1090
|
+
* Search the outline for a suitable point at which it crosses the
|
|
1091
|
+
* chop_coord from left to right.
|
|
1092
|
+
**********************************************************************/
|
|
1093
|
+
|
|
1094
|
+
inT16 next_anti_left_seg( //chop the outline
|
|
1095
|
+
C_OUTLINE *srcline, //source outline
|
|
1096
|
+
inT16 tail_index, //of tailpos
|
|
1097
|
+
inT16 startindex, //end of search
|
|
1098
|
+
inT32 length, //of outline
|
|
1099
|
+
inT16 chop_coord, //place to chop
|
|
1100
|
+
float pitch_error, //allowed deviation
|
|
1101
|
+
ICOORD *tail_pos //current position
|
|
1102
|
+
) {
|
|
1103
|
+
BOOL8 test_valid; //test pt valid
|
|
1104
|
+
inT16 chop_starty; //test chop pt
|
|
1105
|
+
inT16 test_index; //possible chop pt
|
|
1106
|
+
ICOORD test_pos; //possible chop pt
|
|
1107
|
+
ICOORD prev_step; //in x to tail pos
|
|
1108
|
+
|
|
1109
|
+
test_valid = FALSE;
|
|
1110
|
+
chop_starty = -MAX_INT16;
|
|
1111
|
+
test_index = tail_index; //stop warnings
|
|
1112
|
+
do {
|
|
1113
|
+
*tail_pos += srcline->step (tail_index);
|
|
1114
|
+
prev_step = srcline->step (tail_index);
|
|
1115
|
+
tail_index++;
|
|
1116
|
+
if (tail_index >= length)
|
|
1117
|
+
tail_index = 0;
|
|
1118
|
+
if (test_valid && tail_pos->x () == chop_coord && prev_step.x () < 0) {
|
|
1119
|
+
if (tail_pos->y () >= chop_starty) {
|
|
1120
|
+
chop_starty = -MAX_INT16;
|
|
1121
|
+
test_valid = FALSE;
|
|
1122
|
+
}
|
|
1123
|
+
else {
|
|
1124
|
+
*tail_pos = test_pos;
|
|
1125
|
+
tail_index = test_index;
|
|
1126
|
+
break; //must chop there
|
|
1127
|
+
}
|
|
1128
|
+
}
|
|
1129
|
+
if (tail_pos->x () == chop_coord
|
|
1130
|
+
&& srcline->step (tail_index).x () > 0
|
|
1131
|
+
&& tail_pos->y () > chop_starty) {
|
|
1132
|
+
chop_starty = tail_pos->y ();
|
|
1133
|
+
test_index = tail_index;
|
|
1134
|
+
test_pos = *tail_pos;
|
|
1135
|
+
test_valid = TRUE;
|
|
1136
|
+
}
|
|
1137
|
+
else if (tail_pos->x () == chop_coord
|
|
1138
|
+
&& srcline->step (tail_index).y () < 0
|
|
1139
|
+
&& prev_step.x () > 0 && tail_pos->y () > chop_starty)
|
|
1140
|
+
break; //must chop here
|
|
1141
|
+
}
|
|
1142
|
+
while (tail_index != startindex
|
|
1143
|
+
&& tail_pos->x () < chop_coord + pitch_error);
|
|
1144
|
+
return tail_index;
|
|
1145
|
+
}
|
|
1146
|
+
|
|
1147
|
+
|
|
1148
|
+
/**********************************************************************
|
|
1149
|
+
* next_anti_right_seg
|
|
1150
|
+
*
|
|
1151
|
+
* Search the outline for a suitable point at which it crosses the
|
|
1152
|
+
* chop_coord from right to left.
|
|
1153
|
+
**********************************************************************/
|
|
1154
|
+
|
|
1155
|
+
inT16 next_anti_right_seg( //chop the outline
|
|
1156
|
+
C_OUTLINE *srcline, //source outline
|
|
1157
|
+
inT16 tail_index, //of tailpos
|
|
1158
|
+
inT16 startindex, //end of search
|
|
1159
|
+
inT32 length, //of outline
|
|
1160
|
+
inT16 chop_coord, //place to chop
|
|
1161
|
+
float pitch_error, //allowed deviation
|
|
1162
|
+
ICOORD *tail_pos //current position
|
|
1163
|
+
) {
|
|
1164
|
+
BOOL8 test_valid; //test pt valid
|
|
1165
|
+
inT16 chop_starty; //test chop pt
|
|
1166
|
+
inT16 test_index; //possible chop pt
|
|
1167
|
+
ICOORD test_pos; //possible chop pt
|
|
1168
|
+
ICOORD prev_step; //in x to tail pos
|
|
1169
|
+
|
|
1170
|
+
test_valid = FALSE;
|
|
1171
|
+
chop_starty = MAX_INT16;
|
|
1172
|
+
test_index = tail_index; //stop warnings
|
|
1173
|
+
do {
|
|
1174
|
+
//move forward
|
|
1175
|
+
*tail_pos += srcline->step (tail_index);
|
|
1176
|
+
prev_step = srcline->step (tail_index);
|
|
1177
|
+
tail_index++;
|
|
1178
|
+
if (tail_index >= length)
|
|
1179
|
+
tail_index = 0;
|
|
1180
|
+
if (test_valid && tail_pos->x () == chop_coord && prev_step.x () > 0) {
|
|
1181
|
+
if (tail_pos->y () <= chop_starty) {
|
|
1182
|
+
chop_starty = MAX_INT16;
|
|
1183
|
+
test_valid = FALSE;
|
|
1184
|
+
}
|
|
1185
|
+
else {
|
|
1186
|
+
*tail_pos = test_pos;
|
|
1187
|
+
tail_index = test_index;
|
|
1188
|
+
break; //must chop there
|
|
1189
|
+
}
|
|
1190
|
+
}
|
|
1191
|
+
if (tail_pos->x () == chop_coord
|
|
1192
|
+
&& srcline->step (tail_index).x () < 0
|
|
1193
|
+
&& tail_pos->y () < chop_starty) {
|
|
1194
|
+
chop_starty = tail_pos->y ();
|
|
1195
|
+
test_index = tail_index;
|
|
1196
|
+
test_pos = *tail_pos;
|
|
1197
|
+
test_valid = TRUE; //save possible chop pt
|
|
1198
|
+
}
|
|
1199
|
+
else if (tail_pos->x () == chop_coord
|
|
1200
|
+
&& srcline->step (tail_index).y () > 0
|
|
1201
|
+
&& prev_step.x () < 0 && tail_pos->y () < chop_starty)
|
|
1202
|
+
break; //must chop here
|
|
1203
|
+
}
|
|
1204
|
+
while (tail_index != startindex
|
|
1205
|
+
&& tail_pos->x () > chop_coord - pitch_error);
|
|
1206
|
+
return tail_index;
|
|
1207
|
+
}
|
|
1208
|
+
|
|
1209
|
+
|
|
1210
|
+
/**********************************************************************
|
|
1211
|
+
* next_clock_left_seg
|
|
1212
|
+
*
|
|
1213
|
+
* Search the outline for a suitable point at which it crosses the
|
|
1214
|
+
* chop_coord from left to right.
|
|
1215
|
+
**********************************************************************/
|
|
1216
|
+
|
|
1217
|
+
inT16 next_clock_left_seg( //chop the outline
|
|
1218
|
+
C_OUTLINE *srcline, //source outline
|
|
1219
|
+
inT16 tail_index, //of tailpos
|
|
1220
|
+
inT16 startindex, //end of search
|
|
1221
|
+
inT32 length, //of outline
|
|
1222
|
+
inT16 chop_coord, //place to chop
|
|
1223
|
+
float pitch_error, //allowed deviation
|
|
1224
|
+
ICOORD *tail_pos //current position
|
|
1225
|
+
) {
|
|
1226
|
+
BOOL8 test_valid; //test pt valid
|
|
1227
|
+
inT16 chop_starty; //test chop pt
|
|
1228
|
+
inT16 test_index; //possible chop pt
|
|
1229
|
+
ICOORD test_pos; //possible chop pt
|
|
1230
|
+
ICOORD prev_step; //in x to tail pos
|
|
1231
|
+
|
|
1232
|
+
test_valid = FALSE;
|
|
1233
|
+
chop_starty = MAX_INT16;
|
|
1234
|
+
test_index = tail_index; //stop warnings
|
|
1235
|
+
do {
|
|
1236
|
+
*tail_pos += srcline->step (tail_index);
|
|
1237
|
+
prev_step = srcline->step (tail_index);
|
|
1238
|
+
tail_index++;
|
|
1239
|
+
if (tail_index >= length)
|
|
1240
|
+
tail_index = 0;
|
|
1241
|
+
if (test_valid && tail_pos->x () == chop_coord && prev_step.x () < 0) {
|
|
1242
|
+
if (tail_pos->y () <= chop_starty) {
|
|
1243
|
+
chop_starty = MAX_INT16;
|
|
1244
|
+
test_valid = FALSE;
|
|
1245
|
+
}
|
|
1246
|
+
else {
|
|
1247
|
+
*tail_pos = test_pos;
|
|
1248
|
+
tail_index = test_index;
|
|
1249
|
+
break; //must chop there
|
|
1250
|
+
}
|
|
1251
|
+
}
|
|
1252
|
+
if (tail_pos->x () == chop_coord
|
|
1253
|
+
&& srcline->step (tail_index).x () > 0
|
|
1254
|
+
&& tail_pos->y () < chop_starty) {
|
|
1255
|
+
chop_starty = tail_pos->y ();
|
|
1256
|
+
test_index = tail_index;
|
|
1257
|
+
test_pos = *tail_pos;
|
|
1258
|
+
test_valid = TRUE;
|
|
1259
|
+
}
|
|
1260
|
+
else if (tail_pos->x () == chop_coord
|
|
1261
|
+
&& srcline->step (tail_index).y () > 0
|
|
1262
|
+
&& prev_step.x () > 0 && tail_pos->y () < chop_starty)
|
|
1263
|
+
break; //must chop here
|
|
1264
|
+
}
|
|
1265
|
+
while (tail_index != startindex
|
|
1266
|
+
&& tail_pos->x () < chop_coord + pitch_error);
|
|
1267
|
+
return tail_index;
|
|
1268
|
+
}
|
|
1269
|
+
|
|
1270
|
+
|
|
1271
|
+
/**********************************************************************
|
|
1272
|
+
* next_clock_right_seg
|
|
1273
|
+
*
|
|
1274
|
+
* Search the outline for a suitable point at which it crosses the
|
|
1275
|
+
* chop_coord from right to left.
|
|
1276
|
+
**********************************************************************/
|
|
1277
|
+
|
|
1278
|
+
inT16 next_clock_right_seg( //chop the outline
|
|
1279
|
+
C_OUTLINE *srcline, //source outline
|
|
1280
|
+
inT16 tail_index, //of tailpos
|
|
1281
|
+
inT16 startindex, //end of search
|
|
1282
|
+
inT32 length, //of outline
|
|
1283
|
+
inT16 chop_coord, //place to chop
|
|
1284
|
+
float pitch_error, //allowed deviation
|
|
1285
|
+
ICOORD *tail_pos //current position
|
|
1286
|
+
) {
|
|
1287
|
+
BOOL8 test_valid; //test pt valid
|
|
1288
|
+
inT16 chop_starty; //test chop pt
|
|
1289
|
+
inT16 test_index; //possible chop pt
|
|
1290
|
+
ICOORD test_pos; //possible chop pt
|
|
1291
|
+
ICOORD prev_step; //in x to tail pos
|
|
1292
|
+
|
|
1293
|
+
test_valid = FALSE;
|
|
1294
|
+
chop_starty = MAX_INT16;
|
|
1295
|
+
test_index = tail_index; //stop warnings
|
|
1296
|
+
do {
|
|
1297
|
+
//move forward
|
|
1298
|
+
*tail_pos += srcline->step (tail_index);
|
|
1299
|
+
prev_step = srcline->step (tail_index);
|
|
1300
|
+
tail_index++;
|
|
1301
|
+
if (tail_index >= length)
|
|
1302
|
+
tail_index = 0;
|
|
1303
|
+
if (test_valid && tail_pos->x () == chop_coord && prev_step.x () > 0) {
|
|
1304
|
+
if (tail_pos->y () >= chop_starty) {
|
|
1305
|
+
chop_starty = MAX_INT16;
|
|
1306
|
+
test_valid = FALSE;
|
|
1307
|
+
}
|
|
1308
|
+
else {
|
|
1309
|
+
*tail_pos = test_pos;
|
|
1310
|
+
tail_index = test_index;
|
|
1311
|
+
break; //must chop there
|
|
1312
|
+
}
|
|
1313
|
+
}
|
|
1314
|
+
if (tail_pos->x () == chop_coord
|
|
1315
|
+
&& srcline->step (tail_index).x () < 0
|
|
1316
|
+
&& tail_pos->y () > chop_starty) {
|
|
1317
|
+
chop_starty = tail_pos->y ();
|
|
1318
|
+
test_index = tail_index;
|
|
1319
|
+
test_pos = *tail_pos;
|
|
1320
|
+
test_valid = TRUE; //save possible chop pt
|
|
1321
|
+
}
|
|
1322
|
+
else if (tail_pos->x () == chop_coord
|
|
1323
|
+
&& srcline->step (tail_index).y () < 0
|
|
1324
|
+
&& prev_step.x () < 0 && tail_pos->y () > chop_starty)
|
|
1325
|
+
break; //must chop here
|
|
1326
|
+
}
|
|
1327
|
+
while (tail_index != startindex
|
|
1328
|
+
&& tail_pos->x () > chop_coord - pitch_error);
|
|
1329
|
+
return tail_index;
|
|
1330
|
+
}
|
|
1331
|
+
|
|
1332
|
+
|
|
1333
|
+
/**********************************************************************
|
|
1334
|
+
* save_chop_cfragment
|
|
1335
|
+
*
|
|
1336
|
+
* Store the given fragment in the given fragment list.
|
|
1337
|
+
**********************************************************************/
|
|
1338
|
+
|
|
1339
|
+
void save_chop_cfragment( //chop the outline
|
|
1340
|
+
inT16 head_index, //head of fragment
|
|
1341
|
+
ICOORD head_pos, //head of fragment
|
|
1342
|
+
inT16 tail_index, //tail of fragment
|
|
1343
|
+
ICOORD tail_pos, //tail of fragment
|
|
1344
|
+
C_OUTLINE *srcline, //source of edgesteps
|
|
1345
|
+
C_OUTLINE_FRAG_LIST *frags //fragment list
|
|
1346
|
+
) {
|
|
1347
|
+
inT16 jump; //gap across end
|
|
1348
|
+
inT16 stepcount; //total steps
|
|
1349
|
+
C_OUTLINE_FRAG *head; //head of fragment
|
|
1350
|
+
C_OUTLINE_FRAG *tail; //tail of fragment
|
|
1351
|
+
inT16 tail_y; //ycoord of tail
|
|
1352
|
+
|
|
1353
|
+
ASSERT_HOST (tail_pos.x () == head_pos.x ());
|
|
1354
|
+
ASSERT_HOST (tail_index != head_index);
|
|
1355
|
+
stepcount = tail_index - head_index;
|
|
1356
|
+
if (stepcount < 0)
|
|
1357
|
+
stepcount += srcline->pathlength ();
|
|
1358
|
+
jump = tail_pos.y () - head_pos.y ();
|
|
1359
|
+
if (jump < 0)
|
|
1360
|
+
jump = -jump;
|
|
1361
|
+
if (jump == stepcount)
|
|
1362
|
+
return; //its a nop
|
|
1363
|
+
tail_y = tail_pos.y ();
|
|
1364
|
+
head = new C_OUTLINE_FRAG (head_pos, tail_pos, srcline,
|
|
1365
|
+
head_index, tail_index);
|
|
1366
|
+
tail = new C_OUTLINE_FRAG (head, tail_y);
|
|
1367
|
+
head->other_end = tail;
|
|
1368
|
+
add_frag_to_list(head, frags);
|
|
1369
|
+
add_frag_to_list(tail, frags);
|
|
1370
|
+
}
|
|
1371
|
+
|
|
1372
|
+
|
|
1373
|
+
/**********************************************************************
|
|
1374
|
+
* C_OUTLINE_FRAG::C_OUTLINE_FRAG
|
|
1375
|
+
*
|
|
1376
|
+
* Constructors for C_OUTLINE_FRAG.
|
|
1377
|
+
**********************************************************************/
|
|
1378
|
+
|
|
1379
|
+
C_OUTLINE_FRAG::C_OUTLINE_FRAG( //record fragment
|
|
1380
|
+
ICOORD start_pt, //start coord
|
|
1381
|
+
ICOORD end_pt, //end coord
|
|
1382
|
+
C_OUTLINE *outline, //source of steps
|
|
1383
|
+
inT16 start_index,
|
|
1384
|
+
inT16 end_index) {
|
|
1385
|
+
start = start_pt;
|
|
1386
|
+
end = end_pt;
|
|
1387
|
+
ycoord = start_pt.y ();
|
|
1388
|
+
stepcount = end_index - start_index;
|
|
1389
|
+
if (stepcount < 0)
|
|
1390
|
+
stepcount += outline->pathlength ();
|
|
1391
|
+
ASSERT_HOST (stepcount > 0);
|
|
1392
|
+
steps = new DIR128[stepcount];
|
|
1393
|
+
if (end_index > start_index) {
|
|
1394
|
+
for (int i = start_index; i < end_index; ++i)
|
|
1395
|
+
steps[i - start_index] = outline->step_dir(i);
|
|
1396
|
+
}
|
|
1397
|
+
else {
|
|
1398
|
+
int len = outline->pathlength();
|
|
1399
|
+
int i = start_index;
|
|
1400
|
+
for (; i < len; ++i)
|
|
1401
|
+
steps[i - start_index] = outline->step_dir(i);
|
|
1402
|
+
if (end_index > 0)
|
|
1403
|
+
for (; i < end_index + len; ++i)
|
|
1404
|
+
steps[i - start_index] = outline->step_dir(i - len);
|
|
1405
|
+
}
|
|
1406
|
+
other_end = NULL;
|
|
1407
|
+
delete close();
|
|
1408
|
+
}
|
|
1409
|
+
|
|
1410
|
+
|
|
1411
|
+
C_OUTLINE_FRAG::C_OUTLINE_FRAG( //record fragment
|
|
1412
|
+
C_OUTLINE_FRAG *head, //other end
|
|
1413
|
+
inT16 tail_y) {
|
|
1414
|
+
ycoord = tail_y;
|
|
1415
|
+
other_end = head;
|
|
1416
|
+
start = head->start;
|
|
1417
|
+
end = head->end;
|
|
1418
|
+
steps = NULL;
|
|
1419
|
+
stepcount = 0;
|
|
1420
|
+
}
|
|
1421
|
+
|
|
1422
|
+
|
|
1423
|
+
/**********************************************************************
|
|
1424
|
+
* add_frag_to_list
|
|
1425
|
+
*
|
|
1426
|
+
* Insert the fragment in the list at the appropriate place to keep
|
|
1427
|
+
* them in ascending ycoord order.
|
|
1428
|
+
**********************************************************************/
|
|
1429
|
+
|
|
1430
|
+
void add_frag_to_list( //ordered add
|
|
1431
|
+
C_OUTLINE_FRAG *frag, //fragment to add
|
|
1432
|
+
C_OUTLINE_FRAG_LIST *frags //fragment list
|
|
1433
|
+
) {
|
|
1434
|
+
//output list
|
|
1435
|
+
C_OUTLINE_FRAG_IT frag_it = frags;
|
|
1436
|
+
|
|
1437
|
+
if (!frags->empty ()) {
|
|
1438
|
+
for (frag_it.mark_cycle_pt (); !frag_it.cycled_list ();
|
|
1439
|
+
frag_it.forward ()) {
|
|
1440
|
+
if (frag_it.data ()->ycoord > frag->ycoord
|
|
1441
|
+
|| (frag_it.data ()->ycoord == frag->ycoord
|
|
1442
|
+
&& frag->other_end->ycoord < frag->ycoord)) {
|
|
1443
|
+
frag_it.add_before_then_move (frag);
|
|
1444
|
+
return;
|
|
1445
|
+
}
|
|
1446
|
+
}
|
|
1447
|
+
}
|
|
1448
|
+
frag_it.add_to_end (frag);
|
|
1449
|
+
}
|
|
1450
|
+
|
|
1451
|
+
|
|
1452
|
+
/**********************************************************************
|
|
1453
|
+
* close_chopped_cfragments
|
|
1454
|
+
*
|
|
1455
|
+
* Clear the given list of fragments joining them up into outlines.
|
|
1456
|
+
* Each outline made soaks up any of the child outlines which it encloses.
|
|
1457
|
+
**********************************************************************/
|
|
1458
|
+
|
|
1459
|
+
void close_chopped_cfragments( //chop the outline
|
|
1460
|
+
C_OUTLINE_FRAG_LIST *frags, //list to clear
|
|
1461
|
+
C_OUTLINE_LIST *children, //potential children
|
|
1462
|
+
float pitch_error, //allowed shrinkage
|
|
1463
|
+
C_OUTLINE_IT *dest_it //output list
|
|
1464
|
+
) {
|
|
1465
|
+
//iterator
|
|
1466
|
+
C_OUTLINE_FRAG_IT frag_it = frags;
|
|
1467
|
+
C_OUTLINE_FRAG *bottom_frag; //bottom of cut
|
|
1468
|
+
C_OUTLINE_FRAG *top_frag; //top of cut
|
|
1469
|
+
C_OUTLINE *outline; //new outline
|
|
1470
|
+
C_OUTLINE *child; //current child
|
|
1471
|
+
C_OUTLINE_IT child_it = children;
|
|
1472
|
+
C_OUTLINE_IT olchild_it; //children of outline
|
|
1473
|
+
|
|
1474
|
+
while (!frag_it.empty ()) {
|
|
1475
|
+
frag_it.move_to_first ();
|
|
1476
|
+
//get bottom one
|
|
1477
|
+
bottom_frag = frag_it.extract ();
|
|
1478
|
+
frag_it.forward ();
|
|
1479
|
+
top_frag = frag_it.data (); //look at next
|
|
1480
|
+
if ((bottom_frag->steps == 0 && top_frag->steps == 0)
|
|
1481
|
+
|| (bottom_frag->steps != 0 && top_frag->steps != 0)) {
|
|
1482
|
+
if (frag_it.data_relative (1)->ycoord == top_frag->ycoord)
|
|
1483
|
+
frag_it.forward ();
|
|
1484
|
+
}
|
|
1485
|
+
top_frag = frag_it.extract ();
|
|
1486
|
+
if (top_frag->other_end != bottom_frag) {
|
|
1487
|
+
outline = join_chopped_fragments (bottom_frag, top_frag);
|
|
1488
|
+
ASSERT_HOST (outline == NULL);
|
|
1489
|
+
}
|
|
1490
|
+
else {
|
|
1491
|
+
outline = join_chopped_fragments (bottom_frag, top_frag);
|
|
1492
|
+
ASSERT_HOST (outline != NULL);
|
|
1493
|
+
olchild_it.set_to_list (outline->child ());
|
|
1494
|
+
for (child_it.mark_cycle_pt (); !child_it.cycled_list ();
|
|
1495
|
+
child_it.forward ()) {
|
|
1496
|
+
child = child_it.data ();
|
|
1497
|
+
if (*child < *outline)
|
|
1498
|
+
olchild_it.add_to_end (child_it.extract ());
|
|
1499
|
+
}
|
|
1500
|
+
if (outline->bounding_box ().width () > pitch_error)
|
|
1501
|
+
dest_it->add_after_then_move (outline);
|
|
1502
|
+
else
|
|
1503
|
+
delete outline; //make it disappear
|
|
1504
|
+
}
|
|
1505
|
+
}
|
|
1506
|
+
while (!child_it.empty ()) {
|
|
1507
|
+
dest_it->add_after_then_move (child_it.extract ());
|
|
1508
|
+
child_it.forward ();
|
|
1509
|
+
}
|
|
1510
|
+
}
|
|
1511
|
+
|
|
1512
|
+
|
|
1513
|
+
/**********************************************************************
|
|
1514
|
+
* join_chopped_fragments
|
|
1515
|
+
*
|
|
1516
|
+
* Join the two lists of POLYPTs such that neither OUTLINE_FRAG
|
|
1517
|
+
* operand keeps responsibility for the fragment.
|
|
1518
|
+
**********************************************************************/
|
|
1519
|
+
|
|
1520
|
+
C_OUTLINE *join_chopped_fragments( //join pieces
|
|
1521
|
+
C_OUTLINE_FRAG *bottom, //bottom of cut
|
|
1522
|
+
C_OUTLINE_FRAG *top //top of cut
|
|
1523
|
+
) {
|
|
1524
|
+
C_OUTLINE *outline; //closed loop
|
|
1525
|
+
|
|
1526
|
+
if (bottom->other_end == top) {
|
|
1527
|
+
if (bottom->steps == 0)
|
|
1528
|
+
outline = top->close (); //turn to outline
|
|
1529
|
+
else
|
|
1530
|
+
outline = bottom->close ();
|
|
1531
|
+
delete top;
|
|
1532
|
+
delete bottom;
|
|
1533
|
+
return outline;
|
|
1534
|
+
}
|
|
1535
|
+
if (bottom->steps == 0) {
|
|
1536
|
+
ASSERT_HOST (top->steps != 0);
|
|
1537
|
+
join_segments (bottom->other_end, top);
|
|
1538
|
+
}
|
|
1539
|
+
else {
|
|
1540
|
+
ASSERT_HOST (top->steps == 0);
|
|
1541
|
+
join_segments (top->other_end, bottom);
|
|
1542
|
+
}
|
|
1543
|
+
top->other_end->other_end = bottom->other_end;
|
|
1544
|
+
bottom->other_end->other_end = top->other_end;
|
|
1545
|
+
delete bottom;
|
|
1546
|
+
delete top;
|
|
1547
|
+
return NULL;
|
|
1548
|
+
}
|
|
1549
|
+
|
|
1550
|
+
|
|
1551
|
+
/**********************************************************************
|
|
1552
|
+
* join_segments
|
|
1553
|
+
*
|
|
1554
|
+
* Join the two edgestep fragments such that the second comes after
|
|
1555
|
+
* the first and the gap beween them is closed.
|
|
1556
|
+
**********************************************************************/
|
|
1557
|
+
|
|
1558
|
+
void join_segments( //join pieces
|
|
1559
|
+
C_OUTLINE_FRAG *bottom, //bottom of cut
|
|
1560
|
+
C_OUTLINE_FRAG *top //top of cut
|
|
1561
|
+
) {
|
|
1562
|
+
DIR128 *steps; //new steps
|
|
1563
|
+
inT32 stepcount; //no of steps
|
|
1564
|
+
inT16 fake_count; //fake steps
|
|
1565
|
+
DIR128 fake_step; //step entry
|
|
1566
|
+
|
|
1567
|
+
ASSERT_HOST (bottom->end.x () == top->start.x ());
|
|
1568
|
+
fake_count = top->start.y () - bottom->end.y ();
|
|
1569
|
+
if (fake_count < 0) {
|
|
1570
|
+
fake_count = -fake_count;
|
|
1571
|
+
fake_step = 32;
|
|
1572
|
+
}
|
|
1573
|
+
else
|
|
1574
|
+
fake_step = 96;
|
|
1575
|
+
|
|
1576
|
+
stepcount = bottom->stepcount + fake_count + top->stepcount;
|
|
1577
|
+
steps = new DIR128[stepcount];
|
|
1578
|
+
memmove (steps, bottom->steps, bottom->stepcount);
|
|
1579
|
+
memset (steps + bottom->stepcount, fake_step.get_dir(), fake_count);
|
|
1580
|
+
memmove (steps + bottom->stepcount + fake_count, top->steps,
|
|
1581
|
+
top->stepcount);
|
|
1582
|
+
delete [] bottom->steps;
|
|
1583
|
+
bottom->steps = steps;
|
|
1584
|
+
bottom->stepcount = stepcount;
|
|
1585
|
+
bottom->end = top->end;
|
|
1586
|
+
bottom->other_end->end = top->end;
|
|
1587
|
+
}
|
|
1588
|
+
|
|
1589
|
+
|
|
1590
|
+
/**********************************************************************
|
|
1591
|
+
* C_OUTLINE_FRAG::close
|
|
1592
|
+
*
|
|
1593
|
+
* Join the ends of this fragment and turn it into an outline.
|
|
1594
|
+
**********************************************************************/
|
|
1595
|
+
|
|
1596
|
+
C_OUTLINE *C_OUTLINE_FRAG::close() { //join pieces
|
|
1597
|
+
DIR128 *new_steps; //new steps
|
|
1598
|
+
inT32 new_stepcount; //no of steps
|
|
1599
|
+
inT16 fake_count; //fake steps
|
|
1600
|
+
DIR128 fake_step; //step entry
|
|
1601
|
+
|
|
1602
|
+
ASSERT_HOST (start.x () == end.x ());
|
|
1603
|
+
fake_count = start.y () - end.y ();
|
|
1604
|
+
if (fake_count < 0) {
|
|
1605
|
+
fake_count = -fake_count;
|
|
1606
|
+
fake_step = 32;
|
|
1607
|
+
}
|
|
1608
|
+
else
|
|
1609
|
+
fake_step = 96;
|
|
1610
|
+
|
|
1611
|
+
new_stepcount = stepcount + fake_count;
|
|
1612
|
+
new_steps = new DIR128[new_stepcount];
|
|
1613
|
+
memmove(new_steps, steps, stepcount);
|
|
1614
|
+
memset (new_steps + stepcount, fake_step.get_dir(), fake_count);
|
|
1615
|
+
C_OUTLINE* result = new C_OUTLINE (start, new_steps, new_stepcount);
|
|
1616
|
+
delete [] new_steps;
|
|
1617
|
+
return result;
|
|
1618
|
+
}
|
|
1619
|
+
|
|
1620
|
+
|
|
1621
|
+
/**********************************************************************
|
|
1622
|
+
* C_OUTLINE_FRAG::operator=
|
|
1623
|
+
*
|
|
1624
|
+
* Copy this fragment.
|
|
1625
|
+
**********************************************************************/
|
|
1626
|
+
|
|
1627
|
+
//join pieces
|
|
1628
|
+
C_OUTLINE_FRAG & C_OUTLINE_FRAG::operator= (
|
|
1629
|
+
const C_OUTLINE_FRAG & src //fragment to copy
|
|
1630
|
+
) {
|
|
1631
|
+
if (steps != NULL)
|
|
1632
|
+
delete [] steps;
|
|
1633
|
+
|
|
1634
|
+
stepcount = src.stepcount;
|
|
1635
|
+
steps = new DIR128[stepcount];
|
|
1636
|
+
memmove (steps, src.steps, stepcount);
|
|
1637
|
+
start = src.start;
|
|
1638
|
+
end = src.end;
|
|
1639
|
+
ycoord = src.ycoord;
|
|
1640
|
+
return *this;
|
|
1641
|
+
}
|