factor/library/ui/paint.factor

78 lines
2.1 KiB
Factor
Raw Normal View History

2005-01-31 14:02:09 -05:00
! Copyright (C) 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license.
IN: gadgets
2005-02-26 02:11:25 -05:00
USING: generic hashtables kernel lists math namespaces sdl
2005-03-07 00:39:57 -05:00
stdio strings ;
2005-01-31 14:02:09 -05:00
2005-02-27 03:48:27 -05:00
! Clipping
SYMBOL: clip
: intersect* ( gadget rect quot -- t1 t2 )
2005-04-09 18:30:46 -04:00
call >r >r max r> r> min 2dup > [ drop dup ] when ; inline
2005-02-27 03:48:27 -05:00
: intersect-x ( gadget rect -- x1 x2 )
[
2005-03-01 18:55:25 -05:00
0 rectangle-x-extents >r swap 0 rectangle-x-extents r>
2005-02-27 03:48:27 -05:00
] intersect* ;
: intersect-y ( gadget rect -- y1 y2 )
[
2005-03-01 18:55:25 -05:00
0 rectangle-y-extents >r swap 0 rectangle-y-extents r>
2005-02-27 03:48:27 -05:00
] intersect* ;
2005-03-01 18:55:25 -05:00
: screen-bounds ( shape -- rect )
[ shape-x x get + ] keep
[ shape-y y get + ] keep
2005-03-02 21:26:11 -05:00
[ shape-w ] keep
shape-h
2005-03-01 18:55:25 -05:00
<rectangle> ;
2005-02-27 03:48:27 -05:00
: clip-rect ( x1 x2 y1 y2 -- rect )
2005-03-01 18:55:25 -05:00
over - 0 max >r >r over - 0 max r> swap r>
<rectangle> ;
2005-02-27 03:48:27 -05:00
2005-03-01 18:55:25 -05:00
: intersect ( rect rect -- rect )
2005-02-27 03:48:27 -05:00
[ intersect-x ] 2keep intersect-y clip-rect ;
2005-03-01 22:19:26 -05:00
: >sdl-rect ( rectangle -- sdlrect )
[ rectangle-x ] keep
[ rectangle-y ] keep
[ rectangle-w ] keep
rectangle-h
make-rect ;
2005-02-27 16:51:12 -05:00
: set-clip ( rect -- ? )
#! The top/left corner of the clip rectangle is the location
#! of the gadget on the screen. The bottom/right is the
#! intersected clip rectangle. Return t if the clip region
#! is an empty region.
surface get swap [ >sdl-rect SDL_SetClipRect drop ] keep
dup shape-w 0 = swap shape-h 0 = or ;
2005-02-27 03:48:27 -05:00
: with-clip ( shape quot -- )
2005-02-27 16:51:12 -05:00
#! All drawing done inside the quotation is clipped to the
#! shape's bounds. The quotation is called with a boolean
2005-05-05 23:58:45 -04:00
#! that is set to false if the gadget is entirely clipped.
2005-02-27 16:51:12 -05:00
[
2005-03-06 19:46:29 -05:00
>r screen-bounds clip [ intersect dup ] change set-clip
r> call
2005-02-27 16:51:12 -05:00
] with-scope ; inline
2005-02-27 03:48:27 -05:00
: draw-gadget ( gadget -- )
#! All drawing done inside draw-shape is done with the
#! gadget's paint. If the gadget does not have any custom
#! paint, just call the quotation.
2005-04-30 14:27:40 -04:00
f over set-gadget-redraw?
2005-02-27 03:48:27 -05:00
dup gadget-paint [
2005-05-05 23:58:45 -04:00
dup [
2005-02-27 16:51:12 -05:00
[
drop
] [
2005-03-01 18:55:25 -05:00
dup draw-shape dup [
2005-02-27 16:51:12 -05:00
gadget-children [ draw-gadget ] each
] with-trans
] ifte
2005-02-27 03:48:27 -05:00
] with-clip
] bind ;