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) }