go-tinyqr

An experimental minimal QR Code generator  http://go-qrcode.appspot.com
git clone https://git.ce9e.org/go-tinyqr.git

commit
7ac0b40b20381309a948070efde6bf158f0b75be
parent
a3b48390827ef63b58d657612023e343b90bdc58
Author
tfh <tfh@skip.org>
Date
2020-05-26 17:57
Merge pull request #33 from vsenko/occasional-byte-encoding-efficiency-over-mixed-encoding

Occasional byte encoding efficiency over mixed encoding

Diffstat

M encoder.go 19 +++++++++++++++++++
M encoder_test.go 37 ++++++++++++++++++++++++++++++++++---

2 files changed, 53 insertions, 3 deletions


diff --git a/encoder.go b/encoder.go

@@ -180,6 +180,25 @@ func (d *dataEncoder) encode(data []byte) (*bitset.Bitset, error) {
  180   180 		return nil, err
  181   181 	}
  182   182 
   -1   183 	// Check if a single byte encoded segment would be more efficient.
   -1   184 	optimizedLength := 0
   -1   185 	for _, s := range d.optimised {
   -1   186 		length, err := d.encodedLength(s.dataMode, len(s.data))
   -1   187 		if err != nil {
   -1   188 			return nil, err
   -1   189 		}
   -1   190 		optimizedLength += length
   -1   191 	}
   -1   192 
   -1   193 	singleByteSegmentLength, err := d.encodedLength(dataModeByte, len(d.data))
   -1   194 	if err != nil {
   -1   195 		return nil, err
   -1   196 	}
   -1   197 
   -1   198 	if singleByteSegmentLength <= optimizedLength {
   -1   199 		d.optimised = []segment{segment{dataMode: dataModeByte, data: d.data}}
   -1   200 	}
   -1   201 
  183   202 	// Encode data.
  184   203 	encoded := bitset.New()
  185   204 	for _, s := range d.optimised {

diff --git a/encoder_test.go b/encoder_test.go

@@ -180,17 +180,49 @@ func TestOptimiseEncoding(t *testing.T) {
  180   180 		{
  181   181 			dataEncoderType1To9,
  182   182 			[]testModeSegment{
   -1   183 				{dataModeAlphanumeric, 100},
   -1   184 				{dataModeByte, 1},
   -1   185 				{dataModeNumeric, 1},
   -1   186 			},
   -1   187 			[]testModeSegment{
   -1   188 				{dataModeAlphanumeric, 100},
   -1   189 				{dataModeByte, 2},
   -1   190 			},
   -1   191 		},
   -1   192 		// Sometimes encoding everything as bytes is more efficient.
   -1   193 		{
   -1   194 			dataEncoderType1To9,
   -1   195 			[]testModeSegment{
  183   196 				{dataModeAlphanumeric, 1},
  184   197 				{dataModeByte, 1},
  185   198 				{dataModeNumeric, 1},
  186   199 			},
  187   200 			[]testModeSegment{
   -1   201 				{dataModeByte, 3},
   -1   202 			},
   -1   203 		},
   -1   204 		// https://www.google.com/123456789012345678901234567890
   -1   205 		// BBBBBAAABBBABBBBBBABBBANNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
   -1   206 		{
   -1   207 			dataEncoderType1To9,
   -1   208 			[]testModeSegment{
   -1   209 				{dataModeByte, 5},
   -1   210 				{dataModeAlphanumeric, 3},
   -1   211 				{dataModeByte, 3},
  188   212 				{dataModeAlphanumeric, 1},
  189    -1 				{dataModeByte, 2},
   -1   213 				{dataModeByte, 6},
   -1   214 				{dataModeAlphanumeric, 1},
   -1   215 				{dataModeAlphanumeric, 4},
   -1   216 				{dataModeNumeric, 30},
   -1   217 			},
   -1   218 			[]testModeSegment{
   -1   219 				{dataModeByte, 23},
   -1   220 				{dataModeNumeric, 30},
  190   221 			},
  191   222 		},
  192   223 		// https://www.google.com/123
  193   224 		// BBBBBAAABBBABBBBBBABBBANNN
   -1   225 		// Small segments are inefficient because of additional metadata.
  194   226 		{
  195   227 			dataEncoderType1To9,
  196   228 			[]testModeSegment{
@@ -204,8 +236,7 @@ func TestOptimiseEncoding(t *testing.T) {
  204   236 				{dataModeNumeric, 3},
  205   237 			},
  206   238 			[]testModeSegment{
  207    -1 				{dataModeByte, 23},
  208    -1 				{dataModeNumeric, 3},
   -1   239 				{dataModeByte, 26},
  209   240 			},
  210   241 		},
  211   242 		// HTTPS://WWW.GOOGLE.COM/123