]> gitweb.factorcode.org Git - factor.git/blob - library/ui/paint.factor
0a00c06e7a79367bfc87715d3a8c279b73aee6ff
[factor.git] / library / ui / paint.factor
1 ! Copyright (C) 2005, 2006 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: alien arrays freetype generic hashtables io kernel
4 math namespaces opengl sequences strings styles
5 vectors ;
6 IN: gadgets
7
8 SYMBOL: clip
9
10 : init-gl ( dim -- )
11     GL_PROJECTION glMatrixMode
12     glLoadIdentity
13     GL_MODELVIEW glMatrixMode
14     glLoadIdentity
15     { 0 0 } over <rect> clip set
16     dup first2 0 0 2swap glViewport
17     0 over first2 0 gluOrtho2D
18     first2 0 0 2swap glScissor
19     GL_SMOOTH glShadeModel
20     GL_BLEND glEnable
21     GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA glBlendFunc
22     GL_SCISSOR_TEST glEnable
23     1.0 1.0 1.0 1.0 glClearColor
24     GL_COLOR_BUFFER_BIT glClear ;
25
26 GENERIC: draw-gadget* ( gadget -- )
27
28 M: gadget draw-gadget* drop ;
29
30 GENERIC: draw-interior ( gadget interior -- )
31
32 GENERIC: draw-boundary ( gadget boundary -- )
33
34 : visible-children ( gadget -- seq ) clip get swap children-on ;
35
36 DEFER: draw-gadget
37
38 : with-translation ( loc quot -- )
39     over translate over gl-translate
40     swap slip
41     vneg dup translate gl-translate ; inline
42
43 : (draw-gadget) ( gadget -- )
44     dup rect-loc [
45         dup dup gadget-interior draw-interior
46         dup draw-gadget*
47         dup visible-children [ draw-gadget ] each
48         dup gadget-boundary draw-boundary
49     ] with-translation ;
50
51 : change-clip ( gadget -- )
52     >absolute clip [ rect-intersect ] change ;
53
54 : clip-x/y ( loc dim -- x y )
55     >r [ first ] keep r>
56     [ second ] 2apply + world get rect-dim second swap - ;
57
58 : gl-set-clip ( loc dim -- )
59     [ clip-x/y ] keep first2 glScissor ;
60
61 : do-clip ( -- ) clip get rect-bounds gl-set-clip ;
62
63 : with-clipping ( gadget quot -- )
64     clip get >r
65     over change-clip do-clip call
66     r> clip set do-clip ; inline
67
68 : draw-gadget ( gadget -- )
69     {
70         { [ dup gadget-visible? not ] [ drop ] }
71         { [ dup gadget-clipped? not ] [ (draw-gadget) ] }
72         { [ t ] [ [ (draw-gadget) ] with-clipping ] }
73     } cond ;
74
75 : (draw-world) ( world -- )
76     dup world-handle [
77         dup rect-dim init-gl draw-gadget
78     ] with-gl-context ;
79
80 ! Pen paint properties
81 M: f draw-interior 2drop ;
82 M: f draw-boundary 2drop ;
83
84 ! Solid fill/border
85 TUPLE: solid color ;
86
87 ! Solid pen
88 M: solid draw-interior
89     solid-color gl-color rect-dim gl-fill-rect ;
90
91 M: solid draw-boundary
92     solid-color gl-color rect-dim gl-rect ;
93
94 ! Gradient pen
95 TUPLE: gradient colors ;
96
97 M: gradient draw-interior
98     over gadget-orientation swap gradient-colors rot rect-dim
99     gl-gradient ;
100
101 ! Polygon pen
102 TUPLE: polygon color points ;
103
104 : draw-polygon ( polygon quot -- )
105     >r dup polygon-color gl-color polygon-points r> each ; inline
106
107 M: polygon draw-boundary
108     [ gl-poly ] draw-polygon drop ;
109
110 M: polygon draw-interior
111     [ gl-fill-poly ] draw-polygon drop ;
112
113 : arrow-up    { { { 3 0 } { 6 6 } { 0 6 } } } ;
114 : arrow-right { { { 0 0 } { 6 3 } { 0 6 } } } ;
115 : arrow-down  { { { 0 0 } { 6 0 } { 3 6 } } } ;
116 : arrow-left  { { { 0 3 } { 6 0 } { 6 6 } } } ;
117
118 : <polygon-gadget> ( color points -- gadget )
119     dup { 0 0 } [ max-dim vmax ] reduce
120     >r <polygon> <gadget> r> over set-rect-dim
121     [ set-gadget-interior ] keep ;