--- /dev/null
+(in-package #:clnl-gltk)
+
+(defvar *texture*)
+(defvar *base*)
+
+(defvar *font-data*
+ (let*
+ ; This is a small hack for resource loading. It will do until number of resources grows
+ ; to greater than 1.
+ ((font-locs
+ (list
+ "resources/clnl-gltk/font.dat"
+ (asdf:system-relative-pathname 'clnl-gltk "resources/clnl-gltk/font.dat")
+ (asdf:system-relative-pathname 'clnl-gltk "../../resources/clnl-gltk/font.dat")))
+ (font-loc
+ (or
+ (find-if (lambda (loc) (probe-file loc)) font-locs)
+ (error "Couldn't find font location!"))))
+ (with-open-file
+ (str font-loc :element-type 'unsigned-byte)
+ (let
+ ((seq (make-sequence 'vector (/ (* 4 (file-length str)) 3))))
+ (loop
+ :for idx :from 0
+ :for r := (read-byte str nil)
+ :for g := (read-byte str nil)
+ :for b := (read-byte str nil)
+ :while r
+ :do
+ (progn
+ (setf (aref seq (* idx 4)) r)
+ (setf (aref seq (+ (* idx 4) 1)) r)
+ (setf (aref seq (+ (* idx 4) 2)) r)
+ (setf (aref seq (+ (* idx 4) 3)) r)))
+ seq))))
+
+(defvar *font-width* 7
+ "*FONT-WIDTH*
+
+VALUE TYPE:
+
+ an integer
+
+INITIAL VALUE:
+
+ 7.
+
+DESCRIPTION:
+
+ The width of the font used by CLNL-GLTK.
+
+ This can be used to calculate appropriate sizes of things
+ that may have fonts displayed in them.")
+
+(defvar *font-height* 14
+ "*FONT-HEIGHT*
+
+VALUE TYPE:
+
+ an integer
+
+INITIAL VALUE:
+
+ 14
+
+DESCRIPTION:
+
+ The height of the font used by CLNL-GLTK.
+
+ This can be used to calculate appropriate sizes of things
+ that may have fonts displayed in them.")
+
+(defun font-print (str)
+ "FONT-PRINT STR => RESULT
+
+ARGUMENTS AND VALUES:
+
+ STR: a string to be printed to screen
+ RESULT: undefined
+
+DESCRIPTION:
+
+ FONT-PRINT prints STR to the screen.
+
+ It affirms no assumptions that are required for it to run, in the
+ interest of speed. Those assumptions include that an opengl window
+ has been opened, that all matrices are correct, and that SETUP-FONT
+ has been run.
+
+EXAMPLES:
+
+ (font-print #P\"Hello World\" t) => nil"
+ (gl:enable :texture-2d)
+ (gl:bind-texture :texture-2d *texture*)
+ (gl:list-base *base*)
+ (gl:call-lists (map 'vector (lambda (c) (- (char-code c) 32)) str))
+ (gl:disable :texture-2d))
+
+(defun setup-font ()
+ (setf *texture* (first (gl:gen-textures 1)))
+ (gl:bind-texture :texture-2d *texture*)
+ (gl:tex-parameter :texture-2d :texture-mag-filter :linear)
+ (gl:tex-parameter :texture-2d :texture-min-filter :linear)
+ (gl:tex-image-2d :texture-2d 0 :rgba8 (* *font-width* 224) *font-height* 0 :rgba :unsigned-byte *font-data*)
+ (setf *base* (gl:gen-lists 224))
+ (dotimes (l 224)
+ (gl:with-new-list ((+ *base* l) :compile)
+ (gl:begin :quads)
+ (gl:tex-coord (/ l 224d0) 1d0)
+ (gl:vertex 0 0)
+ (gl:tex-coord (/ (1+ l) 224d0) 1d0)
+ (gl:vertex *font-width* 0)
+ (gl:tex-coord (/ (1+ l) 224d0) 0d0)
+ (gl:vertex *font-width* *font-height*)
+ (gl:tex-coord (/ l 224d0) 0d0)
+ (gl:vertex 0 *font-height*)
+ (gl:end)
+ (gl:translate *font-width* 0 0))))