1#
2# "$Id: device.py 456 2009-09-25 13:35:05Z andreasheld $"
3#
4# Test program for pyFLTK the Python bindings
5# for the Fast Light Tool Kit (FLTK).
6#
7# FLTK copyright 1998-1999 by Bill Spitzak and others.
8# pyFLTK copyright 2011 by Andreas Held and others.
9#
10# This library is free software you can redistribute it and/or
11# modify it under the terms of the GNU Library General Public
12# License as published by the Free Software Foundation either
13# version 2 of the License, or (at your option) any later version.
14#
15# This library is distributed in the hope that it will be useful,
16# but WITHOUT ANY WARRANTY without even the implied warranty of
17# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18# Library General Public License for more details.
19#
20# You should have received a copy of the GNU Library General Public
21# License along with this library if not, write to the Free Software
22# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
23# USA.
24#
25# Please report all bugs and problems to "pyfltk-user@lists.sourceforge.net".
26#
27
28
29from fltk import *
30import sys, math
31
32porsche_xpm=[
33"64 64 4 1",
34" 	c #background",
35".	c #000000000000",
36"X	c #ffd100",
37"o	c #FFFF00000000",
38"                                                                ",
39"                   ..........................                   ",
40"              .....................................             ",
41"        ............XXXXXXXXXXXXXXXXXXXXXXXX............        ",
42"        ......XXXXXXX...XX...XXXXXXXX...XXXXXXXXXX......        ",
43"        ..XXXXXXXXXX..X..XX..XXXX.XXXX..XXXXXXXXXXXXXX..        ",
44"        ..XXXXXXXXXX..X..XX..XXX..XXXX..X...XXXXXXXXXX..        ",
45"        ..XXXXXXXXXX..XXXXX..XX.....XX..XX.XXXXXXXXXXX..        ",
46"        ..XXXXXXXXX.....XXX..XXX..XXXX..X.XXXXXXXXXXXX..        ",
47"        ..XXXXXXXXXX..XXXXX..XXX..XXXX....XXXXXXXXXXXX..        ",
48"        ..XXXXXXXXXX..XXXXX..XXX..XXXX..X..XXXXXXXXXXX..        ",
49"        ..XXXXXXXXXX..XXXXX..XXX..X.XX..XX..XXXXXXXXXX..        ",
50"        ..XXXXXXXXX....XXX....XXX..XX....XX..XXXXXXXXX..        ",
51"        ..XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..        ",
52"        ..XXXXXXXXX..........................XXXXXXXXX..        ",
53"        ..XXX.......XXXXXXXXXXX...................XXXX..        ",
54"        ......XX.XXX.XXX..XXXXX.........................        ",
55"        ..XXXXX.XXX.XXX.XXXX.XX.........................        ",
56"        ..XXXX.XXX.XX.......XXX.........................        ",
57"        ..XXXX.......XXXXXX..XX..ooooooooooooooooooooo..        ",
58"        ..X.....XXXXXXXXXXXXXXX..ooooooooooooooooooooo..        ",
59"        ..X...XXXXXXXXXXXXXXXXX..ooooooooooooooooooooo..        ",
60"        ..X..XXXXXXX.XX.XXXXXXX..ooooooooooooooooooooo..        ",
61"        ..XXXXX.XXX.XX.XXXXXXXX..ooooooooooooooooooooo..        ",
62"        ..XXXX.XXX.XX.XX................................        ",
63"        ..XXXX.X.........X....X.X.X.....................        ",
64"        ..XXXX...XXXXXXX.X..X...X.X.X.X.................        ",
65"        ..X....XXXXXXXXXX.X...X.X.X.....................        ",
66"        ..X...XXXXXXXXXX.XXXXXXXXXXXXXX.................        ",
67"        ..X..XXXXXX.XX.X.XXX...XXXXXXXX.................        ",
68"        ..XXXXX.XX.XX.XX.XX.....XXXXXXX.oooooooooooooo..        ",
69"        ..XXXX.XX.XX.XX..XX.X...XXXXX.X.oooooooooooooo..        ",
70"        ..XXXX.X.......X.XXXX...XXXX..X.oooooooooooooo..        ",
71"        ..X......XXXXXX..XXXX...XXXX..X.oooooooooooooo..        ",
72"        ..X...XXXXXXXXXX.XXX.....XXX.XX.oooooooooooooo..        ",
73"        ..X..XXXXXXXXXXX.X...........XX.oooooooooooooo..        ",
74"        .................X.X.........XX.................        ",
75"        .................X.X.XXXX....XX.XXXXXXXXXXXXXX..        ",
76"        .................XXX.XXXXX.X.XX.XXX.XX.XXXXXXX..        ",
77"         ................XXXX.XXX..X..X.XX.XX.XXX.XXX..         ",
78"         ................XXXXXXXX.XX.XX.X.XX.XXX.XXXX..         ",
79"         .................XXXXXX.XX.XX.X..........XXX..         ",
80"          ..oooooooooooooo.XXXXXXXXXX....XXXXXXXX..X..          ",
81"          ..ooooooooooooooo.XXXXXXXX....XXXXXXXXXXXX..          ",
82"           ..ooooooooooooooo........XXXXXXX.XX.XXXX..           ",
83"           ..oooooooooooooooooo..XXXXX.XXX.XX.XX.XX..           ",
84"            ..ooooooooooooooooo..XXXX.XXX.XX.XX.XX..            ",
85"            ..ooooooooooooooooo..XXX.XX........XXX..            ",
86"             ....................XXX....XXXXXX..X..             ",
87"              ...................XX...XXXXXXXXXXX.              ",
88"              ...................X...XXXXXXXXXXX..              ",
89"               ..................X..XXXX.XXXXXX..               ",
90"                .................XXX.XX.XX.XXX..                ",
91"                 ................XX.XX.XX.XXX..                 ",
92"                  ..ooooooooooo..XX.......XX..                  ",
93"                   ..oooooooooo..X...XXXX.X..                   ",
94"                    ..ooooooooo..X..XXXXXX..                    ",
95"                     ...ooooooo..X..XXXX...                     ",
96"                      ....ooooo..XXXXX....                      ",
97"                        ....ooo..XXX....                        ",
98"                          ....o..X....                          ",
99"                            ........                            ",
100"                              ....                              ",
101"                                                                "]
102
103
104sorceress_width = 75
105sorceress_height = 75
106sorceress_bits = [
107   0xfc, 0x7e, 0x40, 0x20, 0x90, 0x00, 0x07, 0x80, 0x23, 0x00, 0x00, 0xc6,
108   0xc1, 0x41, 0x98, 0xb8, 0x01, 0x07, 0x66, 0x00, 0x15, 0x9f, 0x03, 0x47,
109   0x8c, 0xc6, 0xdc, 0x7b, 0xcc, 0x00, 0xb0, 0x71, 0x0e, 0x4d, 0x06, 0x66,
110   0x73, 0x8e, 0x8f, 0x01, 0x18, 0xc4, 0x39, 0x4b, 0x02, 0x23, 0x0c, 0x04,
111   0x1e, 0x03, 0x0c, 0x08, 0xc7, 0xef, 0x08, 0x30, 0x06, 0x07, 0x1c, 0x02,
112   0x06, 0x30, 0x18, 0xae, 0xc8, 0x98, 0x3f, 0x78, 0x20, 0x06, 0x02, 0x20,
113   0x60, 0xa0, 0xc4, 0x1d, 0xc0, 0xff, 0x41, 0x04, 0xfa, 0x63, 0x80, 0xa1,
114   0xa4, 0x3d, 0x00, 0x84, 0xbf, 0x04, 0x0f, 0x06, 0xfc, 0xa1, 0x34, 0x6b,
115   0x01, 0x1c, 0xc9, 0x05, 0x06, 0xc7, 0x06, 0xbe, 0x11, 0x1e, 0x43, 0x30,
116   0x91, 0x05, 0xc3, 0x61, 0x02, 0x30, 0x1b, 0x30, 0xcc, 0x20, 0x11, 0x00,
117   0xc1, 0x3c, 0x03, 0x20, 0x0a, 0x00, 0xe8, 0x60, 0x21, 0x00, 0x61, 0x1b,
118   0xc1, 0x63, 0x08, 0xf0, 0xc6, 0xc7, 0x21, 0x03, 0xf8, 0x08, 0xe1, 0xcf,
119   0x0a, 0xfc, 0x4d, 0x99, 0x43, 0x07, 0x3c, 0x0c, 0xf1, 0x9f, 0x0b, 0xfc,
120   0x5b, 0x81, 0x47, 0x02, 0x16, 0x04, 0x31, 0x1c, 0x0b, 0x1f, 0x17, 0x89,
121   0x4d, 0x06, 0x1a, 0x04, 0x31, 0x38, 0x02, 0x07, 0x56, 0x89, 0x49, 0x04,
122   0x0b, 0x04, 0xb1, 0x72, 0x82, 0xa1, 0x54, 0x9a, 0x49, 0x04, 0x1d, 0x66,
123   0x50, 0xe7, 0xc2, 0xf0, 0x54, 0x9a, 0x58, 0x04, 0x0d, 0x62, 0xc1, 0x1f,
124   0x44, 0xfc, 0x51, 0x90, 0x90, 0x04, 0x86, 0x63, 0xe0, 0x74, 0x04, 0xef,
125   0x31, 0x1a, 0x91, 0x00, 0x02, 0xe2, 0xc1, 0xfd, 0x84, 0xf9, 0x30, 0x0a,
126   0x91, 0x00, 0x82, 0xa9, 0xc0, 0xb9, 0x84, 0xf9, 0x31, 0x16, 0x81, 0x00,
127   0x42, 0xa9, 0xdb, 0x7f, 0x0c, 0xff, 0x1c, 0x16, 0x11, 0x00, 0x02, 0x28,
128   0x0b, 0x07, 0x08, 0x60, 0x1c, 0x02, 0x91, 0x00, 0x46, 0x29, 0x0e, 0x00,
129   0x00, 0x00, 0x10, 0x16, 0x11, 0x02, 0x06, 0x29, 0x04, 0x00, 0x00, 0x00,
130   0x10, 0x16, 0x91, 0x06, 0xa6, 0x2a, 0x04, 0x00, 0x00, 0x00, 0x18, 0x24,
131   0x91, 0x04, 0x86, 0x2a, 0x04, 0x00, 0x00, 0x00, 0x18, 0x27, 0x93, 0x04,
132   0x96, 0x4a, 0x04, 0x00, 0x00, 0x00, 0x04, 0x02, 0x91, 0x04, 0x86, 0x4a,
133   0x0c, 0x00, 0x00, 0x00, 0x1e, 0x23, 0x93, 0x04, 0x56, 0x88, 0x08, 0x00,
134   0x00, 0x00, 0x90, 0x21, 0x93, 0x04, 0x52, 0x0a, 0x09, 0x80, 0x01, 0x00,
135   0xd0, 0x21, 0x95, 0x04, 0x57, 0x0a, 0x0f, 0x80, 0x27, 0x00, 0xd8, 0x20,
136   0x9d, 0x04, 0x5d, 0x08, 0x1c, 0x80, 0x67, 0x00, 0xe4, 0x01, 0x85, 0x04,
137   0x79, 0x8a, 0x3f, 0x00, 0x00, 0x00, 0xf4, 0x11, 0x85, 0x06, 0x39, 0x08,
138   0x7d, 0x00, 0x00, 0x18, 0xb7, 0x10, 0x81, 0x03, 0x29, 0x12, 0xcb, 0x00,
139   0x7e, 0x30, 0x28, 0x00, 0x85, 0x03, 0x29, 0x10, 0xbe, 0x81, 0xff, 0x27,
140   0x0c, 0x10, 0x85, 0x03, 0x29, 0x32, 0xfa, 0xc1, 0xff, 0x27, 0x94, 0x11,
141   0x85, 0x03, 0x28, 0x20, 0x6c, 0xe1, 0xff, 0x07, 0x0c, 0x01, 0x85, 0x01,
142   0x28, 0x62, 0x5c, 0xe3, 0x8f, 0x03, 0x4e, 0x91, 0x80, 0x05, 0x39, 0x40,
143   0xf4, 0xc2, 0xff, 0x00, 0x9f, 0x91, 0x84, 0x05, 0x31, 0xc6, 0xe8, 0x07,
144   0x7f, 0x80, 0xcd, 0x00, 0xc4, 0x04, 0x31, 0x06, 0xc9, 0x0e, 0x00, 0xc0,
145   0x48, 0x88, 0xe0, 0x04, 0x79, 0x04, 0xdb, 0x12, 0x00, 0x30, 0x0c, 0xc8,
146   0xe4, 0x04, 0x6d, 0x06, 0xb6, 0x23, 0x00, 0x18, 0x1c, 0xc0, 0x84, 0x04,
147   0x25, 0x0c, 0xff, 0xc2, 0x00, 0x4e, 0x06, 0xb0, 0x80, 0x04, 0x3f, 0x8a,
148   0xb3, 0x83, 0xff, 0xc3, 0x03, 0x91, 0x84, 0x04, 0x2e, 0xd8, 0x0f, 0x3f,
149   0x00, 0x00, 0x5f, 0x83, 0x84, 0x04, 0x2a, 0x70, 0xfd, 0x7f, 0x00, 0x00,
150   0xc8, 0xc0, 0x84, 0x04, 0x4b, 0xe2, 0x2f, 0x01, 0x00, 0x08, 0x58, 0x60,
151   0x80, 0x04, 0x5b, 0x82, 0xff, 0x01, 0x00, 0x08, 0xd0, 0xa0, 0x84, 0x04,
152   0x72, 0x80, 0xe5, 0x00, 0x00, 0x08, 0xd2, 0x20, 0x44, 0x04, 0xca, 0x02,
153   0xff, 0x00, 0x00, 0x08, 0xde, 0xa0, 0x44, 0x04, 0x82, 0x02, 0x6d, 0x00,
154   0x00, 0x08, 0xf6, 0xb0, 0x40, 0x02, 0x82, 0x07, 0x3f, 0x00, 0x00, 0x08,
155   0x44, 0x58, 0x44, 0x02, 0x93, 0x3f, 0x1f, 0x00, 0x00, 0x30, 0x88, 0x4f,
156   0x44, 0x03, 0x83, 0x23, 0x3e, 0x00, 0x00, 0x00, 0x18, 0x60, 0xe0, 0x07,
157   0xe3, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x70, 0x70, 0xe4, 0x07, 0xc7, 0x1b,
158   0xfe, 0x01, 0x00, 0x00, 0xe0, 0x3c, 0xe4, 0x07, 0xc7, 0xe3, 0xfe, 0x1f,
159   0x00, 0x00, 0xff, 0x1f, 0xfc, 0x07, 0xc7, 0x03, 0xf8, 0x33, 0x00, 0xc0,
160   0xf0, 0x07, 0xff, 0x07, 0x87, 0x02, 0xfc, 0x43, 0x00, 0x60, 0xf0, 0xff,
161   0xff, 0x07, 0x8f, 0x06, 0xbe, 0x87, 0x00, 0x30, 0xf8, 0xff, 0xff, 0x07,
162   0x8f, 0x14, 0x9c, 0x8f, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x07, 0x9f, 0x8d,
163   0x8a, 0x0f, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0xbf, 0x0b, 0x80, 0x1f,
164   0x00, 0x00, 0xff, 0xff, 0xff, 0x07, 0x7f, 0x3a, 0x80, 0x3f, 0x00, 0x80,
165   0xff, 0xff, 0xff, 0x07, 0xff, 0x20, 0xc0, 0x3f, 0x00, 0x80, 0xff, 0xff,
166   0xff, 0x07, 0xff, 0x01, 0xe0, 0x7f, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x07,
167   0xff, 0x0f, 0xf8, 0xff, 0x40, 0xe0, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff,
168   0xff, 0xff, 0x40, 0xf0, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff,
169   0x41, 0xf0, 0xff, 0xff, 0xff, 0x07 ]
170
171
172class MyWidget(Fl_Box):
173    def __init__(self, x, y):
174        Fl_Box.__init__(self, x,y,100,100, "Clipping and rect(f):\nYellow rect.framed\nby B-Y-G-R rect. 1 p.\nthick. Your printer may \nrender very thin lines\nsurrounding \"X\"")
175        self.align(FL_ALIGN_TOP)
176        self.labelsize(10)
177
178    def draw(self):
179        Fl_Box.draw(self)
180        fl_color(FL_RED)
181        fl_rectf(self.x()+5,self.y()+5,self.w()-10,self.h()-10)
182        fl_push_clip(self.x()+6,self.y()+6,self.w()-12,self.h()-12)
183        fl_color(FL_DARK_GREEN)
184        fl_rectf(self.x()+5,self.y()+5,self.w()-10,self.h()-10)
185        fl_pop_clip()
186        fl_color(FL_YELLOW)
187        fl_rectf(self.x()+7,self.y()+7,self.w()-14,self.h()-14)
188        fl_color(FL_BLUE)
189
190        fl_rect(self.x()+8,self.y()+8,self.w()-16,self.h()-16)
191        fl_push_clip(self.x()+25,self.y()+25,self.w()-50, self.h()-50)
192        fl_color(FL_BLACK)
193        fl_rect(self.x()+24,self.y()+24,self.w()-48,self.h()-48)
194        fl_line(self.x()+27,self.y()+27,self.x()+self.w()-27,self.y()+self.h()-27)
195        fl_line(self.x()+27,self.y()+self.h()-27,self.x()+self.w()-27,self.y()+27)
196        fl_pop_clip()
197
198
199
200class MyWidget2(Fl_Box):
201    def __init__(self, x, y):
202        Fl_Box.__init__(self,x,y,100,100, "Integer primitives")
203        self.labelsize(10)
204        self.align(FL_ALIGN_TOP)
205
206    def draw(self):
207        Fl_Box.draw(self)
208        d = self.y()+5
209        while d < 48+self.y():
210            fl_xyline(self.x()+5,d,self.x()+48)
211            d = d+2
212
213        fl_push_clip(self.x()+52,self.y()+5,45,43)
214        d = self.y()+5
215        while d < 150+self.y():
216            fl_line(self.x()+52,d,self.x()+92,d-40)
217            d = d+3
218
219        fl_pop_clip()
220
221        fl_line_style(FL_DASH)
222        fl_xyline(self.x()+5,self.y()+55,self.x()+48)
223        fl_line_style(FL_DOT)
224        fl_xyline(self.x()+5,self.y()+58,self.x()+48)
225        fl_line_style(FL_DASHDOT)
226        fl_xyline(self.x()+5,self.y()+61,self.x()+48)
227        fl_line_style(FL_DASHDOTDOT)
228        fl_xyline(self.x()+5,self.y()+64,self.x()+48)
229        fl_line_style(0,0,"\7\3\7\2")
230        fl_xyline(self.x()+5,self.y()+67,self.x()+48)
231
232        fl_line_style(0)
233
234        fl_line(self.x()+5,self.y()+72,self.x()+25,self.y()+95)
235        fl_line(self.x()+8,self.y()+72,self.x()+28,self.y()+95,self.x()+31,self.y()+72)
236
237        fl_color(FL_YELLOW)
238        fl_polygon(self.x()+11, self.y()+72,self.x()+27,self.y()+91,self.x()+29,self.y()+72)
239        fl_color(FL_RED)
240        fl_loop(self.x()+11, self.y()+72,self.x()+27,self.y()+91,self.x()+29,self.y()+72)
241
242        fl_color(FL_BLUE)
243        fl_line_style(FL_SOLID, 6)
244        fl_loop(self.x()+31,self.y()+12,self.x()+47,self.y()+31,self.x()+49,self.y()+12)
245        fl_line_style(0)
246
247        fl_color(200,0,200)
248        fl_polygon(self.x()+35,self.y()+72,self.x()+33,self.y()+95,self.x()+48,self.y()+95,self.x()+43,self.y()+72)
249        fl_color(FL_GREEN)
250        fl_loop(self.x()+35,self.y()+72,self.x()+33,self.y()+95,self.x()+48,self.y()+95,self.x()+43,self.y()+72)
251
252        fl_color(FL_BLUE)
253        fl_yxline(self.x()+65,self.y()+63,self.y()+66)
254        fl_color(FL_GREEN)
255        fl_yxline(self.x()+66,self.y()+66,self.y()+63)
256
257        fl_color(FL_BLUE)
258        fl_rect(self.x()+80,self.y()+55,5,5)
259        fl_color(FL_YELLOW)
260        fl_rectf(self.x()+81,self.y()+56,3,3)
261        fl_color(FL_BLACK)
262        fl_point(self.x()+82,self.y()+57)
263
264        fl_color(FL_BLUE)
265        fl_rect(self.x()+56, self.y()+79, 24, 17)
266        fl_color(FL_CYAN)
267        fl_rectf(self.x()+57, self.y()+80, 22 , 15 )
268        fl_color(FL_RED)
269        fl_arc(self.x()+57, self.y()+80, 22 ,15 ,40, 270)
270        fl_color(FL_YELLOW)
271        fl_pie(self.x()+58, self.y()+81, 20 ,13 ,40, 270)
272
273        fl_line_style(0)
274
275
276        fl_color(FL_BLACK)
277        fl_point(self.x()+58,self.y()+58)
278        fl_color(FL_RED)
279        fl_yxline(self.x()+59,self.y()+58,self.y()+59)
280        fl_color(FL_GREEN)
281        fl_yxline(self.x()+60,self.y()+59,self.y()+58)
282        fl_color(FL_BLACK)
283        fl_xyline(self.x()+61,self.y()+58,self.x()+62)
284        fl_color(FL_RED)
285        fl_xyline(self.x()+62,self.y()+59,self.x()+61)
286
287        fl_color(FL_GREEN)
288        fl_yxline(self.x()+57,self.y()+58,self.y()+59,self.x()+58)
289        fl_color(FL_BLUE)
290        fl_xyline(self.x()+58,self.y()+60,self.x()+56,self.y()+58)
291        fl_color(FL_RED)
292        fl_xyline(self.x()+58,self.y()+61,self.x()+56,self.y()+63)
293        fl_color(FL_GREEN)
294        fl_yxline(self.x()+57,self.y()+63,self.y()+62,self.x()+58)
295
296        fl_color(FL_BLUE)
297        fl_line(self.x()+58,self.y()+63, self.x()+60, self.y()+65)
298        fl_color(FL_BLACK)
299        fl_line(self.x()+61,self.y()+65, self.x()+59, self.y()+63)
300
301        fl_color(FL_BLACK)
302
303
304class MyWidget3(Fl_Box):
305    def __init__(self, x, y):
306        Fl_Box.__init__(self, x,y,100,100, "Sub-pixel drawing of\nlines 1.63 points apart\nOn the screen you\ncan see aliasing, the\nprinter should render\nthem properly")
307        self.labelsize(10)
308        self.align(FL_ALIGN_TOP)
309
310    def draw(self):
311        Fl_Box.draw(self)
312        fl_push_clip(self.x()+5,self.y()+5,45,43)
313        d = self.y()+5.0
314        while d < 95+self.y():
315            fl_begin_line()
316            fl_vertex(self.x()+5,d)
317            fl_vertex(self.x()+48,d)
318            fl_end_line()
319            d = d+1.63
320
321        fl_pop_clip()
322
323        fl_push_clip(self.x()+52,self.y()+5,45,43)
324        d = self.y()+5.0
325        while d < 150+self.y():
326            fl_begin_line()
327            fl_vertex(self.x()+52,d)
328            fl_vertex(self.x()+92,d-43)
329            fl_end_line()
330            d = d+2.3052
331
332        fl_pop_clip()
333
334
335class MyWidget4(Fl_Box):
336    def __init__(self, x, y):
337        Fl_Box.__init__(self, x,y,150,150, "Line styles")
338        self.labelsize(10)
339        self.align(FL_ALIGN_TOP)
340
341    def draw(self):
342        Fl_Box.draw(self)
343        fl_push_matrix()
344        fl_translate(self.x(),self.y())
345        fl_scale(.75,.75)
346
347        fl_line_style(FL_SOLID , 5)
348        fl_begin_line()
349        fl_vertex(10, 160)
350        fl_vertex(40, 160)
351        fl_vertex(40, 190)
352        fl_end_line()
353        fl_line_style(0)
354
355
356        fl_color(FL_RED)
357        fl_line_style(FL_SOLID | FL_CAP_FLAT |FL_JOIN_MITER , 5)
358        fl_begin_line()
359        fl_vertex(10, 150)
360        fl_vertex(50, 150)
361        fl_vertex(50, 190)
362        fl_end_line()
363        fl_line_style(0)
364
365        fl_color(FL_GREEN)
366        fl_line_style(FL_SOLID | FL_CAP_ROUND |FL_JOIN_ROUND , 5)
367        fl_begin_line()
368        fl_vertex(10, 140)
369        fl_vertex(60, 140)
370        fl_vertex(60, 190)
371        fl_end_line()
372        fl_line_style(0)
373
374        fl_color(FL_BLUE)
375        fl_line_style(FL_SOLID | FL_CAP_SQUARE |FL_JOIN_BEVEL , 5)
376        fl_begin_line()
377        fl_vertex(10, 130)
378        fl_vertex(70, 130)
379        fl_vertex(70, 190)
380        fl_end_line()
381        fl_line_style(0)
382
383        fl_color(FL_BLACK)
384        fl_line_style(FL_DASH , 5)
385        fl_begin_line()
386        fl_vertex(10, 120)
387        fl_vertex(80, 120)
388        fl_vertex(80, 190)
389        fl_end_line()
390        fl_line_style(0)
391
392        fl_color(FL_RED)
393        fl_line_style(FL_DASH |FL_CAP_FLAT , 5)
394        fl_begin_line()
395        fl_vertex(10, 110)
396        fl_vertex(90, 110)
397        fl_vertex(90, 190)
398        fl_end_line()
399        fl_line_style(0)
400
401        fl_color(FL_GREEN)
402        fl_line_style(FL_DASH |FL_CAP_ROUND , 5)
403        fl_begin_line()
404        fl_vertex(10, 100)
405        fl_vertex(100, 100)
406        fl_vertex(100, 190)
407        fl_end_line()
408        fl_line_style(0)
409
410        fl_color(FL_BLUE)
411        fl_line_style(FL_DASH |FL_CAP_SQUARE , 5)
412        fl_begin_line()
413        fl_vertex(10, 90)
414        fl_vertex(110, 90)
415        fl_vertex(110, 190)
416        fl_end_line()
417        fl_line_style(0)
418
419        fl_color(FL_BLACK)
420        fl_line_style(FL_DOT, 5)
421        fl_begin_line()
422        fl_vertex(10, 80)
423        fl_vertex(120, 80)
424        fl_vertex(120, 190)
425        fl_end_line()
426        fl_line_style(0)
427
428        fl_color(FL_RED)
429        fl_line_style(FL_DOT | FL_CAP_FLAT, 5)
430        fl_begin_line()
431        fl_vertex(10, 70)
432        fl_vertex(130, 70)
433        fl_vertex(130, 190)
434        fl_end_line()
435        fl_line_style(0)
436
437        fl_color(FL_GREEN)
438        fl_line_style(FL_DOT | FL_CAP_ROUND, 5)
439        fl_begin_line()
440        fl_vertex(10, 60)
441        fl_vertex(140, 60)
442        fl_vertex(140, 190)
443        fl_end_line()
444        fl_line_style(0)
445
446        fl_color(FL_BLUE)
447        fl_line_style(FL_DOT | FL_CAP_SQUARE, 5)
448        fl_begin_line()
449        fl_vertex(10, 50)
450        fl_vertex(150, 50)
451        fl_vertex(150, 190)
452        fl_end_line()
453        fl_line_style(0)
454
455        fl_color(FL_BLACK)
456        fl_line_style(FL_DASHDOT |FL_CAP_ROUND |FL_JOIN_ROUND , 5)
457        fl_begin_line()
458        fl_vertex(10, 40)
459        fl_vertex(160, 40)
460        fl_vertex(160, 190)
461        fl_end_line()
462        fl_line_style(0)
463
464        fl_color(FL_RED)
465        fl_line_style(FL_DASHDOTDOT |FL_CAP_SQUARE |FL_JOIN_BEVEL , 5)
466        fl_begin_line()
467        fl_vertex(10, 30)
468        fl_vertex(170, 30)
469        fl_vertex(170, 190)
470        fl_end_line()
471        fl_line_style(0)
472
473        fl_color(FL_GREEN)
474        fl_line_style(FL_DASHDOTDOT |FL_CAP_ROUND |FL_JOIN_ROUND , 5)
475        fl_begin_line()
476        fl_vertex(10, 20)
477        fl_vertex(180, 20)
478        fl_vertex(180, 190)
479        fl_end_line()
480        fl_line_style(0)
481
482        fl_color(FL_BLUE)
483        fl_line_style(0, 5, "\12\3\4\2\2\1")
484        fl_begin_line()
485        fl_vertex(10, 10)
486        fl_vertex(190, 10)
487        fl_vertex(190, 190)
488
489        fl_end_line()
490        fl_line_style(0)
491        fl_pop_matrix()
492
493        fl_color(FL_BLACK)
494
495
496
497class MyWidget5(Fl_Box):
498    def __init__(self, x, y):
499        Fl_Box.__init__(self,x,y,230,250, "Complex (double) drawings:\nBlue ellipse may not be\ncorrectly transformed\ndue to non-orthogonal\ntransformation")
500        self.labelsize(10)
501        self.align(FL_ALIGN_TOP)
502
503    def draw(self):
504        Fl_Box.draw(self)
505        fl_push_matrix()
506
507        fl_translate(self.x(),self.y())
508        fl_push_matrix()
509        fl_mult_matrix(1,3,0,1,0,-20)
510        fl_color(FL_GREEN)
511        fl_begin_polygon()
512        fl_vertex(10,10)
513        fl_vertex(100,-80)
514        fl_vertex(100,-190)
515        fl_end_polygon()
516
517        fl_color(FL_RED)
518        fl_line_style(FL_DASHDOT, 7)
519        fl_begin_loop()
520
521        fl_vertex(10,10)
522        fl_vertex(100,-80)
523        fl_vertex(100,-190)
524        fl_end_loop()
525        fl_line_style(0)
526
527        fl_color(FL_BLUE)
528        fl_line_style(FL_SOLID, 3)
529        fl_begin_loop()
530        fl_circle(60,-50,30)
531        fl_end_loop()
532        fl_line_style(0)
533
534        fl_pop_matrix()
535        fl_scale(1.8,1)
536
537        fl_color(FL_YELLOW)
538        fl_begin_polygon()
539        fl_arc(30,90,20,-45,200)
540        fl_end_polygon()
541
542        fl_color(FL_BLACK)
543        fl_line_style(FL_DASH, 3)
544        fl_begin_line()
545        fl_arc(30,90,20,-45,200)
546        fl_end_line()
547        fl_line_style(0)
548
549        fl_translate(15,0)
550        fl_scale(1.5,3)
551        fl_begin_complex_polygon()
552        fl_vertex(30,70)
553        fl_arc(45,55,10,200,90)
554        fl_arc(55,45,8,-170,20)
555        fl_vertex(60,40)
556        fl_vertex(30,20)
557        fl_vertex(40,5)
558        fl_vertex(60,25)
559        fl_curve(35,30,30,53,0,35,65,65)
560        fl_gap()
561        fl_vertex(50,25)
562        fl_vertex(40,10)
563        fl_vertex(35,20)
564        fl_end_complex_polygon()
565
566        fl_pop_matrix()
567
568image = []
569width = 80
570height = 80
571
572def make_image():
573    p = image
574    index = 0
575
576    y = 0
577    while y < height:
578        dy = float(y)/(height-1)
579        x = 0
580        while x < width:
581            dx = float(x)/(width-1)
582            p.append(int(255*((1.0-dx)*(1.0-dy))))
583            index = index+1
584            p.append(int(255*((1.0-dx)*dy)))
585            index = index+1
586            p.append(int(255*(dx*dy)))
587            index = index+1
588            dx = dx-0.5
589            dy = dy-0.5
590            alpha = int(255*math.sqrt(dx*dx+dy*dy))
591            if alpha < 255:
592                p.append(alpha)
593            else:
594                p.append(255)
595            index = index+1
596            dy = dy+0.5
597            x = x+1
598        y = y+1
599
600    return None
601
602
603def print_cb(widget, w):
604    p = Fl_Printer()
605    if (p.start_job(1) == 0):
606        p.start_page()
607        p.print_widget(w)
608        p.end_page()
609        p.end_job()
610
611
612class My_Button(Fl_Button):
613    def __init__(self, x, y, w, h, label = 0):
614        Fl_Button.__init__(self, x,y,w,h,label)
615
616    def draw(self):
617        if (self.type() == FL_HIDDEN_BUTTON):
618            return
619        col = self.color()
620        if self.value() != 0:
621            col = self.selection_color()
622        boxtype = fl_down(self.box())
623        if self.down_box():
624            boxtype = self.down_box()
625        #self.draw_box(boxtype, col)
626
627        fl_color(FL_WHITE)
628        fl_line_style(FL_SOLID,5)
629        fl_line(self.x()+15,self.y()+10,self.x()+self.w()-15,self.y()+self.h()-23)
630        fl_line(self.x()+self.w()-15,self.y()+10,self.x()+15,self.y()+self.h()-23)
631        fl_line_style(0)
632        self.draw_label()
633
634
635if __name__=='__main__':
636    #Fl.scheme("plastic")
637
638    window = Fl_Window(500,560,"Graphics test")
639
640
641    c2 = Fl_Group(3, 43, 494, 514 )
642
643    w1 = MyWidget(10,140)
644    w2 = MyWidget2(110,80)
645    w3 = MyWidget3(220,140)
646    w4 = MyWidget4(330,70)
647    w5 = MyWidget5(140,270)
648
649    make_image()
650    rgb = Fl_RGB_Image(image, width, height, 4)
651    b_rgb = My_Button(10,245,100,100,"RGB with alpha")
652    b_rgb.image(rgb)
653
654    b_pixmap = My_Button(10,345,100,100,"Pixmap")
655    pixmap = Fl_Pixmap(porsche_xpm)
656    b_pixmap.image(pixmap)
657
658    b_bitmap = My_Button(10,445,100,100,"Bitmap")
659    b_bitmap.labelcolor(FL_GREEN)
660    b_bitmap.image(Fl_Bitmap(sorceress_bits,sorceress_width,sorceress_height))
661
662    clock = Fl_Clock(360,230,120,120)
663    ret = Fl_Return_Button (360, 360, 120,30, "Return")
664    ret.deactivate()
665    but1 = Fl_Button(360, 390, 30, 30, "@->|")
666    but1.labelcolor(FL_DARK3)
667    but2 = Fl_Button(390, 390, 30, 30, "@UpArrow")
668    but2.labelcolor(FL_DARK3)
669    but3 = Fl_Button(420, 390, 30, 30, "@DnArrow")
670    but3.labelcolor(FL_DARK3)
671    but4 = Fl_Button(450, 390, 30, 30, "@+")
672    but4.labelcolor(FL_DARK3)
673    but5 = Fl_Button(360, 425, 120, 30, "Hello, World")
674    but5.labelfont(FL_BOLD|FL_ITALIC)
675    but5.labeltype(FL_SHADOW_LABEL)
676    but5.box(FL_ROUND_UP_BOX)
677
678
679    but6 = Fl_Button(360, 460, 120, 30, "Plastic")
680    but6.box(FL_PLASTIC_UP_BOX)
681
682    o1 = Fl_Group(360, 495, 120, 40)
683    o1.box(FL_UP_BOX)
684    o2 = Fl_Group(365, 500, 110, 30)
685    o2.box(FL_THIN_UP_FRAME)
686    rnd_btn = Fl_Round_Button(365, 500, 40, 30, "rad")
687    rnd_btn.value(1)
688    chk_btn = Fl_Check_Button(410, 500, 60, 30, "check")
689    chk_btn.value(1)
690    o2.end()
691    o1.end()
692    o1.deactivate()
693
694
695    tx = Fl_Box(120,492,230,50,"Background is not printed because\nencapsulating group, which we are\n printing, has not set the box type")
696    tx.box(FL_SHADOW_BOX)
697    tx.labelsize(12)
698
699    c2.end()
700    b4 = Fl_Button(10,5, 150, 25, "Print")
701    b4.callback(print_cb,c2)
702
703    window.end()
704    window.show(sys.argv)
705
706
707    Fl.run()
708