[mcclim-cvs] CVS mcclim/Experimental/freetype
ahefner
ahefner at common-lisp.net
Sun Jan 13 20:23:59 UTC 2008
Update of /project/mcclim/cvsroot/mcclim/Experimental/freetype
In directory clnet:/tmp/cvs-serv8112
Modified Files:
freetype-fonts.lisp
Log Message:
Attempt to improve handling of broken freetype paths.
Error immediately when a TTF file cannot be found. If call-next-method
here was a feature, I hope no one misses it. Added potentially helpful
restart.
--- /project/mcclim/cvsroot/mcclim/Experimental/freetype/freetype-fonts.lisp 2008/01/06 01:37:06 1.15
+++ /project/mcclim/cvsroot/mcclim/Experimental/freetype/freetype-fonts.lisp 2008/01/13 20:23:59 1.16
@@ -137,7 +137,7 @@
(or (pop (display-free-glyph-ids display))
(incf (display-free-glyph-id-counter display))))
-(defvar *font-hash*
+(defparameter *font-hash*
(make-hash-table :test #'equalp))
(defstruct (glyph-info (:constructor glyph-info (id width height left right top)))
@@ -386,7 +386,6 @@
;;; Here are alternate mappings for the DejaVu family of fonts, which
;;; are a derivative of Vera with improved unicode coverage.
-
#+NIL
(defparameter *families/faces*
'(((:FIX :ROMAN) . "DejaVuSansMono.ttf")
@@ -436,6 +435,24 @@
(defparameter *free-type-face-hash* (make-hash-table :test #'equal))
+(define-condition missing-font (simple-error)
+ ((filename :reader missing-font-filename :initarg :filename))
+ (:report (lambda (condition stream)
+ (format stream "Cannot access ~W~%Your *freetype-font-path* is currently ~W~%The following files should exist:~&~{ ~A~^~%~}"
+ (missing-font-filename condition)
+ *freetype-font-path*
+ (mapcar #'cdr *families/faces*)))))
+
+(defun invoke-with-freetype-path-restart (continuation)
+ (restart-case (funcall continuation)
+ (change-font-path (new-path)
+ :report (lambda (stream) (format stream "Retry with alternate freetype font path"))
+ :interactive (lambda ()
+ (format t "Enter new value: ")
+ (list (read-line)))
+ (setf *freetype-font-path* new-path)
+ (invoke-with-freetype-path-restart continuation))))
+
(let (lookaside)
(defmethod clim-clx::text-style-to-X-font :around ((port clim-clx::clx-port) (text-style standard-text-style))
(flet ((f ()
@@ -453,14 +470,18 @@
(let* ((font-path-relative (cdr (assoc (list family face) *families/faces*
:test #'equal)))
(font-path (namestring (merge-pathnames font-path-relative *freetype-font-path*))))
+ (unless (and font-path (probe-file font-path))
+ (error 'missing-font :filename font-path))
+ #+NIL
(if (and font-path (probe-file font-path))
(make-free-type-face display font-path size)
- (call-next-method)))))))
+ (call-next-method))
+ (make-free-type-face display font-path size))))))
(t
- (call-next-method)))))))
+ (call-next-method)))))))
(cdr (if (eq (car lookaside) text-style)
lookaside
- (setf lookaside (cons text-style (f))))))))
+ (setf lookaside (cons text-style (invoke-with-freetype-path-restart #'f))))))))
(defmethod clim-clx::text-style-to-X-font ((port clim-clx::clx-port) text-style)
(error "You lost: ~S." text-style))
More information about the Mcclim-cvs
mailing list