                                                                       [screen-width screen-height 1.0])
                             :character-width character-width
                             :character-height character-height
+                            :character->col-row (character->col-row (character-idxs (displayable-characters boxy-font)))
                             :buffers {:vertices-vbo-id vertices-vbo-id
                                       :vertices-count vertices-count
                                       :texture-coords-vbo-id texture-coords-vbo-id}

                                line))
                 character-matrix))))

(log/info "character-layout" (str (vec character-idxs)))

;; Map [\character underline?] to [col row]
(def character->col-row
  (reduce (fn [m [c-underline? x y]]
            (assoc m c-underline? [x y]))
          {}
          character-idxs))

(defn make-glyph-image
  [char-width char-height font]
  ;; Adjust canvas to fit character atlas size
  (let [cwidth  (next-pow-2 (* char-width (int (inc (Math/sqrt (count characters))))))
        cheight (next-pow-2 (* char-height (int (inc (Math/sqrt (count characters))))))
        width   (max cwidth cheight)
        height  (max cwidth cheight)
        antialias true
        font-metrics  ^FontMetrics (.getFontMetrics (Canvas.) font)]
    (log/info "glyph image width" width "height" height)
    (let [texture-image    (BufferedImage. width height BufferedImage/TYPE_4BYTE_ABGR)
          texture-graphics ^Graphics (.getGraphics texture-image)
          white            (Color. 255 255 255 255)]


(defn- init-buffers []
  (let [vertices              (float-array [1.0   1.0  0.0,
                                            0.0   1.0  0.0
                                            0.0,  0.0 0.0
                                            1.0   0.0 0.0])
        texture-coords        (float-array [1.0 1.0
                                            0.0 1.0
