From a0b020bb88a803ecc053b0bf063ada3fb55b84ab Mon Sep 17 00:00:00 2001 From: mpustelnik Date: Fri, 22 Feb 2019 16:59:45 +0100 Subject: [PATCH] Ported EAN8 reader --- src/core/oned/EAN8Reader.ts | 71 +++++++++++++++++++++++ src/core/oned/MultiFormatOneDReader.ts | 3 +- src/core/oned/MultiFormatUPCEANReader.ts | 10 +++- src/test/core/oned/Ean8BlackBox1.spec.ts | 38 ++++++++++++ src/test/resources/blackbox/ean8-1/1.png | Bin 0 -> 568 bytes src/test/resources/blackbox/ean8-1/1.txt | 1 + src/test/resources/blackbox/ean8-1/2.png | Bin 0 -> 433 bytes src/test/resources/blackbox/ean8-1/2.txt | 1 + src/test/resources/blackbox/ean8-1/3.png | Bin 0 -> 402 bytes src/test/resources/blackbox/ean8-1/3.txt | 1 + src/test/resources/blackbox/ean8-1/4.png | Bin 0 -> 4168 bytes src/test/resources/blackbox/ean8-1/4.txt | 1 + src/test/resources/blackbox/ean8-1/5.png | Bin 0 -> 2205 bytes src/test/resources/blackbox/ean8-1/5.txt | 1 + src/test/resources/blackbox/ean8-1/6.png | Bin 0 -> 13711 bytes src/test/resources/blackbox/ean8-1/6.txt | 1 + src/test/resources/blackbox/ean8-1/7.png | Bin 0 -> 16610 bytes src/test/resources/blackbox/ean8-1/7.txt | 1 + src/test/resources/blackbox/ean8-1/8.png | Bin 0 -> 580 bytes src/test/resources/blackbox/ean8-1/8.txt | 1 + 20 files changed, 127 insertions(+), 3 deletions(-) create mode 100644 src/core/oned/EAN8Reader.ts create mode 100644 src/test/core/oned/Ean8BlackBox1.spec.ts create mode 100644 src/test/resources/blackbox/ean8-1/1.png create mode 100644 src/test/resources/blackbox/ean8-1/1.txt create mode 100644 src/test/resources/blackbox/ean8-1/2.png create mode 100644 src/test/resources/blackbox/ean8-1/2.txt create mode 100644 src/test/resources/blackbox/ean8-1/3.png create mode 100644 src/test/resources/blackbox/ean8-1/3.txt create mode 100644 src/test/resources/blackbox/ean8-1/4.png create mode 100644 src/test/resources/blackbox/ean8-1/4.txt create mode 100644 src/test/resources/blackbox/ean8-1/5.png create mode 100644 src/test/resources/blackbox/ean8-1/5.txt create mode 100644 src/test/resources/blackbox/ean8-1/6.png create mode 100644 src/test/resources/blackbox/ean8-1/6.txt create mode 100644 src/test/resources/blackbox/ean8-1/7.png create mode 100644 src/test/resources/blackbox/ean8-1/7.txt create mode 100644 src/test/resources/blackbox/ean8-1/8.png create mode 100644 src/test/resources/blackbox/ean8-1/8.txt diff --git a/src/core/oned/EAN8Reader.ts b/src/core/oned/EAN8Reader.ts new file mode 100644 index 00000000..90d3ac30 --- /dev/null +++ b/src/core/oned/EAN8Reader.ts @@ -0,0 +1,71 @@ +/* + * Copyright 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import BarcodeFormat from '../BarcodeFormat'; +import BitArray from '../common/BitArray'; + +import UPCEANReader from './UPCEANReader'; + +/** + *

Implements decoding of the EAN-8 format.

+ * + * @author Sean Owen + */ +export default class EAN8Reader extends UPCEANReader { + private decodeMiddleCounters: number[]; + + public constructor() { + super(); + this.decodeMiddleCounters = [0, 0, 0, 0]; + } + + public decodeMiddle(row: BitArray, startRange: number[], resultString: string) { + let counters = this.decodeMiddleCounters; + counters[0] = 0; + counters[1] = 0; + counters[2] = 0; + counters[3] = 0; + let end = row.getSize(); + let rowOffset = startRange[1]; + + for (let x = 0; x < 4 && rowOffset < end; x++) { + let bestMatch = UPCEANReader.decodeDigit(row, counters, rowOffset, UPCEANReader.L_PATTERNS); + resultString += String.fromCharCode(('0'.charCodeAt(0) + bestMatch)); + + for (let counter of counters) { + rowOffset += counter; + } + } + + let middleRange = UPCEANReader.findGuardPattern(row, rowOffset, true, UPCEANReader.MIDDLE_PATTERN, new Array(UPCEANReader.MIDDLE_PATTERN.length).fill(0)); + rowOffset = middleRange[1]; + + for (let x = 0; x < 4 && rowOffset < end; x++) { + let bestMatch = UPCEANReader.decodeDigit(row, counters, rowOffset, UPCEANReader.L_PATTERNS); + resultString += String.fromCharCode(('0'.charCodeAt(0) + bestMatch)); + + for (let counter of counters) { + rowOffset += counter; + } + } + + return {rowOffset, resultString}; + } + + public getBarcodeFormat(): BarcodeFormat { + return BarcodeFormat.EAN_8; + } +} diff --git a/src/core/oned/MultiFormatOneDReader.ts b/src/core/oned/MultiFormatOneDReader.ts index 4d9b3088..08c6905d 100644 --- a/src/core/oned/MultiFormatOneDReader.ts +++ b/src/core/oned/MultiFormatOneDReader.ts @@ -42,7 +42,8 @@ export default class MultiFormatOneDReader extends OneDReader { const useCode39CheckDigit = hints && hints.get(DecodeHintType.ASSUME_CODE_39_CHECK_DIGIT) !== undefined; if (possibleFormats) { - if (possibleFormats.includes(BarcodeFormat.EAN_13)) { + if (possibleFormats.includes(BarcodeFormat.EAN_13) || + possibleFormats.includes(BarcodeFormat.EAN_8)) { this.readers.push(new MultiFormatUPCEANReader(hints)); } // if (possibleFormats.includes(BarcodeFormat.EAN_13) || diff --git a/src/core/oned/MultiFormatUPCEANReader.ts b/src/core/oned/MultiFormatUPCEANReader.ts index 493ce419..e4be3409 100644 --- a/src/core/oned/MultiFormatUPCEANReader.ts +++ b/src/core/oned/MultiFormatUPCEANReader.ts @@ -22,6 +22,7 @@ import Result from '../Result'; import OneDReader from './OneDReader'; import UPCEANReader from './UPCEANReader'; import EAN13Reader from './EAN13Reader'; +import EAN8Reader from './EAN8Reader'; import NotFoundException from '../NotFoundException'; /** @@ -42,12 +43,17 @@ export default class MultiFormatUPCEANReader extends OneDReader { if (possibleFormats.indexOf(BarcodeFormat.EAN_13) > -1) { readers.push(new EAN13Reader()); } - // todo add UPC_A, EAN_8, UPC_E + + if (possibleFormats.indexOf(BarcodeFormat.EAN_8) > -1) { + readers.push(new EAN8Reader()); + } + // todo add UPC_A, UPC_E } if (readers.length === 0) { readers.push(new EAN13Reader()); - // todo add UPC_A, EAN_8, UPC_E + readers.push(new EAN8Reader()); + // todo add UPC_A, UPC_E } this.readers = readers; diff --git a/src/test/core/oned/Ean8BlackBox1.spec.ts b/src/test/core/oned/Ean8BlackBox1.spec.ts new file mode 100644 index 00000000..703b5036 --- /dev/null +++ b/src/test/core/oned/Ean8BlackBox1.spec.ts @@ -0,0 +1,38 @@ +/* + * Copyright 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import BarcodeFormat from '../../../core/BarcodeFormat'; +import MultiFormatReader from '../../../core/MultiFormatReader'; +import AbstractBlackBoxSpec from '../common/AbstractBlackBox'; + +/** + * @author Sean Owen + */ +class Ean8BlackBox1Spec extends AbstractBlackBoxSpec { + + public constructor() { + super('src/test/resources/blackbox/ean8-1', new MultiFormatReader(), BarcodeFormat.EAN_8); + this.addTest(8, 8, 0.0); + this.addTest(8, 8, 180.0); + } +} + +describe('Ean8BlackBox1Spec.1', () => { + it('testBlackBox', done => { + const test = new Ean8BlackBox1Spec(); + return test.testBlackBox(done); + }); +}); diff --git a/src/test/resources/blackbox/ean8-1/1.png b/src/test/resources/blackbox/ean8-1/1.png new file mode 100644 index 0000000000000000000000000000000000000000..14195c2e044b135e19a94c3f0fe5f7284015ee02 GIT binary patch literal 568 zcmeAS@N?(olHy`uVBq!ia0y~yU<6@jMrNQ$&_t0*K#DEEC&U#<|NsAg>CO3ffzoe1 zT^vIy;@+Iv$a}~^!1Z8pUjeg6_-gClw@*%UOnB*_q@bu!VxV7nvgd30&K}=QMbeTt z&(GYu>eG#LJMZ0}S1emvlUu%iU;n>E`_-!>r==1?wOhTv@8E4N5IL~Xrs4_5KF`|C zLMxk(%dG4*`XOO)>cYhmXRU`{KW=}_FO%9IqVjpo@qC6OxA-KK*dp%yxOw^Hy&vq^ zYmZz@GTyOGa(%w@)=jTEzcy$KOl3344dCTFwZU&<V`rEsv0EXrWv4wud%G=-6b}ryiFw6SE74*Ei zW6Q!tsa;=9YZ$Nf+}USZ!20*@H{Lx=KqHyg?lH5y*_@agvHZsE$;J-WH?Oo`Y&-Mo zJ6r66w{Fs>Q>3qHe%r=-Hpw(sCil*b#1E?u8QxpFb)nd4tJbaEtY%@`c5OT0e7of5VdzV-QSFOno#{hF(Ca<}eL rqq4AjGvjW?b*H9$i`=vA@Ai7*mu%htO66jJNr1uA)z4*}Q$iB}BZ&{7 literal 0 HcmV?d00001 diff --git a/src/test/resources/blackbox/ean8-1/1.txt b/src/test/resources/blackbox/ean8-1/1.txt new file mode 100644 index 00000000..cf23e896 --- /dev/null +++ b/src/test/resources/blackbox/ean8-1/1.txt @@ -0,0 +1 @@ +48512343 \ No newline at end of file diff --git a/src/test/resources/blackbox/ean8-1/2.png b/src/test/resources/blackbox/ean8-1/2.png new file mode 100644 index 0000000000000000000000000000000000000000..d9d93bca50316c7563828bfbe603636182d38e34 GIT binary patch literal 433 zcmeAS@N?(olHy`uVBq!ia0vp^CxEz?g&9bS78+&)DT4r?5Z6Ed{;)8y%$YUk$)hJV zbu~+tEqU|mjgOztmrq}=T)L8zmDAJLbL7~OJGbs^*|cTPzCA1CbhsH97;QXV978f1 z-<~z}V@ecpefYU0K_=v$@G(Ox!^1)zZ*mIQH!$bsENM7)=>^}Gt&6ucUOE@awDoMx zLD`5GY(90ldzSA$``1Bp=|2-=Ci6pw?s6I{-;q7cVQ#GG)WRXCLh_|}N8&Sjq`Rs30nMPS0zl;bJV?AJEmiStXSoG%f% ze!;qX`|Y`3=dU`~u;oM^Bg6){DZg`C6q2UW~l|vGtA!?`4@{iDxT$mQD%Ue_j1$Yt6zUv;UKUalqi| L>gTe~DWM4fLbJIX literal 0 HcmV?d00001 diff --git a/src/test/resources/blackbox/ean8-1/2.txt b/src/test/resources/blackbox/ean8-1/2.txt new file mode 100644 index 00000000..c1c11781 --- /dev/null +++ b/src/test/resources/blackbox/ean8-1/2.txt @@ -0,0 +1 @@ +12345670 \ No newline at end of file diff --git a/src/test/resources/blackbox/ean8-1/3.png b/src/test/resources/blackbox/ean8-1/3.png new file mode 100644 index 0000000000000000000000000000000000000000..2e29b6bfb49b1b159acd5f83d113f56b109abf51 GIT binary patch literal 402 zcmV;D0d4+?P)C z|Nlg)>|6i<0Y^zhK~#8N?bNYK!%!3k;7GtOf-fLs^Z~k-p2zV49EwnS$BsTi9>KAL z*bE)w5I7IukV1z$=E@a%V{h|&ZHz6sMFa&M@^j$8xBPI16Tpx9w`h7>B*K!1aT_;y zb-2kry!$rJ+Gu)fG4tDf#0G0|?-woUC_eaDBu8=HMsu1!%}16zOh%RX$>lrjFjJb( z!oJEl>|3h_*_YU1haI9$vwsI^fhlBW&dne&qQRgFkvdctfubFvqCs_y6dF3-t|IKv z4#(pXQ-_jE8P{lrlTXw|UgI-WqQs>`hGwo&f8Yx-WP@<19WJ9x93s-{3M+n$ialB^ z9Li!5^B%V-tpsGs2Ux=HkU8F?hAlmmu;!$Vd<<``g@kmN6nTS@HSfr2PBLzgsvC!z wWlYWKFbpQ4Llr3^MV~094lNns=FcDX8@nFX1K5uh6951J07*qoM6N<$f?zhRpa1{> literal 0 HcmV?d00001 diff --git a/src/test/resources/blackbox/ean8-1/3.txt b/src/test/resources/blackbox/ean8-1/3.txt new file mode 100644 index 00000000..c1c11781 --- /dev/null +++ b/src/test/resources/blackbox/ean8-1/3.txt @@ -0,0 +1 @@ +12345670 \ No newline at end of file diff --git a/src/test/resources/blackbox/ean8-1/4.png b/src/test/resources/blackbox/ean8-1/4.png new file mode 100644 index 0000000000000000000000000000000000000000..ab36270097a14cfc1baddae083805bd010c1dde1 GIT binary patch literal 4168 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/blackbox/ean8-1/4.txt b/src/test/resources/blackbox/ean8-1/4.txt new file mode 100644 index 00000000..2ab0cf49 --- /dev/null +++ b/src/test/resources/blackbox/ean8-1/4.txt @@ -0,0 +1 @@ +67678983 \ No newline at end of file diff --git a/src/test/resources/blackbox/ean8-1/5.png b/src/test/resources/blackbox/ean8-1/5.png new file mode 100644 index 0000000000000000000000000000000000000000..8dba68477e579844e03f07ade8e133adc02fd67b GIT binary patch literal 2205 zcmds(`#;l*AIHZiBgRaJin&ZBok&tHe#s>oN-iBGYRO|tww2b%gz1>d zT$;<4TfU`P3)2#FNw=>VCb^}9<2)YUU(Ubq{o(z1z8>$#^Zo1l{U&*NxT~w~Pz8ZN z>R15d0|F@^H%nOsyxGYdjK^)l#_I&$b(2si6oEikSXekYIeB_|hJ}SCB_(BLWfc?@ zl$MsV+3fcA_TJv!@$qrFT)wff(bUxBi0?;$Kq|&q3>tqSbh_`LYKI{l+?S=)x)Cj@ zgjM4wrv&9L<#W|ZCSu9%c{PZS-HnP_6!mT8cnmBJF%tWdl&k&vp0&Ol!=fg zO(!yF%WRAt#e=CG#}PjE(0|tu!26l_j!=x4u92g1tuGHXXN)#-Wk;V3r;da+h}%MQ zK3_TRy8J8Ha9d`zqE{;I+n6t4-nl2Lrn0hY$HNM@4?enVbdiGW{CN0ah;q*uEJ9kr zK_|8@5ZBUvMUn1g_pa7GWklFhPwU;H+$YOI6(JOPZ8Xg2R#aa=Eh`uW8_4{}T zpwH>C!Y0%v9f{*c`CMdN?l(nd!5@uarvAG{`+XPX_<|3%cR+#cC9xU zobgd?I0qVT&xyjLCWC-0Da3Fo?XNAdgbcRkpyXmFy0CU3rCYQvG>=mrK2EloGxv9Z zS!4CNW5rjD`QRTb4v*UM;WDcAz{yf<5S{9O{Tqy_Wysmpk$RGd-zH+;IGlXx1^oG{ zBP_gFfj4U&Lkag!p`nNO|JHw;Y;6qcPxZ?AxqNp!h%nU#@f&yVnSlN`GWgJ_*cenM zbp=GHIow;t7ZY6CpFZQ1(LRT!4-W1e<65+Cfh_E8{yBqCH^71Rh)5}Yq!i;4;Ggs_ zEHw85P7mC*pTVRUyPwM@|5FrL_L@9UymD2x9FlhonZg0mP}S~L@g$+2(bq4(h3I{> z>_Gad1Z;t`OzQ=P+xdrB{0p9_x|xhdKf~#4zibJe{>a;jzubTHVJZbh4?!Iaxqdb| zcHmZjqKt@pnVxur3*N7FrbG@T6RUQV5rD!qBhh7aQT#%lpa!@iQ{k*CLqt{&rqY64 z@*@5`R!X+2DOqx$I+`dP-&wNq3x#T7d-%3%a;Xk2=HZX829fLvioN($AMyU@ObMUy zd!c`wV5ZUgS@VQr%>b0IdrfR+K-|_#Q0-S+17nFoZC}s3{LrMPVwsItF+A8E_f$Tb zNWIU6=|2c1@9WF1Jz^*<1fLtMP^~rF8tJP{u=R>nax@qLsAX>4T}=W|(6EUS8;WEF zYb+AX74&P5Fbge<((;hm^B+3b7B2yTj;3+ysQ!6DBd@iKHp_FGZI*n^sQ=V{Xf$&z zdztw?dLEM;HvdN}K;!+~HG4p4QVKrQ_8Qq>I~Wqk+p-Bc>-65v{|xe@Q!YQ2U5v>=P!se+i8%6s&f1_x_G)o`L;kIn1p zr830OzL^^Ky(FioU zbJM44DC(@S{#$7mPo>2o|B|tO;gI@UFp|Xp+-)Tc-PHUJ(gJT=heF=AIc@2Kq1C?0 z%wt`ngQSJL&FjGuPPjD1gk9!scrXi!SY9J3{DgZ40_-VcYQE04?=1y_1h|gmddyME zSP>RB#UGqyaa;J^jo3H_&@_THIwB;0)G@1!qW&PIoEafgi_F5v4%Nj`pD-CW%)0JO zQY3{@m;p>u36MGv5rm>RR{L%hR&UsehW@=vy56iqaYWxLq&VyS=AQw=x_V%0oWrmF E4U(bwr~m)} literal 0 HcmV?d00001 diff --git a/src/test/resources/blackbox/ean8-1/5.txt b/src/test/resources/blackbox/ean8-1/5.txt new file mode 100644 index 00000000..4911bf2b --- /dev/null +++ b/src/test/resources/blackbox/ean8-1/5.txt @@ -0,0 +1 @@ +80674313 \ No newline at end of file diff --git a/src/test/resources/blackbox/ean8-1/6.png b/src/test/resources/blackbox/ean8-1/6.png new file mode 100644 index 0000000000000000000000000000000000000000..87f88938764a6759a1ebc353351b496c00b8b08f GIT binary patch literal 13711 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 X3>Yd< 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/blackbox/ean8-1/7.txt b/src/test/resources/blackbox/ean8-1/7.txt new file mode 100644 index 00000000..36db36bc --- /dev/null +++ b/src/test/resources/blackbox/ean8-1/7.txt @@ -0,0 +1 @@ +50487066 \ No newline at end of file diff --git a/src/test/resources/blackbox/ean8-1/8.png b/src/test/resources/blackbox/ean8-1/8.png new file mode 100644 index 0000000000000000000000000000000000000000..faddfd7d0663e7ca55be8bd2a327f4262ab950a5 GIT binary patch literal 580 zcmV-K0=xZ*P)pm_dP2AxUk}3gtMiik6fzGa2|6Zzlqx7Y_7hvs%e)XH4`gM&F+U*|u_4F% z16%OG``-(@{|Vb7ws@(+eI$k|fJ<@sTXDE0Ugv@OR79+ToCyooV)6sU%~IsEu)y)S zn#WgwehR|HJH`V8v=G3x*u0;9yj%(3hDh(?;g|4yTRh@Ic#%Jgr%S