private/version.rkt
#lang racket/base

(require racket/list
         racket/math
         "constants.rkt")

(provide (all-defined-out))

(define (qr-alignment-pattern-coords version)
  (vector-ref qr-alignment-coord-table (sub1 version)))

(define (qr-alignment-pattern-count version)
  (if (> version 1)
      (- (sqr (+ (quotient version 7)
                 2))
         3)
      0))

(define (qr-data/edc-block-sizes version edc-level)
  (let* ([ns (vector-ref (cadr (assq edc-level qr-edc-block-count-table))
                         (sub1 version))]
         [n1 (car ns)]
         [n2 (cadr ns)]
         [total-words (qr-word-count version)]
         [data-words (qr-data-word-count version edc-level)]
         [d1 (quotient data-words (+ n1 n2))]
         [d2 (add1 d1)]
         [e (quotient (- total-words data-words)
                      (+ n1 n2))])
    (values (append (make-list n1 d1)
                    (make-list n2 d2))
            (make-list (+ n1 n2) e))))

(define (qr-data+edc-module-count version)
  (- (qr-encoding-module-count version)
     (if (qr-has-format-information? version) 31 0)
     (if (qr-has-version-information? version) 36 0)))

(define (qr-data-word-count version edc-level)
  (vector-ref (cadr (assq edc-level qr-data-word-count-table))
              (sub1 version)))

(define (qr-encoding-module-count version)
  (- (qr-module-count version)
     (qr-function-module-count version)))

(define (qr-finder-pattern-count version)
  3)

(define (qr-function-module-count version)
  (+ (* (qr-alignment-pattern-count version) 25)
     (* (qr-finder-pattern-count version) 64)
     (qr-timing-module-count version)))

(define (qr-has-format-information? version)
  #t)

(define (qr-has-version-information? version)
  (>= version 7))

(define (qr-module-count version)
  (sqr (qr-size version)))

(define (qr-size version)
  (+ (* version 4) 17))

(define (qr-timing-module-count version)
  (* (- (qr-size version)
        16
        (* (quotient version 7)
           5))
     2))

(define (qr-word-count version)
  (quotient (qr-data+edc-module-count version) 8))