qr.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815
  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 coding implements low-level QR coding details.
  5. package coding
  6. import (
  7. "fmt"
  8. "strconv"
  9. "strings"
  10. "github.com/SKatiyar/qr/gf256"
  11. )
  12. // Field is the field for QR error correction.
  13. var Field = gf256.NewField(0x11d, 2)
  14. // A Version represents a QR version.
  15. // The version specifies the size of the QR code:
  16. // a QR code with version v has 4v+17 pixels on a side.
  17. // Versions number from 1 to 40: the larger the version,
  18. // the more information the code can store.
  19. type Version int
  20. const MinVersion = 1
  21. const MaxVersion = 40
  22. func (v Version) String() string {
  23. return strconv.Itoa(int(v))
  24. }
  25. func (v Version) sizeClass() int {
  26. if v <= 9 {
  27. return 0
  28. }
  29. if v <= 26 {
  30. return 1
  31. }
  32. return 2
  33. }
  34. // DataBytes returns the number of data bytes that can be
  35. // stored in a QR code with the given version and level.
  36. func (v Version) DataBytes(l Level) int {
  37. vt := &vtab[v]
  38. lev := &vt.level[l]
  39. return vt.bytes - lev.nblock*lev.check
  40. }
  41. // Encoding implements a QR data encoding scheme.
  42. // The implementations--Numeric, Alphanumeric, and String--specify
  43. // the character set and the mapping from UTF-8 to code bits.
  44. // The more restrictive the mode, the fewer code bits are needed.
  45. type Encoding interface {
  46. Check() error
  47. Bits(v Version) int
  48. Encode(b *Bits, v Version)
  49. }
  50. type Bits struct {
  51. b []byte
  52. nbit int
  53. }
  54. func (b *Bits) Reset() {
  55. b.b = b.b[:0]
  56. b.nbit = 0
  57. }
  58. func (b *Bits) Bits() int {
  59. return b.nbit
  60. }
  61. func (b *Bits) Bytes() []byte {
  62. if b.nbit%8 != 0 {
  63. panic("fractional byte")
  64. }
  65. return b.b
  66. }
  67. func (b *Bits) Append(p []byte) {
  68. if b.nbit%8 != 0 {
  69. panic("fractional byte")
  70. }
  71. b.b = append(b.b, p...)
  72. b.nbit += 8 * len(p)
  73. }
  74. func (b *Bits) Write(v uint, nbit int) {
  75. for nbit > 0 {
  76. n := nbit
  77. if n > 8 {
  78. n = 8
  79. }
  80. if b.nbit%8 == 0 {
  81. b.b = append(b.b, 0)
  82. } else {
  83. m := -b.nbit & 7
  84. if n > m {
  85. n = m
  86. }
  87. }
  88. b.nbit += n
  89. sh := uint(nbit - n)
  90. b.b[len(b.b)-1] |= uint8(v >> sh << uint(-b.nbit&7))
  91. v -= v >> sh << sh
  92. nbit -= n
  93. }
  94. }
  95. // Num is the encoding for numeric data.
  96. // The only valid characters are the decimal digits 0 through 9.
  97. type Num string
  98. func (s Num) String() string {
  99. return fmt.Sprintf("Num(%#q)", string(s))
  100. }
  101. func (s Num) Check() error {
  102. for _, c := range s {
  103. if c < '0' || '9' < c {
  104. return fmt.Errorf("non-numeric string %#q", string(s))
  105. }
  106. }
  107. return nil
  108. }
  109. var numLen = [3]int{10, 12, 14}
  110. func (s Num) Bits(v Version) int {
  111. return 4 + numLen[v.sizeClass()] + (10*len(s)+2)/3
  112. }
  113. func (s Num) Encode(b *Bits, v Version) {
  114. b.Write(1, 4)
  115. b.Write(uint(len(s)), numLen[v.sizeClass()])
  116. var i int
  117. for i = 0; i+3 <= len(s); i += 3 {
  118. w := uint(s[i]-'0')*100 + uint(s[i+1]-'0')*10 + uint(s[i+2]-'0')
  119. b.Write(w, 10)
  120. }
  121. switch len(s) - i {
  122. case 1:
  123. w := uint(s[i] - '0')
  124. b.Write(w, 4)
  125. case 2:
  126. w := uint(s[i]-'0')*10 + uint(s[i+1]-'0')
  127. b.Write(w, 7)
  128. }
  129. }
  130. // Alpha is the encoding for alphanumeric data.
  131. // The valid characters are 0-9A-Z$%*+-./: and space.
  132. type Alpha string
  133. const alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:"
  134. func (s Alpha) String() string {
  135. return fmt.Sprintf("Alpha(%#q)", string(s))
  136. }
  137. func (s Alpha) Check() error {
  138. for _, c := range s {
  139. if strings.IndexRune(alphabet, c) < 0 {
  140. return fmt.Errorf("non-alphanumeric string %#q", string(s))
  141. }
  142. }
  143. return nil
  144. }
  145. var alphaLen = [3]int{9, 11, 13}
  146. func (s Alpha) Bits(v Version) int {
  147. return 4 + alphaLen[v.sizeClass()] + (11*len(s)+1)/2
  148. }
  149. func (s Alpha) Encode(b *Bits, v Version) {
  150. b.Write(2, 4)
  151. b.Write(uint(len(s)), alphaLen[v.sizeClass()])
  152. var i int
  153. for i = 0; i+2 <= len(s); i += 2 {
  154. w := uint(strings.IndexRune(alphabet, rune(s[i])))*45 +
  155. uint(strings.IndexRune(alphabet, rune(s[i+1])))
  156. b.Write(w, 11)
  157. }
  158. if i < len(s) {
  159. w := uint(strings.IndexRune(alphabet, rune(s[i])))
  160. b.Write(w, 6)
  161. }
  162. }
  163. // String is the encoding for 8-bit data. All bytes are valid.
  164. type String string
  165. func (s String) String() string {
  166. return fmt.Sprintf("String(%#q)", string(s))
  167. }
  168. func (s String) Check() error {
  169. return nil
  170. }
  171. var stringLen = [3]int{8, 16, 16}
  172. func (s String) Bits(v Version) int {
  173. return 4 + stringLen[v.sizeClass()] + 8*len(s)
  174. }
  175. func (s String) Encode(b *Bits, v Version) {
  176. b.Write(4, 4)
  177. b.Write(uint(len(s)), stringLen[v.sizeClass()])
  178. for i := 0; i < len(s); i++ {
  179. b.Write(uint(s[i]), 8)
  180. }
  181. }
  182. // A Pixel describes a single pixel in a QR code.
  183. type Pixel uint32
  184. const (
  185. Black Pixel = 1 << iota
  186. Invert
  187. )
  188. func (p Pixel) Offset() uint {
  189. return uint(p >> 6)
  190. }
  191. func OffsetPixel(o uint) Pixel {
  192. return Pixel(o << 6)
  193. }
  194. func (r PixelRole) Pixel() Pixel {
  195. return Pixel(r << 2)
  196. }
  197. func (p Pixel) Role() PixelRole {
  198. return PixelRole(p>>2) & 15
  199. }
  200. func (p Pixel) String() string {
  201. s := p.Role().String()
  202. if p&Black != 0 {
  203. s += "+black"
  204. }
  205. if p&Invert != 0 {
  206. s += "+invert"
  207. }
  208. s += "+" + strconv.FormatUint(uint64(p.Offset()), 10)
  209. return s
  210. }
  211. // A PixelRole describes the role of a QR pixel.
  212. type PixelRole uint32
  213. const (
  214. _ PixelRole = iota
  215. Position // position squares (large)
  216. Alignment // alignment squares (small)
  217. Timing // timing strip between position squares
  218. Format // format metadata
  219. PVersion // version pattern
  220. Unused // unused pixel
  221. Data // data bit
  222. Check // error correction check bit
  223. Extra
  224. )
  225. var roles = []string{
  226. "",
  227. "position",
  228. "alignment",
  229. "timing",
  230. "format",
  231. "pversion",
  232. "unused",
  233. "data",
  234. "check",
  235. "extra",
  236. }
  237. func (r PixelRole) String() string {
  238. if Position <= r && r <= Check {
  239. return roles[r]
  240. }
  241. return strconv.Itoa(int(r))
  242. }
  243. // A Level represents a QR error correction level.
  244. // From least to most tolerant of errors, they are L, M, Q, H.
  245. type Level int
  246. const (
  247. L Level = iota
  248. M
  249. Q
  250. H
  251. )
  252. func (l Level) String() string {
  253. if L <= l && l <= H {
  254. return "LMQH"[l : l+1]
  255. }
  256. return strconv.Itoa(int(l))
  257. }
  258. // A Code is a square pixel grid.
  259. type Code struct {
  260. Bitmap []byte // 1 is black, 0 is white
  261. Size int // number of pixels on a side
  262. Stride int // number of bytes per row
  263. }
  264. func (c *Code) Black(x, y int) bool {
  265. return 0 <= x && x < c.Size && 0 <= y && y < c.Size &&
  266. c.Bitmap[y*c.Stride+x/8]&(1<<uint(7-x&7)) != 0
  267. }
  268. // A Mask describes a mask that is applied to the QR
  269. // code to avoid QR artifacts being interpreted as
  270. // alignment and timing patterns (such as the squares
  271. // in the corners). Valid masks are integers from 0 to 7.
  272. type Mask int
  273. // http://www.swetake.com/qr/qr5_en.html
  274. var mfunc = []func(int, int) bool{
  275. func(i, j int) bool { return (i+j)%2 == 0 },
  276. func(i, j int) bool { return i%2 == 0 },
  277. func(i, j int) bool { return j%3 == 0 },
  278. func(i, j int) bool { return (i+j)%3 == 0 },
  279. func(i, j int) bool { return (i/2+j/3)%2 == 0 },
  280. func(i, j int) bool { return i*j%2+i*j%3 == 0 },
  281. func(i, j int) bool { return (i*j%2+i*j%3)%2 == 0 },
  282. func(i, j int) bool { return (i*j%3+(i+j)%2)%2 == 0 },
  283. }
  284. func (m Mask) Invert(y, x int) bool {
  285. if m < 0 {
  286. return false
  287. }
  288. return mfunc[m](y, x)
  289. }
  290. // A Plan describes how to construct a QR code
  291. // with a specific version, level, and mask.
  292. type Plan struct {
  293. Version Version
  294. Level Level
  295. Mask Mask
  296. DataBytes int // number of data bytes
  297. CheckBytes int // number of error correcting (checksum) bytes
  298. Blocks int // number of data blocks
  299. Pixel [][]Pixel // pixel map
  300. }
  301. // NewPlan returns a Plan for a QR code with the given
  302. // version, level, and mask.
  303. func NewPlan(version Version, level Level, mask Mask) (*Plan, error) {
  304. p, err := vplan(version)
  305. if err != nil {
  306. return nil, err
  307. }
  308. if err := fplan(level, mask, p); err != nil {
  309. return nil, err
  310. }
  311. if err := lplan(version, level, p); err != nil {
  312. return nil, err
  313. }
  314. if err := mplan(mask, p); err != nil {
  315. return nil, err
  316. }
  317. return p, nil
  318. }
  319. func (b *Bits) Pad(n int) {
  320. if n < 0 {
  321. panic("qr: invalid pad size")
  322. }
  323. if n <= 4 {
  324. b.Write(0, n)
  325. } else {
  326. b.Write(0, 4)
  327. n -= 4
  328. n -= -b.Bits() & 7
  329. b.Write(0, -b.Bits()&7)
  330. pad := n / 8
  331. for i := 0; i < pad; i += 2 {
  332. b.Write(0xec, 8)
  333. if i+1 >= pad {
  334. break
  335. }
  336. b.Write(0x11, 8)
  337. }
  338. }
  339. }
  340. func (b *Bits) AddCheckBytes(v Version, l Level) {
  341. nd := v.DataBytes(l)
  342. if b.nbit < nd*8 {
  343. b.Pad(nd*8 - b.nbit)
  344. }
  345. if b.nbit != nd*8 {
  346. panic("qr: too much data")
  347. }
  348. dat := b.Bytes()
  349. vt := &vtab[v]
  350. lev := &vt.level[l]
  351. db := nd / lev.nblock
  352. extra := nd % lev.nblock
  353. chk := make([]byte, lev.check)
  354. rs := gf256.NewRSEncoder(Field, lev.check)
  355. for i := 0; i < lev.nblock; i++ {
  356. if i == lev.nblock-extra {
  357. db++
  358. }
  359. rs.ECC(dat[:db], chk)
  360. b.Append(chk)
  361. dat = dat[db:]
  362. }
  363. if len(b.Bytes()) != vt.bytes {
  364. panic("qr: internal error")
  365. }
  366. }
  367. func (p *Plan) Encode(text ...Encoding) (*Code, error) {
  368. var b Bits
  369. for _, t := range text {
  370. if err := t.Check(); err != nil {
  371. return nil, err
  372. }
  373. t.Encode(&b, p.Version)
  374. }
  375. if b.Bits() > p.DataBytes*8 {
  376. return nil, fmt.Errorf("cannot encode %d bits into %d-bit code", b.Bits(), p.DataBytes*8)
  377. }
  378. b.AddCheckBytes(p.Version, p.Level)
  379. bytes := b.Bytes()
  380. // Now we have the checksum bytes and the data bytes.
  381. // Construct the actual code.
  382. c := &Code{Size: len(p.Pixel), Stride: (len(p.Pixel) + 7) &^ 7}
  383. c.Bitmap = make([]byte, c.Stride*c.Size)
  384. crow := c.Bitmap
  385. for _, row := range p.Pixel {
  386. for x, pix := range row {
  387. switch pix.Role() {
  388. case Data, Check:
  389. o := pix.Offset()
  390. if bytes[o/8]&(1<<uint(7-o&7)) != 0 {
  391. pix ^= Black
  392. }
  393. }
  394. if pix&Black != 0 {
  395. crow[x/8] |= 1 << uint(7-x&7)
  396. }
  397. }
  398. crow = crow[c.Stride:]
  399. }
  400. return c, nil
  401. }
  402. // A version describes metadata associated with a version.
  403. type version struct {
  404. apos int
  405. astride int
  406. bytes int
  407. pattern int
  408. level [4]level
  409. }
  410. type level struct {
  411. nblock int
  412. check int
  413. }
  414. var vtab = []version{
  415. {},
  416. {100, 100, 26, 0x0, [4]level{{1, 7}, {1, 10}, {1, 13}, {1, 17}}}, // 1
  417. {16, 100, 44, 0x0, [4]level{{1, 10}, {1, 16}, {1, 22}, {1, 28}}}, // 2
  418. {20, 100, 70, 0x0, [4]level{{1, 15}, {1, 26}, {2, 18}, {2, 22}}}, // 3
  419. {24, 100, 100, 0x0, [4]level{{1, 20}, {2, 18}, {2, 26}, {4, 16}}}, // 4
  420. {28, 100, 134, 0x0, [4]level{{1, 26}, {2, 24}, {4, 18}, {4, 22}}}, // 5
  421. {32, 100, 172, 0x0, [4]level{{2, 18}, {4, 16}, {4, 24}, {4, 28}}}, // 6
  422. {20, 16, 196, 0x7c94, [4]level{{2, 20}, {4, 18}, {6, 18}, {5, 26}}}, // 7
  423. {22, 18, 242, 0x85bc, [4]level{{2, 24}, {4, 22}, {6, 22}, {6, 26}}}, // 8
  424. {24, 20, 292, 0x9a99, [4]level{{2, 30}, {5, 22}, {8, 20}, {8, 24}}}, // 9
  425. {26, 22, 346, 0xa4d3, [4]level{{4, 18}, {5, 26}, {8, 24}, {8, 28}}}, // 10
  426. {28, 24, 404, 0xbbf6, [4]level{{4, 20}, {5, 30}, {8, 28}, {11, 24}}}, // 11
  427. {30, 26, 466, 0xc762, [4]level{{4, 24}, {8, 22}, {10, 26}, {11, 28}}}, // 12
  428. {32, 28, 532, 0xd847, [4]level{{4, 26}, {9, 22}, {12, 24}, {16, 22}}}, // 13
  429. {24, 20, 581, 0xe60d, [4]level{{4, 30}, {9, 24}, {16, 20}, {16, 24}}}, // 14
  430. {24, 22, 655, 0xf928, [4]level{{6, 22}, {10, 24}, {12, 30}, {18, 24}}}, // 15
  431. {24, 24, 733, 0x10b78, [4]level{{6, 24}, {10, 28}, {17, 24}, {16, 30}}}, // 16
  432. {28, 24, 815, 0x1145d, [4]level{{6, 28}, {11, 28}, {16, 28}, {19, 28}}}, // 17
  433. {28, 26, 901, 0x12a17, [4]level{{6, 30}, {13, 26}, {18, 28}, {21, 28}}}, // 18
  434. {28, 28, 991, 0x13532, [4]level{{7, 28}, {14, 26}, {21, 26}, {25, 26}}}, // 19
  435. {32, 28, 1085, 0x149a6, [4]level{{8, 28}, {16, 26}, {20, 30}, {25, 28}}}, // 20
  436. {26, 22, 1156, 0x15683, [4]level{{8, 28}, {17, 26}, {23, 28}, {25, 30}}}, // 21
  437. {24, 24, 1258, 0x168c9, [4]level{{9, 28}, {17, 28}, {23, 30}, {34, 24}}}, // 22
  438. {28, 24, 1364, 0x177ec, [4]level{{9, 30}, {18, 28}, {25, 30}, {30, 30}}}, // 23
  439. {26, 26, 1474, 0x18ec4, [4]level{{10, 30}, {20, 28}, {27, 30}, {32, 30}}}, // 24
  440. {30, 26, 1588, 0x191e1, [4]level{{12, 26}, {21, 28}, {29, 30}, {35, 30}}}, // 25
  441. {28, 28, 1706, 0x1afab, [4]level{{12, 28}, {23, 28}, {34, 28}, {37, 30}}}, // 26
  442. {32, 28, 1828, 0x1b08e, [4]level{{12, 30}, {25, 28}, {34, 30}, {40, 30}}}, // 27
  443. {24, 24, 1921, 0x1cc1a, [4]level{{13, 30}, {26, 28}, {35, 30}, {42, 30}}}, // 28
  444. {28, 24, 2051, 0x1d33f, [4]level{{14, 30}, {28, 28}, {38, 30}, {45, 30}}}, // 29
  445. {24, 26, 2185, 0x1ed75, [4]level{{15, 30}, {29, 28}, {40, 30}, {48, 30}}}, // 30
  446. {28, 26, 2323, 0x1f250, [4]level{{16, 30}, {31, 28}, {43, 30}, {51, 30}}}, // 31
  447. {32, 26, 2465, 0x209d5, [4]level{{17, 30}, {33, 28}, {45, 30}, {54, 30}}}, // 32
  448. {28, 28, 2611, 0x216f0, [4]level{{18, 30}, {35, 28}, {48, 30}, {57, 30}}}, // 33
  449. {32, 28, 2761, 0x228ba, [4]level{{19, 30}, {37, 28}, {51, 30}, {60, 30}}}, // 34
  450. {28, 24, 2876, 0x2379f, [4]level{{19, 30}, {38, 28}, {53, 30}, {63, 30}}}, // 35
  451. {22, 26, 3034, 0x24b0b, [4]level{{20, 30}, {40, 28}, {56, 30}, {66, 30}}}, // 36
  452. {26, 26, 3196, 0x2542e, [4]level{{21, 30}, {43, 28}, {59, 30}, {70, 30}}}, // 37
  453. {30, 26, 3362, 0x26a64, [4]level{{22, 30}, {45, 28}, {62, 30}, {74, 30}}}, // 38
  454. {24, 28, 3532, 0x27541, [4]level{{24, 30}, {47, 28}, {65, 30}, {77, 30}}}, // 39
  455. {28, 28, 3706, 0x28c69, [4]level{{25, 30}, {49, 28}, {68, 30}, {81, 30}}}, // 40
  456. }
  457. func grid(siz int) [][]Pixel {
  458. m := make([][]Pixel, siz)
  459. pix := make([]Pixel, siz*siz)
  460. for i := range m {
  461. m[i], pix = pix[:siz], pix[siz:]
  462. }
  463. return m
  464. }
  465. // vplan creates a Plan for the given version.
  466. func vplan(v Version) (*Plan, error) {
  467. p := &Plan{Version: v}
  468. if v < 1 || v > 40 {
  469. return nil, fmt.Errorf("invalid QR version %d", int(v))
  470. }
  471. siz := 17 + int(v)*4
  472. m := grid(siz)
  473. p.Pixel = m
  474. // Timing markers (overwritten by boxes).
  475. const ti = 6 // timing is in row/column 6 (counting from 0)
  476. for i := range m {
  477. p := Timing.Pixel()
  478. if i&1 == 0 {
  479. p |= Black
  480. }
  481. m[i][ti] = p
  482. m[ti][i] = p
  483. }
  484. // Position boxes.
  485. posBox(m, 0, 0)
  486. posBox(m, siz-7, 0)
  487. posBox(m, 0, siz-7)
  488. // Alignment boxes.
  489. info := &vtab[v]
  490. for x := 4; x+5 < siz; {
  491. for y := 4; y+5 < siz; {
  492. // don't overwrite timing markers
  493. if (x < 7 && y < 7) || (x < 7 && y+5 >= siz-7) || (x+5 >= siz-7 && y < 7) {
  494. } else {
  495. alignBox(m, x, y)
  496. }
  497. if y == 4 {
  498. y = info.apos
  499. } else {
  500. y += info.astride
  501. }
  502. }
  503. if x == 4 {
  504. x = info.apos
  505. } else {
  506. x += info.astride
  507. }
  508. }
  509. // Version pattern.
  510. pat := vtab[v].pattern
  511. if pat != 0 {
  512. v := pat
  513. for x := 0; x < 6; x++ {
  514. for y := 0; y < 3; y++ {
  515. p := PVersion.Pixel()
  516. if v&1 != 0 {
  517. p |= Black
  518. }
  519. m[siz-11+y][x] = p
  520. m[x][siz-11+y] = p
  521. v >>= 1
  522. }
  523. }
  524. }
  525. // One lonely black pixel
  526. m[siz-8][8] = Unused.Pixel() | Black
  527. return p, nil
  528. }
  529. // fplan adds the format pixels
  530. func fplan(l Level, m Mask, p *Plan) error {
  531. // Format pixels.
  532. fb := uint32(l^1) << 13 // level: L=01, M=00, Q=11, H=10
  533. fb |= uint32(m) << 10 // mask
  534. const formatPoly = 0x537
  535. rem := fb
  536. for i := 14; i >= 10; i-- {
  537. if rem&(1<<uint(i)) != 0 {
  538. rem ^= formatPoly << uint(i-10)
  539. }
  540. }
  541. fb |= rem
  542. invert := uint32(0x5412)
  543. siz := len(p.Pixel)
  544. for i := uint(0); i < 15; i++ {
  545. pix := Format.Pixel() + OffsetPixel(i)
  546. if (fb>>i)&1 == 1 {
  547. pix |= Black
  548. }
  549. if (invert>>i)&1 == 1 {
  550. pix ^= Invert | Black
  551. }
  552. // top left
  553. switch {
  554. case i < 6:
  555. p.Pixel[i][8] = pix
  556. case i < 8:
  557. p.Pixel[i+1][8] = pix
  558. case i < 9:
  559. p.Pixel[8][7] = pix
  560. default:
  561. p.Pixel[8][14-i] = pix
  562. }
  563. // bottom right
  564. switch {
  565. case i < 8:
  566. p.Pixel[8][siz-1-int(i)] = pix
  567. default:
  568. p.Pixel[siz-1-int(14-i)][8] = pix
  569. }
  570. }
  571. return nil
  572. }
  573. // lplan edits a version-only Plan to add information
  574. // about the error correction levels.
  575. func lplan(v Version, l Level, p *Plan) error {
  576. p.Level = l
  577. nblock := vtab[v].level[l].nblock
  578. ne := vtab[v].level[l].check
  579. nde := (vtab[v].bytes - ne*nblock) / nblock
  580. extra := (vtab[v].bytes - ne*nblock) % nblock
  581. dataBits := (nde*nblock + extra) * 8
  582. checkBits := ne * nblock * 8
  583. p.DataBytes = vtab[v].bytes - ne*nblock
  584. p.CheckBytes = ne * nblock
  585. p.Blocks = nblock
  586. // Make data + checksum pixels.
  587. data := make([]Pixel, dataBits)
  588. for i := range data {
  589. data[i] = Data.Pixel() | OffsetPixel(uint(i))
  590. }
  591. check := make([]Pixel, checkBits)
  592. for i := range check {
  593. check[i] = Check.Pixel() | OffsetPixel(uint(i+dataBits))
  594. }
  595. // Split into blocks.
  596. dataList := make([][]Pixel, nblock)
  597. checkList := make([][]Pixel, nblock)
  598. for i := 0; i < nblock; i++ {
  599. // The last few blocks have an extra data byte (8 pixels).
  600. nd := nde
  601. if i >= nblock-extra {
  602. nd++
  603. }
  604. dataList[i], data = data[0:nd*8], data[nd*8:]
  605. checkList[i], check = check[0:ne*8], check[ne*8:]
  606. }
  607. if len(data) != 0 || len(check) != 0 {
  608. panic("data/check math")
  609. }
  610. // Build up bit sequence, taking first byte of each block,
  611. // then second byte, and so on. Then checksums.
  612. bits := make([]Pixel, dataBits+checkBits)
  613. dst := bits
  614. for i := 0; i < nde+1; i++ {
  615. for _, b := range dataList {
  616. if i*8 < len(b) {
  617. copy(dst, b[i*8:(i+1)*8])
  618. dst = dst[8:]
  619. }
  620. }
  621. }
  622. for i := 0; i < ne; i++ {
  623. for _, b := range checkList {
  624. if i*8 < len(b) {
  625. copy(dst, b[i*8:(i+1)*8])
  626. dst = dst[8:]
  627. }
  628. }
  629. }
  630. if len(dst) != 0 {
  631. panic("dst math")
  632. }
  633. // Sweep up pair of columns,
  634. // then down, assigning to right then left pixel.
  635. // Repeat.
  636. // See Figure 2 of http://www.pclviewer.com/rs2/qrtopology.htm
  637. siz := len(p.Pixel)
  638. rem := make([]Pixel, 7)
  639. for i := range rem {
  640. rem[i] = Extra.Pixel()
  641. }
  642. src := append(bits, rem...)
  643. for x := siz; x > 0; {
  644. for y := siz - 1; y >= 0; y-- {
  645. if p.Pixel[y][x-1].Role() == 0 {
  646. p.Pixel[y][x-1], src = src[0], src[1:]
  647. }
  648. if p.Pixel[y][x-2].Role() == 0 {
  649. p.Pixel[y][x-2], src = src[0], src[1:]
  650. }
  651. }
  652. x -= 2
  653. if x == 7 { // vertical timing strip
  654. x--
  655. }
  656. for y := 0; y < siz; y++ {
  657. if p.Pixel[y][x-1].Role() == 0 {
  658. p.Pixel[y][x-1], src = src[0], src[1:]
  659. }
  660. if p.Pixel[y][x-2].Role() == 0 {
  661. p.Pixel[y][x-2], src = src[0], src[1:]
  662. }
  663. }
  664. x -= 2
  665. }
  666. return nil
  667. }
  668. // mplan edits a version+level-only Plan to add the mask.
  669. func mplan(m Mask, p *Plan) error {
  670. p.Mask = m
  671. for y, row := range p.Pixel {
  672. for x, pix := range row {
  673. if r := pix.Role(); (r == Data || r == Check || r == Extra) && p.Mask.Invert(y, x) {
  674. row[x] ^= Black | Invert
  675. }
  676. }
  677. }
  678. return nil
  679. }
  680. // posBox draws a position (large) box at upper left x, y.
  681. func posBox(m [][]Pixel, x, y int) {
  682. pos := Position.Pixel()
  683. // box
  684. for dy := 0; dy < 7; dy++ {
  685. for dx := 0; dx < 7; dx++ {
  686. p := pos
  687. if dx == 0 || dx == 6 || dy == 0 || dy == 6 || 2 <= dx && dx <= 4 && 2 <= dy && dy <= 4 {
  688. p |= Black
  689. }
  690. m[y+dy][x+dx] = p
  691. }
  692. }
  693. // white border
  694. for dy := -1; dy < 8; dy++ {
  695. if 0 <= y+dy && y+dy < len(m) {
  696. if x > 0 {
  697. m[y+dy][x-1] = pos
  698. }
  699. if x+7 < len(m) {
  700. m[y+dy][x+7] = pos
  701. }
  702. }
  703. }
  704. for dx := -1; dx < 8; dx++ {
  705. if 0 <= x+dx && x+dx < len(m) {
  706. if y > 0 {
  707. m[y-1][x+dx] = pos
  708. }
  709. if y+7 < len(m) {
  710. m[y+7][x+dx] = pos
  711. }
  712. }
  713. }
  714. }
  715. // alignBox draw an alignment (small) box at upper left x, y.
  716. func alignBox(m [][]Pixel, x, y int) {
  717. // box
  718. align := Alignment.Pixel()
  719. for dy := 0; dy < 5; dy++ {
  720. for dx := 0; dx < 5; dx++ {
  721. p := align
  722. if dx == 0 || dx == 4 || dy == 0 || dy == 4 || dx == 2 && dy == 2 {
  723. p |= Black
  724. }
  725. m[y+dy][x+dx] = p
  726. }
  727. }
  728. }