1 #include <stdio.h>
2
3 #include <Application.h>
4 #include <Region.h>
5 #include <View.h>
6 #include <Window.h>
7
8 enum {
9 MSG_REDRAW = 'shhd'
10 };
11
12 #define TEST_DELAYS 0
13
14 class View : public BView {
15 public:
View(BRect frame,uint8 r,uint8 g,uint8 b,uint8 a)16 View(BRect frame, uint8 r, uint8 g, uint8 b, uint8 a)
17 : BView(frame, "view", B_FOLLOW_ALL, B_WILL_DRAW)
18 {
19 SetDrawingMode(B_OP_ALPHA);
20 SetHighColor(r, g, b, a);
21 }
22
Draw(BRect updateRect)23 virtual void Draw(BRect updateRect)
24 {
25 BRegion region;
26 GetClippingRegion(®ion);
27 BMessage message(MSG_REDRAW);
28 int32 count = region.CountRects();
29 for (int32 i = 0; i < count; i++)
30 message.AddRect("rect", region.RectAt(i));
31 be_app->PostMessage(&message);
32 }
33
AsyncRedraw(BRegion & region)34 void AsyncRedraw(BRegion& region)
35 {
36 if (!LockLooper())
37 return;
38
39 #if 0
40 ConstrainClippingRegion(®ion);
41 FillRect(Bounds());
42 ConstrainClippingRegion(NULL);
43 #else
44 PushState();
45 ConstrainClippingRegion(®ion);
46 FillRect(Bounds());
47 PopState();
48 #endif
49
50 UnlockLooper();
51 }
52 };
53
54
55 class Application : public BApplication {
56 public:
Application()57 Application()
58 : BApplication("application/x-vnd.stippi-async.drawing")
59 , fDelay(true)
60 {
61 BWindow* window = new BWindow(BRect(50, 50, 350, 250),
62 "Test Window", B_TITLED_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL,
63 B_QUIT_ON_WINDOW_CLOSE);
64 fView = new View(window->Bounds(), 255, 80, 155, 128);
65 window->AddChild(fView);
66 window->Show();
67
68 window = new BWindow(BRect(150, 150, 450, 350),
69 "Drag Window", B_TITLED_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL,
70 B_QUIT_ON_WINDOW_CLOSE);
71 window->Show();
72
73 SetPulseRate(100000);
74 }
75
Pulse()76 virtual void Pulse()
77 {
78 fDelay = true;
79 }
80
MessageReceived(BMessage * message)81 virtual void MessageReceived(BMessage* message)
82 {
83 switch (message->what) {
84 case MSG_REDRAW:
85 {
86 #if TEST_DELAYS
87 if (fDelay) {
88 snooze(200000);
89 fDelay = false;
90 }
91 #endif
92 BRegion region;
93 BRect rect;
94 for (int32 i = 0;
95 message->FindRect("rect", i, &rect) == B_OK; i++)
96 region.Include(rect);
97 fView->AsyncRedraw(region);
98 break;
99 }
100
101 default:
102 BApplication::MessageReceived(message);
103 break;
104 }
105 }
106 private:
107 View* fView;
108 bool fDelay;
109 };
110
111
112 int
main(int argc,char * argv[])113 main(int argc, char* argv[])
114 {
115 Application app;
116 app.Run();
117 return 0;
118 }
119
120
121