png.go 8.5 KB

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