From 5a557bac1003bcf7cd59c1f2ced16960f14d1354 Mon Sep 17 00:00:00 2001 From: srowen Date: Mon, 20 Aug 2012 11:10:43 +0000 Subject: [PATCH] Issue 1343 fix border case version selection git-svn-id: https://zxing.googlecode.com/svn/trunk@2393 59b500cc-1b3d-0410-9834-0bbf25fbcc57 --- .../com/google/zxing/qrcode/encoder/Encoder.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/core/src/com/google/zxing/qrcode/encoder/Encoder.java b/core/src/com/google/zxing/qrcode/encoder/Encoder.java index 31baa275a..100d2e775 100644 --- a/core/src/com/google/zxing/qrcode/encoder/Encoder.java +++ b/core/src/com/google/zxing/qrcode/encoder/Encoder.java @@ -111,9 +111,18 @@ public final class Encoder { appendBytes(content, mode, dataBits, encoding); // Hard part: need to know version to know how many bits length takes. But need to know how many - // bits it takes to know version. To pick version size assume length takes maximum bits + // bits it takes to know version. First we take a guess at version by assuming version will be + // the minimum, 1: + + int provisionalBitsNeeded = headerBits.getSize() + + mode.getCharacterCountBits(Version.getVersionForNumber(1)) + + dataBits.getSize(); + Version provisionalVersion = chooseVersion(provisionalBitsNeeded, ecLevel); + + // Use that guess to calculate the right version. I am still not sure this works in 100% of cases. + int bitsNeeded = headerBits.getSize() - + mode.getCharacterCountBits(Version.getVersionForNumber(40)) + + mode.getCharacterCountBits(provisionalVersion) + dataBits.getSize(); Version version = chooseVersion(bitsNeeded, ecLevel);