From c7acc710b052dc6acdf825893fb4bff3fd7a77f4 Mon Sep 17 00:00:00 2001 From: Daniel Gredler Date: Fri, 4 Oct 2024 15:27:41 +0200 Subject: [PATCH] Micro QR Code: allow empty content, if user requests it --- README.md | 2 + .../org/okapibarcode/backend/MicroQrCode.java | 9 +++-- .../backend/microqrcode/empty-data.png | Bin 0 -> 695 bytes .../backend/microqrcode/empty-data.properties | 26 +++++++++++++ .../backend/microqrcode/test-023.png | Bin 286 -> 1247 bytes .../backend/microqrcode/test-023.properties | 36 +++++++++--------- .../backend/microqrcode/test-036.png | Bin 275 -> 1300 bytes .../backend/microqrcode/test-036.properties | 36 +++++++++--------- .../backend/microqrcode/test-044.png | Bin 324 -> 1620 bytes .../backend/microqrcode/test-044.properties | 26 ++++++------- 10 files changed, 82 insertions(+), 53 deletions(-) create mode 100644 src/test/resources/uk/org/okapibarcode/backend/microqrcode/empty-data.png create mode 100644 src/test/resources/uk/org/okapibarcode/backend/microqrcode/empty-data.properties diff --git a/README.md b/README.md index b4d3c9e5..d00b120e 100644 --- a/README.md +++ b/README.md @@ -158,6 +158,8 @@ and data. #### Okapi Barcode 0.4.8 - MaxiCode: improve handling of partial and malformed postal codes (modes 2 and 3) - Code 11: allow empty content, if user requests it +- Micro QR Code: allow empty content, if user requests it +- Micro QR Code: fix last data character ignored during encoding in some scenarios #### Okapi Barcode 0.4.7 - Update build toolchain from Java 17 to Java 21 (minimum target runtime remains Java 8) diff --git a/src/main/java/uk/org/okapibarcode/backend/MicroQrCode.java b/src/main/java/uk/org/okapibarcode/backend/MicroQrCode.java index c7d06ec1..8fead8f3 100644 --- a/src/main/java/uk/org/okapibarcode/backend/MicroQrCode.java +++ b/src/main/java/uk/org/okapibarcode/backend/MicroQrCode.java @@ -465,7 +465,7 @@ private void inputCharCheck() { /* Check that input includes valid characters */ - if (content.matches("[\u0000-\u00FF]+")) { + if (content.matches("[\u0000-\u00FF]*")) { /* All characters in ISO 8859-1 */ return; } @@ -707,12 +707,13 @@ private void generateBinary(int version) { info("Encoding: "); - do { + while (position < content.length()) { + data_block = inputMode[position]; blockLength = 0; do { blockLength++; - } while (((blockLength + position) < content.length()) + } while (((position + blockLength) < content.length()) && (inputMode[position + blockLength] == data_block)); switch (data_block) { @@ -886,7 +887,7 @@ private void generateBinary(int version) { } position += blockLength; - } while (position < content.length() - 1); + } /* Add terminator */ switch(version) { diff --git a/src/test/resources/uk/org/okapibarcode/backend/microqrcode/empty-data.png b/src/test/resources/uk/org/okapibarcode/backend/microqrcode/empty-data.png new file mode 100644 index 0000000000000000000000000000000000000000..ba2e73b115c7eeaf83169be4d9bf592000be321a GIT binary patch literal 695 zcmeAS@N?(olHy`uVBq!ia0vp^c_7RIBp4nWRH`#DFx7dwIEGZjt?f0;V=&}7{OiB} z_UKFrmo;+^YfjL3{`@)T{{M3}yWhw>Etj}lx4LESwl{)hw>DuF;JTvuJzDG|%e(D5 zk2vq-M;;O0aeq^XdcpowLH`GJrk@ir3 z7HKxY@66^Lg}F1*Z#q~Rp5N41k~A-s`Q;It(`=VIkrYm3Tsx`j8J)>XUnOtP+sstj zm3uz2(dy{7=W871CfzO$Tj00xt)+Ir@*Cggh^`3EsXhk`iEXy&tgl31%5N&aF_FBm zZbNg5!|p?TlNjG}S$nW;(SD*(K3?oTkH+Z@Xf)@l40wPg6Qm-QG-H?xSOzwB9B)X{KQH zQ%&L1JvX%dXGWwQiK{$y#7OzusbIBfk{iS48Nsw1+biBZt+v6qtujUaK~JLGO?Hdq k8SdX0&q+L+h*wy%eok5BtNB9LB|$0D)78&qol`;+060@q 19 + +CODEWORDS + +71111 +1514 +1131113 +1131122 +1131122 +1511111 +7112 +083 +2513 +01111313 +13115 diff --git a/src/test/resources/uk/org/okapibarcode/backend/microqrcode/test-023.png b/src/test/resources/uk/org/okapibarcode/backend/microqrcode/test-023.png index df15bb658eacc4a74b62e0eef26ae1a876990960..bfd992ae9e0ab97fa6bbc6bc13705100f950e8f3 100644 GIT binary patch literal 1247 zcmeAS@N?(olHy`uVBq!ia0vp^(?FO5NH9od>De(buq^X*aSW-5+j`bJ?}32;^Tj*= zFBxA@Q#C*JcjJ`pMjqS#d@eq^KfZjE_nViK-w0LzQrUfEp4~~kjm!OU3FSE7E&V-> zOfvY&{v3Cf_n6Y=z8x^SxPI33aI9?2mp;(v1|~u61rcx^Zvo59$6&G7-KZ0xG#YUHx3v IIVCg!06#f&r2qf` delta 259 zcmcc5Ige?Aay`RSPZ!6Kid%1QIdUB~;9+t2|Nrv4wbPw8uGyM-@`c0(iK4(YXC)@i zdVk7BIsya|ujzz8e`6%T4FuX}PVvmT>eKj1d(3&$` zEABl_h-m;RsR&aOIoG2IR>hMYxAtjyO$$h`XyROH%e502KxV$qdNwQ4LihLyux)~2 zYTw=pn0?{_>p7vcazopr028ith5!Hn diff --git a/src/test/resources/uk/org/okapibarcode/backend/microqrcode/test-023.properties b/src/test/resources/uk/org/okapibarcode/backend/microqrcode/test-023.properties index 81ce0a1e..5bbcdd3e 100644 --- a/src/test/resources/uk/org/okapibarcode/backend/microqrcode/test-023.properties +++ b/src/test/resources/uk/org/okapibarcode/backend/microqrcode/test-023.properties @@ -6,27 +6,27 @@ content=\x20V.WTTVΔ\n LOG -Encoding: ALPH (7) 1651 1922 1334 31 KANJ (1) 482 -Codewords: 95 57 248 42 108 254 67 196 0 236 0 +Encoding: ALPH (7) 1651 1922 1334 31 KANJ (1) 482 BYTE (1) 10 +Codewords: 95 57 248 42 108 254 67 197 8 80 0 Version: M3 ECC Level: L -Mask Pattern: 10 -Blocks Merged: 56 -> 45 +Mask Pattern: 0 +Blocks Merged: 58 -> 44 CODEWORDS 711111111 -151611 -1131113211 -11311111311 -11311323 -1511142 -7422 -0;121 -63312 -01452111 -211421121 -032221113 -9132 -031125111 -32111313 +1515111 +113112312 +11311413 +1131114111 +1511214 +711132 +081231 +41221311 +0121164 +5111412 +071111112 +121632 +0211122411 +2321151 diff --git a/src/test/resources/uk/org/okapibarcode/backend/microqrcode/test-036.png b/src/test/resources/uk/org/okapibarcode/backend/microqrcode/test-036.png index efcd51912526f6128203ae1a067c1256d6bb58dd..a2eac32f6fbda4f8e4063aae13345f1d0290b8ec 100644 GIT binary patch literal 1300 zcmeAS@N?(olHy`uVBq!ia0vp^(?FO5NH9od>De(bu-x`^aSW-5+j`bWnYvh2t-@s!8u3EQWomN}Z$u~97WY~hBvscP@HTn)H! z&S-M^tt^e4^qD8Eb4^9IZ9em4?lvi|+mUIX{GxeV-|84wE??VrsBGHIJ(t6r6Rl7C z+{;{zMLW=m(<*_+P>G&y>~q^WIDgw|$z^XBt~9^>l;`rd3s+{pEo#fG&UkgU%<}LS zTa&M8yXPd{lABevIrf}EF2C>In|kRpwzV(2mxH3cuPQ%}_r2_^72ls-`*3d|1>EUZ z_@`z5cK&)f_13?Dza=xb*@xK2E_=&=)qgsE;Z;`ktM~1{a#sDesrvUHETx}MmYqFm zYv*{kW>ai&QNMqH`TU&gbM8DACRIrauU~-q=`F5zV^;R-mTvZmzH)ZzuNy(s5?b76 zclB%UA1>WlQpZ0;)wPQG_9j>8?sw{5cFb_kwD^Ut!H*^4POrbPXk{VK`lsO;7q3{f zUH_!LB_m7baQ08pC==7Zhg*@fmwrC6bt^CxC*D-Nel2R+&DPZRm}pS)o+ewAyEb)Z zY(yE!3fw!)b#E-p6U#pC{6y?cfO+@U$BISVWh-VMz4cLGC#&_9vq^6&I_@;dzDnCz zX5*4~kgs%egteT~_JsCbk!xi6Cq{2@zN>Ssul)p?F)30}Y}v(WIqu6Arfx7xKUPK! zfnPlv@0u{{zIt{Mn3|VKW(1n|1JkSdS%>ajm7oNj$rg3x>|$Vw_cgw-C{GTUrt@Ys zij{r_CHl)eTUN|=2j+^|X$xHM+5po%no&nfEbcaTueoPCt7`VU1Fm83f%<*RA1JLZ z2U@bsx?tkf-9YV^Wp|u-b$9W~?JxOaQog>sc;$8pyWXa%?-{RhcQK1c?yWZYYKCmg av7`0PJdO-yTUN{j6?dMlelF{r5}E*|EspO1 delta 248 zcmbQjHJNFGay`Q>PZ!6Kid%1Q8S=Fl@VGj@tIyoFIBKCwokCY3XOYR=Lc8M=uT+M9 zeskau5OhU8FY~RM-WUM_hN~q_RxiI3ym12%>^s@DO-2U@*6?rq7A^>8l}DZxy|9Ft z8wggXnJz2{25aMeU9)vsxHMQrVawM$CnDdTfEZZ6@2UElU%FyI5Oz4L?sKKy^`jtL zXKk3pu;XSf$eImV*Zy^6xLq#N2dTQ&aMfkIZ;XMJ0LYH)f{&MDRGvzjfTd#pGK9-y VKh}JECXWFKJYD@<);T3K0RZvxZT$cM diff --git a/src/test/resources/uk/org/okapibarcode/backend/microqrcode/test-036.properties b/src/test/resources/uk/org/okapibarcode/backend/microqrcode/test-036.properties index f3a0cdff..13744cef 100644 --- a/src/test/resources/uk/org/okapibarcode/backend/microqrcode/test-036.properties +++ b/src/test/resources/uk/org/okapibarcode/backend/microqrcode/test-036.properties @@ -5,27 +5,27 @@ content=duV.WTTTt LOG -Encoding: BYTE (2) 100 117 ALPH (6) 1437 1469 1334 -Codewords: 137 145 213 107 59 111 105 176 0 236 0 +Encoding: BYTE (2) 100 117 ALPH (6) 1437 1469 1334 BYTE (1) 116 +Codewords: 137 145 213 107 59 111 105 180 46 128 0 Version: M3 ECC Level: L -Mask Pattern: 10 -Blocks Merged: 58 -> 46 +Mask Pattern: 1 +Blocks Merged: 65 -> 48 CODEWORDS 711111111 -151611 -11311143 -11311111113 -113113122 -1511121111 -78 -0;211 -632211 -015121212 -311145 -0411221121 -1411113111 -022122222 -2211414 +15111411 +1131113121 +1131114111 +11311112121 +15171 +72123 +082311 +4221222 +0361221 +11211141111 +0212132211 +111121111311 +01311111222 +1131441 diff --git a/src/test/resources/uk/org/okapibarcode/backend/microqrcode/test-044.png b/src/test/resources/uk/org/okapibarcode/backend/microqrcode/test-044.png index e4da9c06ed758693716cac74fe0100e57c67a696..ae67d62a7f44f050e7ec1f1a1babb4525e5de8be 100644 GIT binary patch literal 1620 zcmeAS@N?(olHy`uVBq!ia0vp^t3a3oNH9pqcE>R=ut|HmIEGZj?LFrx^u&UP`QXq0 z%gdW;XG{`I?aHdQ?q|^WeSUuUpYP}YPv3iFUY&Jyr|sXeZ$j0--o8=&_T~0X?>8^E zZ=QbRa(=r0#^v|V#U=Ugp9@wP9pG=f^XM1Rve^qOi@INGzcF+E{6y?>_>J7QXD4-+ zt>18)=j`NYpZLV>lC#ve&)9b;&)CF2&#<=jZd%5?J4wH|cAvdqgJQt6heBMpC(f)( z&z)bXk>j5BYwp(CXA3vT&U{&Z?c2=uLuDz;?nmBEmm^=%O_A*{ZXYelu->GZcX507 z%L`>G!FLwri(g*&_QbLsuJ`qpIp3b>TiCrX)~9`&^6W=qwYz8V<+__4)%{gwD0{0f zrz`r)+a#+kvX}-vm&`c6?D#h8^A6T#w%hJjvfbMFa^u@`#uxg0`*X|ZHJ0U6N)*ryV+9rZ%yF2_U-1CAJ^JaHf%e;?AUfQ6%-@R=Eg^RUwh27b7!*nFXIi< z)*NRoDn73FB|SkmvY-3Ov%c6D=MO|}k`q61R(AJ=`HfpsZ1pD0wk}&}&zya-Dn`M) z{EbsR+qFqwcR1v|yV3fOXN~IX!p1vyHgf-!jKE^>i7zvkitW62TD)uPG~E>wXRnTV z|CIY^)M>FRC(eeh`~ImlX>BTZ){|#i*Qg&BV3nQ{`Hc9Q=dFpH2 zzJN7ba~yl`#5}FikJq>swQYf0-nyc_)AdENb)y56&BL)6ANNZp#~qjwYm)TicWjac zCecrwdutw^Doa@)ds_Y5r&jIT6C2BP=HECizK%?V`zQ2Iy>sW}?$t5k*}B0z6K7jj zmQQ^R^iG#zQL*~_bw#mjw)z;lcDC^_v-VT<8S;qWb(W9tiBJiOxAs? z<>zgCaa(TtiL>r~r?$A>|F*+5&#owBneMM`$90Q7Ph4!2dvUvM-o)AcGE+0V_q{Fb zzEksLg-`UC-2Uh%&y?L$Z!OBNzN2I=Z>e=ztoHU}v7J9p1kOY=vh~{YnH%p`rkSbN zrsb5+n|aoAz9cZurxjmHKUVg9=FK@@NRXB+>z0|ikJb9iTFH0=m-|h!zpnM@ODxJi z$XAN#{%BJCCHCgR_OzOV0=3*_FQSe2 fC3K(~bK_|I%!e9cClR=FmijkIEGZ*dV9-IsM&yr#o^!o z%uA_3DNUlXdKXr;9E`hsC*oV7%d48}wdeUlK;TOM_0?B@ZnNXk0)bam@5d5R~eD-Lv+Q zwI$f>jaSYcTO+*aqp}&8%N~55H+246ZF#Ul9aG`XnO}Y@CxK0L54dbt`S_+B*cB14 z`VR1@+C$h`%eVfhe(_^c07%{OAmi!wR^Cyf3qUrXTY9a1<@*ax>;)@8AbDlA;m7Rn cV7BlI{jNZstj?M!9#HUjy85}Sb4q9e0G6_ZjQ{`u diff --git a/src/test/resources/uk/org/okapibarcode/backend/microqrcode/test-044.properties b/src/test/resources/uk/org/okapibarcode/backend/microqrcode/test-044.properties index bf73eaeb..1a8e7f2d 100644 --- a/src/test/resources/uk/org/okapibarcode/backend/microqrcode/test-044.properties +++ b/src/test/resources/uk/org/okapibarcode/backend/microqrcode/test-044.properties @@ -6,12 +6,12 @@ content=5\x0E8dΔ\n LOG -Encoding: BYTE (4) 53 14 56 100 KANJ (1) 482 -Codewords: 68 53 14 56 100 98 30 32 0 236 17 236 17 236 +Encoding: BYTE (4) 53 14 56 100 KANJ (1) 482 BYTE (1) 10 +Codewords: 68 53 14 56 100 98 30 36 16 160 0 236 17 236 Version: M4 ECC Level: M Mask Pattern: 0 -Blocks Merged: 70 -> 59 +Blocks Merged: 77 -> 64 CODEWORDS @@ -20,15 +20,15 @@ CODEWORDS 113113121111 113115212 11311111124 -151231121 +151222121 721133 -0935 +0926 11121111512 -0:1411 -1166111 -0512135 -49112 -011528 -121115321 -0131211116 -11211113411 +0121142411 +123521111 +0531125 +124321112 +0111111; +121221521 +01111131111113 +221321411