scx/scheme/xlib/gcontext.scm

237 lines
8.9 KiB
Scheme

;; Copyright (c) 2001-2003 by Norbert Freudemann, David Frese
;; GC is a pointer to a C structure
;; GContext is the protocol ID
;; *** GC type *******************************************************
(define-record-type gc :gc
(make-gc cpointer)
gc?
(cpointer gc-cpointer))
(define-exported-binding "scx-gc" :gc)
;; *** GC values and types *******************************************
(define-enumerated-type gc-function :gc-function
gc-function? gc-functions gc-function-name gc-function-index
(clear and and-reverse copy and-inverted no-op xor or nor equiv
invert or-reverse copy-inverted or-inverted nand set))
(define-exported-binding "scx-gc-function" :gc-function)
(define-exported-binding "scx-gc-functions" gc-functions)
(define-enumerated-type line-style :line-style
line-style? line-styles line-style-name line-style-index
(solid on-off-dash double-dash))
(define-exported-binding "scx-line-style" :line-style)
(define-exported-binding "scx-line-styles" line-styles)
(define-enumerated-type cap-style :cap-style
cap-style? cap-styles cap-style-name cap-style-index
(not-last butt round projecting))
(define-exported-binding "scx-cap-style" :cap-style)
(define-exported-binding "scx-cap-styles" cap-styles)
(define-enumerated-type join-style :join-style
join-style? join-styles join-style-name join-style-index
(miter round bevel))
(define-exported-binding "scx-join-style" :join-style)
(define-exported-binding "scx-join-styles" join-styles)
(define-enumerated-type fill-style :fill-style
fill-style? fill-styles fill-style-name fill-style-index
(solid tiled stippled opaque-stippled))
(define-exported-binding "scx-fill-style" :fill-style)
(define-exported-binding "scx-fill-styles" fill-styles)
(define-enumerated-type fill-rule :fill-rule
fill-rule? fill-rules fill-rule-name fill-rule-index
(even-odd winding))
(define-exported-binding "scx-fill-rule" :fill-rule)
(define-exported-binding "scx-fill-rules" fill-rules)
(define-enumerated-type subwindow-mode :subwindow-mode
subwindow-mode? subwindow-modes subwindow-mode-name subwindow-mode-index
(clip-by-children include-inferiors))
(define-exported-binding "scx-subwindow-mode" :subwindow-mode)
(define-exported-binding "scx-subwindow-modes" subwindow-modes)
(define-enumerated-type arc-mode :arc-mode
arc-mode? arc-modes arc-mode-name arc-mode-index
(chord pie-slice))
(define-exported-binding "scx-arc-mode" :arc-mode)
(define-exported-binding "scx-arc-modes" arc-modes)
(define-enumerated-type gc-value :gc-value
gc-value?
gc-values
gc-value-name
gc-value-index
(function plane-mask foreground background line-width line-style cap-style
join-style fill-style fill-rule tile stipple ts-x-origin ts-y-origin
font subwindow-mode graphics-exposures clip-x-origin clip-y-origin
clip-mask dash-offset dashes arc-mode))
(define all-gc-values (vector->list gc-values))
(define-exported-binding "scx-gc-value" :gc-value)
(define-exported-binding "scx-gc-values" gc-values)
(define-syntax make-gc-value-alist
(syntax-rules
()
((make-gc-value-alist (attr arg) rest ...)
(cons (cons (gc-value attr) arg)
(make-gc-value-alist rest ...)))
((make-gc-value-alist)
'())))
(define-enum-set-type gc-value-set :gc-value-set
gc-value-set? make-gc-value-set
gc-value gc-value? gc-values gc-value-index)
(define-exported-binding "scx-gc-value-set" :gc-value-set)
;; *** create or free graphics contexts ******************************
(import-xlib-function create-gc (display drawable gc-value-alist)
"scx_Create_Gc")
(import-xlib-function copy-gc! (display srck dest mask)
"scx_Copy_Gc")
(define (copy-gc display drawable src)
(let ((gc (create-gc display drawable '())))
(copy-gc! display src all-gc-values gc)
gc))
(import-xlib-function change-gc (display gc values)
"scx_Change_Gc")
(define (make-gc-setter name)
(lambda (display gc value)
(change-gc display gc (list (cons name value)))))
(define set-gc-function! (make-gc-setter (gc-value function)))
(define set-gc-plane-mask! (make-gc-setter (gc-value plane-mask)))
(define set-gc-foreground! (make-gc-setter (gc-value foreground)))
(define set-gc-background! (make-gc-setter (gc-value background)))
(define set-gc-line-width! (make-gc-setter (gc-value line-width)))
(define set-gc-line-style! (make-gc-setter (gc-value line-style)))
(define set-gc-cap-style! (make-gc-setter (gc-value cap-style)))
(define set-gc-join-style! (make-gc-setter (gc-value join-style)))
(define set-gc-fill-style! (make-gc-setter (gc-value fill-style)))
(define set-gc-fill-rule! (make-gc-setter (gc-value fill-rule)))
(define set-gc-arc-mode! (make-gc-setter (gc-value arc-mode)))
(define set-gc-tile! (make-gc-setter (gc-value tile)))
(define set-gc-stipple! (make-gc-setter (gc-value stipple)))
(define set-gc-ts-x-origin! (make-gc-setter (gc-value ts-x-origin)))
(define set-gc-ts-y-origin! (make-gc-setter (gc-value ts-y-origin)))
(define set-gc-font! (make-gc-setter (gc-value font)))
(define set-gc-subwindow-mode! (make-gc-setter (gc-value subwindow-mode)))
(define set-gc-graphics-exposures!
(make-gc-setter (gc-value graphics-exposures)))
(define set-gc-clip-x-origin! (make-gc-setter (gc-value clip-x-origin)))
(define set-gc-clip-y-origin! (make-gc-setter (gc-value clip-y-origin)))
(define set-gc-clip-mask! (make-gc-setter (gc-value clip-mask)))
(define set-gc-dash-offset! (make-gc-setter (gc-value dash-offset)))
(define set-gc-dashes! (make-gc-setter (gc-value dashes)))
(import-xlib-function get-gc-values (display gc values)
"scx_Get_Gc_Values")
(define (make-gc-getter name)
(lambda (display gc)
(let ((values (get-gc-values display gc (list name))))
(and values (cdr (assq name values))))))
(define gc-gc-function (make-gc-getter (gc-value function)))
(define gc-plane-mask (make-gc-getter (gc-value plane-mask)))
(define gc-foreground (make-gc-getter (gc-value foreground)))
(define gc-background (make-gc-getter (gc-value background)))
(define gc-line-width (make-gc-getter (gc-value line-width)))
(define gc-line-style (make-gc-getter (gc-value line-style)))
(define gc-cap-style (make-gc-getter (gc-value cap-style)))
(define gc-join-style (make-gc-getter (gc-value join-style)))
(define gc-fill-style (make-gc-getter (gc-value fill-style)))
(define gc-fill-rule (make-gc-getter (gc-value fill-rule)))
(define gc-arc-mode (make-gc-getter (gc-value arc-mode)))
(define gc-tile (make-gc-getter (gc-value tile)))
(define gc-stipple (make-gc-getter (gc-value stipple)))
(define gc-ts-x-origin (make-gc-getter (gc-value ts-x-origin)))
(define gc-ts-y-origin (make-gc-getter (gc-value ts-y-origin)))
(define gc-font (make-gc-getter (gc-value font)))
(define gc-subwindow-mode (make-gc-getter (gc-value subwindow-mode)))
(define gc-graphics-exposures (make-gc-getter (gc-value graphics-exposures)))
(define gc-clip-x-origin (make-gc-getter (gc-value clip-x-origin)))
(define gc-clip-y-origin (make-gc-getter (gc-value clip-y-origin)))
(define gc-clip-mask (make-gc-getter (gc-value clip-mask)))
(define gc-dash-offset (make-gc-getter (gc-value dash-offset)))
(define gc-dashes (make-gc-getter (gc-value dashes)))
(import-xlib-function free-gc (display gc)
"scx_Free_Gc")
(import-lambda-definition gcontext-from-gc (gc)
"scx_GContext_From_Gc")
;; *** GC convenience routines ***************************************
(define (set-line-attributes! display gc line-width line-style cap-style
join-style)
(change-gc display gc
(make-gc-value-alist (line-width line-width)
(line-style line-style)
(cap-style cap-style)
(join-style join-style))))
(import-xlib-function set-dashes! (display gc dashoffset dashlist)
"scx_Set_Dashes")
(define (set-clip-origin display gc x-origin y-origin)
(change-gc display gc
(make-gc-value-alist (clip-x-origin x-origin)
(clip-y-origin y-origin))))
(define-enumerated-type rectangle-ordering :rectangle-ordering
rectangle-ordering? rectangle-orderings
rectangle-ordering-name rectangle-ordering-index
(unsorted y-sorted xy-sorted xy-banded))
(define-exported-binding "scx-rectangle-ordering" :rectangle-ordering)
(define-exported-binding "scx-rectangle-orderings" rectangle-orderings)
;; rectangles has to be list of (x y width height) lists.
(import-xlib-function set-clip-rectangles!
(display gc x-origin y-origin rectangles ordering)
"scx_Set_Clip_Rectangles")
;; *** determine efficient sizes *************************************
;; returns a pair (width . height)
(import-lambda-definition %%query-best-size (screen class width height)
"scx_Query_Best_Size")
(define (%query-best-size screen class width height)
(call-xlib-function (screen:display screen) 'query-best-size
(lambda ()
(%%query-best-size screen class width height))))
(define (query-best-cursor screen width height)
(%query-best-size screen 0 width height))
(define (query-best-tile screen width height)
(%query-best-size screen 1 width height))
(define (query-best-stipple screen width height)
(%query-best-size screen 2 width height))