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,825 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////////////
|
|
2
|
+
// File: scrollview.cc
|
|
3
|
+
// Description: ScrollView
|
|
4
|
+
// Author: Joern Wanke
|
|
5
|
+
// Created: Thu Nov 29 2007
|
|
6
|
+
//
|
|
7
|
+
// (C) Copyright 2007, Google Inc.
|
|
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
|
+
|
|
21
|
+
#ifndef GRAPHICS_DISABLED
|
|
22
|
+
// This class contains the main ScrollView-logic,
|
|
23
|
+
// e.g. parsing & sending messages, images etc.
|
|
24
|
+
#ifdef WIN32
|
|
25
|
+
#pragma warning(disable:4786) // Don't give stupid warnings for stl
|
|
26
|
+
#endif
|
|
27
|
+
|
|
28
|
+
const int kSvPort = 8461;
|
|
29
|
+
const int kMaxMsgSize = 4096;
|
|
30
|
+
const int kMaxIntPairSize = 45; // Holds %d,%d, for upto 64 bit.
|
|
31
|
+
|
|
32
|
+
#include "scrollview.h"
|
|
33
|
+
|
|
34
|
+
#include <stdarg.h>
|
|
35
|
+
#include <limits.h>
|
|
36
|
+
#include <string.h>
|
|
37
|
+
#include <map>
|
|
38
|
+
#include <utility>
|
|
39
|
+
#include <algorithm>
|
|
40
|
+
#include <vector>
|
|
41
|
+
#include <string>
|
|
42
|
+
#include <cstring>
|
|
43
|
+
#include <climits>
|
|
44
|
+
|
|
45
|
+
#include "svutil.h"
|
|
46
|
+
|
|
47
|
+
#ifdef HAVE_LIBLEPT
|
|
48
|
+
#include "allheaders.h"
|
|
49
|
+
#endif
|
|
50
|
+
|
|
51
|
+
struct SVPolyLineBuffer {
|
|
52
|
+
bool empty; // Independent indicator to allow SendMsg to call SendPolygon.
|
|
53
|
+
std::vector<int> xcoords;
|
|
54
|
+
std::vector<int> ycoords;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
// A map between the window IDs and their corresponding pointers.
|
|
58
|
+
static std::map<int, ScrollView*> svmap;
|
|
59
|
+
// A map of all semaphores waiting for a specific event on a specific window.
|
|
60
|
+
static std::map<std::pair<ScrollView*, SVEventType>,
|
|
61
|
+
std::pair<SVSemaphore*, SVEvent*> > waiting_for_events;
|
|
62
|
+
SVMutex* mutex_waiting;
|
|
63
|
+
|
|
64
|
+
SVEvent* SVEvent::copy() {
|
|
65
|
+
SVEvent* any = new SVEvent;
|
|
66
|
+
any->command_id = command_id;
|
|
67
|
+
any->counter = counter;
|
|
68
|
+
any->parameter = new char[strlen(parameter) + 1];
|
|
69
|
+
strncpy(any->parameter, parameter, strlen(parameter));
|
|
70
|
+
any->parameter[strlen(parameter)] = '\0';
|
|
71
|
+
any->type = type;
|
|
72
|
+
any->x = x;
|
|
73
|
+
any->y = y;
|
|
74
|
+
any->x_size = x_size;
|
|
75
|
+
any->y_size = y_size;
|
|
76
|
+
any->window = window;
|
|
77
|
+
return any;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// This is the main loop which handles the ScrollView-logic from the server
|
|
81
|
+
// to the client. It basically loops through messages, parses them to events
|
|
82
|
+
// and distributes it to the waiting handlers.
|
|
83
|
+
// It is run from a different thread and synchronizes via SVSync.
|
|
84
|
+
void* ScrollView::MessageReceiver(void* a) {
|
|
85
|
+
int counter_event_id = 0; // ongoing counter
|
|
86
|
+
char* message = NULL;
|
|
87
|
+
// Wait until a new message appears in the input stream_.
|
|
88
|
+
do {
|
|
89
|
+
message = ScrollView::GetStream()->Receive();
|
|
90
|
+
} while (message == NULL);
|
|
91
|
+
|
|
92
|
+
// This is the main loop which iterates until the server is dead (strlen = -1).
|
|
93
|
+
// It basically parses for 3 different messagetypes and then distributes the
|
|
94
|
+
// events accordingly.
|
|
95
|
+
while (strlen(message) != -1) {
|
|
96
|
+
// The new event we create.
|
|
97
|
+
SVEvent* cur = new SVEvent;
|
|
98
|
+
// The ID of the corresponding window.
|
|
99
|
+
int window_id;
|
|
100
|
+
|
|
101
|
+
int ev_type;
|
|
102
|
+
|
|
103
|
+
int n;
|
|
104
|
+
// Fill the new SVEvent properly.
|
|
105
|
+
sscanf(message, "%d,%d,%d,%d,%d,%d,%d,%n", &window_id, &ev_type, &cur->x,
|
|
106
|
+
&cur->y, &cur->x_size, &cur->y_size, &cur->command_id, &n);
|
|
107
|
+
char* p = (message + n);
|
|
108
|
+
|
|
109
|
+
cur->window = svmap[window_id];
|
|
110
|
+
|
|
111
|
+
if (cur->window != NULL) {
|
|
112
|
+
cur->parameter = new char[strlen(p) + 1];
|
|
113
|
+
strncpy(cur->parameter, p, strlen(p) + 1);
|
|
114
|
+
if (strlen(p) > 0) { // remove the last \n
|
|
115
|
+
cur->parameter[strlen(p)] = '\0';
|
|
116
|
+
}
|
|
117
|
+
cur->type = static_cast<SVEventType>(ev_type);
|
|
118
|
+
cur->y = cur->window->TranslateYCoordinate(cur->y);
|
|
119
|
+
cur->counter = counter_event_id;
|
|
120
|
+
// Increase by 2 since we will also create an SVET_ANY event from cur,
|
|
121
|
+
// which will have a counter_id of cur + 1 (and thus gets processed
|
|
122
|
+
// after cur).
|
|
123
|
+
counter_event_id += 2;
|
|
124
|
+
|
|
125
|
+
// In case of an SVET_EXIT event, quit the whole application.
|
|
126
|
+
if (ev_type == SVET_EXIT) { ScrollView::Exit(); }
|
|
127
|
+
|
|
128
|
+
// Place two copies of it in the table for the window.
|
|
129
|
+
cur->window->SetEvent(cur);
|
|
130
|
+
|
|
131
|
+
// Check if any of the threads currently waiting want it.
|
|
132
|
+
std::pair<ScrollView*, SVEventType> awaiting_list(cur->window,
|
|
133
|
+
cur->type);
|
|
134
|
+
std::pair<ScrollView*, SVEventType> awaiting_list_any(cur->window,
|
|
135
|
+
SVET_ANY);
|
|
136
|
+
std::pair<ScrollView*, SVEventType> awaiting_list_any_window(NULL,
|
|
137
|
+
SVET_ANY);
|
|
138
|
+
mutex_waiting->Lock();
|
|
139
|
+
if (waiting_for_events.count(awaiting_list) > 0) {
|
|
140
|
+
waiting_for_events[awaiting_list].second = cur;
|
|
141
|
+
waiting_for_events[awaiting_list].first->Signal();
|
|
142
|
+
} else if (waiting_for_events.count(awaiting_list_any) > 0) {
|
|
143
|
+
waiting_for_events[awaiting_list_any].second = cur;
|
|
144
|
+
waiting_for_events[awaiting_list_any].first->Signal();
|
|
145
|
+
} else if (waiting_for_events.count(awaiting_list_any_window) > 0) {
|
|
146
|
+
waiting_for_events[awaiting_list_any_window].second = cur;
|
|
147
|
+
waiting_for_events[awaiting_list_any_window].first->Signal();
|
|
148
|
+
} else {
|
|
149
|
+
// No one wanted it, so delete it.
|
|
150
|
+
delete cur;
|
|
151
|
+
}
|
|
152
|
+
mutex_waiting->Unlock();
|
|
153
|
+
// Signal the corresponding semaphore twice (for both copies).
|
|
154
|
+
ScrollView* sv = svmap[window_id];
|
|
155
|
+
if (sv != NULL) {
|
|
156
|
+
sv->Signal();
|
|
157
|
+
sv->Signal();
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Wait until a new message appears in the input stream_.
|
|
162
|
+
do {
|
|
163
|
+
message = ScrollView::GetStream()->Receive();
|
|
164
|
+
} while (message == NULL);
|
|
165
|
+
}
|
|
166
|
+
return 0;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Table to implement the color index values in the old system.
|
|
170
|
+
int table_colors[ScrollView::GREEN_YELLOW+1][4]= {
|
|
171
|
+
{0, 0, 0, 0}, // NONE (transparent)
|
|
172
|
+
{0, 0, 0, 255}, // BLACK.
|
|
173
|
+
{255, 255, 255, 255}, // WHITE.
|
|
174
|
+
{255, 0, 0, 255}, // RED.
|
|
175
|
+
{255, 255, 0, 255}, // YELLOW.
|
|
176
|
+
{0, 255, 0, 255}, // GREEN.
|
|
177
|
+
{0, 255, 255, 255}, // CYAN.
|
|
178
|
+
{0, 0, 255, 255}, // BLUE.
|
|
179
|
+
{255, 0, 255, 255}, // MAGENTA.
|
|
180
|
+
{0, 128, 255, 255}, // AQUAMARINE.
|
|
181
|
+
{0, 0, 64, 255}, // DARK_SLATE_BLUE.
|
|
182
|
+
{128, 128, 255, 255}, // LIGHT_BLUE.
|
|
183
|
+
{64, 64, 255, 255}, // MEDIUM_BLUE.
|
|
184
|
+
{0, 0, 32, 255}, // MIDNIGHT_BLUE.
|
|
185
|
+
{0, 0, 128, 255}, // NAVY_BLUE.
|
|
186
|
+
{192, 192, 255, 255}, // SKY_BLUE.
|
|
187
|
+
{64, 64, 128, 255}, // SLATE_BLUE.
|
|
188
|
+
{32, 32, 64, 255}, // STEEL_BLUE.
|
|
189
|
+
{255, 128, 128, 255}, // CORAL.
|
|
190
|
+
{128, 64, 0, 255}, // BROWN.
|
|
191
|
+
{128, 128, 0, 255}, // SANDY_BROWN.
|
|
192
|
+
{192, 192, 0, 255}, // GOLD.
|
|
193
|
+
{192, 192, 128, 255}, // GOLDENROD.
|
|
194
|
+
{0, 64, 0, 255}, // DARK_GREEN.
|
|
195
|
+
{32, 64, 0, 255}, // DARK_OLIVE_GREEN.
|
|
196
|
+
{64, 128, 0, 255}, // FOREST_GREEN.
|
|
197
|
+
{128, 255, 0, 255}, // LIME_GREEN.
|
|
198
|
+
{192, 255, 192, 255}, // PALE_GREEN.
|
|
199
|
+
{192, 255, 0, 255}, // YELLOW_GREEN.
|
|
200
|
+
{192, 192, 192, 255}, // LIGHT_GREY.
|
|
201
|
+
{64, 64, 128, 255}, // DARK_SLATE_GREY.
|
|
202
|
+
{64, 64, 64, 255}, // DIM_GREY.
|
|
203
|
+
{128, 128, 128, 255}, // GREY.
|
|
204
|
+
{64, 192, 0, 255}, // KHAKI.
|
|
205
|
+
{255, 0, 192, 255}, // MAROON.
|
|
206
|
+
{255, 128, 0, 255}, // ORANGE.
|
|
207
|
+
{255, 128, 64, 255}, // ORCHID.
|
|
208
|
+
{255, 192, 192, 255}, // PINK.
|
|
209
|
+
{128, 0, 128, 255}, // PLUM.
|
|
210
|
+
{255, 0, 64, 255}, // INDIAN_RED.
|
|
211
|
+
{255, 64, 0, 255}, // ORANGE_RED.
|
|
212
|
+
{255, 0, 192, 255}, // VIOLET_RED.
|
|
213
|
+
{255, 192, 128, 255}, // SALMON.
|
|
214
|
+
{128, 128, 0, 255}, // TAN.
|
|
215
|
+
{0, 255, 255, 255}, // TURQUOISE.
|
|
216
|
+
{0, 128, 128, 255}, // DARK_TURQUOISE.
|
|
217
|
+
{192, 0, 255, 255}, // VIOLET.
|
|
218
|
+
{128, 128, 0, 255}, // WHEAT.
|
|
219
|
+
{128, 255, 0, 255} // GREEN_YELLOW
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
/*******************************************************************************
|
|
224
|
+
* Scrollview implementation.
|
|
225
|
+
*******************************************************************************/
|
|
226
|
+
|
|
227
|
+
SVNetwork* ScrollView::stream_ = NULL;
|
|
228
|
+
int ScrollView::nr_created_windows_ = 0;
|
|
229
|
+
|
|
230
|
+
// Calls Initialize with all arguments given.
|
|
231
|
+
ScrollView::ScrollView(const char* name, int x_pos, int y_pos, int x_size,
|
|
232
|
+
int y_size, int x_canvas_size, int y_canvas_size,
|
|
233
|
+
bool y_axis_reversed, const char* server_name) {
|
|
234
|
+
Initialize(name, x_pos, y_pos, x_size, y_size, x_canvas_size, y_canvas_size,
|
|
235
|
+
y_axis_reversed, server_name);}
|
|
236
|
+
|
|
237
|
+
// Calls Initialize with default argument for server_name_.
|
|
238
|
+
ScrollView::ScrollView(const char* name, int x_pos, int y_pos, int x_size,
|
|
239
|
+
int y_size, int x_canvas_size, int y_canvas_size,
|
|
240
|
+
bool y_axis_reversed) {
|
|
241
|
+
Initialize(name, x_pos, y_pos, x_size, y_size, x_canvas_size, y_canvas_size,
|
|
242
|
+
y_axis_reversed, "localhost");
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// Calls Initialize with default argument for server_name_ & y_axis_reversed.
|
|
246
|
+
ScrollView::ScrollView(const char* name, int x_pos, int y_pos, int x_size,
|
|
247
|
+
int y_size, int x_canvas_size, int y_canvas_size) {
|
|
248
|
+
Initialize(name, x_pos, y_pos, x_size, y_size, x_canvas_size, y_canvas_size,
|
|
249
|
+
false, "localhost");
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// Sets up a ScrollView window, depending on the constructor variables.
|
|
253
|
+
void ScrollView::Initialize(const char* name, int x_pos, int y_pos, int x_size,
|
|
254
|
+
int y_size, int x_canvas_size, int y_canvas_size,
|
|
255
|
+
bool y_axis_reversed, const char* server_name) {
|
|
256
|
+
// If this is the first ScrollView Window which gets created, there is no
|
|
257
|
+
// network connection yet and we have to set it up in a different thread.
|
|
258
|
+
if (stream_ == NULL) {
|
|
259
|
+
nr_created_windows_ = 0;
|
|
260
|
+
stream_ = new SVNetwork(server_name, kSvPort);
|
|
261
|
+
mutex_waiting = new SVMutex();
|
|
262
|
+
SendRawMessage(
|
|
263
|
+
"svmain = luajava.bindClass('com.google.scrollview.ScrollView')\n");
|
|
264
|
+
SVSync::StartThread(MessageReceiver, NULL);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// Set up the variables on the clientside.
|
|
268
|
+
nr_created_windows_++;
|
|
269
|
+
event_handler_ = NULL;
|
|
270
|
+
y_axis_is_reversed_ = y_axis_reversed;
|
|
271
|
+
y_size_ = y_canvas_size;
|
|
272
|
+
window_name_ = name;
|
|
273
|
+
window_id_ = nr_created_windows_;
|
|
274
|
+
// Set up polygon buffering.
|
|
275
|
+
points_ = new SVPolyLineBuffer;
|
|
276
|
+
points_->empty = true;
|
|
277
|
+
|
|
278
|
+
svmap[window_id_] = this;
|
|
279
|
+
|
|
280
|
+
for (int i = 0; i < SVET_COUNT; i++) {
|
|
281
|
+
event_table_[i] = NULL;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
mutex_ = new SVMutex();
|
|
285
|
+
semaphore_ = new SVSemaphore();
|
|
286
|
+
|
|
287
|
+
// Set up an actual Window on the client side.
|
|
288
|
+
char message[kMaxMsgSize];
|
|
289
|
+
snprintf(message, sizeof(message),
|
|
290
|
+
"w%u = luajava.newInstance('com.google.scrollview.ui"
|
|
291
|
+
".SVWindow','%s',%u,%u,%u,%u,%u,%u,%u)\n",
|
|
292
|
+
window_id_, window_name_, window_id_,
|
|
293
|
+
x_pos, y_pos, x_size, y_size, x_canvas_size, y_canvas_size);
|
|
294
|
+
SendRawMessage(message);
|
|
295
|
+
|
|
296
|
+
SVSync::StartThread(StartEventHandler, this);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// Sits and waits for events on this window.
|
|
300
|
+
void* ScrollView::StartEventHandler(void* a) {
|
|
301
|
+
ScrollView* sv = reinterpret_cast<ScrollView*>(a);
|
|
302
|
+
SVEvent* new_event;
|
|
303
|
+
|
|
304
|
+
do {
|
|
305
|
+
stream_->Flush();
|
|
306
|
+
sv->semaphore_->Wait();
|
|
307
|
+
new_event = NULL;
|
|
308
|
+
int serial = -1;
|
|
309
|
+
int k = -1;
|
|
310
|
+
sv->mutex_->Lock();
|
|
311
|
+
// Check every table entry if he is is valid and not already processed.
|
|
312
|
+
|
|
313
|
+
for (int i = 0; i < SVET_COUNT; i++) {
|
|
314
|
+
if (sv->event_table_[i] != NULL &&
|
|
315
|
+
(serial < 0 || sv->event_table_[i]->counter < serial)) {
|
|
316
|
+
new_event = sv->event_table_[i];
|
|
317
|
+
serial = sv->event_table_[i]->counter;
|
|
318
|
+
k = i;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
// If we didnt find anything we had an old alarm and just sleep again.
|
|
322
|
+
if (new_event != NULL) {
|
|
323
|
+
sv->event_table_[k] = NULL;
|
|
324
|
+
sv->mutex_->Unlock();
|
|
325
|
+
if (sv->event_handler_ != NULL) { sv->event_handler_->Notify(new_event); }
|
|
326
|
+
if (new_event->type == SVET_DESTROY) { sv = NULL; }
|
|
327
|
+
delete new_event; // Delete the pointer after it has been processed.
|
|
328
|
+
} else { sv->mutex_->Unlock(); }
|
|
329
|
+
// The thread should run as long as its associated window is alive.
|
|
330
|
+
} while (sv != NULL);
|
|
331
|
+
return 0;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
ScrollView::~ScrollView() {
|
|
335
|
+
if (svmap[window_id_] != NULL) {
|
|
336
|
+
// So the event handling thread can quit.
|
|
337
|
+
SendMsg("destroy()");
|
|
338
|
+
|
|
339
|
+
SVEvent* sve = AwaitEvent(SVET_DESTROY);
|
|
340
|
+
delete sve;
|
|
341
|
+
}
|
|
342
|
+
delete mutex_;
|
|
343
|
+
delete semaphore_;
|
|
344
|
+
delete points_;
|
|
345
|
+
|
|
346
|
+
svmap.erase(window_id_);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
// Send a message to the server, attaching the window id.
|
|
350
|
+
void ScrollView::SendMsg(const char* format, ...) {
|
|
351
|
+
if (!points_->empty)
|
|
352
|
+
SendPolygon();
|
|
353
|
+
va_list args;
|
|
354
|
+
char message[kMaxMsgSize];
|
|
355
|
+
|
|
356
|
+
va_start(args, format); // variable list
|
|
357
|
+
vsnprintf(message, kMaxMsgSize, format, args);
|
|
358
|
+
va_end(args);
|
|
359
|
+
|
|
360
|
+
char form[kMaxMsgSize];
|
|
361
|
+
snprintf(form, kMaxMsgSize, "w%u:%s\n", window_id_, message);
|
|
362
|
+
|
|
363
|
+
stream_->Send(form);
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
// Send a message to the server without a
|
|
367
|
+
// window id. Used for global events like exit().
|
|
368
|
+
void ScrollView::SendRawMessage(const char* msg) {
|
|
369
|
+
stream_->Send(msg);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// Add an Event Listener to this ScrollView Window
|
|
373
|
+
void ScrollView::AddEventHandler(SVEventHandler* listener) {
|
|
374
|
+
event_handler_ = listener;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
void ScrollView::Signal() {
|
|
378
|
+
semaphore_->Signal();
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
void ScrollView::SetEvent(SVEvent* svevent) {
|
|
382
|
+
// Copy event
|
|
383
|
+
SVEvent* any = svevent->copy();
|
|
384
|
+
SVEvent* specific = svevent->copy();
|
|
385
|
+
any->counter = specific->counter + 1;
|
|
386
|
+
|
|
387
|
+
// Place both events into the queue.
|
|
388
|
+
mutex_->Lock();
|
|
389
|
+
// Delete the old objects..
|
|
390
|
+
if (event_table_[specific->type] != NULL) {
|
|
391
|
+
delete event_table_[specific->type]; }
|
|
392
|
+
if (event_table_[SVET_ANY] != NULL) {
|
|
393
|
+
delete event_table_[SVET_ANY]; }
|
|
394
|
+
// ...and put the new ones in the table.
|
|
395
|
+
event_table_[specific->type] = specific;
|
|
396
|
+
event_table_[SVET_ANY] = any;
|
|
397
|
+
mutex_->Unlock();
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
|
|
401
|
+
// Block until an event of the given type is received.
|
|
402
|
+
// Note: The calling function is responsible for deleting the returned
|
|
403
|
+
// SVEvent afterwards!
|
|
404
|
+
SVEvent* ScrollView::AwaitEvent(SVEventType type) {
|
|
405
|
+
// Initialize the waiting semaphore.
|
|
406
|
+
SVSemaphore* sem = new SVSemaphore();
|
|
407
|
+
std::pair<ScrollView*, SVEventType> ea(this, type);
|
|
408
|
+
mutex_waiting->Lock();
|
|
409
|
+
waiting_for_events[ea] = std::pair<SVSemaphore*, SVEvent*> (sem, NULL);
|
|
410
|
+
mutex_waiting->Unlock();
|
|
411
|
+
// Wait on it, but first flush.
|
|
412
|
+
stream_->Flush();
|
|
413
|
+
sem->Wait();
|
|
414
|
+
// Process the event we got woken up for (its in waiting_for_events pair).
|
|
415
|
+
mutex_waiting->Lock();
|
|
416
|
+
SVEvent* ret = waiting_for_events[ea].second;
|
|
417
|
+
waiting_for_events.erase(ea);
|
|
418
|
+
mutex_waiting->Unlock();
|
|
419
|
+
return ret;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
// Block until any event on any window is received.
|
|
423
|
+
// No event is returned here!
|
|
424
|
+
SVEvent* ScrollView::AwaitEventAnyWindow() {
|
|
425
|
+
// Initialize the waiting semaphore.
|
|
426
|
+
SVSemaphore* sem = new SVSemaphore();
|
|
427
|
+
std::pair<ScrollView*, SVEventType> ea(NULL, SVET_ANY);
|
|
428
|
+
mutex_waiting->Lock();
|
|
429
|
+
waiting_for_events[ea] = std::pair<SVSemaphore*, SVEvent*> (sem, NULL);
|
|
430
|
+
mutex_waiting->Unlock();
|
|
431
|
+
// Wait on it.
|
|
432
|
+
stream_->Flush();
|
|
433
|
+
sem->Wait();
|
|
434
|
+
// Process the event we got woken up for (its in waiting_for_events pair).
|
|
435
|
+
mutex_waiting->Lock();
|
|
436
|
+
SVEvent* ret = waiting_for_events[ea].second;
|
|
437
|
+
waiting_for_events.erase(ea);
|
|
438
|
+
mutex_waiting->Unlock();
|
|
439
|
+
return ret;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
// Send the current buffered polygon (if any) and clear it.
|
|
443
|
+
void ScrollView::SendPolygon() {
|
|
444
|
+
if (!points_->empty) {
|
|
445
|
+
points_->empty = true; // Allows us to use SendMsg.
|
|
446
|
+
int length = points_->xcoords.size();
|
|
447
|
+
// length == 1 corresponds to 2 SetCursors in a row and only the
|
|
448
|
+
// last setCursor has any effect.
|
|
449
|
+
if (length == 2) {
|
|
450
|
+
// An isolated line!
|
|
451
|
+
SendMsg("drawLine(%d,%d,%d,%d)",
|
|
452
|
+
points_->xcoords[0], points_->ycoords[0],
|
|
453
|
+
points_->xcoords[1], points_->ycoords[1]);
|
|
454
|
+
} else if (length > 2) {
|
|
455
|
+
// A polyline.
|
|
456
|
+
SendMsg("createPolyline(%d)", length);
|
|
457
|
+
char coordpair[kMaxIntPairSize];
|
|
458
|
+
std::string decimal_coords;
|
|
459
|
+
for (int i = 0; i < length; ++i) {
|
|
460
|
+
snprintf(coordpair, kMaxIntPairSize, "%d,%d,",
|
|
461
|
+
points_->xcoords[i], points_->ycoords[i]);
|
|
462
|
+
decimal_coords += coordpair;
|
|
463
|
+
}
|
|
464
|
+
decimal_coords += '\n';
|
|
465
|
+
SendRawMessage(decimal_coords.c_str());
|
|
466
|
+
SendMsg("drawPolyline()");
|
|
467
|
+
}
|
|
468
|
+
points_->xcoords.clear();
|
|
469
|
+
points_->ycoords.clear();
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
|
|
474
|
+
/*******************************************************************************
|
|
475
|
+
* LUA "API" functions.
|
|
476
|
+
*******************************************************************************/
|
|
477
|
+
|
|
478
|
+
// Sets the position from which to draw to (x,y).
|
|
479
|
+
void ScrollView::SetCursor(int x, int y) {
|
|
480
|
+
SendPolygon();
|
|
481
|
+
DrawTo(x, y);
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
// Draws from the current position to (x,y) and sets the new position to it.
|
|
485
|
+
void ScrollView::DrawTo(int x, int y) {
|
|
486
|
+
points_->xcoords.push_back(x);
|
|
487
|
+
points_->ycoords.push_back(TranslateYCoordinate(y));
|
|
488
|
+
points_->empty = false;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
// Draw a line using the current pen color.
|
|
492
|
+
void ScrollView::Line(int x1, int y1, int x2, int y2) {
|
|
493
|
+
if (!points_->xcoords.empty() && x1 == points_->xcoords.back() &&
|
|
494
|
+
TranslateYCoordinate(y1) == points_->ycoords.back()) {
|
|
495
|
+
// We are already at x1, y1, so just draw to x2, y2.
|
|
496
|
+
DrawTo(x2, y2);
|
|
497
|
+
} else if (!points_->xcoords.empty() && x2 == points_->xcoords.back() &&
|
|
498
|
+
TranslateYCoordinate(y2) == points_->ycoords.back()) {
|
|
499
|
+
// We are already at x2, y2, so just draw to x1, y1.
|
|
500
|
+
DrawTo(x1, y1);
|
|
501
|
+
} else {
|
|
502
|
+
// This is a new line.
|
|
503
|
+
SetCursor(x1, y1);
|
|
504
|
+
DrawTo(x2, y2);
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
// Set the visibility of the window.
|
|
509
|
+
void ScrollView::SetVisible(bool visible) {
|
|
510
|
+
if (visible) { SendMsg("setVisible(true)");
|
|
511
|
+
} else { SendMsg("setVisible(false)"); }
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
// Set the alwaysOnTop flag.
|
|
515
|
+
void ScrollView::AlwaysOnTop(bool b) {
|
|
516
|
+
if (b) { SendMsg("setAlwaysOnTop(true)");
|
|
517
|
+
} else { SendMsg("setAlwaysOnTop(false)"); }
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
// Adds a message entry to the message box.
|
|
521
|
+
void ScrollView::AddMessage(const char* format, ...) {
|
|
522
|
+
va_list args;
|
|
523
|
+
char message[kMaxMsgSize];
|
|
524
|
+
char form[kMaxMsgSize];
|
|
525
|
+
|
|
526
|
+
va_start(args, format); // variable list
|
|
527
|
+
vsnprintf(message, kMaxMsgSize, format, args);
|
|
528
|
+
va_end(args);
|
|
529
|
+
|
|
530
|
+
snprintf(form, kMaxMsgSize, "w%u:%s", window_id_, message);
|
|
531
|
+
|
|
532
|
+
char* esc = AddEscapeChars(form);
|
|
533
|
+
SendMsg("addMessage(\"%s\")", esc);
|
|
534
|
+
delete[] esc;
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
// Set a messagebox.
|
|
538
|
+
void ScrollView::AddMessageBox() {
|
|
539
|
+
SendMsg("addMessageBox()");
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
// Exit the client completely (and notify the server of it).
|
|
543
|
+
void ScrollView::Exit() {
|
|
544
|
+
SendRawMessage("svmain:exit()");
|
|
545
|
+
exit(0);
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
// Clear the canvas.
|
|
549
|
+
void ScrollView::Clear() {
|
|
550
|
+
SendMsg("clear()");
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
// Set the stroke width.
|
|
554
|
+
void ScrollView::Stroke(float width) {
|
|
555
|
+
SendMsg("setStrokeWidth(%f)", width);
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
// Draw a rectangle using the current pen color.
|
|
559
|
+
// The rectangle is filled with the current brush color.
|
|
560
|
+
void ScrollView::Rectangle(int x1, int y1, int x2, int y2) {
|
|
561
|
+
SendMsg("drawRectangle(%d,%d,%d,%d)",
|
|
562
|
+
x1, TranslateYCoordinate(y1), x2, TranslateYCoordinate(y2));
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
// Draw an ellipse using the current pen color.
|
|
566
|
+
// The ellipse is filled with the current brush color.
|
|
567
|
+
void ScrollView::Ellipse(int x1, int y1, int width, int height) {
|
|
568
|
+
SendMsg("drawEllipse(%d,%d,%u,%u)",
|
|
569
|
+
x1, TranslateYCoordinate(y1), width, height);
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
// Set the pen color to the given RGB values.
|
|
573
|
+
void ScrollView::Pen(int red, int green, int blue) {
|
|
574
|
+
SendMsg("pen(%d,%d,%d)", red, green, blue);
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
// Set the pen color to the given RGB values.
|
|
578
|
+
void ScrollView::Pen(int red, int green, int blue, int alpha) {
|
|
579
|
+
SendMsg("pen(%d,%d,%d,%d)", red, green, blue, alpha);
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
// Set the brush color to the given RGB values.
|
|
583
|
+
void ScrollView::Brush(int red, int green, int blue) {
|
|
584
|
+
SendMsg("brush(%d,%d,%d)", red, green, blue);
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
// Set the brush color to the given RGB values.
|
|
588
|
+
void ScrollView::Brush(int red, int green, int blue, int alpha) {
|
|
589
|
+
SendMsg("brush(%d,%d,%d,%d)", red, green, blue, alpha);
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
// Set the attributes for future Text(..) calls.
|
|
593
|
+
void ScrollView::TextAttributes(const char* font, int pixel_size,
|
|
594
|
+
bool bold, bool italic, bool underlined) {
|
|
595
|
+
const char* b;
|
|
596
|
+
const char* i;
|
|
597
|
+
const char* u;
|
|
598
|
+
|
|
599
|
+
if (bold) { b = "true";
|
|
600
|
+
} else { b = "false"; }
|
|
601
|
+
if (italic) { i = "true";
|
|
602
|
+
} else { i = "false"; }
|
|
603
|
+
if (underlined) { u = "true";
|
|
604
|
+
} else { u = "false"; }
|
|
605
|
+
SendMsg("textAttributes('%s',%u,%s,%s,%s)", font, pixel_size,
|
|
606
|
+
b, i, u);
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
// Draw text at the given coordinates.
|
|
610
|
+
void ScrollView::Text(int x, int y, const char* mystring) {
|
|
611
|
+
SendMsg("drawText(%d,%d,'%s')", x, TranslateYCoordinate(y), mystring);
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
// Open and draw an image given a name at (x,y).
|
|
615
|
+
void ScrollView::Image(const char* image, int x_pos, int y_pos) {
|
|
616
|
+
SendMsg("openImage('%s')", image);
|
|
617
|
+
SendMsg("drawImage('%s',%d,%d)",
|
|
618
|
+
image, x_pos, TranslateYCoordinate(y_pos));
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
// Add new checkboxmenuentry to menubar.
|
|
622
|
+
void ScrollView::MenuItem(const char* parent, const char* name,
|
|
623
|
+
int cmdEvent, bool flag) {
|
|
624
|
+
if (parent == NULL) { parent = ""; }
|
|
625
|
+
if (flag) { SendMsg("addMenuBarItem('%s','%s',%d,true)",
|
|
626
|
+
parent, name, cmdEvent);
|
|
627
|
+
} else { SendMsg("addMenuBarItem('%s','%s',%d,false)",
|
|
628
|
+
parent, name, cmdEvent); }
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
// Add new menuentry to menubar.
|
|
632
|
+
void ScrollView::MenuItem(const char* parent, const char* name, int cmdEvent) {
|
|
633
|
+
if (parent == NULL) { parent = ""; }
|
|
634
|
+
SendMsg("addMenuBarItem('%s','%s',%d)", parent, name, cmdEvent);
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
// Add new submenu to menubar.
|
|
638
|
+
void ScrollView::MenuItem(const char* parent, const char* name) {
|
|
639
|
+
if (parent == NULL) { parent = ""; }
|
|
640
|
+
SendMsg("addMenuBarItem('%s','%s')", parent, name);
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
// Add new submenu to popupmenu.
|
|
644
|
+
void ScrollView::PopupItem(const char* parent, const char* name) {
|
|
645
|
+
if (parent == NULL) { parent = ""; }
|
|
646
|
+
SendMsg("addPopupMenuItem('%s','%s')", parent, name);
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
// Add new submenuentry to popupmenu.
|
|
650
|
+
void ScrollView::PopupItem(const char* parent, const char* name,
|
|
651
|
+
int cmdEvent, const char* value, const char* desc) {
|
|
652
|
+
if (parent == NULL) { parent = ""; }
|
|
653
|
+
char* esc = AddEscapeChars(value);
|
|
654
|
+
char* esc2 = AddEscapeChars(desc);
|
|
655
|
+
SendMsg("addPopupMenuItem('%s','%s',%d,'%s','%s')", parent, name,
|
|
656
|
+
cmdEvent, esc, esc2);
|
|
657
|
+
delete[] esc;
|
|
658
|
+
delete[] esc2;
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
// Send an update message for a single window.
|
|
662
|
+
void ScrollView::UpdateWindow() {
|
|
663
|
+
SendMsg("update()");
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
// Note: this is an update to all windows
|
|
667
|
+
void ScrollView::Update() {
|
|
668
|
+
for (std::map<int, ScrollView*>::iterator iter = svmap.begin();
|
|
669
|
+
iter != svmap.end(); ++iter) {
|
|
670
|
+
if (iter->second != NULL)
|
|
671
|
+
iter->second->UpdateWindow();
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
// Set the pen color, using an enum value (e.g. ScrollView::ORANGE)
|
|
676
|
+
void ScrollView::Pen(Color color) {
|
|
677
|
+
Pen(table_colors[color][0], table_colors[color][1],
|
|
678
|
+
table_colors[color][2], table_colors[color][3]);
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
// Set the brush color, using an enum value (e.g. ScrollView::ORANGE)
|
|
682
|
+
void ScrollView::Brush(Color color) {
|
|
683
|
+
Brush(table_colors[color][0],
|
|
684
|
+
table_colors[color][1],
|
|
685
|
+
table_colors[color][2],
|
|
686
|
+
table_colors[color][3]);
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
// Shows a modal Input Dialog which can return any kind of String
|
|
690
|
+
char* ScrollView::ShowInputDialog(const char* msg) {
|
|
691
|
+
SendMsg("showInputDialog(\"%s\")", msg);
|
|
692
|
+
SVEvent* ev;
|
|
693
|
+
// wait till an input event (all others are thrown away)
|
|
694
|
+
ev = AwaitEvent(SVET_INPUT);
|
|
695
|
+
char* p = new char[strlen(ev->parameter) + 1];
|
|
696
|
+
strncpy(p, ev->parameter, strlen(ev->parameter));
|
|
697
|
+
p[strlen(ev->parameter)] = '\0';
|
|
698
|
+
delete ev;
|
|
699
|
+
return p;
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
// Shows a modal Yes/No Dialog which will return 'y' or 'n'
|
|
703
|
+
int ScrollView::ShowYesNoDialog(const char* msg) {
|
|
704
|
+
SendMsg("showYesNoDialog(\"%s\")", msg);
|
|
705
|
+
SVEvent* ev;
|
|
706
|
+
// Wait till an input event (all others are thrown away)
|
|
707
|
+
ev = AwaitEvent(SVET_INPUT);
|
|
708
|
+
int a = ev->parameter[0];
|
|
709
|
+
delete ev;
|
|
710
|
+
return a;
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
// Zoom the window to the rectangle given upper left corner and
|
|
714
|
+
// lower right corner.
|
|
715
|
+
void ScrollView::ZoomToRectangle(int x1, int y1, int x2, int y2) {
|
|
716
|
+
y1 = TranslateYCoordinate(y1);
|
|
717
|
+
y2 = TranslateYCoordinate(y2);
|
|
718
|
+
SendMsg("zoomRectangle(%d,%d,%d,%d)",
|
|
719
|
+
MIN(x1, x2), MIN(y1, y2), MAX(x1, x2), MAX(y1, y2));
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
#ifdef HAVE_LIBLEPT
|
|
723
|
+
// Send an image of type PIX.
|
|
724
|
+
void ScrollView::Image(PIX* image, int x_pos, int y_pos) {
|
|
725
|
+
int width = image->w;
|
|
726
|
+
int height = image->h;
|
|
727
|
+
l_uint32 bpp = image->d;
|
|
728
|
+
// PIX* do not have a unique identifier/name associated, so name them "lept".
|
|
729
|
+
SendMsg("createImage('%s',%d,%d,%d)", "lept", width, height, bpp);
|
|
730
|
+
|
|
731
|
+
if (bpp == 32) {
|
|
732
|
+
Transfer32bppImage(image);
|
|
733
|
+
} else if (bpp == 8) {
|
|
734
|
+
TransferGrayImage(image);
|
|
735
|
+
} else if (bpp == 1) {
|
|
736
|
+
TransferBinaryImage(image);
|
|
737
|
+
}
|
|
738
|
+
// PIX* do not have a unique identifier/name associated, so name them "lept".
|
|
739
|
+
SendMsg("drawImage('%s',%d,%d)", "lept", x_pos, y_pos);
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
// Sends each pixel as hex value like html, e.g. #00FF00 for green.
|
|
743
|
+
void ScrollView::Transfer32bppImage(PIX* image) {
|
|
744
|
+
int ppL = pixGetWidth(image);
|
|
745
|
+
int h = pixGetHeight(image);
|
|
746
|
+
int wpl = pixGetWpl(image);
|
|
747
|
+
int transfer_size= ppL * 7 + 2;
|
|
748
|
+
char* pixel_data = new char[transfer_size];
|
|
749
|
+
for (int y = 0; y < h; ++y) {
|
|
750
|
+
l_uint32* data = pixGetData(image) + y*wpl;
|
|
751
|
+
for (int x = 0; x < ppL; ++x, ++data) {
|
|
752
|
+
snprintf(&pixel_data[x*7], 7, "#%.2x%.2x%.2x",
|
|
753
|
+
GET_DATA_BYTE(data, COLOR_RED),
|
|
754
|
+
GET_DATA_BYTE(data, COLOR_GREEN),
|
|
755
|
+
GET_DATA_BYTE(data, COLOR_BLUE));
|
|
756
|
+
}
|
|
757
|
+
pixel_data[transfer_size - 2] = '\n';
|
|
758
|
+
pixel_data[transfer_size - 1] = '\0';
|
|
759
|
+
SendRawMessage(pixel_data);
|
|
760
|
+
}
|
|
761
|
+
delete[] pixel_data;
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
// Sends for each pixel either '1' or '0'.
|
|
765
|
+
void ScrollView::TransferGrayImage(PIX* image) {
|
|
766
|
+
char* pixel_data = new char[image->w * 2 + 2];
|
|
767
|
+
for (int y = 0; y < image->h; y++) {
|
|
768
|
+
l_uint32* data = pixGetData(image) + y * pixGetWpl(image);
|
|
769
|
+
for (int x = 0; x < image->w; x++) {
|
|
770
|
+
snprintf(&pixel_data[x*2], 2, "%.2x", (GET_DATA_BYTE(data, x)));
|
|
771
|
+
pixel_data[image->w * 2] = '\n';
|
|
772
|
+
pixel_data[image->w * 2 + 1] = '\0';
|
|
773
|
+
SendRawMessage(pixel_data);
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
delete [] pixel_data;
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
// Sends for each pixel either '1' or '0'.
|
|
780
|
+
void ScrollView::TransferBinaryImage(PIX* image) {
|
|
781
|
+
char* pixel_data = new char[image->w + 2];
|
|
782
|
+
for (int y = 0; y < image->h; y++) {
|
|
783
|
+
l_uint32* data = pixGetData(image) + y * pixGetWpl(image);
|
|
784
|
+
for (int x = 0; x < image->w; x++) {
|
|
785
|
+
if (GET_DATA_BIT(data, x))
|
|
786
|
+
pixel_data[x] = '1';
|
|
787
|
+
else
|
|
788
|
+
pixel_data[x] = '0';
|
|
789
|
+
}
|
|
790
|
+
pixel_data[image->w] = '\n';
|
|
791
|
+
pixel_data[image->w + 1] = '\0';
|
|
792
|
+
SendRawMessage(pixel_data);
|
|
793
|
+
}
|
|
794
|
+
delete [] pixel_data;
|
|
795
|
+
}
|
|
796
|
+
#endif
|
|
797
|
+
|
|
798
|
+
// Escapes the ' character with a \, so it can be processed by LUA.
|
|
799
|
+
// Note: The caller will have to make sure he deletes the newly allocated item.
|
|
800
|
+
char* ScrollView::AddEscapeChars(const char* input) {
|
|
801
|
+
const char* nextptr = strchr(input, '\'');
|
|
802
|
+
const char* lastptr = input;
|
|
803
|
+
char* message = new char[kMaxMsgSize];
|
|
804
|
+
int pos = 0;
|
|
805
|
+
while (nextptr != NULL) {
|
|
806
|
+
strncpy(message+pos, lastptr, nextptr-lastptr);
|
|
807
|
+
pos += nextptr - lastptr;
|
|
808
|
+
message[pos] = '\\';
|
|
809
|
+
pos += 1;
|
|
810
|
+
lastptr = nextptr;
|
|
811
|
+
nextptr = strchr(nextptr+1, '\'');
|
|
812
|
+
}
|
|
813
|
+
strncpy(message+pos, lastptr, strlen(lastptr));
|
|
814
|
+
message[pos+strlen(lastptr)] = '\0';
|
|
815
|
+
return message;
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
// Inverse the Y axis if the coordinates are actually inversed.
|
|
819
|
+
int ScrollView::TranslateYCoordinate(int y) {
|
|
820
|
+
if (!y_axis_is_reversed_) { return y;
|
|
821
|
+
} else { return y_size_ - y; }
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
|
|
825
|
+
#endif // GRAPHICS_DISABLED
|