Browse Source

Improve penalty calculations, still incomplete.

Tom Harwood 11 years ago
parent
commit
f3168efedf
4 changed files with 37 additions and 5 deletions
  1. 4 0
      qrcode.go
  2. 5 0
      qrcode_decode_test.go
  3. 14 3
      qrcode_test.go
  4. 14 2
      symbol.go

+ 4 - 0
qrcode.go

@@ -101,6 +101,7 @@ type QRCode struct {
 
 
 	data   *bitset.Bitset
 	data   *bitset.Bitset
 	symbol *symbol
 	symbol *symbol
+	mask int
 }
 }
 
 
 // New constructs a QRCode.
 // New constructs a QRCode.
@@ -318,8 +319,11 @@ func (q *QRCode) encode(numTerminatorBits int) {
 
 
 		var p int = s.penaltyScore()
 		var p int = s.penaltyScore()
 
 
+		//log.Printf("mask=%d p=%3d p1=%3d p2=%3d p3=%3d p4=%d\n", mask, p, s.penalty1(), s.penalty2(), s.penalty3(), s.penalty4())
+
 		if q.symbol == nil || p < penalty {
 		if q.symbol == nil || p < penalty {
 			q.symbol = s
 			q.symbol = s
+			q.mask = mask
 			penalty = p
 			penalty = p
 		}
 		}
 	}
 	}

+ 5 - 0
qrcode_decode_test.go

@@ -59,6 +59,11 @@ func TestDecodeBasic(t *testing.T) {
 			1,
 			1,
 			Highest,
 			Highest,
 		},
 		},
+		{
+			"01234567",
+			1,
+			Medium,
+		},
 	}
 	}
 
 
 	for _, test := range tests {
 	for _, test := range tests {

+ 14 - 3
qrcode_test.go

@@ -136,9 +136,20 @@ func TestQRCodeVersionCapacity(t *testing.T) {
 	}
 	}
 }
 }
 
 
-func BenchmarkQRCodeMinimumSize(b *testing.B) {
-	for n := 0; n < b.N; n++ {
-		New("1", Low)
+func TestQRCodeISOAnnexIExample(t *testing.T) {
+	var q *QRCode
+	q, err := New("01234567", Medium)
+
+	if err != nil {
+		t.Fatalf("Error producing ISO Annex I Example: %s, expected success",
+			err.Error())
+	}
+
+	const expectedMask int = 2
+
+	if q.mask != 2 {
+		t.Errorf("ISO Annex I example mask got %d, expected %d\n", q.mask,
+		expectedMask)
 	}
 	}
 }
 }
 
 

+ 14 - 2
symbol.go

@@ -220,7 +220,7 @@ func (m *symbol) penalty3() int {
 	var penalty int = 0
 	var penalty int = 0
 
 
 	for y := 0; y < m.symbolSize; y++ {
 	for y := 0; y < m.symbolSize; y++ {
-		var bitBuffer int16 = 0xFF
+		var bitBuffer int16 = 0x00
 
 
 		for x := 0; x < m.symbolSize; x++ {
 		for x := 0; x < m.symbolSize; x++ {
 			bitBuffer <<= 1
 			bitBuffer <<= 1
@@ -233,12 +233,18 @@ func (m *symbol) penalty3() int {
 			// 0x05d           or 0x5d0
 			// 0x05d           or 0x5d0
 			case 0x05d, 0x5d0:
 			case 0x05d, 0x5d0:
 				penalty += penaltyWeight3
 				penalty += penaltyWeight3
+				bitBuffer = 0xFF
+			default:
+				if x == m.symbolSize - 1 && (bitBuffer & 0x7f) == 0x5d {
+					penalty += penaltyWeight3
+					bitBuffer = 0xFF
+				}
 			}
 			}
 		}
 		}
 	}
 	}
 
 
 	for x := 0; x < m.symbolSize; x++ {
 	for x := 0; x < m.symbolSize; x++ {
-		var bitBuffer int16 = 0xFF
+		var bitBuffer int16 = 0x00
 
 
 		for y := 0; y < m.symbolSize; y++ {
 		for y := 0; y < m.symbolSize; y++ {
 			bitBuffer <<= 1
 			bitBuffer <<= 1
@@ -251,6 +257,12 @@ func (m *symbol) penalty3() int {
 			// 0x05d           or 0x5d0
 			// 0x05d           or 0x5d0
 			case 0x05d, 0x5d0:
 			case 0x05d, 0x5d0:
 				penalty += penaltyWeight3
 				penalty += penaltyWeight3
+				bitBuffer = 0xFF
+			default:
+				if y == m.symbolSize - 1 && (bitBuffer & 0x7f) == 0x5d {
+					penalty += penaltyWeight3
+					bitBuffer = 0xFF
+				}
 			}
 			}
 		}
 		}
 	}
 	}