github.com/slspeek/camlistore_namedsearch@v0.0.0-20140519202248-ed6f70f7721a/third_party/code.google.com/p/rsc/qr/png.go (about) 1 // Copyright 2011 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package qr 6 7 // PNG writer for QR codes. 8 9 import ( 10 "bytes" 11 "encoding/binary" 12 "hash" 13 "hash/crc32" 14 ) 15 16 // PNG returns a PNG image displaying the code. 17 // 18 // PNG uses a custom encoder tailored to QR codes. 19 // Its compressed size is about 2x away from optimal, 20 // but it runs about 20x faster than calling png.Encode 21 // on c.Image(). 22 func (c *Code) PNG() []byte { 23 var p pngWriter 24 return p.encode(c) 25 } 26 27 type pngWriter struct { 28 tmp [16]byte 29 wctmp [4]byte 30 buf bytes.Buffer 31 zlib bitWriter 32 crc hash.Hash32 33 } 34 35 var pngHeader = []byte("\x89PNG\r\n\x1a\n") 36 37 func (w *pngWriter) encode(c *Code) []byte { 38 scale := c.Scale 39 siz := c.Size 40 41 w.buf.Reset() 42 43 // Header 44 w.buf.Write(pngHeader) 45 46 // Header block 47 binary.BigEndian.PutUint32(w.tmp[0:4], uint32((siz+8)*scale)) 48 binary.BigEndian.PutUint32(w.tmp[4:8], uint32((siz+8)*scale)) 49 w.tmp[8] = 1 // 1-bit 50 w.tmp[9] = 0 // gray 51 w.tmp[10] = 0 52 w.tmp[11] = 0 53 w.tmp[12] = 0 54 w.writeChunk("IHDR", w.tmp[:13]) 55 56 // Comment 57 w.writeChunk("tEXt", comment) 58 59 // Data 60 w.zlib.writeCode(c) 61 w.writeChunk("IDAT", w.zlib.bytes.Bytes()) 62 63 // End 64 w.writeChunk("IEND", nil) 65 66 return w.buf.Bytes() 67 } 68 69 var comment = []byte("Software\x00QR-PNG http://qr.swtch.com/") 70 71 func (w *pngWriter) writeChunk(name string, data []byte) { 72 if w.crc == nil { 73 w.crc = crc32.NewIEEE() 74 } 75 binary.BigEndian.PutUint32(w.wctmp[0:4], uint32(len(data))) 76 w.buf.Write(w.wctmp[0:4]) 77 w.crc.Reset() 78 copy(w.wctmp[0:4], name) 79 w.buf.Write(w.wctmp[0:4]) 80 w.crc.Write(w.wctmp[0:4]) 81 w.buf.Write(data) 82 w.crc.Write(data) 83 crc := w.crc.Sum32() 84 binary.BigEndian.PutUint32(w.wctmp[0:4], crc) 85 w.buf.Write(w.wctmp[0:4]) 86 } 87 88 func (b *bitWriter) writeCode(c *Code) { 89 const ftNone = 0 90 91 b.adler32.Reset() 92 b.bytes.Reset() 93 b.nbit = 0 94 95 scale := c.Scale 96 siz := c.Size 97 98 // zlib header 99 b.tmp[0] = 0x78 100 b.tmp[1] = 0 101 b.tmp[1] += uint8(31 - (uint16(b.tmp[0])<<8+uint16(b.tmp[1]))%31) 102 b.bytes.Write(b.tmp[0:2]) 103 104 // Start flate block. 105 b.writeBits(1, 1, false) // final block 106 b.writeBits(1, 2, false) // compressed, fixed Huffman tables 107 108 // White border. 109 // First row. 110 b.byte(ftNone) 111 n := (scale*(siz+8) + 7) / 8 112 b.byte(255) 113 b.repeat(n-1, 1) 114 // 4*scale rows total. 115 b.repeat((4*scale-1)*(1+n), 1+n) 116 117 for i := 0; i < 4*scale; i++ { 118 b.adler32.WriteNByte(ftNone, 1) 119 b.adler32.WriteNByte(255, n) 120 } 121 122 row := make([]byte, 1+n) 123 for y := 0; y < siz; y++ { 124 row[0] = ftNone 125 j := 1 126 var z uint8 127 nz := 0 128 for x := -4; x < siz+4; x++ { 129 // Raw data. 130 for i := 0; i < scale; i++ { 131 z <<= 1 132 if !c.Black(x, y) { 133 z |= 1 134 } 135 if nz++; nz == 8 { 136 row[j] = z 137 j++ 138 nz = 0 139 } 140 } 141 } 142 if j < len(row) { 143 row[j] = z 144 } 145 for _, z := range row { 146 b.byte(z) 147 } 148 149 // Scale-1 copies. 150 b.repeat((scale-1)*(1+n), 1+n) 151 152 b.adler32.WriteN(row, scale) 153 } 154 155 // White border. 156 // First row. 157 b.byte(ftNone) 158 b.byte(255) 159 b.repeat(n-1, 1) 160 // 4*scale rows total. 161 b.repeat((4*scale-1)*(1+n), 1+n) 162 163 for i := 0; i < 4*scale; i++ { 164 b.adler32.WriteNByte(ftNone, 1) 165 b.adler32.WriteNByte(255, n) 166 } 167 168 // End of block. 169 b.hcode(256) 170 b.flushBits() 171 172 // adler32 173 binary.BigEndian.PutUint32(b.tmp[0:], b.adler32.Sum32()) 174 b.bytes.Write(b.tmp[0:4]) 175 } 176 177 // A bitWriter is a write buffer for bit-oriented data like deflate. 178 type bitWriter struct { 179 bytes bytes.Buffer 180 bit uint32 181 nbit uint 182 183 tmp [4]byte 184 adler32 adigest 185 } 186 187 func (b *bitWriter) writeBits(bit uint32, nbit uint, rev bool) { 188 // reverse, for huffman codes 189 if rev { 190 br := uint32(0) 191 for i := uint(0); i < nbit; i++ { 192 br |= ((bit >> i) & 1) << (nbit - 1 - i) 193 } 194 bit = br 195 } 196 b.bit |= bit << b.nbit 197 b.nbit += nbit 198 for b.nbit >= 8 { 199 b.bytes.WriteByte(byte(b.bit)) 200 b.bit >>= 8 201 b.nbit -= 8 202 } 203 } 204 205 func (b *bitWriter) flushBits() { 206 if b.nbit > 0 { 207 b.bytes.WriteByte(byte(b.bit)) 208 b.nbit = 0 209 b.bit = 0 210 } 211 } 212 213 func (b *bitWriter) hcode(v int) { 214 /* 215 Lit Value Bits Codes 216 --------- ---- ----- 217 0 - 143 8 00110000 through 218 10111111 219 144 - 255 9 110010000 through 220 111111111 221 256 - 279 7 0000000 through 222 0010111 223 280 - 287 8 11000000 through 224 11000111 225 */ 226 switch { 227 case v <= 143: 228 b.writeBits(uint32(v)+0x30, 8, true) 229 case v <= 255: 230 b.writeBits(uint32(v-144)+0x190, 9, true) 231 case v <= 279: 232 b.writeBits(uint32(v-256)+0, 7, true) 233 case v <= 287: 234 b.writeBits(uint32(v-280)+0xc0, 8, true) 235 default: 236 panic("invalid hcode") 237 } 238 } 239 240 func (b *bitWriter) byte(x byte) { 241 b.hcode(int(x)) 242 } 243 244 func (b *bitWriter) codex(c int, val int, nx uint) { 245 b.hcode(c + val>>nx) 246 b.writeBits(uint32(val)&(1<<nx-1), nx, false) 247 } 248 249 func (b *bitWriter) repeat(n, d int) { 250 for ; n >= 258+3; n -= 258 { 251 b.repeat1(258, d) 252 } 253 if n > 258 { 254 // 258 < n < 258+3 255 b.repeat1(10, d) 256 b.repeat1(n-10, d) 257 return 258 } 259 if n < 3 { 260 panic("invalid flate repeat") 261 } 262 b.repeat1(n, d) 263 } 264 265 func (b *bitWriter) repeat1(n, d int) { 266 /* 267 Extra Extra Extra 268 Code Bits Length(s) Code Bits Lengths Code Bits Length(s) 269 ---- ---- ------ ---- ---- ------- ---- ---- ------- 270 257 0 3 267 1 15,16 277 4 67-82 271 258 0 4 268 1 17,18 278 4 83-98 272 259 0 5 269 2 19-22 279 4 99-114 273 260 0 6 270 2 23-26 280 4 115-130 274 261 0 7 271 2 27-30 281 5 131-162 275 262 0 8 272 2 31-34 282 5 163-194 276 263 0 9 273 3 35-42 283 5 195-226 277 264 0 10 274 3 43-50 284 5 227-257 278 265 1 11,12 275 3 51-58 285 0 258 279 266 1 13,14 276 3 59-66 280 */ 281 switch { 282 case n <= 10: 283 b.codex(257, n-3, 0) 284 case n <= 18: 285 b.codex(265, n-11, 1) 286 case n <= 34: 287 b.codex(269, n-19, 2) 288 case n <= 66: 289 b.codex(273, n-35, 3) 290 case n <= 130: 291 b.codex(277, n-67, 4) 292 case n <= 257: 293 b.codex(281, n-131, 5) 294 case n == 258: 295 b.hcode(285) 296 default: 297 panic("invalid repeat length") 298 } 299 300 /* 301 Extra Extra Extra 302 Code Bits Dist Code Bits Dist Code Bits Distance 303 ---- ---- ---- ---- ---- ------ ---- ---- -------- 304 0 0 1 10 4 33-48 20 9 1025-1536 305 1 0 2 11 4 49-64 21 9 1537-2048 306 2 0 3 12 5 65-96 22 10 2049-3072 307 3 0 4 13 5 97-128 23 10 3073-4096 308 4 1 5,6 14 6 129-192 24 11 4097-6144 309 5 1 7,8 15 6 193-256 25 11 6145-8192 310 6 2 9-12 16 7 257-384 26 12 8193-12288 311 7 2 13-16 17 7 385-512 27 12 12289-16384 312 8 3 17-24 18 8 513-768 28 13 16385-24576 313 9 3 25-32 19 8 769-1024 29 13 24577-32768 314 */ 315 if d <= 4 { 316 b.writeBits(uint32(d-1), 5, true) 317 } else if d <= 32768 { 318 nbit := uint(16) 319 for d <= 1<<(nbit-1) { 320 nbit-- 321 } 322 v := uint32(d - 1) 323 v &^= 1 << (nbit - 1) // top bit is implicit 324 code := uint32(2*nbit - 2) // second bit is low bit of code 325 code |= v >> (nbit - 2) 326 v &^= 1 << (nbit - 2) 327 b.writeBits(code, 5, true) 328 // rest of bits follow 329 b.writeBits(uint32(v), nbit-2, false) 330 } else { 331 panic("invalid repeat distance") 332 } 333 } 334 335 func (b *bitWriter) run(v byte, n int) { 336 if n == 0 { 337 return 338 } 339 b.byte(v) 340 if n-1 < 3 { 341 for i := 0; i < n-1; i++ { 342 b.byte(v) 343 } 344 } else { 345 b.repeat(n-1, 1) 346 } 347 } 348 349 type adigest struct { 350 a, b uint32 351 } 352 353 func (d *adigest) Reset() { d.a, d.b = 1, 0 } 354 355 const amod = 65521 356 357 func aupdate(a, b uint32, pi byte, n int) (aa, bb uint32) { 358 // TODO(rsc): 6g doesn't do magic multiplies for b %= amod, 359 // only for b = b%amod. 360 361 // invariant: a, b < amod 362 if pi == 0 { 363 b += uint32(n%amod) * a 364 b = b % amod 365 return a, b 366 } 367 368 // n times: 369 // a += pi 370 // b += a 371 // is same as 372 // b += n*a + n*(n+1)/2*pi 373 // a += n*pi 374 m := uint32(n) 375 b += (m % amod) * a 376 b = b % amod 377 b += (m * (m + 1) / 2) % amod * uint32(pi) 378 b = b % amod 379 a += (m % amod) * uint32(pi) 380 a = a % amod 381 return a, b 382 } 383 384 func afinish(a, b uint32) uint32 { 385 return b<<16 | a 386 } 387 388 func (d *adigest) WriteN(p []byte, n int) { 389 for i := 0; i < n; i++ { 390 for _, pi := range p { 391 d.a, d.b = aupdate(d.a, d.b, pi, 1) 392 } 393 } 394 } 395 396 func (d *adigest) WriteNByte(pi byte, n int) { 397 d.a, d.b = aupdate(d.a, d.b, pi, n) 398 } 399 400 func (d *adigest) Sum32() uint32 { return afinish(d.a, d.b) }