1 #include <fstream>
2 #include <iostream>
3 #include <memory>
4 #include <sstream>
5 #include <string>
6 
7 #include "dlib/image_io.h"
8 #include "dlib/array2d.h"
9 #include "dlib/gui_core.h"
10 #include "dlib/assert.h"
11 #include "dlib/misc_api.h"
12 
13 #include "dlib/image_transforms.h"
14 
15 #include "dlib/timer.h"
16 
17 #include "dlib/gui_widgets.h"
18 #include "dlib/queue.h"
19 
20 using namespace dlib;
21 using namespace std;
22 
23 
24 typedef dlib::array2d<hsi_pixel> image;
25 
26 
27 
28 
29 #include "dlib/base64.h"
30 
31 
32 
33 
34 class color_box : public draggable
35 {
36     unsigned char red, green,blue;
37 
38 public:
color_box(drawable_window & w,rectangle area,unsigned char red_,unsigned char green_,unsigned char blue_)39     color_box (
40         drawable_window& w,
41         rectangle area,
42         unsigned char red_,
43         unsigned char green_,
44         unsigned char blue_
45     ) :
46         draggable(w, MOUSE_WHEEL),
47         red(red_),
48         green(green_),
49         blue(blue_),
50         t(*this,&color_box::action)
51     {
52         rect = area;
53 
54         t.set_delay_time(4);
55         // t.start();
56 
57         set_draggable_area(rectangle(10,10,500,500));
58 
59         enable_events();
60     }
61 
~color_box()62     ~color_box()
63     {
64         disable_events();
65     }
66 
67 private:
68 
action()69     void action (
70         )
71     {
72         ++red;
73         parent.invalidate_rectangle(rect);
74     }
75 
draw(const canvas & c) const76     void draw (
77         const canvas& c
78     ) const
79     {
80         if (hidden == false )
81         {
82             fill_rect(c,rect,rgb_pixel(red,green,blue));
83             std::vector<point> poly;
84             poly.push_back((rect.tl_corner()+rect.tr_corner())/2);
85             poly.push_back((rect.tr_corner()+rect.br_corner())/2);
86             poly.push_back((rect.br_corner()+rect.bl_corner())/2);
87             poly.push_back((rect.bl_corner()+rect.tl_corner())/2);
88             draw_solid_convex_polygon(c,poly,rgb_alpha_pixel(0,0,0,70));
89         }
90     }
91 
on_wheel_up(unsigned long state)92     void on_wheel_up(
93         unsigned long state
94     )
95     {
96         if (state == base_window::NONE)
97             cout << "up scroll, NONE" << endl;
98         else if (state&base_window::LEFT)
99             cout << "up scroll, LEFT" << endl;
100         else if (state&base_window::RIGHT)
101             cout << "up scroll, RIGHT" << endl;
102         else if (state&base_window::MIDDLE)
103             cout << "up scroll, MIDDLE" << endl;
104         else if (state&base_window::SHIFT)
105             cout << "up scroll, SHIFT" << endl;
106         else if (state&base_window::CONTROL)
107             cout << "up scroll, CONTROL" << endl;
108 
109     }
110 
on_wheel_down(unsigned long state)111     void on_wheel_down(
112         unsigned long state
113     )
114     {
115 
116         if (state == base_window::NONE)
117             cout << "down scroll, NONE" << endl;
118         else if (state&base_window::LEFT)
119             cout << "down scroll, LEFT" << endl;
120         else if (state&base_window::RIGHT)
121             cout << "down scroll, RIGHT" << endl;
122         else if (state&base_window::MIDDLE)
123             cout << "down scroll, MIDDLE" << endl;
124         else if (state&base_window::SHIFT)
125             cout << "down scroll, SHIFT" << endl;
126         else if (state&base_window::CONTROL)
127             cout << "down scroll, CONTROL" << endl;
128 
129     }
130 
131 
on_window_resized()132     void on_window_resized ()
133     {
134         draggable::on_window_resized();
135     }
136     timer<color_box> t;
137 };
138 
139 
140 
141 
142 
143 
144 class win : public drawable_window
145 {
146 
147     label lbl_last_keydown;
148     label lbl_mod_shift;
149     label lbl_mod_control;
150     label lbl_mod_alt;
151     label lbl_mod_meta;
152     label lbl_mod_caps_lock;
153     label lbl_mod_num_lock;
154     label lbl_mod_scroll_lock;
on_keydown(unsigned long key,bool is_printable,unsigned long state)155     void on_keydown (
156         unsigned long key,
157         bool is_printable,
158         unsigned long state
159     )
160     {
161         if (is_printable)
162             lbl_last_keydown.set_text(string("last keydown: ") + (char)key);
163         else
164             lbl_last_keydown.set_text(string("last keydown: nonprintable"));
165 
166         if (state&base_window::KBD_MOD_SHIFT)
167             lbl_mod_shift.set_text("shift is on");
168         else
169             lbl_mod_shift.set_text("shift is off");
170 
171         if (state&base_window::KBD_MOD_CONTROL)
172             lbl_mod_control.set_text("control is on");
173         else
174             lbl_mod_control.set_text("control is off");
175 
176         if (state&base_window::KBD_MOD_ALT)
177             lbl_mod_alt.set_text("alt is on");
178         else
179             lbl_mod_alt.set_text("alt is off");
180 
181 
182         if (state&base_window::KBD_MOD_META)
183             lbl_mod_meta.set_text("meta is on");
184         else
185             lbl_mod_meta.set_text("meta is off");
186 
187         if (state&base_window::KBD_MOD_CAPS_LOCK)
188             lbl_mod_caps_lock.set_text("caps_lock is on");
189         else
190             lbl_mod_caps_lock.set_text("caps_lock is off");
191 
192         if (state&base_window::KBD_MOD_NUM_LOCK)
193             lbl_mod_num_lock.set_text("num_lock is on");
194         else
195             lbl_mod_num_lock.set_text("num_lock is off");
196 
197 
198         if (state&base_window::KBD_MOD_SCROLL_LOCK)
199             lbl_mod_scroll_lock.set_text("scroll_lock is on");
200         else
201             lbl_mod_scroll_lock.set_text("scroll_lock is off");
202 
203         drawable_window::on_keydown(key,is_printable,state);
204     }
205 
rb_click()206     void rb_click (
207     )
208     {
209         if (rb.is_checked())
210             rb.set_name("radio button checked");
211         else
212             rb.set_name("radio button");
213         rb.set_checked();
214     }
215 
cb_sb_enabled(toggle_button &)216     void cb_sb_enabled (
217         toggle_button&
218     )
219     {
220         if (sb_enabled.is_checked())
221         {
222             sb.enable();
223             lb.enable();
224             b.enable();
225         }
226         else
227         {
228             lb.disable();
229             sb.disable();
230             b.disable();
231         }
232 
233         if (sb_enabled.is_checked())
234             rb.enable();
235         else
236             rb.disable();
237 
238         if (sb_enabled.is_checked())
239             tabs.enable();
240         else
241             tabs.disable();
242 
243         if (sb_enabled.is_checked())
244             tf.enable();
245         else
246             tf.disable();
247 
248         if (sb_enabled.is_checked())
249             tb.enable();
250         else
251             tb.disable();
252 
253     }
254 
cb_sb_shown()255     void cb_sb_shown (
256     )
257     {
258         if (sb_shown.is_checked())
259         {
260             sb.show();
261             tabs.show();
262             lb.show();
263         }
264         else
265         {
266             sb.hide();
267             tabs.hide();
268             lb.hide();
269         }
270     }
271 
272 
tab_change(unsigned long new_idx,unsigned long)273     void tab_change (
274         unsigned long new_idx,
275         unsigned long
276     )
277     {
278         tab_label.set_text(tabs.tab_name(new_idx));
279     }
280 
scroll_handler()281     void scroll_handler (
282     )
283     {
284         ostringstream sout;
285         sout << "scroll bar pos: " << sb.slider_pos();
286         sbl.set_text(sout.str());
287     }
288 
scroll2_handler()289     void scroll2_handler (
290     )
291     {
292         sb.set_length(sb2.slider_pos());
293         ostringstream sout;
294         sout << "scroll bar2 pos: " << sb2.slider_pos();
295         sbl2.set_text(sout.str());
296         scroll_handler();
297     }
298 
scroll3_handler()299     void scroll3_handler (
300     )
301     {
302         sb.set_max_slider_pos(sb3.slider_pos());
303         ostringstream sout;
304         sout << "scroll bar3 pos: " << sb3.slider_pos();
305         sbl3.set_text(sout.str());
306         scroll_handler();
307     }
308 
lb_double_click(unsigned long)309     void lb_double_click (
310         unsigned long
311     )
312     {
313         dlib::queue<unsigned long>::kernel_2a_c sel;
314         lb.get_selected(sel);
315         sel.reset();
316         while (sel.move_next())
317         {
318             cout << lb[sel.element()] << endl;
319         }
320         //message_box("list_box",lb[idx]);
321     }
322 
msg_box()323     void msg_box (
324     )
325     {
326         message_box("title","you clicked the ok button!\n HURRAY!");
327     }
328 
try_this_junk(void * param)329 	static void try_this_junk (
330 		void* param
331 		)
332 	{
333 		win& p = *reinterpret_cast<win*>(param);
334         put_on_clipboard(p.tf.text() + "\nfoobar");
335 
336 
337 	}
338 
on_set_clipboard()339     void on_set_clipboard (
340     )
341     {
342         create_new_thread(try_this_junk,this);
343 		//try_this_junk(this);
344     }
345 
try_this_junk2(void *)346 	static void try_this_junk2 (
347 		void*
348 		)
349 	{
350 
351         string temp;
352         get_from_clipboard(temp);
353         message_box("clipboard",temp);
354 
355 	}
on_get_clipboard()356     void on_get_clipboard (
357     )
358     {
359         create_new_thread(try_this_junk2,this);
360     }
361 
362 
on_show_msg_click()363     void on_show_msg_click (
364     )
365     {
366         message_box("title","This is a test message.",*this,&win::msg_box);
367     }
368 
on_menu_help()369     void on_menu_help (
370     )
371     {
372         message_box("About","This is the messy dlib gui regression test program");
373     }
374 
375 public:
376 
~win()377     ~win()
378     {
379         close_window();
380     }
381 
cbox_clicked()382     void cbox_clicked (
383     )
384     {
385         if (cbox.is_checked())
386             cbl.set_text(cbox.name() + " box is checked");
387         else
388             cbl.set_text("box NOT is checked");
389     }
390 
win()391     win (
392     ):
393         drawable_window(true),
394         lbl_last_keydown(*this),
395         lbl_mod_shift(*this),
396         lbl_mod_control(*this),
397         lbl_mod_alt(*this),
398         lbl_mod_meta(*this),
399         lbl_mod_caps_lock(*this),
400         lbl_mod_num_lock(*this),
401         lbl_mod_scroll_lock(*this),
402         b(*this),
403         btn_count(*this),
404         btn_get_clipboard(*this),
405         btn_set_clipboard(*this),
406         btn_show_message(*this),
407         cb1(*this,rectangle(100,100,200,200),255,0,0),
408         cb2(*this,rectangle(150,150,250,240),0,255,0),
409         cbl(*this),
410         cbox(*this),
411         group1(*this),
412         group2(*this),
413         group3(*this),
414         keyboard_count(1),
415         keydown(*this),
416         keyup(*this),
417         l1(*this),
418         l2(*this),
419         l3(*this),
420         lb(*this),
421         leave_count(*this),
422         left_down(*this),
423         left_up(*this),
424         middle_down(*this),
425         middle_up(*this),
426         mouse_state(*this),
427         mt(*this),
428         nrect(*this),
429         pos(*this),
430         rb(*this),
431         right_down(*this),
432         right_up(*this),
433         sb2(*this,scroll_bar::VERTICAL),
434         sb3(*this,scroll_bar::VERTICAL),
435         sb_enabled(*this),
436         sbl2(*this),
437         sbl3(*this),
438         sbl(*this),
439         sb_shown(*this),
440         sb(*this,scroll_bar::HORIZONTAL),
441         scroll(*this),
442         tab_label(*this),
443         tabs(*this),
444         tf(*this),
445         tb(*this),
446         mbar(*this)
447     {
448         bool use_bdf_fonts = false;
449 
450         std::shared_ptr<bdf_font> f(new bdf_font);
451 
452         if (use_bdf_fonts)
453         {
454 
455             ifstream fin("/home/davis/source/10x20.bdf");
456             f->read_bdf_file(fin,0xFFFF);
457 
458             mt.set_main_font(f);
459         }
460         //mt.hide();
461         mt.set_pos(5,200);
462 
463 
464         lbl_last_keydown.set_text("?");
465         lbl_mod_shift.set_text("?");
466         lbl_mod_control.set_text("?");
467         lbl_mod_alt.set_text("?");
468         lbl_mod_meta.set_text("?");
469         lbl_mod_caps_lock.set_text("?");
470         lbl_mod_num_lock.set_text("?");
471         lbl_mod_scroll_lock.set_text("?");
472 
473         lbl_last_keydown.set_pos(20,420);
474         lbl_mod_shift.set_pos(20,lbl_last_keydown.bottom()+5);
475         lbl_mod_control.set_pos(20,lbl_mod_shift.bottom()+5);
476         lbl_mod_alt.set_pos(20,lbl_mod_control.bottom()+5);
477         lbl_mod_meta.set_pos(20,lbl_mod_alt.bottom()+5);
478         lbl_mod_caps_lock.set_pos(20,lbl_mod_meta.bottom()+5);
479         lbl_mod_num_lock.set_pos(20,lbl_mod_caps_lock.bottom()+5);
480         lbl_mod_scroll_lock.set_pos(20,lbl_mod_num_lock.bottom()+5);
481 
482         lb.set_pos(580,200);
483         lb.set_size(200,300);
484         if (use_bdf_fonts)
485             lb.set_main_font(f);
486 
487         dlib::queue<string>::kernel_2a_c qos;
488         string a;
489         a = "Davis"; qos.enqueue(a);
490         a = "king"; qos.enqueue(a);
491         a = "one"; qos.enqueue(a);
492         a = "two"; qos.enqueue(a);
493         a = "three"; qos.enqueue(a);
494         a = "yo yo yo alsdkjf asfj lsa jfsf\n this is a long phrase"; qos.enqueue(a);
495         a = "four"; qos.enqueue(a);
496         a = "five"; qos.enqueue(a);
497         a = "six"; qos.enqueue(a);
498         a = "seven"; qos.enqueue(a);
499         a = "eight"; qos.enqueue(a);
500         a = "nine"; qos.enqueue(a);
501         a = "ten"; qos.enqueue(a);
502         a = "eleven"; qos.enqueue(a);
503         a = "twelve"; qos.enqueue(a);
504         for (int i = 0; i < 1000; ++i)
505         {
506             a = "thirteen"; qos.enqueue(a);
507         }
508         lb.load(qos);
509         lb.select(1);
510         lb.select(2);
511         lb.select(3);
512         lb.select(5);
513         lb.enable_multiple_select();
514         lb.set_double_click_handler(*this,&win::lb_double_click);
515         //        lb.disable_multiple_select();
516 
517         btn_show_message.set_pos(50,350);
518         btn_show_message.set_name("message_box()");
519         mbar.set_number_of_menus(2);
520         mbar.set_menu_name(0,"File",'F');
521         mbar.set_menu_name(1,"Help",'H');
522         mbar.menu(0).add_menu_item(menu_item_text("show msg click",*this,&win::on_show_msg_click,'s'));
523         mbar.menu(0).add_menu_item(menu_item_text("get clipboard",*this,&win::on_get_clipboard,'g'));
524         mbar.menu(0).add_menu_item(menu_item_text("set clipboard",*this,&win::on_set_clipboard,'c'));
525         mbar.menu(0).add_menu_item(menu_item_separator());
526         mbar.menu(0).add_submenu(menu_item_submenu("submenu",'m'), submenu);
527         submenu.add_menu_item(menu_item_separator());
528         submenu.add_menu_item(menu_item_separator());
529         submenu.add_menu_item(menu_item_text("show msg click",*this,&win::on_show_msg_click,'s'));
530         submenu.add_menu_item(menu_item_text("get clipboard",*this,&win::on_get_clipboard,'g'));
531         submenu.add_menu_item(menu_item_text("set clipboard",*this,&win::on_set_clipboard,'c'));
532         submenu.add_menu_item(menu_item_separator());
533         submenu.add_menu_item(menu_item_separator());
534         mbar.menu(1).add_menu_item(menu_item_text("About",*this,&win::on_menu_help,'A'));
535 
536         btn_show_message.set_click_handler(*this,&win::on_show_msg_click);
537         btn_get_clipboard.set_pos(btn_show_message.right()+5,btn_show_message.top());
538         btn_get_clipboard.set_name("get_from_clipboard()");
539         btn_get_clipboard.set_click_handler(*this,&win::on_get_clipboard);
540 
541         btn_get_clipboard.set_style(button_style_toolbar1());
542         btn_set_clipboard.set_pos(btn_get_clipboard.right()+5,btn_get_clipboard.top());
543         btn_set_clipboard.set_name("put_on_clipboard()");
544         btn_set_clipboard.set_click_handler(*this,&win::on_set_clipboard);
545 
546         nrect.set_size(700,500);
547         nrect.set_name("test widgets");
548         nrect.set_pos(2,mbar.bottom()+2);
549 
550         //throw dlib::error("holy crap batman");
551         tab_label.set_pos(10,440);
552 
553         tabs.set_click_handler(*this,&win::tab_change);
554         tabs.set_pos(5,mbar.bottom()+10);
555         tabs.set_size(280,100);
556         tabs.set_number_of_tabs(3);
557         tabs.set_tab_name(0,"davis");
558         tabs.set_tab_name(1,"edward");
559         tabs.set_tab_name(2,"king alsklsdkfj asfd");
560         tabs.set_tab_group(0,group1);
561         tabs.set_tab_group(1,group2);
562         tabs.set_tab_group(2,group3);
563 
564         l1.set_text("group one");
565         l2.set_text("group two");
566         l3.set_text("group three");
567 
568         group1.add(l1,0,0);
569         group2.add(l2,20,10);
570         group3.add(l3,0,0);
571 
572 
573 
574         sb_enabled.set_name("enabled");
575         sb_shown.set_name("shown");
576         sb_shown.set_checked();
577         sb_enabled.set_checked();
578         sb_shown.set_click_handler(*this,&win::cb_sb_shown);
579         sb_enabled.set_click_handler(*this,&win::cb_sb_enabled);
580 
581         sb_shown.set_tooltip_text("I'm a checkbox");
582 
583         rb.set_click_handler(*this,&win::rb_click);
584 
585 
586         sb3.set_pos(440,mbar.bottom()+10);
587         sb3.set_max_slider_pos(300);
588         sb3.set_slider_pos(150);
589         sb3.set_length(300);
590         sb2.set_pos(470,mbar.bottom()+10);
591         sb2.set_max_slider_pos(300);
592         sb2.set_length(300);
593         sb.set_pos(500,mbar.bottom()+10);
594         sb.set_max_slider_pos(30);
595         sb.set_length(300);
596 
597 
598         sb.set_scroll_handler(*this,&win::scroll_handler);
599         sb2.set_scroll_handler(*this,&win::scroll2_handler);
600         sb3.set_scroll_handler(*this,&win::scroll3_handler);
601         sbl.set_pos(540,mbar.bottom()+20);
602         sbl2.set_pos(540,mbar.bottom()+40);
603         sbl3.set_pos(540,mbar.bottom()+60);
604 
605         cbox.set_pos(300,mbar.bottom()+30);
606         cbox.set_name("davis king");
607         cbox.set_click_handler(*this,&win::cbox_clicked);
608 
609         cbl.set_pos(300,cbox.get_rect().bottom()+1);
610         cbox.set_checked();
611         sb_enabled.set_pos(cbox.get_rect().left(),cbox.get_rect().bottom()+20);
612         sb_shown.set_pos(sb_enabled.get_rect().left(),sb_enabled.get_rect().bottom()+2);
613 
614 
615 
616         if (use_bdf_fonts)
617             rb.set_main_font(f);
618         rb.set_name("radio button");
619         rb.set_pos(sb_shown.get_rect().left(),sb_shown.get_rect().bottom()+2);
620 
621 
622         cb1.set_z_order(10);
623         cb2.set_z_order(20);
624 
625         pos.set_pos(50,50);
626         left_up.set_pos(50,70);
627         left_down.set_pos(50,90);
628         middle_up.set_pos(50,110);
629         middle_down.set_pos(50,130);
630         right_up.set_pos(50,150);
631         right_down.set_pos(50,170);
632 
633         mouse_state.set_pos(50,190);
634 
635         leave_count.set_pos(50,210);
636 
637         scroll_count = 0;
638         scroll.set_pos(50,230);
639 
640         btn_count.set_pos(50,250);
641 
642 
643         keydown.set_pos(50,270);
644         keyup.set_pos(50,290);
645 
646         tf.set_pos(50,310);
647         tf.set_text("Davis685g@");
648         tf.set_width(500);
649         tf.set_text_color(rgb_pixel(255,0,0));
650         tf.set_enter_key_handler(*this,&win::on_enter_key);
651         tf.set_focus_lost_handler(*this,&win::on_tf_focus_lost);
652 
653         tb.set_pos(250,400);
654         tb.set_text("initial test\nstring");
655         tb.set_size(300,300);
656         tb.set_text_color(rgb_pixel(255,0,0));
657         tb.set_enter_key_handler(*this,&win::on_enter_key);
658         tb.set_focus_lost_handler(*this,&win::on_tf_focus_lost);
659 
660 
661         button_count = 0;
662         count = 0;
663         b.set_name("button");
664         b.set_pos(540,100);
665         b.set_click_handler(*this,&win::on_click);
666         b.set_tooltip_text("hurray i'm a button!");
667         if (use_bdf_fonts)
668             b.set_main_font(f);
669 
670 
671         set_size(815,730);
672 
673         nrect.wrap_around(
674             cbox.get_rect() +
675             rb.get_rect() +
676             sb_enabled.get_rect() +
677             sb_shown.get_rect());
678 
679         flip = 0;
680         open_file_box(*this,&win::on_open_file);
681         open_existing_file_box(*this,&win::on_open_file);
682         save_file_box(*this,&win::on_open_file);
683 
684         if (use_bdf_fonts)
685         {
686             tf.set_main_font(f);
687             tb.set_main_font(f);
688         }
689         if (use_bdf_fonts)
690             tabs.set_main_font(f);
691 
692     }
693 
694 private:
695 
696 
on_enter_key()697     void on_enter_key()
698     {
699         cout << "enter key pressed" << endl;
700     }
701 
on_tf_focus_lost()702     void on_tf_focus_lost()
703     {
704         cout << "text field/box lost focus" << endl;
705     }
706 
707 
on_open_file(const std::string & file)708     void on_open_file (const std::string& file)
709     {
710         message_box("file opened",file);
711     }
712 
713 
714 
715 
on_click()716     void on_click (
717     )
718     {
719         ostringstream sout;
720         sout << "text field: " << tf.text();
721         ++button_count;
722         btn_count.set_text(sout.str());
723 
724         if (flip == 0)
725         {
726             flip = 1;
727             lb.set_size(200,200);
728         }
729         else if (flip == 1)
730         {
731             flip = 2;
732             lb.set_size(150,200);
733         }
734         else if (flip == 2)
735         {
736             flip = 3;
737             lb.set_size(150,300);
738         }
739         else
740         {
741             flip = 0;
742             lb.set_size(200,300);
743         }
744     }
745 
746 
747     button b;
748     label btn_count;
749     button btn_get_clipboard;
750     button btn_set_clipboard;
751     button btn_show_message;
752     int button_count;
753     color_box cb1;
754     color_box cb2;
755     label cbl;
756     check_box cbox;
757     int count;
758     int flip;
759     widget_group group1;
760     widget_group group2;
761     widget_group group3;
762     int keyboard_count;
763     label keydown;
764     label keyup;
765     label l1;
766     label l2;
767     label l3;
768     list_box lb;
769     label leave_count;
770     label left_down;
771     label left_up;
772     label middle_down;
773     label middle_up;
774     label mouse_state;
775     mouse_tracker mt;
776     named_rectangle nrect;
777     label pos;
778     radio_button rb;
779     label right_down;
780     label right_up;
781     scroll_bar sb2;
782     scroll_bar sb3;
783     check_box sb_enabled;
784     label sbl2;
785     label sbl3;
786     label sbl;
787     check_box sb_shown;
788     scroll_bar sb;
789     int scroll_count;
790     label scroll;
791     label tab_label;
792     tabbed_display tabs;
793     text_field tf;
794     text_box tb;
795     menu_bar mbar;
796     popup_menu submenu;
797 
798 };
799 
800 
801 win w;
802 
main()803 int main()
804 {
805 
806     try
807     {
808 
809         image_window win;
810 
811         array2d<unsigned char> img;
812         img.set_size(100,100);
813         assign_all_pixels(img,0);
814 
815         fill_rect(img, rectangle(1,1,1,1), 255);
816         fill_rect(img, rectangle(1,3,2,5), 255);
817         fill_rect(img, rectangle(4,3,5,4), 255);
818         fill_rect(img, rectangle(9,9,13,10), 255);
819 
820         win.set_image(img);
821 
822         win.add_overlay(image_display::overlay_rect(rectangle(1,1,1,1), rgb_pixel(255,0,0)));
823         win.add_overlay(image_display::overlay_rect(rectangle(1,3,2,5), rgb_pixel(255,0,0)));
824         win.add_overlay(image_display::overlay_rect(rectangle(4,3,5,4), rgb_pixel(255,0,0)));
825         win.add_overlay(image_display::overlay_rect(rectangle(9,9,13,10), rgb_pixel(255,0,0)));
826 
827 
828 
829         w.set_pos (100,200);
830         w.set_title("test window");
831         w.show();
832 
833         w.wait_until_closed();
834     }
835     catch (exception& e)
836     {
837         cout << e.what() << endl;
838     }
839 
840 }
841