forked from mbattyani/cl-pdf
-
Notifications
You must be signed in to change notification settings - Fork 0
/
text.lisp
71 lines (63 loc) · 2.64 KB
/
text.lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
;;; cl-pdf copyright 2002-2003 Marc Battyani see license.txt for the details
;;; You can reach me at [email protected] or [email protected]
;;; The homepage of cl-pdf is here: http://www.fractalconcept.com/asp/html/cl-pdf.html
(in-package #:pdf)
;;; Basic (and crude) text layout functions
;;; use cl-typesetting for nice text layout functions
(defconstant +section-char+ (code-char 167)
"This character is not entered literally to avoid causing problems
with Lisps that read source files in UTF-8 encoding.")
(defvar *delimiter-chars* (list #\Space #\Tab #\Newline +section-char+))
(defun text-width (string font font-size)
(loop for c across string
summing (get-char-width c font font-size)))
(defun split-text (string font font-size max-width)
(if (> (* 2 (get-char-width #\M font font-size)) max-width)
(loop for c across string
collect (make-string 1 :initial-element c))
(let ((width 0)
(start 0)
(result ()))
(loop for i from 0
for c across string
for d = (get-char-width c font font-size) do
(if (or (char= c #\Newline)
(char= c +section-char+)
(> (+ width d) max-width))
(progn
(push (string-trim *delimiter-chars* (subseq string start i)) result)
(setf start i width 0))
(incf width d))
finally (push (string-trim *delimiter-chars* (subseq string start)) result))
(nreverse result))))
(defun draw-centered-text (x y string font font-size &optional max-width)
(pdf:in-text-mode
(pdf:move-text x y)
(pdf:set-font font font-size)
(loop with dy = (* -1.2 font-size)
for (str . rest) on (if max-width (split-text string font font-size max-width) (list string))
for last-x = 0 then offset
for offset = (* -0.5 (text-width str font font-size)) do
(move-text (- offset last-x) 0)
(show-text str)
(when rest (pdf:move-text 0 dy)))))
(defun draw-left-text (x y string font font-size &optional max-width)
(pdf:in-text-mode
(pdf:move-text x y)
(pdf:set-font font font-size)
(loop with dy = (* -1.2 font-size)
for (str . rest) on (if max-width (split-text string font font-size max-width) (list string))
for last-x = 0 then offset
for offset = (- (text-width str font font-size)) do
(move-text (- offset last-x) 0)
(show-text str)
(when rest (pdf:move-text 0 dy)))))
(defun draw-right-text (x y string font font-size &optional max-width)
(pdf:in-text-mode
(pdf:move-text x y)
(pdf:set-font font font-size)
(loop with dy = (* -1.2 font-size)
for (str . rest) on (if max-width (split-text string font font-size max-width) (list string))
do
(show-text str)
(when rest (move-text 0 dy)))))