isbn 2.0.4 → 2.0.5
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/{README → README.md} +5 -11
- data/Rakefile +20 -14
- data/isbn.gemspec +23 -0
- data/lib/isbn.rb +2 -0
- data/test/isbn_spec.rb +1 -1
- metadata +29 -316
- data/VERSION +0 -1
- data/src/gocr-0.48/.cvsignore +0 -6
- data/src/gocr-0.48/AUTHORS +0 -7
- data/src/gocr-0.48/BUGS +0 -55
- data/src/gocr-0.48/CREDITS +0 -17
- data/src/gocr-0.48/HISTORY +0 -243
- data/src/gocr-0.48/INSTALL +0 -83
- data/src/gocr-0.48/Makefile +0 -193
- data/src/gocr-0.48/Makefile.in +0 -193
- data/src/gocr-0.48/README +0 -165
- data/src/gocr-0.48/READMEde.txt +0 -80
- data/src/gocr-0.48/REMARK.txt +0 -18
- data/src/gocr-0.48/REVIEW +0 -538
- data/src/gocr-0.48/TODO +0 -65
- data/src/gocr-0.48/bin/.cvsignore +0 -2
- data/src/gocr-0.48/bin/create_db +0 -38
- data/src/gocr-0.48/bin/gocr.tcl +0 -527
- data/src/gocr-0.48/bin/gocr_chk.sh +0 -44
- data/src/gocr-0.48/configure +0 -4689
- data/src/gocr-0.48/configure.in +0 -71
- data/src/gocr-0.48/doc/.#Makefile.1.6 +0 -39
- data/src/gocr-0.48/doc/.cvsignore +0 -2
- data/src/gocr-0.48/doc/Makefile +0 -39
- data/src/gocr-0.48/doc/Makefile.in +0 -39
- data/src/gocr-0.48/doc/example.dtd +0 -53
- data/src/gocr-0.48/doc/example.xml +0 -21
- data/src/gocr-0.48/doc/examples.txt +0 -67
- data/src/gocr-0.48/doc/gocr.html +0 -578
- data/src/gocr-0.48/doc/unicode.txt +0 -57
- data/src/gocr-0.48/examples/.#Makefile.1.22 +0 -166
- data/src/gocr-0.48/examples/4x6.png +0 -0
- data/src/gocr-0.48/examples/4x6.txt +0 -2
- data/src/gocr-0.48/examples/5x7.png +0 -0
- data/src/gocr-0.48/examples/5x7.png.txt +0 -2
- data/src/gocr-0.48/examples/5x8.png +0 -0
- data/src/gocr-0.48/examples/5x8.png.txt +0 -2
- data/src/gocr-0.48/examples/Makefile +0 -166
- data/src/gocr-0.48/examples/color.fig +0 -20
- data/src/gocr-0.48/examples/ex.fig +0 -16
- data/src/gocr-0.48/examples/font.tex +0 -22
- data/src/gocr-0.48/examples/font1.tex +0 -46
- data/src/gocr-0.48/examples/font2.fig +0 -27
- data/src/gocr-0.48/examples/font_nw.tex +0 -24
- data/src/gocr-0.48/examples/handwrt1.jpg +0 -0
- data/src/gocr-0.48/examples/handwrt1.txt +0 -10
- data/src/gocr-0.48/examples/inverse.fig +0 -20
- data/src/gocr-0.48/examples/matrix.jpg +0 -0
- data/src/gocr-0.48/examples/ocr-a-subset.png +0 -0
- data/src/gocr-0.48/examples/ocr-a-subset.png.txt +0 -4
- data/src/gocr-0.48/examples/ocr-a.png +0 -0
- data/src/gocr-0.48/examples/ocr-a.txt +0 -6
- data/src/gocr-0.48/examples/ocr-b.png +0 -0
- data/src/gocr-0.48/examples/ocr-b.png.txt +0 -4
- data/src/gocr-0.48/examples/polish.tex +0 -28
- data/src/gocr-0.48/examples/rotate45.fig +0 -14
- data/src/gocr-0.48/examples/score +0 -36
- data/src/gocr-0.48/examples/text.tex +0 -28
- data/src/gocr-0.48/gpl.html +0 -537
- data/src/gocr-0.48/include/.cvsignore +0 -2
- data/src/gocr-0.48/include/config.h +0 -36
- data/src/gocr-0.48/include/config.h.in +0 -36
- data/src/gocr-0.48/include/version.h +0 -2
- data/src/gocr-0.48/install-sh +0 -3
- data/src/gocr-0.48/make.bat +0 -57
- data/src/gocr-0.48/man/.cvsignore +0 -2
- data/src/gocr-0.48/man/Makefile +0 -29
- data/src/gocr-0.48/man/Makefile.in +0 -29
- data/src/gocr-0.48/man/man1/gocr.1 +0 -166
- data/src/gocr-0.48/src/.cvsignore +0 -4
- data/src/gocr-0.48/src/Makefile +0 -132
- data/src/gocr-0.48/src/Makefile.in +0 -132
- data/src/gocr-0.48/src/amiga.h +0 -31
- data/src/gocr-0.48/src/barcode.c +0 -846
- data/src/gocr-0.48/src/barcode.c.orig +0 -593
- data/src/gocr-0.48/src/barcode.h +0 -11
- data/src/gocr-0.48/src/box.c +0 -372
- data/src/gocr-0.48/src/database.c +0 -462
- data/src/gocr-0.48/src/detect.c +0 -943
- data/src/gocr-0.48/src/gocr.c +0 -373
- data/src/gocr-0.48/src/gocr.h +0 -288
- data/src/gocr-0.48/src/jconv.c +0 -168
- data/src/gocr-0.48/src/job.c +0 -84
- data/src/gocr-0.48/src/lines.c +0 -350
- data/src/gocr-0.48/src/list.c +0 -334
- data/src/gocr-0.48/src/list.h +0 -90
- data/src/gocr-0.48/src/ocr0.c +0 -6756
- data/src/gocr-0.48/src/ocr0.h +0 -63
- data/src/gocr-0.48/src/ocr0n.c +0 -1475
- data/src/gocr-0.48/src/ocr1.c +0 -85
- data/src/gocr-0.48/src/ocr1.h +0 -3
- data/src/gocr-0.48/src/otsu.c +0 -289
- data/src/gocr-0.48/src/otsu.h +0 -23
- data/src/gocr-0.48/src/output.c +0 -289
- data/src/gocr-0.48/src/output.h +0 -37
- data/src/gocr-0.48/src/pcx.c +0 -153
- data/src/gocr-0.48/src/pcx.h +0 -9
- data/src/gocr-0.48/src/pgm2asc.c +0 -2893
- data/src/gocr-0.48/src/pgm2asc.h +0 -105
- data/src/gocr-0.48/src/pixel.c +0 -537
- data/src/gocr-0.48/src/pnm.c +0 -533
- data/src/gocr-0.48/src/pnm.h +0 -35
- data/src/gocr-0.48/src/progress.c +0 -87
- data/src/gocr-0.48/src/progress.h +0 -42
- data/src/gocr-0.48/src/remove.c +0 -703
- data/src/gocr-0.48/src/tga.c +0 -87
- data/src/gocr-0.48/src/tga.h +0 -6
- data/src/gocr-0.48/src/unicode.c +0 -1314
- data/src/gocr-0.48/src/unicode.h +0 -1257
- data/src/jpeg-7/Makefile.am +0 -133
- data/src/jpeg-7/Makefile.in +0 -1089
- data/src/jpeg-7/README +0 -322
- data/src/jpeg-7/aclocal.m4 +0 -8990
- data/src/jpeg-7/ansi2knr.1 +0 -36
- data/src/jpeg-7/ansi2knr.c +0 -739
- data/src/jpeg-7/cderror.h +0 -132
- data/src/jpeg-7/cdjpeg.c +0 -181
- data/src/jpeg-7/cdjpeg.h +0 -187
- data/src/jpeg-7/change.log +0 -270
- data/src/jpeg-7/cjpeg.1 +0 -325
- data/src/jpeg-7/cjpeg.c +0 -616
- data/src/jpeg-7/ckconfig.c +0 -402
- data/src/jpeg-7/coderules.txt +0 -118
- data/src/jpeg-7/config.guess +0 -1561
- data/src/jpeg-7/config.sub +0 -1686
- data/src/jpeg-7/configure +0 -17139
- data/src/jpeg-7/configure.ac +0 -317
- data/src/jpeg-7/depcomp +0 -630
- data/src/jpeg-7/djpeg.1 +0 -251
- data/src/jpeg-7/djpeg.c +0 -617
- data/src/jpeg-7/example.c +0 -433
- data/src/jpeg-7/filelist.txt +0 -215
- data/src/jpeg-7/install-sh +0 -520
- data/src/jpeg-7/install.txt +0 -1097
- data/src/jpeg-7/jaricom.c +0 -148
- data/src/jpeg-7/jcapimin.c +0 -282
- data/src/jpeg-7/jcapistd.c +0 -161
- data/src/jpeg-7/jcarith.c +0 -921
- data/src/jpeg-7/jccoefct.c +0 -453
- data/src/jpeg-7/jccolor.c +0 -459
- data/src/jpeg-7/jcdctmgr.c +0 -482
- data/src/jpeg-7/jchuff.c +0 -1612
- data/src/jpeg-7/jcinit.c +0 -65
- data/src/jpeg-7/jcmainct.c +0 -293
- data/src/jpeg-7/jcmarker.c +0 -667
- data/src/jpeg-7/jcmaster.c +0 -770
- data/src/jpeg-7/jcomapi.c +0 -106
- data/src/jpeg-7/jconfig.bcc +0 -48
- data/src/jpeg-7/jconfig.cfg +0 -45
- data/src/jpeg-7/jconfig.dj +0 -38
- data/src/jpeg-7/jconfig.mac +0 -43
- data/src/jpeg-7/jconfig.manx +0 -43
- data/src/jpeg-7/jconfig.mc6 +0 -52
- data/src/jpeg-7/jconfig.sas +0 -43
- data/src/jpeg-7/jconfig.st +0 -42
- data/src/jpeg-7/jconfig.txt +0 -155
- data/src/jpeg-7/jconfig.vc +0 -45
- data/src/jpeg-7/jconfig.vms +0 -37
- data/src/jpeg-7/jconfig.wat +0 -38
- data/src/jpeg-7/jcparam.c +0 -632
- data/src/jpeg-7/jcprepct.c +0 -358
- data/src/jpeg-7/jcsample.c +0 -545
- data/src/jpeg-7/jctrans.c +0 -381
- data/src/jpeg-7/jdapimin.c +0 -396
- data/src/jpeg-7/jdapistd.c +0 -275
- data/src/jpeg-7/jdarith.c +0 -762
- data/src/jpeg-7/jdatadst.c +0 -151
- data/src/jpeg-7/jdatasrc.c +0 -212
- data/src/jpeg-7/jdcoefct.c +0 -736
- data/src/jpeg-7/jdcolor.c +0 -396
- data/src/jpeg-7/jdct.h +0 -393
- data/src/jpeg-7/jddctmgr.c +0 -382
- data/src/jpeg-7/jdhuff.c +0 -1309
- data/src/jpeg-7/jdinput.c +0 -384
- data/src/jpeg-7/jdmainct.c +0 -512
- data/src/jpeg-7/jdmarker.c +0 -1360
- data/src/jpeg-7/jdmaster.c +0 -663
- data/src/jpeg-7/jdmerge.c +0 -400
- data/src/jpeg-7/jdpostct.c +0 -290
- data/src/jpeg-7/jdsample.c +0 -361
- data/src/jpeg-7/jdtrans.c +0 -136
- data/src/jpeg-7/jerror.c +0 -252
- data/src/jpeg-7/jerror.h +0 -304
- data/src/jpeg-7/jfdctflt.c +0 -174
- data/src/jpeg-7/jfdctfst.c +0 -230
- data/src/jpeg-7/jfdctint.c +0 -4348
- data/src/jpeg-7/jidctflt.c +0 -242
- data/src/jpeg-7/jidctfst.c +0 -368
- data/src/jpeg-7/jidctint.c +0 -5137
- data/src/jpeg-7/jinclude.h +0 -91
- data/src/jpeg-7/jmemansi.c +0 -167
- data/src/jpeg-7/jmemdos.c +0 -638
- data/src/jpeg-7/jmemdosa.asm +0 -379
- data/src/jpeg-7/jmemmac.c +0 -289
- data/src/jpeg-7/jmemmgr.c +0 -1118
- data/src/jpeg-7/jmemname.c +0 -276
- data/src/jpeg-7/jmemnobs.c +0 -109
- data/src/jpeg-7/jmemsys.h +0 -198
- data/src/jpeg-7/jmorecfg.h +0 -369
- data/src/jpeg-7/jpegint.h +0 -395
- data/src/jpeg-7/jpeglib.h +0 -1135
- data/src/jpeg-7/jpegtran.1 +0 -272
- data/src/jpeg-7/jpegtran.c +0 -546
- data/src/jpeg-7/jquant1.c +0 -856
- data/src/jpeg-7/jquant2.c +0 -1310
- data/src/jpeg-7/jutils.c +0 -179
- data/src/jpeg-7/jversion.h +0 -14
- data/src/jpeg-7/libjpeg.map +0 -4
- data/src/jpeg-7/libjpeg.txt +0 -3067
- data/src/jpeg-7/ltmain.sh +0 -8406
- data/src/jpeg-7/makcjpeg.st +0 -36
- data/src/jpeg-7/makdjpeg.st +0 -36
- data/src/jpeg-7/makeadsw.vc6 +0 -77
- data/src/jpeg-7/makeasln.vc9 +0 -33
- data/src/jpeg-7/makecdep.vc6 +0 -82
- data/src/jpeg-7/makecdsp.vc6 +0 -130
- data/src/jpeg-7/makecmak.vc6 +0 -159
- data/src/jpeg-7/makecvcp.vc9 +0 -186
- data/src/jpeg-7/makeddep.vc6 +0 -82
- data/src/jpeg-7/makeddsp.vc6 +0 -130
- data/src/jpeg-7/makedmak.vc6 +0 -159
- data/src/jpeg-7/makedvcp.vc9 +0 -186
- data/src/jpeg-7/makefile.ansi +0 -220
- data/src/jpeg-7/makefile.bcc +0 -291
- data/src/jpeg-7/makefile.dj +0 -226
- data/src/jpeg-7/makefile.manx +0 -220
- data/src/jpeg-7/makefile.mc6 +0 -255
- data/src/jpeg-7/makefile.mms +0 -224
- data/src/jpeg-7/makefile.sas +0 -258
- data/src/jpeg-7/makefile.unix +0 -234
- data/src/jpeg-7/makefile.vc +0 -217
- data/src/jpeg-7/makefile.vms +0 -142
- data/src/jpeg-7/makefile.wat +0 -239
- data/src/jpeg-7/makejdep.vc6 +0 -423
- data/src/jpeg-7/makejdsp.vc6 +0 -285
- data/src/jpeg-7/makejdsw.vc6 +0 -29
- data/src/jpeg-7/makejmak.vc6 +0 -425
- data/src/jpeg-7/makejsln.vc9 +0 -17
- data/src/jpeg-7/makejvcp.vc9 +0 -328
- data/src/jpeg-7/makeproj.mac +0 -213
- data/src/jpeg-7/makerdep.vc6 +0 -6
- data/src/jpeg-7/makerdsp.vc6 +0 -78
- data/src/jpeg-7/makermak.vc6 +0 -110
- data/src/jpeg-7/makervcp.vc9 +0 -133
- data/src/jpeg-7/maketdep.vc6 +0 -43
- data/src/jpeg-7/maketdsp.vc6 +0 -122
- data/src/jpeg-7/maketmak.vc6 +0 -131
- data/src/jpeg-7/maketvcp.vc9 +0 -178
- data/src/jpeg-7/makewdep.vc6 +0 -6
- data/src/jpeg-7/makewdsp.vc6 +0 -78
- data/src/jpeg-7/makewmak.vc6 +0 -110
- data/src/jpeg-7/makewvcp.vc9 +0 -133
- data/src/jpeg-7/makljpeg.st +0 -68
- data/src/jpeg-7/maktjpeg.st +0 -30
- data/src/jpeg-7/makvms.opt +0 -4
- data/src/jpeg-7/missing +0 -376
- data/src/jpeg-7/rdbmp.c +0 -439
- data/src/jpeg-7/rdcolmap.c +0 -253
- data/src/jpeg-7/rdgif.c +0 -38
- data/src/jpeg-7/rdjpgcom.1 +0 -63
- data/src/jpeg-7/rdjpgcom.c +0 -515
- data/src/jpeg-7/rdppm.c +0 -459
- data/src/jpeg-7/rdrle.c +0 -387
- data/src/jpeg-7/rdswitch.c +0 -365
- data/src/jpeg-7/rdtarga.c +0 -500
- data/src/jpeg-7/structure.txt +0 -945
- data/src/jpeg-7/testimg.bmp +0 -0
- data/src/jpeg-7/testimg.jpg +0 -0
- data/src/jpeg-7/testimg.ppm +0 -4
- data/src/jpeg-7/testimgp.jpg +0 -0
- data/src/jpeg-7/testorig.jpg +0 -0
- data/src/jpeg-7/testprog.jpg +0 -0
- data/src/jpeg-7/transupp.c +0 -1533
- data/src/jpeg-7/transupp.h +0 -205
- data/src/jpeg-7/usage.txt +0 -605
- data/src/jpeg-7/wizard.txt +0 -211
- data/src/jpeg-7/wrbmp.c +0 -442
- data/src/jpeg-7/wrgif.c +0 -399
- data/src/jpeg-7/wrjpgcom.1 +0 -103
- data/src/jpeg-7/wrjpgcom.c +0 -583
- data/src/jpeg-7/wrppm.c +0 -269
- data/src/jpeg-7/wrrle.c +0 -305
- data/src/jpeg-7/wrtarga.c +0 -253
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# Makefile for ./src path, used by configure
|
|
3
|
-
#
|
|
4
|
-
|
|
5
|
-
EXEEXT = @EXEEXT@
|
|
6
|
-
PROGRAM = gocr$(EXEEXT)
|
|
7
|
-
# lib removed for simplification (v0.46)
|
|
8
|
-
# but Igor from OSRA an optical chemical structure recognition software
|
|
9
|
-
# wants it (v0.47 Mar09)
|
|
10
|
-
PGMASCLIB = Pgm2asc
|
|
11
|
-
#LIBPGMASCLIB = lib$(PGMASCLIB).a
|
|
12
|
-
# ToDo: need a better pgm2asc.h for lib users
|
|
13
|
-
#INCLUDEFILES = gocr.h
|
|
14
|
-
# avoid german compiler messages
|
|
15
|
-
LANG=C
|
|
16
|
-
|
|
17
|
-
LIBOBJS=pgm2asc.o \
|
|
18
|
-
box.o \
|
|
19
|
-
database.o \
|
|
20
|
-
detect.o \
|
|
21
|
-
barcode.o \
|
|
22
|
-
lines.o \
|
|
23
|
-
list.o \
|
|
24
|
-
ocr0.o \
|
|
25
|
-
ocr0n.o \
|
|
26
|
-
ocr1.o \
|
|
27
|
-
otsu.o \
|
|
28
|
-
output.o \
|
|
29
|
-
pixel.o \
|
|
30
|
-
unicode.o \
|
|
31
|
-
remove.o \
|
|
32
|
-
pnm.o \
|
|
33
|
-
pcx.o \
|
|
34
|
-
progress.o \
|
|
35
|
-
job.o
|
|
36
|
-
|
|
37
|
-
# these two lines are for cross-compiling, not tested
|
|
38
|
-
#srcdir = @srcdir@
|
|
39
|
-
#VPATH = @srcdir@
|
|
40
|
-
bindir = @bindir@
|
|
41
|
-
# lib removed for simplification
|
|
42
|
-
#libdir = @libdir@
|
|
43
|
-
#includedir = @includedir@
|
|
44
|
-
|
|
45
|
-
CC=@CC@
|
|
46
|
-
# lib removed for simplification
|
|
47
|
-
# ar,ranlib detection removed from configure (simplicity)
|
|
48
|
-
# but needed by some developpers (linux only) for for (make libs)
|
|
49
|
-
# RANLIB = @RANLIB@
|
|
50
|
-
# AR = @AR@
|
|
51
|
-
RANLIB = ranlib
|
|
52
|
-
AR = ar
|
|
53
|
-
INSTALL=@INSTALL@
|
|
54
|
-
# shell is needed for OS/2 to let if test -r $(PROGRAM) ... work
|
|
55
|
-
SHELL=@SHELL@
|
|
56
|
-
|
|
57
|
-
DEFS=@DEFS@
|
|
58
|
-
CPPFLAGS=@CPPFLAGS@
|
|
59
|
-
# to see the config.h
|
|
60
|
-
CFLAGS=@CFLAGS@ $(CPPFLAGS) -I../include $(DEFS)
|
|
61
|
-
LDFLAGS=@LDFLAGS@
|
|
62
|
-
LIBS=@LIBS@
|
|
63
|
-
DESTDIR=@prefix@
|
|
64
|
-
|
|
65
|
-
.SUFFIXES: .s .o .c .h
|
|
66
|
-
# do not look for files if help (etc) is given
|
|
67
|
-
.PHONY : doc clean install libs default
|
|
68
|
-
|
|
69
|
-
.c.o: gocr.h pgm2asc.h ../include/config.h
|
|
70
|
-
$(CC) $(CFLAGS) -c -o $*.o $<
|
|
71
|
-
|
|
72
|
-
default: all
|
|
73
|
-
|
|
74
|
-
# all: $(PROGRAM) lib$(PGMASCLIB).a
|
|
75
|
-
all: $(PROGRAM)
|
|
76
|
-
|
|
77
|
-
gocr.o: gocr.h Makefile ../include/version.h
|
|
78
|
-
|
|
79
|
-
.c.h:
|
|
80
|
-
|
|
81
|
-
#$(PROGRAM): lib$(PGMASCLIB).a gocr.o
|
|
82
|
-
$(PROGRAM): $(LIBOBJS) gocr.o
|
|
83
|
-
# make it conform to ld --as-needed
|
|
84
|
-
#$(CC) -o $@ $(LDFLAGS) gocr.o ./lib$(PGMASCLIB).a $(LIBS)
|
|
85
|
-
$(CC) -o $@ $(LDFLAGS) gocr.o $(LIBOBJS) $(LIBS)
|
|
86
|
-
if test -r $(PROGRAM); then cp $@ ../bin; fi
|
|
87
|
-
|
|
88
|
-
libs: lib$(PGMASCLIB).a lib$(PGMASCLIB).@PACKAGE_VERSION@.so
|
|
89
|
-
|
|
90
|
-
lib$(PGMASCLIB).@PACKAGE_VERSION@.so: $(LIBOBJS)
|
|
91
|
-
$(CC) -fPIC -shared -Wl,-h$@ -o $@ $(LIBOBJS)
|
|
92
|
-
-ln -s $@ lib$(PGMASCLIB).so
|
|
93
|
-
|
|
94
|
-
lib$(PGMASCLIB).a: $(LIBOBJS)
|
|
95
|
-
# -rm -f $@
|
|
96
|
-
$(AR) cru $@ $(LIBOBJS)
|
|
97
|
-
$(RANLIB) $@
|
|
98
|
-
|
|
99
|
-
$(LIBOBJS): Makefile
|
|
100
|
-
|
|
101
|
-
# PHONY = don't look at file clean, -rm = start rm and ignore errors
|
|
102
|
-
.PHONY : clean proper install uninstall
|
|
103
|
-
install: all
|
|
104
|
-
#$(INSTALL) -d $(DESTDIR)$(bindir) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir)
|
|
105
|
-
$(INSTALL) -d $(DESTDIR)$(bindir)
|
|
106
|
-
$(INSTALL) ../bin/$(PROGRAM) $(DESTDIR)$(bindir)
|
|
107
|
-
$(INSTALL) ../bin/gocr.tcl $(DESTDIR)$(bindir) # better X11/bin?
|
|
108
|
-
if test -f lib$(PGMASCLIB).a; then\
|
|
109
|
-
$(INSTALL) lib$(PGMASCLIB).a $(DESTDIR)$(libdir);\
|
|
110
|
-
$(INSTALL) lib$(PGMASCLIB).@PACKAGE_VERSION@.so $(DESTDIR)$(libdir);\
|
|
111
|
-
$(INSTALL) lib$(PGMASCLIB).so $(DESTDIR)$(libdir);\
|
|
112
|
-
fi
|
|
113
|
-
# ToDo: not sure that the link will be installed correctly
|
|
114
|
-
#$(INSTALL) $(INCLUDEFILES) $(DESTDIR)$(includedir)
|
|
115
|
-
|
|
116
|
-
# directories are not removed
|
|
117
|
-
uninstall:
|
|
118
|
-
-rm -f $(DESTDIR)$(bindir)/$(PROGRAM)
|
|
119
|
-
-rm -f $(DESTDIR)$(bindir)/gocr.tcl
|
|
120
|
-
-rm -f $(DESTDIR)$(libdir)/lib$(PGMASCLIB).a
|
|
121
|
-
-rm -f $(DESTDIR)$(libdir)/lib$(PGMASCLIB).@PACKAGE_VERSION@.so
|
|
122
|
-
-rm -f $(DESTDIR)$(libdir)/lib$(PGMASCLIB).so
|
|
123
|
-
# ToDo: set to old version.so ?
|
|
124
|
-
#for X in $(INCLUDEFILES); do rm -f $(DESTDIR)$(includedir)/$$X; done
|
|
125
|
-
|
|
126
|
-
clean:
|
|
127
|
-
-rm -f *.o *~
|
|
128
|
-
|
|
129
|
-
proper: clean
|
|
130
|
-
-rm -f gocr libPgm2asc.*
|
|
131
|
-
-rm -f gocr
|
|
132
|
-
|
data/src/gocr-0.48/src/amiga.h
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
this file was suggested by Uffe Holst Jun05,2000
|
|
3
|
-
to compile gocr using SAS/C under AmigaOS
|
|
4
|
-
|
|
5
|
-
uhc@post6.tele.dk
|
|
6
|
-
|
|
7
|
-
SAS/C propably does not support ANSI C++, therefore this changes
|
|
8
|
-
|
|
9
|
-
I am a little bit confused about using declaration and
|
|
10
|
-
macro definition of abs(). I think that should not be necessary.
|
|
11
|
-
Tell me, if you have an Amiga and you can give answer
|
|
12
|
-
to the following questions.
|
|
13
|
-
|
|
14
|
-
Joerg Schulenburg, see README for EMAIL-address
|
|
15
|
-
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
#ifdef _AMIGA
|
|
19
|
-
#ifdef __SASC
|
|
20
|
-
#if 0
|
|
21
|
-
#include <string.h> /* may be this can be removed ??? */
|
|
22
|
-
#include <stdlib.h> /* may be this can be removed ??? */
|
|
23
|
-
extern int abs(int); /* may be this can be removed ??? */
|
|
24
|
-
#endif
|
|
25
|
-
#ifndef abs
|
|
26
|
-
#define abs(i) ((i) < 0 ? -(i) : (i))
|
|
27
|
-
#endif
|
|
28
|
-
#endif
|
|
29
|
-
#endif
|
|
30
|
-
|
|
31
|
-
|
data/src/gocr-0.48/src/barcode.c
DELETED
|
@@ -1,846 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
This is a Optical-Character-Recognition program
|
|
3
|
-
Copyright (C) 2000-2009 Joerg Schulenburg
|
|
4
|
-
|
|
5
|
-
This program is free software; you can redistribute it and/or
|
|
6
|
-
modify it under the terms of the GNU General Public License
|
|
7
|
-
as published by the Free Software Foundation; either version 2
|
|
8
|
-
of the License, or (at your option) any later version.
|
|
9
|
-
|
|
10
|
-
This program is distributed in the hope that it will be useful,
|
|
11
|
-
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
-
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
-
GNU General Public License for more details.
|
|
14
|
-
|
|
15
|
-
You should have received a copy of the GNU General Public License
|
|
16
|
-
along with this program; if not, write to the Free Software
|
|
17
|
-
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
18
|
-
|
|
19
|
-
see README for email address
|
|
20
|
-
|
|
21
|
-
ToDo:
|
|
22
|
-
- transform special xml bar code symbols (<>&) to xml symbols (<>&)
|
|
23
|
-
|
|
24
|
-
*/
|
|
25
|
-
|
|
26
|
-
#include <stdlib.h>
|
|
27
|
-
#include <stdio.h>
|
|
28
|
-
#include <string.h>
|
|
29
|
-
/* #include <math.h> -- we do not want unnecessary dependencies */
|
|
30
|
-
#include "pgm2asc.h"
|
|
31
|
-
#include "gocr.h"
|
|
32
|
-
#include "pnm.h"
|
|
33
|
-
|
|
34
|
-
#ifndef DO_DEBUG /* can be defined outside (configure --with-debug) */
|
|
35
|
-
#define DO_DEBUG 0 /* 0 is the default */
|
|
36
|
-
#endif
|
|
37
|
-
|
|
38
|
-
#undef g_debug
|
|
39
|
-
#if DO_DEBUG
|
|
40
|
-
# define g_debug(a) if (JOB->cfg.verbose&1) { a }
|
|
41
|
-
#else
|
|
42
|
-
# define g_debug(a)
|
|
43
|
-
#endif
|
|
44
|
-
|
|
45
|
-
/*
|
|
46
|
-
detect barcode and add a XML-string to the box (obj-pointer, ToDo)
|
|
47
|
-
ToDo: barcode-output stderr->stdout
|
|
48
|
-
*/
|
|
49
|
-
|
|
50
|
-
double sqr(double x) { return(x*x); }
|
|
51
|
-
|
|
52
|
-
/* ----------------------------- code128 ---------------------------- *
|
|
53
|
-
* "BSBSBS", B=Bar, S=Space, better using 2*6=12bit-integer? */
|
|
54
|
-
#define Num128 107
|
|
55
|
-
const char *code128[Num128+1]={ /* can be generated by an algorithm? */
|
|
56
|
-
/* 00 */"212222","222122","222221","121223","121322","131222","122213","122312",
|
|
57
|
-
/* 08 */"132212","221213","221312","231212","112232","122132","122231","113222",
|
|
58
|
-
/* 16 */"123122","123221","223211","221132","221231","213212","223112","312131",
|
|
59
|
-
/* 24 */"311222","321122","321221","312212","322112","322211","212123","212321",
|
|
60
|
-
/* 32 */"232121","111323","131123","131321","112313","132113","132311","211313",
|
|
61
|
-
/* 40 */"231113","231311","112133","112331","132131","113123","113321","133121",
|
|
62
|
-
/* 48 */"313121","211331","231131","213113","213311","213131","311123","311321",
|
|
63
|
-
/* 56 */"331121","312113","312311","332111","314111","221411","431111","111224",
|
|
64
|
-
/* 64 */"111422","121124","121421","141122","141221","112214","112412","122114",
|
|
65
|
-
/* 72 */"122411","142112","142211","241211","221114","413111","241112","134111",
|
|
66
|
-
/* 80 */"111242","121142","121241","114212","124112","124211","411212","421112",
|
|
67
|
-
/* 88 */"421211","212141","214121","412121","111143","111341","131141","114113",
|
|
68
|
-
/* 96 */"114311","411113","411311","113141","114131","311141","411131","211412",
|
|
69
|
-
/*104 */"211214","211232","2331112","???"};
|
|
70
|
-
|
|
71
|
-
/*
|
|
72
|
-
code128: see code128.tex by Petr Olsak (108 codes)
|
|
73
|
-
quiet_zone: size=10 (before and after code128)
|
|
74
|
-
num_bars=3*(start+chars[N]+crc+stop)+1
|
|
75
|
-
B=bar S=space char=BSBSBS (size=11), stop=BSBSBSB (size=11+2)
|
|
76
|
-
Width: Bar,Space=1,[2,3,4] char=11 code=11*(N+3)+2 sumB=even,sumS=odd
|
|
77
|
-
startA="211412"=103 startB="211214"=104 startC="211232"=105(2dec_digits)
|
|
78
|
-
mode/code 0..95 96 97 98 99 100 101 102 103 104 105 106
|
|
79
|
-
1=A x20-x5f,0-x20 F3 F2 uB mC mB F4 F1 ^A ^B ^C $
|
|
80
|
-
2=B x20-x7f F3 F2 uA mC F4 mA F1 ^A ^B ^C $
|
|
81
|
-
3=C "00"-"95" "96" "97" "98" "99" mB mA F1 ^A ^B ^C $
|
|
82
|
-
uA,uB: switch mode for next char, mA,mB: switch mode permanently
|
|
83
|
-
crc=(start+1*char1+2*char2+3*char3+...+N*charN) mod 103
|
|
84
|
-
$=stop="2331112"=106 (4bars, with=13) => start/end==211
|
|
85
|
-
return num of chars or string
|
|
86
|
-
|
|
87
|
-
size B+W even-variants odd-variants num_codes
|
|
88
|
-
11 = 8+3 = (1+3+4,2+2+4,2+3+3)+(1+1+1) => (6+3+3)*(1) = 12
|
|
89
|
-
= 6+5 = (1+1+4,1+2+3,2+2+2)+(1+1+3,1+2+2) => (3+6+1)*(3+3) = 60
|
|
90
|
-
= 4+7 = (1+1+2)+(1+2+4,1+3+3,2+2+3) => (3)*(6+3+3) = 36
|
|
91
|
-
sum = 108
|
|
92
|
-
*/
|
|
93
|
-
/* example: barcode -E -e 128c -b 1434600120000884 >a.eps */
|
|
94
|
-
/* example: barcode -E -e 128b -b 14Test41 >a.eps */
|
|
95
|
-
/* example: barcode -E -e 128raw -b 105 17 14 30 >a.eps */
|
|
96
|
-
|
|
97
|
-
char *decode_code128(int *wb, int num_bars){
|
|
98
|
-
int i, w, i1, i2, i3=0, i4, i5=0, crc, mode=1;
|
|
99
|
-
double dww, dw, err, min_err; char cc, *buf;
|
|
100
|
-
char *result=NULL; /* malloc and store the result */
|
|
101
|
-
|
|
102
|
-
for(w=i=0;i<2*num_bars-1;i++) w+=wb[i]; /* summ all bars and spaces */
|
|
103
|
-
|
|
104
|
-
/* test code128 characteristics, ToDo: look for correct start/stop 211 seq. */
|
|
105
|
-
if ((num_bars-1)%3!=0 || num_bars<10 || w<11*(num_bars-1)/3+2)
|
|
106
|
-
return 0;
|
|
107
|
-
g_debug(fprintf(stderr," code128 b%d s%d b%d\n",wb[0],wb[1],wb[2]);)
|
|
108
|
-
if (3*wb[0]<4* wb[1]
|
|
109
|
-
|| 3*wb[0]<4* wb[2]
|
|
110
|
-
|| 4*wb[0]<3*(wb[1]+wb[2])
|
|
111
|
-
|| 3*wb[0]>4*(wb[1]+wb[2])) return 0; /* 211 */
|
|
112
|
-
dw=3.0*w/((num_bars-1)*11+6);
|
|
113
|
-
/* get enough memory for all digits in longest mode C */
|
|
114
|
-
buf =(char *) malloc( (num_bars-7)/3*2+1); if (!buf) return result;
|
|
115
|
-
result=(char *) malloc(256+(num_bars-7)/3*2+1);
|
|
116
|
-
|
|
117
|
-
dww=crc=0;
|
|
118
|
-
for(i4=i1=0;i1<(num_bars-1)/3;i1++) {
|
|
119
|
-
for(min_err=1e8,i3=Num128,i5=0;i5<Num128;i5++){ /* get best fit */
|
|
120
|
-
for(err=i2=0;i2<6;i2++) err+=sqr(code128[i5][i2]-'0'-wb[i1*6+i2]/dw);
|
|
121
|
-
if (err<min_err) { min_err=err; i3=i5; }
|
|
122
|
-
} dww+=min_err;
|
|
123
|
-
g_debug(fprintf(stderr,"\n %7s %3d err=%.3f ",code128[i3],i3,min_err);)
|
|
124
|
-
if(i3<Num128){ /* valid symbol */
|
|
125
|
-
if(i1==0){ if (i3>102 && i3<106) mode=i3-103+1; crc=i3; } /* start */
|
|
126
|
-
if(i1>0 && i1<(num_bars-1)/3-2){
|
|
127
|
-
crc+=i3*(i1); cc=0; /* first * 1 + second * 2 + third * 3 ... */
|
|
128
|
-
i5=((mode>3)?mode>>2:mode&3); mode&=3; /* mode can be modified now */
|
|
129
|
-
switch (i5) { /* mode=1..3=modeA..modeC */
|
|
130
|
-
case 1: if (i3>=64 && i3<96) cc=i3-64; /* modeA: x20-x5f,0-x20 */
|
|
131
|
-
else cc=i3+32;
|
|
132
|
-
if (i3==101) mode=1; /* switch to mode A */
|
|
133
|
-
if (i3== 99) mode=3; /* switch to mode C */
|
|
134
|
-
if (i3== 98) mode|=2<<2; /* shift to mode B */
|
|
135
|
-
break;
|
|
136
|
-
case 2: cc=i3+32; /* modeB: x20-x7f */
|
|
137
|
-
if (i3==100) mode=2; /* switch to mode B */
|
|
138
|
-
if (i3== 99) mode=3; /* switch to mode C */
|
|
139
|
-
if (i3== 98) mode|=1<<2; /* shift to mode A */
|
|
140
|
-
break;
|
|
141
|
-
case 3:
|
|
142
|
-
if (i3==101) mode=1; /* switch to mode A */
|
|
143
|
-
if (i3==100) mode=2; /* switch to mode B */
|
|
144
|
-
}
|
|
145
|
-
if (i5==3) { buf[i4]='0'+i3/10; i4++;
|
|
146
|
-
buf[i4]='0'+i3%10; i4++; } /* modeC: two digits */
|
|
147
|
-
else {
|
|
148
|
-
if (cc>=0x20 && i3<=0x7f) { buf[i4]=cc; i4++; } /* modeA+B: one digit */
|
|
149
|
-
if (cc>=0 && cc< 0x20) { buf[i4]='^'; i4++;
|
|
150
|
-
buf[i4]=cc+'@'; i4++; }
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
if(i1==(num_bars-1)/3-2){ crc=(crc+103-i3)%103; }
|
|
154
|
-
if(i1==(num_bars-1)/3-1){ if(i3!=106) i3=-1; } /* stop code */
|
|
155
|
-
mode &= 3; /* remove shift */
|
|
156
|
-
}
|
|
157
|
-
else fprintf(stderr," %s=%02d? ",buf,i5);
|
|
158
|
-
}
|
|
159
|
-
buf[i4]=0; /* end of string */
|
|
160
|
-
if (result)
|
|
161
|
-
sprintf(result,"<barcode type=\"128\" chars=\"%d\" code=\"%s\" "
|
|
162
|
-
"crc=\"%d\" error=\"%.3f\" />",
|
|
163
|
-
i4,buf,crc,dww/((num_bars-1)));
|
|
164
|
-
free(buf);
|
|
165
|
-
return result;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/* -------------------------------------------------------------------- UPC
|
|
169
|
-
EAN 13 (UPC,(1+6+1+6+1)*2bars,size=3+6*7+5+6*7+3=95)
|
|
170
|
-
EAN 8 (UPC,(1+4+1+4+1)*2bars,size=3+4*7+5+4*7+3=67)
|
|
171
|
-
UPC: (10 codes)
|
|
172
|
-
BSB SBSB^n SBSBS BSBS^n BSB
|
|
173
|
-
bsb ...... sbsbs ...... bsb
|
|
174
|
-
111 ...... 11111 ...... 111
|
|
175
|
-
num_bars=2*(2*6+3) middle=SBSBS=11111 right/left=BSB=111="101"
|
|
176
|
-
char: left=SBSB right=BSBS (size=7) only_dec_digits
|
|
177
|
-
SS+BB = (S+S) + (B+B) => BB:SS = 5:2 or 3:4
|
|
178
|
-
size ev+odd even + odd => variants
|
|
179
|
-
7 = 2 + 5 = (1+1) + (1+4,2+3) => (1)*(2+2) = 4 codes
|
|
180
|
-
= 4 + 3 = (1+3,2+2) + (1+3) => (2+1)*(2) = 6 codes += 10 codes
|
|
181
|
-
ToDo: make it more robust
|
|
182
|
-
- return error as mean deviation
|
|
183
|
-
* -------------------------------------------------------------------- */
|
|
184
|
-
/* example: barcode -E -e upc -b 12345678901 >a.eps # ok */
|
|
185
|
-
/* example: barcode -E -e ean -b 123456789012 >a.eps # ok */
|
|
186
|
-
#define NumUPC 20
|
|
187
|
-
const char *codeUPC[NumUPC+1]={ /* 0..9, first n = SBSB, last n = BSBS */
|
|
188
|
-
"3211","2221","2122","1411","1132", /* 0,1,2,3,4 normal (+0bit) */
|
|
189
|
-
"1231","1114","1312","1213","3112", /* 5,6,7,8,9 */
|
|
190
|
-
"1123","1222","2212","1141","2311", /* 0,1,2,3,4 mirrored (+1bit) */
|
|
191
|
-
"1321","4111","2131","3121","2113", /* 5,6,7,8,9 */
|
|
192
|
-
"????"}; /* not found */
|
|
193
|
-
|
|
194
|
-
char *decode_UPC(int *wb, int num_bars){ /* ToDo: char *dest, int len */
|
|
195
|
-
int i, w, i1, i2, i3, i4, i5, crc, mirrored, ean;
|
|
196
|
-
double err, min_err, dw, dww=0.0; char digit;
|
|
197
|
-
char *result=NULL, *buf=NULL; /* malloc and store the result */
|
|
198
|
-
for(w=i=0;i<2*num_bars-1;i++) w+=wb[i];
|
|
199
|
-
|
|
200
|
-
dw=2.0*w/((num_bars-6)*7+2*11); /* or min(wb[]) */
|
|
201
|
-
crc=0;
|
|
202
|
-
if ((num_bars)%2!=0 || num_bars<10 || w<7*(num_bars-6)/2+11
|
|
203
|
-
|| ((num_bars-6)/2)%2!=0) return 0; /* should be balanced */
|
|
204
|
-
/* check front BSB, middle SBSBS and end BSB */
|
|
205
|
-
dww=0;
|
|
206
|
-
for (i=0;i<3;i++) { dww=sqr(wb[i ]/dw-1); if (dww>0.4) return 0; }
|
|
207
|
-
for (i=0;i<5;i++) { dww=sqr(wb[i+ num_bars-3]/dw-1); if (dww>0.4) return 0; }
|
|
208
|
-
for (i=0;i<3;i++) { dww=sqr(wb[i+2*num_bars-4]/dw-1); if (dww>0.4) return 0; }
|
|
209
|
-
buf =(char *)malloc( (num_bars-6)/2+1); if (!buf) return result;
|
|
210
|
-
result=(char *)malloc(256+(num_bars-6)/2+1);
|
|
211
|
-
|
|
212
|
-
for(ean=i5=0,i1=3;i1<2*num_bars-4;i1+=4) { /* each digit (2bars+2spaces) */
|
|
213
|
-
if (i1==num_bars-3) { i1++; continue; } /* skip middle sync SBSBS */
|
|
214
|
-
for (i4=NumUPC,mirrored=0,digit='?',min_err=16e8,i2=0;i2<NumUPC;i2++) {
|
|
215
|
-
for (err=0,i3=0;i3<4;i3++) err+=sqr(codeUPC[i2][i3]-'0'-wb[i1+i3]/dw);
|
|
216
|
-
if (err<min_err) { min_err=err; i4=i2; digit='0'+i2%10; mirrored=i2/10; }
|
|
217
|
-
} dww+=min_err; crc+=(digit-'0')*((i5&1)?1:3); /* even*3+odd, last char is even */
|
|
218
|
-
buf[i5++]=digit; if (i5<7) ean=(ean<<1)|mirrored;
|
|
219
|
-
/* ToDo: error as deviation wb from ideal */
|
|
220
|
-
g_debug(fprintf(stderr,"\nDBG: UPC digit=%c mirrored=%d err=%.3f err_m=%.3f ",
|
|
221
|
-
digit,mirrored,min_err/4,dww/(i5*4));)
|
|
222
|
-
}
|
|
223
|
-
/* EAN has a 13th leading digit build by 3 of 6 mirorred digits */
|
|
224
|
-
if (ean & 0x20) ean^=0x3f; /* UPC-E mirrored 1xxxxx => 0yyyyy */
|
|
225
|
-
switch (ean) {
|
|
226
|
-
case 11: ean=1; break;
|
|
227
|
-
case 13: ean=2; break;
|
|
228
|
-
case 14: ean=3; break;
|
|
229
|
-
case 19: ean=4; break;
|
|
230
|
-
case 25: ean=5; break;
|
|
231
|
-
case 28: ean=6; break;
|
|
232
|
-
case 21: ean=7; break;
|
|
233
|
-
case 22: ean=8; break;
|
|
234
|
-
case 26: ean=9; break;
|
|
235
|
-
default: ean=0; /* no or invalid EAN digit or UPC-extension */
|
|
236
|
-
} crc+=ean*1;
|
|
237
|
-
/* ToDo: fix possible buffer OVL, complement crc */
|
|
238
|
-
buf[i5]=0;
|
|
239
|
-
if (result)
|
|
240
|
-
sprintf(result,"<barcode type=\"UPC\" chars=\"%d\" code=\"%d%s\" "
|
|
241
|
-
"crc=\"%d\" error=\"%.3f\" />",
|
|
242
|
-
i5+1,ean,buf,(10-crc%10)%10,dww/((num_bars-6)*2));
|
|
243
|
-
free(buf);
|
|
244
|
-
return result;
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
/* EAN/UPC add-on is either 2 or 5 digits. It always starts with a
|
|
248
|
-
* guard bar BSB, followed by ([digit + SB] * (N-1)) + digit. Digit is
|
|
249
|
-
* SBSB. Two digit add-on's have 7 bars, and 5 digit add ons have 16.
|
|
250
|
-
*/
|
|
251
|
-
char *decode_UPC_addon(int *wb, int num_bars){ /* ToDo: char *dest, int len */
|
|
252
|
-
int i, w, i1, i2, i3, i4, i5, digits=num_bars/3;
|
|
253
|
-
double err, min_err, dw, dww=0.0; char digit;
|
|
254
|
-
char *result=NULL, *buf=NULL; /* malloc and store the result */
|
|
255
|
-
if (num_bars!=7 && num_bars!=16)
|
|
256
|
-
return 0;
|
|
257
|
-
for(w=i=0;i<2*num_bars-1;i++) w+=wb[i];
|
|
258
|
-
|
|
259
|
-
dw=1.0*w/(digits*7+4 + (digits-1)*2);
|
|
260
|
-
/* check front BSB, and delineators SB */
|
|
261
|
-
dww=0;
|
|
262
|
-
for (i=0;i<2;i++) { dww=sqr(wb[i]/dw-1); if (dww>0.4) return 0; }
|
|
263
|
-
dww=sqr(wb[i]*0.5/dw-1); if (dww>0.4) return 0;
|
|
264
|
-
for (i=1;i<digits; i++) {
|
|
265
|
-
for (i1=0; i1<2; i1++) {
|
|
266
|
-
dww = sqr(wb[i*6 + 1 + i1]/dw-1);
|
|
267
|
-
if (dww > 0.4) return 0;
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
buf =(char *)malloc( digits+1); if (!buf) return result;
|
|
271
|
-
result=(char *)malloc(256+digits+1);
|
|
272
|
-
|
|
273
|
-
for(i5=0,i1=3;i1<2*num_bars-1;i1+=6) { /* each digit (2bars+2spaces) */
|
|
274
|
-
for (i4=NumUPC,digit='?',min_err=16e8,i2=0;i2<NumUPC;i2++) {
|
|
275
|
-
for (err=0,i3=0;i3<4;i3++) err+=sqr(codeUPC[i2][i3]-'0'-wb[i1+i3]/dw);
|
|
276
|
-
if (err<min_err) { min_err=err; i4=i2; digit='0'+i2%10; }
|
|
277
|
-
}
|
|
278
|
-
dww+=min_err;
|
|
279
|
-
buf[i5++]=digit;
|
|
280
|
-
/* ToDo: error as deviation wb from ideal */
|
|
281
|
-
g_debug(fprintf(stderr,"\nDBG: UPC digit=%c err=%.3f err_m=%.3f ",
|
|
282
|
-
digit, min_err/4, dww/(i5*4));)
|
|
283
|
-
}
|
|
284
|
-
buf[i5]=0;
|
|
285
|
-
if (result)
|
|
286
|
-
sprintf(result, "<barcode type=\"UPC_addon\" chars=\"%d\" code=\"%s\" "
|
|
287
|
-
"error=\"%.3f\" />",
|
|
288
|
-
i5, buf, dww/((num_bars-6)*2));
|
|
289
|
-
free(buf);
|
|
290
|
-
return result;
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
/* --------------------------------------------------------- *
|
|
295
|
-
* code 3 of 9, 3 thick of 9 bars
|
|
296
|
-
* BSBSBSBSB<S> size=7+3*aw aw=2(3), sumS/sumB=2/1?
|
|
297
|
-
* two widths: size=1 or size=2or3, digit_width=13(16)
|
|
298
|
-
* 5 bars and 4(+1) spaces per digit, last space is not used
|
|
299
|
-
* with 2 (or 0) wide bars, 1 (or 3) wide spaces per digit
|
|
300
|
-
* => 3 of 9 => max=9*8*7=504
|
|
301
|
-
* evenBB=(0of5)+(2of5) oddSS=(1of4)+(3of4) max=44
|
|
302
|
-
* ToDo: better code -...-.-.. as 046 or 083 (even,even,odd)
|
|
303
|
-
*/
|
|
304
|
-
#define Num39 (40+4) /* (3of9)=(2of5)(1of4)+(0of5)(3of4), (2of5)(.-..)=0..9 */
|
|
305
|
-
const char *code39= /* rearranged to BBBBBSSSS<S> (bars,spaces) */
|
|
306
|
-
"0..--..-.."
|
|
307
|
-
"1-...-.-..""2.-..-.-..""3--....-..""4..-.-.-..""5-.-...-.."
|
|
308
|
-
"6.--...-..""7...--.-..""8-..-..-..""9.-.-..-.."
|
|
309
|
-
"A-...-..-.""B.-..-..-.""C--.....-.""D..-.-..-.""E-.-....-."
|
|
310
|
-
"F.--....-.""G...--..-.""H-..-...-.""I.-.-...-.""J..--...-."
|
|
311
|
-
"K-...-...-""L.-..-...-""M--......-""N..-.-...-""O-.-.....-"
|
|
312
|
-
"P.--.....-""Q...--...-""R-..-....-""S.-.-....-""T..--....-"
|
|
313
|
-
"U-...--...""V.-..--...""W--...-...""X..-.--...""Y-.-..-..."
|
|
314
|
-
"Z.--..-...""-...---..."".-..-.-..."" .-.-.-...""*..--.-..."
|
|
315
|
-
/* (0of5)(3of4)=(.....)(3of4) store only 3of4? */
|
|
316
|
-
"$.....---.""/.....--.-""+.....-.--""%......---"
|
|
317
|
-
"?xxxxxxxxx";
|
|
318
|
-
|
|
319
|
-
/* example: barcode -E -e 39 -b 123abc | gs -sDEVICE=pnggray -r100 */
|
|
320
|
-
|
|
321
|
-
/* return index[] according to sorted values[], big first */
|
|
322
|
-
void sort(int *value, int *idx, int len){
|
|
323
|
-
int i,j;
|
|
324
|
-
for (j=0;j<len;j++) idx[j]=j; /* initialize */
|
|
325
|
-
for(i=1;i;) { /* bubble sort, len...len^2 steps */
|
|
326
|
-
for(i=j=0;j<len-1;j++) if(value[idx[j]]<value[idx[j+1]]) {
|
|
327
|
-
i=idx[j]; idx[j]=idx[j+1]; idx[j+1]=i; i=1;
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
char *decode_39(int *wb, int num_bars){ /* ToDo: char *dest, int len */
|
|
333
|
-
int i, w, i1, i3, i5, crc, idx[10];
|
|
334
|
-
double dw,dww,err; char *buf;
|
|
335
|
-
char *result=NULL; /* malloc and store the result */
|
|
336
|
-
|
|
337
|
-
/* check for multiple of 5 bars and minimum start+1char+stop=15 bars */
|
|
338
|
-
if ((num_bars)%5!=0 || num_bars<15) return 0;
|
|
339
|
-
for(w=i=0; i<2*num_bars-1;i++ ) w+=wb[i]; /* summ width to w */
|
|
340
|
-
dw=w*1.0/(16*(num_bars/5)); /* threshold = 1.5..2 */
|
|
341
|
-
/* whats best and most rigorosely for dw=threshold_width?
|
|
342
|
-
* - (1.5..2)*mean_width of every 5th space
|
|
343
|
-
* - (1.5..2)*summ(5bars+5spaces)/(13..16)
|
|
344
|
-
* - 3/4*summ(three thickest)/3
|
|
345
|
-
*/
|
|
346
|
-
dww=crc=0; /* error and checksum (not supported yet) */
|
|
347
|
-
#if 0 /* should we exclude any non-standard code39? */
|
|
348
|
-
/* check for correct start and end symbol * or NwNnWnWnN Narrow+Wide */
|
|
349
|
-
i=2*num_bars-2;
|
|
350
|
-
if (wb[ 0]>dw*2 || wb[ 1]<=dw*2 || wb[ 2]> dw*2) return 0;
|
|
351
|
-
if (wb[i-0]>dw*2 || wb[i-1]> dw*2 || wb[i-2]<=dw*2) return 0;
|
|
352
|
-
#endif
|
|
353
|
-
g_debug(fprintf(stderr," code39 base=%.3f chars=%2d\n ",dw,(num_bars)/5);)
|
|
354
|
-
buf =(char *)malloc( 1+(num_bars)/5); if (!buf) return result;
|
|
355
|
-
result=(char *)malloc(256+(num_bars)/5);
|
|
356
|
-
|
|
357
|
-
for(i5=i1=0;i1<2*num_bars-3;i1+=10) {
|
|
358
|
-
/* ToDo: looking for three widest bars/gaps, 0 or 2 bars, 1 or 3 spaces */
|
|
359
|
-
sort(wb+i1,idx,9);
|
|
360
|
-
for(err=0,i3=3;i3<9;i3++) // estimate error ??
|
|
361
|
-
err+=sqr(wb[i1+idx[i3]]/dw-1.0); /* narrow=1, wide=2..3 */
|
|
362
|
-
dww+=err;
|
|
363
|
-
for(i3=0;i3<Num39;i3++)
|
|
364
|
-
if (code39[10*i3+1+(idx[0]%2)*5+idx[0]/2]=='-'
|
|
365
|
-
&& code39[10*i3+1+(idx[1]%2)*5+idx[1]/2]=='-'
|
|
366
|
-
&& code39[10*i3+1+(idx[2]%2)*5+idx[2]/2]=='-') break;
|
|
367
|
-
if (i5>0 && i5<num_bars/5-2) crc+=i3;
|
|
368
|
-
buf[i5++]=code39[10*i3];
|
|
369
|
-
|
|
370
|
-
/* ToDo: check if wee have even number of black bars within 3 biggest */
|
|
371
|
-
g_debug(for(i3=0;i3<9;i3++)fprintf(stderr,"%02d ",wb[i1+i3]);
|
|
372
|
-
fprintf(stderr," posWide=%d,%d,%d %c err=%.3f\n ",
|
|
373
|
-
idx[0],idx[1],idx[2],buf[i5-1],err/6);)
|
|
374
|
-
{ int num_ws=0; // Jul09 ~codabar
|
|
375
|
-
if (idx[0]&1) num_ws++;
|
|
376
|
-
if (idx[1]&1) num_ws++;
|
|
377
|
-
if (idx[2]&1) num_ws++;
|
|
378
|
-
if ((num_ws&1)==0) { // num wide spaces must be 1 or 3
|
|
379
|
-
free (buf); free(result);
|
|
380
|
-
g_debug(fprintf(stderr," num wide spaces = %d, abort code39\n", num_ws);)
|
|
381
|
-
return 0;
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
buf[i5]=0;
|
|
386
|
-
if (result)
|
|
387
|
-
sprintf(result,"<barcode type=\"39\" chars=\"%d\" code=\"%s\" "
|
|
388
|
-
"crc=\"%c\" error=\"%.3f\" />",
|
|
389
|
-
i5,buf,code39[(crc%44)*10],dww/((num_bars/5)*6));
|
|
390
|
-
free(buf);
|
|
391
|
-
return result;
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
/* code interleaved 2 of 5 numbers-only (10 bars+spaces = 2 decimal digits)
|
|
395
|
-
B B B B B <= digit1 bars=1,3,5,...
|
|
396
|
-
S S S S S <= digit2 spaces=2,4,6,...
|
|
397
|
-
1122447700 <= weight digit=sum(bit*weight)%11 (except 7+4=11 means 0)
|
|
398
|
-
N = narrow bar, W = wide bar, n = narrow space, w = wide space
|
|
399
|
-
"NnNn"+interleaved+"WnN" (odd num W, even num w)
|
|
400
|
-
18 digits/inch
|
|
401
|
-
see http://www.barcode-1.net/i25code.html (Jun 2009)
|
|
402
|
-
minN=0.19mm=0.0075inch
|
|
403
|
-
sizeN>0.02inch: sizeW=2..3*sizeN (but constant)
|
|
404
|
-
sizeN<0.02inch: sizeW=2.2..3*sizeN
|
|
405
|
-
quite zones 10*sizeN or 0.25inch
|
|
406
|
-
heigh=max(0.15*symbol_length,0.25inch)
|
|
407
|
-
Len = (numChars*(2*(sizeW/sizeN)+3) + 6 + (sizeW/sizeN)) * sizeN
|
|
408
|
-
*/
|
|
409
|
-
#define Num25 10
|
|
410
|
-
const char *code25= /* is the code sorted randomly? */
|
|
411
|
-
"1-...-2.-..-3--...4..-.-5-.-..6.--..7...--8-..-.9.-.-.0..--.";
|
|
412
|
-
|
|
413
|
-
/* example: barcode -E -e i25 -b 123456 >a.eps */
|
|
414
|
-
|
|
415
|
-
/*
|
|
416
|
-
add i25, patch by: Chris Lee, 13 Jul 2009
|
|
417
|
-
ToDo: check correctness
|
|
418
|
-
*/
|
|
419
|
-
char *decode_i25(int *wb, int num_bars){ /* ToDo: char *dest, int len */
|
|
420
|
-
int i, w, i1, i3, i5, crc, idx[7], pos;
|
|
421
|
-
double dw, dww, err; char *buf;
|
|
422
|
-
char *result=NULL; /* malloc and store the result */
|
|
423
|
-
|
|
424
|
-
int *wb_temp;
|
|
425
|
-
int *wb_check;
|
|
426
|
-
int code_chars;
|
|
427
|
-
|
|
428
|
-
if ((num_bars)%5!=4) return 0; /* chars*5bars + 4 start/stop bars */
|
|
429
|
-
code_chars = ((num_bars - 4) / 5) * 2;
|
|
430
|
-
// dw=w*1.0/(9*(num_bars/3)); /* threshold = 1.5..2 */
|
|
431
|
-
|
|
432
|
-
wb_temp = (int *)malloc((code_chars * 5)*sizeof(int)); if (!wb_temp) { return NULL; }
|
|
433
|
-
wb_check = (int *)malloc( 7 *sizeof(int)); if (!wb_check) { return NULL; }
|
|
434
|
-
|
|
435
|
-
for (i=0; i<(code_chars * 5)+7; i++) {
|
|
436
|
-
if (i<4) { wb_check[i] = wb[i]; } /* start sequence NnNn... */
|
|
437
|
-
else if (i > ((code_chars*5)+3)) { /* end sequence ...WnN */
|
|
438
|
-
wb_check[(int)(i-(code_chars*5))] = wb[i]; }
|
|
439
|
-
else {
|
|
440
|
-
pos = i - 4;
|
|
441
|
-
/* reinterleave 0,5,1,6,2,7,3,8,4,9,... to 0,1,2,3,4,5,6,7,8,9,... */
|
|
442
|
-
// pos = (int)(10*(int)(pos/10) + 1.0*(pos%10)/2.0 + 4.5*(pos%2));
|
|
443
|
-
pos = 10*(pos/10) + (pos%10)/2 + 5*(pos&1);
|
|
444
|
-
wb_temp[pos] = wb[i];
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
|
-
wb = wb_temp;
|
|
448
|
-
|
|
449
|
-
/* check start / finish codes */
|
|
450
|
-
sort(wb_check,idx,7);
|
|
451
|
-
if (idx[0] != 4 /* widest bar W must be the 4th = 1st of end */
|
|
452
|
-
|| wb_check[idx[0]]==wb_check[idx[1]]) { /* exact 1 widest */
|
|
453
|
-
free(wb_temp);
|
|
454
|
-
free(wb_check);
|
|
455
|
-
g_debug(fprintf(stderr," need exact 1 widest at start of end, abort\n");)
|
|
456
|
-
return 0;
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
for(w=i=0; i<5*code_chars;i++ ) w+=wb[i]; /* summ width */
|
|
460
|
-
dw=w*1.0/(16*(num_bars/5)); /* threshold = 1.5..2 */
|
|
461
|
-
/* whats best and most rigorosely for dw=threshold_width?
|
|
462
|
-
* - (1.5..2)*mean_width of every 5th space
|
|
463
|
-
* - (1.5..2)*summ(5bars+5spaces)/(13..16)
|
|
464
|
-
* - 3/4*summ(three thickest)/3
|
|
465
|
-
*/
|
|
466
|
-
dww=crc=0; /* error and checksum (not supported yet) */
|
|
467
|
-
#if 0 /* should we exclude any non-standard code39? */
|
|
468
|
-
/* check for correct start and end symbol * or NwNnWnWnN Narrow+Wide */
|
|
469
|
-
i=2*num_bars-2;
|
|
470
|
-
if (wb[ 0]>dw*2 || wb[ 1]<=dw*2 || wb[ 2]> dw*2) return 0;
|
|
471
|
-
if (wb[i-0]>dw*2 || wb[i-1]> dw*2 || wb[i-2]<=dw*2) return 0;
|
|
472
|
-
#endif
|
|
473
|
-
g_debug(fprintf(stderr," code25 base=%.3f chars=%2d\n ",dw,code_chars);)
|
|
474
|
-
buf =malloc( code_chars); if (!buf) return result;
|
|
475
|
-
result=malloc(256+code_chars);
|
|
476
|
-
|
|
477
|
-
for(i5=i1=0;i1<5*code_chars;i1+=5) {
|
|
478
|
-
/* ToDo: looking for three widest bars/gaps */
|
|
479
|
-
sort(wb+i1,idx,5);
|
|
480
|
-
for(err=0,i3=2;i3<5;i3++)
|
|
481
|
-
err+=sqr(wb[i1+idx[i3]]/dw-1.0); /* narrow=1, wide=2..3 */
|
|
482
|
-
dww+=err;
|
|
483
|
-
for(i3=0;i3<Num25;i3++)
|
|
484
|
-
if (code25[6*i3+1+idx[0]]=='-'
|
|
485
|
-
&& code25[6*i3+1+idx[1]]=='-') break;
|
|
486
|
-
//if (i5>0 && i5<num_bars/3-2) crc+=i3;
|
|
487
|
-
buf[i5++]=code25[6*i3];
|
|
488
|
-
|
|
489
|
-
/* ToDo: check if we have even number of black bars within 3 biggest */
|
|
490
|
-
g_debug(for(i3=0;i3<5;i3++)fprintf(stderr,"%02d ",wb[i1+i3]);
|
|
491
|
-
fprintf(stderr," posWide=%d,%d %c err=%.3f\n ",
|
|
492
|
-
idx[0], idx[1], buf[i5-1], err/6);)
|
|
493
|
-
{
|
|
494
|
-
/* check that we have exact 2 widest bars, 2nd widest > 3th widest */
|
|
495
|
-
if (wb[i1+idx[1]]==wb[i1+idx[2]]) {
|
|
496
|
-
free(buf); free(result);
|
|
497
|
-
g_debug(fprintf(stderr," need exact 2 widest, abort\n");)
|
|
498
|
-
return 0;
|
|
499
|
-
}
|
|
500
|
-
}
|
|
501
|
-
}
|
|
502
|
-
buf[i5]=0;
|
|
503
|
-
if (result) // ToDo: fix CRC (not defined?)
|
|
504
|
-
sprintf(result,"<barcode type=\"i25\" chars=\"%d\" code=\"%s\" crc=\"%c\""
|
|
505
|
-
" error=\"%.3f\" />", i5,buf,code25[(crc%10)*10],dww/((num_bars/5)*6));
|
|
506
|
-
|
|
507
|
-
free(wb_temp);
|
|
508
|
-
free(wb_check);
|
|
509
|
-
free(buf);
|
|
510
|
-
return result;
|
|
511
|
-
}
|
|
512
|
-
|
|
513
|
-
/* code codabar, numbers only, 4 bars per char (1*wide bar, 1*wide space)
|
|
514
|
-
robust code (dot-matrix printer)
|
|
515
|
-
characters have same length (distance between 1st bar to 4th space)
|
|
516
|
-
??? codeproject: 6*n+2*w=12 or 5*n+3*w=14
|
|
517
|
-
??? suchymips.de:
|
|
518
|
-
variant 1: 18 different bar widths (Monarch code)
|
|
519
|
-
variant 2: 2 different bar widths (Codabar Matrix or ABC-Codabar)
|
|
520
|
-
9..11 digits/inch, N=narrow bar, W=wide bar, n=narrow space, w=wide space
|
|
521
|
-
see http://www.barcodeman.com/info/codabar.php (Jul 2009)
|
|
522
|
-
minN=0.17mm=0.0065inch, 11 digits/inch = 0.0909 = 14*minN
|
|
523
|
-
2of7 + extensions
|
|
524
|
-
extensions: 1 wide bar + 2 wide spaces (no narrow space between 2 wide)
|
|
525
|
-
4 start/stop sets = a/t, b/m, c/ *, d/e
|
|
526
|
-
- mean wide = thickest of 4 bars
|
|
527
|
-
- mean narrow = thinnest of 4 bars, thinnest of 3 (4) spaces or every 4th
|
|
528
|
-
wiki-sample: a31117013206375b (wide spaces between chars) schraeg!
|
|
529
|
-
barcode: t1234567t n=N=1 w=W=3 c=12,14 (not const.)
|
|
530
|
-
*/
|
|
531
|
-
const char *code27= /* 4bars+3spaces, 12+12 chars */
|
|
532
|
-
// 0..11: 3 nbar + 1 wbar + 2 nspace + 1 wspace
|
|
533
|
-
"0.....--1....--.2...-..-3--.....4..-..-."
|
|
534
|
-
"5-....-.6.-....-7.-..-..8.--....9-..-...-...--..$..--..."
|
|
535
|
-
// 12..15: 1 nbar + 3 wbar + 3 nspace + 0 wspace
|
|
536
|
-
":-...-.-/-.-...-.-.-.-..+..-.-.-"
|
|
537
|
-
// 16..23: 3 nbar + 1 wbar + 1 nspace + 2 wspace
|
|
538
|
-
"a..--.-.b.-.-..-c...-.--d...---.t..--.-.n.-.-..-*...-.--e...---."
|
|
539
|
-
// EOS
|
|
540
|
-
"????????";
|
|
541
|
-
|
|
542
|
-
/* example: barcode -E -e cbr -b 123456 >a.eps */
|
|
543
|
-
|
|
544
|
-
char *decode_27(int *wb, int num_bars){ /* ToDo: char *dest, int len */
|
|
545
|
-
int i, i1, i2, i3, i4, i5, b_idx[4], s_idx[3], b_w[4], s_w[3],
|
|
546
|
-
max_wdiff, err=0;
|
|
547
|
-
// double dw, err;
|
|
548
|
-
char *buf, char27[8]="......";
|
|
549
|
-
char *result=NULL; /* malloc and store the result */
|
|
550
|
-
|
|
551
|
-
int code_chars;
|
|
552
|
-
#if 0 // ToDo: verifications nb_max < wb_min etc.
|
|
553
|
-
int nb_min=99999, nb_max=0, nb_sum=0, nb_num=0; // narrow bar
|
|
554
|
-
int ns_min=99999, ns_max=0, ns_sum=0, ns_num=0; // narrow space
|
|
555
|
-
int wb_min=99999, wb_max=0, wb_sum=0, wb_num=0; // wide bar
|
|
556
|
-
int ws_min=99999, ws_max=0, ws_sum=0, ws_num=0; // wide space
|
|
557
|
-
#endif
|
|
558
|
-
|
|
559
|
-
if ((num_bars)%4!=0) return 0; /* chars*4bars */
|
|
560
|
-
code_chars = num_bars / 4;
|
|
561
|
-
// dw=w*1.0/(9*(num_bars/3)); /* threshold = 1.5..2 */
|
|
562
|
-
|
|
563
|
-
g_debug(fprintf(stderr," codabar chars= %d\n ", code_chars);)
|
|
564
|
-
buf =malloc( code_chars); if (!buf) return result;
|
|
565
|
-
result=malloc(256+code_chars);
|
|
566
|
-
i5=0; // index output string
|
|
567
|
-
for (i=0; i< code_chars; i++) {
|
|
568
|
-
b_w[0]=wb[i*8+0]; // 1st bar
|
|
569
|
-
b_w[1]=wb[i*8+2]; // 2nd bar
|
|
570
|
-
b_w[2]=wb[i*8+4]; // 3th bar
|
|
571
|
-
b_w[3]=wb[i*8+6]; // 4th bar
|
|
572
|
-
s_w[0]=wb[i*8+1]; // 1st space
|
|
573
|
-
s_w[1]=wb[i*8+3]; // 2nd space
|
|
574
|
-
s_w[2]=wb[i*8+5]; // 3th space
|
|
575
|
-
sort(b_w,b_idx,4); /* idx[0] points to widest bar */
|
|
576
|
-
sort(s_w,s_idx,3); /* idx[0] points to widest space */
|
|
577
|
-
g_debug(for(i3=0;i3<7;i3++)fprintf(stderr,"%02d ",wb[8*i+i3]);)
|
|
578
|
-
if (b_w[b_idx[0]]==b_w[b_idx[3]]) { err=__LINE__; break; } // min. 1 wide + narrow
|
|
579
|
-
// search max. diff between sorted widths
|
|
580
|
-
i2=b_w[b_idx[0]]-b_w[b_idx[1]]; i1=1; max_wdiff=i2; // diff widest - 2nd wides
|
|
581
|
-
i2=b_w[b_idx[1]]-b_w[b_idx[2]]; if (i2>max_wdiff) { i1=2; max_wdiff=i2; }
|
|
582
|
-
i2=b_w[b_idx[2]]-b_w[b_idx[3]]; if (i2>max_wdiff) { i1=3; max_wdiff=i2; }
|
|
583
|
-
if (i1==2) { err=__LINE__; break; } // 2 wide + 2 narrow bars not allowed
|
|
584
|
-
for (i3=0;i3<7;i3++) char27[i3]='.'; // reset char
|
|
585
|
-
if (i1==1) { // 1 wide bar (1 or 2 wspaces)
|
|
586
|
-
if (s_w[s_idx[0]]-s_w[s_idx[1]]
|
|
587
|
-
>s_w[s_idx[1]]-s_w[s_idx[2]]) { // 1 wspace
|
|
588
|
-
char27[2*b_idx[0]+0]='-';
|
|
589
|
-
char27[2*s_idx[0]+1]='-';
|
|
590
|
-
} else { // assume 2 wspaces
|
|
591
|
-
if (s_w[s_idx[2]]==s_w[s_idx[1]]) { err=__LINE__; break; }
|
|
592
|
-
char27[2*b_idx[0]+0]='-';
|
|
593
|
-
char27[2*s_idx[0]+1]='-';
|
|
594
|
-
char27[2*s_idx[1]+1]='-';
|
|
595
|
-
}
|
|
596
|
-
} else { // assume 3 wbars + 0 wspaces
|
|
597
|
-
char27[2*s_idx[0]+0]='-';
|
|
598
|
-
char27[2*s_idx[1]+0]='-';
|
|
599
|
-
char27[2*s_idx[2]+0]='-';
|
|
600
|
-
}
|
|
601
|
-
for(i4=24,i3=0;i3<24;i3++) {
|
|
602
|
-
if (code27[8*i3+1]==char27[0]
|
|
603
|
-
&& code27[8*i3+2]==char27[1]
|
|
604
|
-
&& code27[8*i3+3]==char27[2]
|
|
605
|
-
&& code27[8*i3+4]==char27[3]
|
|
606
|
-
&& code27[8*i3+5]==char27[4]
|
|
607
|
-
&& code27[8*i3+6]==char27[5]
|
|
608
|
-
&& code27[8*i3+7]==char27[6]) {
|
|
609
|
-
i4=i3; buf[i5++]=code27[8*i3]; break; }
|
|
610
|
-
}
|
|
611
|
-
g_debug(fprintf(stderr," %s c27= %c\n ", char27, ((i5)?buf[i5-1]:'?'));)
|
|
612
|
-
if (i4==24) { err=__LINE__; break; }
|
|
613
|
-
} // each char
|
|
614
|
-
if (i>=code_chars) { // else: inconsistent char
|
|
615
|
-
g_debug(fprintf(stderr," code27 base=%.3f chars=%2d\n ",0.0,code_chars);)
|
|
616
|
-
} else {
|
|
617
|
-
g_debug(fprintf(stderr," error %d at char %d, abort\n", err, i);)
|
|
618
|
-
free(result); result=0;
|
|
619
|
-
}
|
|
620
|
-
buf[i5]=0;
|
|
621
|
-
if (result) // ToDo: fix CRC (not defined?)
|
|
622
|
-
sprintf(result,"<barcode type=\"codabar\" chars=\"%d\" code=\"%s\""
|
|
623
|
-
" crc=\"%c\" error=\"%.3f\" />", i5,buf,'?',0.0);
|
|
624
|
-
|
|
625
|
-
free(buf);
|
|
626
|
-
return result; // free at parent!
|
|
627
|
-
}
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
/*
|
|
631
|
-
decode barcode
|
|
632
|
-
- check main characteristics (num bars, min+max width, etc.)
|
|
633
|
-
- detect code type
|
|
634
|
-
- the current algorithm measures the width of bars and spaces
|
|
635
|
-
called by detect_barcode()
|
|
636
|
-
ToDo: - like storing sequence of widths for 1D code
|
|
637
|
-
store array of bits for 2D matrix code and decode later
|
|
638
|
-
*/
|
|
639
|
-
char *decode_barcode(struct box *bb){ /* ToDo: char *dest, int len */
|
|
640
|
-
int i, num_bars, yy, w, ww, dx, xx, cs=JOB->cfg.cs, *wb;
|
|
641
|
-
char *result=NULL; /* store the result */
|
|
642
|
-
yy=(bb->y0+bb->y1)/2;
|
|
643
|
-
w=ww=bb->x1-bb->x0+1;
|
|
644
|
-
num_bars = num_cross(bb->x0,bb->x1,yy,yy,bb->p,JOB->cfg.cs);
|
|
645
|
-
if(JOB->cfg.verbose)
|
|
646
|
-
fprintf(stderr,"\n# ... detect bars=%3d w=%4d",num_bars,ww);
|
|
647
|
-
|
|
648
|
-
/* store width of bars and spaces to buffer wb */
|
|
649
|
-
wb=(int *)malloc(2*num_bars*sizeof(int)); if(!wb) return NULL;
|
|
650
|
-
xx=bb->x0;
|
|
651
|
-
xx-=loop(bb->p,xx,yy, 8,cs,1,LE);
|
|
652
|
-
xx+=loop(bb->p,xx,yy,ww,cs,0,RI); /* start with a bar! */
|
|
653
|
-
for (i=0;i<2*num_bars;i++) {
|
|
654
|
-
dx=loop(bb->p,xx,yy,w,cs,1^(i&1),RI);
|
|
655
|
-
xx+=dx;
|
|
656
|
-
w-=dx;
|
|
657
|
-
wb[i]=dx;
|
|
658
|
-
} wb[2*num_bars-1]=0;
|
|
659
|
-
|
|
660
|
-
/* ToDo: what about probability? if not unique
|
|
661
|
-
* - add argument char *result which can be modified or not,
|
|
662
|
-
* - or add box2? (would reuse of this code more difficult)
|
|
663
|
-
*/
|
|
664
|
-
/* test code128 characteristics, ToDo: look for correct start/stop 211 seq. */
|
|
665
|
-
if ((num_bars-1)%3==0 && num_bars>=10 && ww>=11*(num_bars-1)/3+2){
|
|
666
|
-
if (!result) result=decode_code128(wb,num_bars);
|
|
667
|
-
}
|
|
668
|
-
/* test UPC/EAN characteristics */
|
|
669
|
-
if ((num_bars)%2==0 && num_bars>=8 && ww>=7*(num_bars-6)/2+11
|
|
670
|
-
&& ((num_bars-6)/2)%2==0){ /* should be balanced */
|
|
671
|
-
if (!result) result=decode_UPC(wb,num_bars);
|
|
672
|
-
}
|
|
673
|
-
/* test UPC_addon by Michael van Rooyen, often on books */
|
|
674
|
-
if (num_bars==7 || num_bars==16)
|
|
675
|
-
if (!result) result=decode_UPC_addon(wb,num_bars);
|
|
676
|
-
|
|
677
|
-
/* test code39 characteristics */
|
|
678
|
-
if ((num_bars)%5==0 && num_bars>14){
|
|
679
|
-
if (!result) result=decode_39(wb,num_bars);
|
|
680
|
-
}
|
|
681
|
-
/* test i2of5 chartacteristics */
|
|
682
|
-
if ((num_bars)%5==4 && num_bars>3) {
|
|
683
|
-
if (!result) result=decode_i25(wb,num_bars);
|
|
684
|
-
}
|
|
685
|
-
|
|
686
|
-
/* test codabar chartacteristics */
|
|
687
|
-
if ((num_bars)%4==0 && num_bars>3) {
|
|
688
|
-
if (!result) result=decode_27(wb,num_bars);
|
|
689
|
-
}
|
|
690
|
-
|
|
691
|
-
free(wb);
|
|
692
|
-
return result;
|
|
693
|
-
}
|
|
694
|
-
|
|
695
|
-
/*
|
|
696
|
-
* taking the list of boxes and search for groups of bars (1D-barcodes)
|
|
697
|
-
*/
|
|
698
|
-
int detect_barcode(job_t *job)
|
|
699
|
-
{
|
|
700
|
-
int j=0, j2=0, bx0, by0, bx1, by1, bdx, bdy, bbx, rm,
|
|
701
|
-
x0, y0, dx, dy, cs, y, yl0, yl1, yr0, yr1;
|
|
702
|
-
struct box *box2, *box3;
|
|
703
|
-
|
|
704
|
-
if(JOB->cfg.verbose)
|
|
705
|
-
fprintf(stderr,"# barcode.c detect_barcode ");
|
|
706
|
-
x0=y0=0; rm=0; dx=job->src.p.x; dy=job->src.p.y; cs=JOB->cfg.cs;
|
|
707
|
-
for_each_data(&(JOB->res.boxlist)) {
|
|
708
|
-
box2 = (struct box *)list_get_current(&(JOB->res.boxlist));
|
|
709
|
-
/* detect width (bdx) and height (bdy) of possible bar */
|
|
710
|
-
/* ToDo: better check for a line */
|
|
711
|
-
bdx=box2->x1-box2->x0+1 /* substract correction for skewed bars */
|
|
712
|
-
-loop(box2->p,box2->x1,(box2->y0+box2->y1)/2,box2->x1-box2->x0,cs,0,LE)
|
|
713
|
-
-loop(box2->p,box2->x0,(box2->y0+box2->y1)/2,box2->x1-box2->x0,cs,0,RI);
|
|
714
|
-
bdy=box2->y1-box2->y0+1;
|
|
715
|
-
if (box2->c == PICTURE || box2->c == UNKNOWN)
|
|
716
|
-
if (box2->y0 >= y0 && box2->y1 <= y0 + dy /* within frame? */
|
|
717
|
-
&& box2->x0 >= x0 && box2->x1 <= x0 + dx
|
|
718
|
-
&& box2->y1 - box2->y0 > 19 /* min. length */
|
|
719
|
-
&& box2->y1 - box2->y0 > 8 * bdx
|
|
720
|
-
) { /* a bar? */
|
|
721
|
-
j=1; /* number of bars */
|
|
722
|
-
bx0=box2->x0; bx1=box2->x1; /* initial values for barcode frame */
|
|
723
|
-
by0=box2->y0; by1=box2->y1;
|
|
724
|
-
bbx=bx1-bx0+2; /* width of bar */
|
|
725
|
-
/* this is for scans which are not exactly horizontal */
|
|
726
|
-
yl0=yr0=by0; /* left and right upper bound */
|
|
727
|
-
yl1=yr1=by1; /* left and right lower bound */
|
|
728
|
-
/* --- iteratively take into account next nearest bar ---
|
|
729
|
-
* this is important, because bar-boxes are not in right order */
|
|
730
|
-
for (j2=1;j2;) {
|
|
731
|
-
j2=0;
|
|
732
|
-
/* expand a frame around the potential barcode (bx0,by0,bx1,by1) */
|
|
733
|
-
for_each_data(&(JOB->res.boxlist)) {
|
|
734
|
-
box3 = (struct box *)list_get_current(&(JOB->res.boxlist));
|
|
735
|
-
/* bdy=box3->y1-box3->y0+1; */
|
|
736
|
-
if (box2!=box3)
|
|
737
|
-
if (box3->c == PICTURE || box3->c == UNKNOWN)
|
|
738
|
-
if (box3->y0 >= y0 && box3->y1 <= y0 + dy /* within image */
|
|
739
|
-
&& box3->x0 >= x0 && box3->x1 <= x0 + dx
|
|
740
|
-
&& box3->y1 - box3->y0 > 19 /* min. length */
|
|
741
|
-
&& box3->y1 - box3->y0 > 4 * (bdx) /* height > 4*width2 */
|
|
742
|
-
&& box3->x1 - box3->x0 < 4 * (bdy) /* width < height/4 = bar */
|
|
743
|
-
&& (( abs(box3->y0-by0)<bdy/16+4 /* within bar-box ? */
|
|
744
|
-
&& abs(box3->y1-by1)<bdy/2 ) /* lower ends of UPC could be longer */
|
|
745
|
-
||( abs(box3->y0-yl0)<bdy/16+4 /* left side of frame */
|
|
746
|
-
&& abs(box3->y1-yl1)<bdy/2
|
|
747
|
-
&& box3->x0 <= bx0 )
|
|
748
|
-
||( abs(box3->y0-yr0)<bdy/16+4 /* right side of frame */
|
|
749
|
-
&& abs(box3->y1-yr1)<bdy/2
|
|
750
|
-
&& box3->x0 >= bx1 ) )
|
|
751
|
-
&& box3->x0 > bx0 - 12*bbx /* startspace=5...10 */
|
|
752
|
-
&& box3->x1 < bx1 + 12*bbx
|
|
753
|
-
&& box3->x0 > bx0 - bdy/2 /* dont glue two barcodes together */
|
|
754
|
-
&& box3->x1 < bx1 + bdy/2 /* ex: ean13a.jpg */
|
|
755
|
-
/* dont check bars which already within the frame twice ? */
|
|
756
|
-
&& ( box3->x1 > bx1 || box3->x0 < bx0 )
|
|
757
|
-
) { /* a bar? -> extend barcode frame only in x direction */
|
|
758
|
-
/* take minimum of y to have valid barcode for all y */
|
|
759
|
-
if (box3->x0<bx0) { bx0=box3->x0; yl0=box3->y0; yl1=box3->y1; }
|
|
760
|
-
if (box3->x1>bx1) { bx1=box3->x1; yr0=box3->y0; yr1=box3->y1; }
|
|
761
|
-
if (4*(box3->y1-box3->y0)>3*(by1-by0)) { /* carefull reduce */
|
|
762
|
-
if (box3->y0>by0) by0=box3->y0; /* ToDo: fix for non-horizontal */
|
|
763
|
-
if (box3->y1<by1) by1=box3->y1;
|
|
764
|
-
}
|
|
765
|
-
j++; /* found a near bar and count to num bars */
|
|
766
|
-
j2=1; /* continue searching (endless loop?) */
|
|
767
|
-
}
|
|
768
|
-
} end_for_each(&(JOB->res.boxlist));
|
|
769
|
-
}
|
|
770
|
-
/* j is the num of bars found above, some inner bars are not counted */
|
|
771
|
-
/* ToDo: better iterative add next nearest bars from sorted list near bars? */
|
|
772
|
-
if (j>5) {
|
|
773
|
-
char *code=0;
|
|
774
|
-
box2->c=PICTURE; /* BARCODE */
|
|
775
|
-
box2->x0=bx0; box2->y0=by0;
|
|
776
|
-
box2->x1=bx1; box2->y1=by1;
|
|
777
|
-
/* ToDo: add pointer to decoded text */
|
|
778
|
-
|
|
779
|
-
y=(box2->y0+box2->y1)/2;
|
|
780
|
-
if (JOB->cfg.verbose){
|
|
781
|
-
int nbars;
|
|
782
|
-
nbars=num_cross(box2->x0,box2->x1,y,y,box2->p,JOB->cfg.cs);
|
|
783
|
-
fprintf(stderr,"\n# barcode at %3d %3d size %3d %3d nbars %d (%d)",
|
|
784
|
-
bx0,by0,bx1-bx0+1,by1-by0+1,nbars,j);
|
|
785
|
-
if (j!=nbars)
|
|
786
|
-
fprintf(stderr,"\n# ... trouble: num_found_bars != num_cross");
|
|
787
|
-
/* this is because some far bars are detected before near bars */
|
|
788
|
-
}
|
|
789
|
-
/* transport the info to the gocr-output (development) */
|
|
790
|
-
/* ToDo: decode and print/store barcode bars=j */
|
|
791
|
-
code=decode_barcode(box2); /* ToDo: char *dest, int len */
|
|
792
|
-
if (!code) { /* failed */
|
|
793
|
-
code=(char *)malloc(128);
|
|
794
|
-
/* ToDo: analyze and output num_bars, width of bars etc. */
|
|
795
|
-
if(code) strncpy(code,"<barcode type=\"unknown\" />",128);
|
|
796
|
-
}
|
|
797
|
-
if (JOB->cfg.verbose)
|
|
798
|
-
fprintf(stderr,"\n# ... decoded as: %s", code);
|
|
799
|
-
setas(box2,code,99); /* ToDo: set a better weight */
|
|
800
|
-
free(code);
|
|
801
|
-
|
|
802
|
-
/* remove inner boxes, only if sure!? (ToDo: use cfg.certainty) */
|
|
803
|
-
for_each_data(&(JOB->res.boxlist)) {
|
|
804
|
-
box3 = (struct box *)list_get_current(&(JOB->res.boxlist));
|
|
805
|
-
/* bdy=box3->y1-box3->y0+1; */
|
|
806
|
-
if (box2!=box3)
|
|
807
|
-
if (box3->c == PICTURE || box3->c == UNKNOWN)
|
|
808
|
-
if ( abs(box3->y0-by0)<bdy/16+4 /* within bar-box ? */
|
|
809
|
-
&& abs(box3->y1-by1)<bdy/2 /* lower ends of UPC could be longer */
|
|
810
|
-
&& box3->x1 <= bx1
|
|
811
|
-
&& box3->x0 >= bx0
|
|
812
|
-
) {
|
|
813
|
-
rm++; /* count removed boxes */
|
|
814
|
-
list_del(&(JOB->res.boxlist),box3);
|
|
815
|
-
free_box(box3);
|
|
816
|
-
}
|
|
817
|
-
} end_for_each(&(JOB->res.boxlist));
|
|
818
|
-
if (JOB->cfg.verbose)
|
|
819
|
-
fprintf(stderr,"\n# ... removed boxes: %d", rm);
|
|
820
|
-
rm=0;
|
|
821
|
-
}
|
|
822
|
-
}
|
|
823
|
-
} end_for_each(&(JOB->res.boxlist));
|
|
824
|
-
|
|
825
|
-
/* recalculate averages without bars */
|
|
826
|
-
JOB->res.numC=JOB->res.sumX=JOB->res.sumY=j2=0;
|
|
827
|
-
for_each_data(&(JOB->res.boxlist)) {
|
|
828
|
-
j2++;
|
|
829
|
-
box3 = (struct box *)list_get_current(&(JOB->res.boxlist));
|
|
830
|
-
if (box3->c==PICTURE) continue;
|
|
831
|
-
JOB->res.numC++; /* count remaining boxes */
|
|
832
|
-
JOB->res.sumX+=box3->x1-box3->x0+1;
|
|
833
|
-
JOB->res.sumY+=box3->y1-box3->y0+1;
|
|
834
|
-
} end_for_each(&(JOB->res.boxlist));
|
|
835
|
-
if(JOB->cfg.verbose)
|
|
836
|
-
fprintf(stderr,"\n# ... boxes %d nC %d\n",
|
|
837
|
-
j2, JOB->res.numC);
|
|
838
|
-
|
|
839
|
-
/* ToDo: detect DataMatrix = iec16022
|
|
840
|
-
* search square of 2 lines and 2 dottet lines (first no rotation)
|
|
841
|
-
* output characteristics pixel size, bytes, code type, etc.
|
|
842
|
-
*/
|
|
843
|
-
|
|
844
|
-
return 0;
|
|
845
|
-
}
|
|
846
|
-
|