changed the text-representation from vectors to lists, added delta
statements, changed the internal processing and abstractions.
This commit is contained in:
parent
875610bc46
commit
5e0439da94
|
@ -2,6 +2,7 @@
|
|||
;; creation date : 16/07/2001
|
||||
;; last change : 19/07/2001
|
||||
|
||||
; --- Dimension-Predicates
|
||||
|
||||
(define (1-byte? int)
|
||||
(and (< 0 int) (> 255 int)))
|
||||
|
@ -9,50 +10,91 @@
|
|||
(define (2-byte? int)
|
||||
(and (< 0 int) (> 65535 int)))
|
||||
|
||||
; --- format is a number: 1 or 2. Make sure to call "change-format" before
|
||||
; useing this function!
|
||||
; --- verify-format checks wheather the text-vec elements are between correct
|
||||
; dimensions.
|
||||
|
||||
(define (vec-format? text-vec format)
|
||||
(let ((len (vector-length text-vec))
|
||||
(pred (cond ((and (number? format) (= 1 format))
|
||||
1-byte?)
|
||||
((and (number? format) (= 2 format))
|
||||
2-byte?)
|
||||
(else (error "Wrong format-type" vec-format?)))))
|
||||
(let loop ((i 0))
|
||||
(if (= i len)
|
||||
#t
|
||||
(if (pred (vector-ref text-vec i))
|
||||
(loop (+ i 1))
|
||||
#f)))))
|
||||
(define (verify-format text format)
|
||||
(let ((pred (if (eq? format '1-byte)
|
||||
1-byte?
|
||||
2-byte?)))
|
||||
(let loop ((t text))
|
||||
(cond
|
||||
((null? t) #f)
|
||||
((pred (car t)) (loop (cdr t)))
|
||||
(else (error "text doesnt' match format" text format))))))
|
||||
|
||||
; --- Makes a number (1 or 2) from the format-symbols '1-byte or '2-byte
|
||||
|
||||
(define (change-format format)
|
||||
(cond ((symbol? format)
|
||||
(cond ((eq? format '1-byte) 1)
|
||||
((eq? format '2-byte) 2)
|
||||
(else (error "Wrong format-type" change-format))))
|
||||
((number? format)
|
||||
(if (or (= 1 format) (= 2 format))
|
||||
format
|
||||
(error "Wrong format-type" change-format)))
|
||||
(else "Wrong format-type" change-format)))
|
||||
|
||||
(define (get-format-id format)
|
||||
(cond ((eq? format '1-byte) 0)
|
||||
((eq? format '2-byte) 1)
|
||||
(else (error "Unknown format specifier" format))))
|
||||
|
||||
; --- mixed-text->pure-text converts a list of integers, chars, symbols and
|
||||
; strings into a long list of integers (= the characters)
|
||||
|
||||
(define (mixed-text->pure-text list)
|
||||
(if (not (list? list))
|
||||
(mixed-text->pure-text (cons list '()))
|
||||
(let loop ((list list)
|
||||
(rev-list '()))
|
||||
(if (null? list)
|
||||
(reverse rev-list)
|
||||
(loop (cdr list)
|
||||
(let loop2 ((e (car list)))
|
||||
(cond
|
||||
((integer? e) (cons e rev-list))
|
||||
((char? e) (cons (char->ascii e) rev-list))
|
||||
((symbol? e) (loop2 (symbol->string e)))
|
||||
((string? e)
|
||||
(append (reverse
|
||||
(mixed-text->pure-text (string->list e)))
|
||||
rev-list))
|
||||
(else (error "wrong element in list" list e)))))))))
|
||||
|
||||
; --- separate-fonts converts a list of mixed types (including fonts) like this:
|
||||
; (13 "abc" font 'abc) -> ((13 "abc") font ('abc)) or
|
||||
; "abc" -> ("abc")
|
||||
|
||||
(define (separate-fonts lst)
|
||||
(cond
|
||||
((null? lst) lst)
|
||||
;; a single text-spec
|
||||
((not (list? lst)) (list lst))
|
||||
;; a font-spec
|
||||
((or (font? (car lst))
|
||||
(pair? (car lst)))
|
||||
(cons (car lst) (separate-fonts (cdr lst))))
|
||||
(else (let ((r (separate-fonts (cdr lst))))
|
||||
(cond
|
||||
;; first element is a font-spec:
|
||||
((or (null? r) (font? (car r)) (pair? (car r)))
|
||||
(cons (list (car lst)) r))
|
||||
;; first element is a text-spec, so add this one
|
||||
(else
|
||||
(cons (cons (car lst) (car r))
|
||||
(cdr r))))))))
|
||||
|
||||
; --- text->internal-text
|
||||
|
||||
(define (text->internal-text text format)
|
||||
(let ((t (mixed-text->pure-text text)))
|
||||
(verify-format t format)
|
||||
(list->vector t)))
|
||||
|
||||
|
||||
; --- text-width returns the widht of the given 1- or 2-byte char-string,
|
||||
; represented by a vector of integers.
|
||||
|
||||
(define (text-width font text format)
|
||||
(let ((int-format (change-format format)))
|
||||
(if (vec-format? text format)
|
||||
(%text-width (font-Xfontstruct font) text int-format)
|
||||
(error "Wrong format for text"))))
|
||||
|
||||
(%text-width (font-Xfontstruct font)
|
||||
(text->internal-text text format)
|
||||
(get-format-id format)))
|
||||
|
||||
(import-lambda-definition %text-width (Xfontstruct text format)
|
||||
"scx_Text_Width")
|
||||
|
||||
; --- Each extents-...-functions returns an number.
|
||||
; --- Each extents-...-functions returns a number.
|
||||
|
||||
(define (extents-lbearing font text format)
|
||||
(extents-intern font text format 0))
|
||||
|
@ -75,96 +117,55 @@
|
|||
|
||||
|
||||
(define (extents-intern font text format which?)
|
||||
(let ((int-format (change-format format)))
|
||||
(if (vec-format? text int-format)
|
||||
(%extents (font-Xfontstruct font)
|
||||
text int-format which?)
|
||||
(error "Wrong format for text!"))))
|
||||
(%extents (font-Xfontstruct font)
|
||||
(text->internal-text text format)
|
||||
(get-format-id format)
|
||||
which?))
|
||||
|
||||
(import-lambda-definition %extents-text (Xfontstruct text format which)
|
||||
"scx_Extents_Text")
|
||||
|
||||
; --- draw-image-text get's a mixed vector (text) with integer and
|
||||
; font-type inside.
|
||||
; --- draw-image-text draws the text. text is a integer, character, string
|
||||
; or symbol, or event a list of these types.
|
||||
|
||||
(define (draw-image-text drawable gcontext x y text format)
|
||||
(let ((int-format (change-format format)))
|
||||
(if (vec-format? text int-format)
|
||||
(%draw-image-text (display-Xdisplay (drawable-display drawable))
|
||||
(drawable-Xobject drawable)
|
||||
(gcontext-Xgcontext gcontext)
|
||||
x y text int-format)
|
||||
(error "Wrong format for text!"))))
|
||||
(%draw-image-text (display-Xdisplay (drawable-display drawable))
|
||||
(drawable-Xobject drawable)
|
||||
(gcontext-Xgcontext gcontext)
|
||||
x y
|
||||
(text->internal-text text format)
|
||||
(eq? format '2-byte)))
|
||||
|
||||
|
||||
(import-lambda-definition %draw-image-text (Xdisplay Xdrawable Xgcontext
|
||||
x y text format)
|
||||
"scx_Draw_Image_Text")
|
||||
|
||||
; --- text is a Vector of font-object and chars.
|
||||
; --- text is a list of font-object and chars.
|
||||
|
||||
(define (draw-poly-text drawable gcontext x y text format)
|
||||
(let ((vec-text (transform-text text))
|
||||
(int-format (change-format format)))
|
||||
(if (check-format vec-text int-format)
|
||||
(%draw-poly-text (display-Xdisplay (drawable-display drawable))
|
||||
(drawable-Xobject drawable) (gcontext-Xgcontext gcontext)
|
||||
x y vec-text int-format))))
|
||||
(let ((text-spec
|
||||
(map (lambda (text-or-font)
|
||||
(cond
|
||||
((font? text-or-font)
|
||||
(cons (font-Xfont text-or-font)
|
||||
0))
|
||||
((and (pair? text-or-font)
|
||||
(not (list? text-or-font)))
|
||||
(cons (if (font? (car text-or-font))
|
||||
(font-Xfont (car text-or-font))
|
||||
'none)
|
||||
(cdr text-or-font)))
|
||||
(else (text->internal-text text-or-font
|
||||
format))))
|
||||
(separate-fonts text))))
|
||||
(%draw-poly-text (display-Xdisplay (drawable-display drawable))
|
||||
(drawable-Xobject drawable)
|
||||
(gcontext-Xgcontext gcontext)
|
||||
x y
|
||||
(list->vector text-spec)
|
||||
(eq? format '2-byte))))
|
||||
|
||||
(import-lambda-definition %draw-poly-text (Xdisplay Xdrawable Xgcontext
|
||||
x y text format)
|
||||
x y text twobyte)
|
||||
"scx_Draw_Poly_Text")
|
||||
|
||||
(define (check-format (trans-text int-format))
|
||||
(call-with-current-continuation
|
||||
(lambda (return)
|
||||
(for-each (lambda (obj)
|
||||
(if (and (vector? obj)
|
||||
(not (vec-format? obj int-format)))
|
||||
(return #f)))
|
||||
(vector->list trans-text))
|
||||
#t)))
|
||||
|
||||
|
||||
; --- Extracts the Xfont from the scheme48-font-record and makes vectors
|
||||
; from formerly integer vector entries...
|
||||
; [13 24 35 font 3 5 34] -> [[13 24 35] Xfont [3 5 34]]
|
||||
|
||||
(define (transform-text text)
|
||||
(let ((len (vector-length text)))
|
||||
(let loop ((i 0)
|
||||
(res '())
|
||||
(tmp '()))
|
||||
(if (= i len)
|
||||
(if (not (null? tmp))
|
||||
(list->vector (append res (list (list->vector tmp))))
|
||||
(list->vector res))
|
||||
(let ((item (vector-ref text i)))
|
||||
(if (font? item)
|
||||
(if (not (null? tmp))
|
||||
(loop (+ i 1)
|
||||
(append res (list (list->vector tmp))
|
||||
(list (font-Xfont item)))
|
||||
'())
|
||||
(loop (+ i 1)
|
||||
(append res (list font-Xfont item))
|
||||
'()))
|
||||
(loop (+ i 1)
|
||||
res
|
||||
(append tmp (list item)))))))))
|
||||
|
||||
|
||||
|
||||
; --- Translates a string to it's representation (as a vector of int)
|
||||
; for the other text proedures like text-width, ... .
|
||||
; The format is '1-byte.
|
||||
|
||||
(define (translate-text string)
|
||||
(let* ((len (string-length string))
|
||||
(res-vec (make-vector len)))
|
||||
(let loop ((i 0))
|
||||
(if (= i len)
|
||||
res-vec
|
||||
(begin
|
||||
(vector-set! res-vec i (char->integer (string-ref string i)))
|
||||
(loop (+ i 1)))))))
|
||||
|
|
Loading…
Reference in New Issue