1bef1ed93SStephan Aßmus
2bef1ed93SStephan Aßmus #include <Application.h>
3e76d86d5SStephan Aßmus #include <DirectWindow.h>
4bef1ed93SStephan Aßmus #include <View.h>
5bef1ed93SStephan Aßmus
6bef1ed93SStephan Aßmus #include <stdio.h>
7bef1ed93SStephan Aßmus #include <stdlib.h>
8bef1ed93SStephan Aßmus
9e76d86d5SStephan Aßmus #include "AccelerantHWInterface.h"
10bef1ed93SStephan Aßmus #include "Desktop.h"
11e76d86d5SStephan Aßmus #include "DirectWindowBuffer.h"
12bef1ed93SStephan Aßmus #include "DrawingEngine.h"
13e76d86d5SStephan Aßmus #include "DrawView.h"
14bef1ed93SStephan Aßmus #include "ViewLayer.h"
15bef1ed93SStephan Aßmus #include "WindowLayer.h"
16bef1ed93SStephan Aßmus
17bef1ed93SStephan Aßmus class App : public BApplication {
18bef1ed93SStephan Aßmus public:
19bef1ed93SStephan Aßmus App();
20bef1ed93SStephan Aßmus
21bef1ed93SStephan Aßmus virtual void ReadyToRun();
22bef1ed93SStephan Aßmus };
23bef1ed93SStephan Aßmus
24e76d86d5SStephan Aßmus class Window : public BDirectWindow {
25bef1ed93SStephan Aßmus public:
26bef1ed93SStephan Aßmus Window(const char* title);
270b78f37eSStephan Aßmus virtual ~Window();
28bef1ed93SStephan Aßmus
29a825e403SStephan Aßmus virtual bool QuitRequested();
30a825e403SStephan Aßmus
31e76d86d5SStephan Aßmus virtual void DirectConnected(direct_buffer_info* info);
32e76d86d5SStephan Aßmus
33bef1ed93SStephan Aßmus void AddWindow(BRect frame, const char* name);
34bef1ed93SStephan Aßmus void Test();
35bef1ed93SStephan Aßmus private:
36bef1ed93SStephan Aßmus DrawView* fView;
37bef1ed93SStephan Aßmus Desktop* fDesktop;
38a825e403SStephan Aßmus bool fQuit;
39e76d86d5SStephan Aßmus DirectWindowBuffer fBuffer;
40e76d86d5SStephan Aßmus AccelerantHWInterface fInterface;
41e76d86d5SStephan Aßmus DrawingEngine fEngine;
42e76d86d5SStephan Aßmus
43bef1ed93SStephan Aßmus };
44bef1ed93SStephan Aßmus
450b78f37eSStephan Aßmus // constructor
App()46bef1ed93SStephan Aßmus App::App()
47bef1ed93SStephan Aßmus : BApplication("application/x-vnd.stippi.ClippingTest")
48bef1ed93SStephan Aßmus {
49bef1ed93SStephan Aßmus srand(real_time_clock_usecs());
50bef1ed93SStephan Aßmus }
51bef1ed93SStephan Aßmus
520b78f37eSStephan Aßmus // ReadyToRun
53bef1ed93SStephan Aßmus void
ReadyToRun()54bef1ed93SStephan Aßmus App::ReadyToRun()
55bef1ed93SStephan Aßmus {
56bef1ed93SStephan Aßmus Window* win = new Window("clipping");
57bef1ed93SStephan Aßmus win->Show();
58bef1ed93SStephan Aßmus
59040ce757SStephan Aßmus // win->Test();
60bef1ed93SStephan Aßmus }
61bef1ed93SStephan Aßmus
620b78f37eSStephan Aßmus // constructor
Window(const char * title)63bef1ed93SStephan Aßmus Window::Window(const char* title)
64e76d86d5SStephan Aßmus : BDirectWindow(BRect(50, 50, 800, 650), title,
65e76d86d5SStephan Aßmus B_TITLED_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL, B_ASYNCHRONOUS_CONTROLS),
66e76d86d5SStephan Aßmus fQuit(false),
67e76d86d5SStephan Aßmus fBuffer(),
68e76d86d5SStephan Aßmus fInterface(),
69e76d86d5SStephan Aßmus fEngine(&fInterface, &fBuffer)
70bef1ed93SStephan Aßmus {
71e76d86d5SStephan Aßmus fInterface.Initialize();
72bef1ed93SStephan Aßmus fView = new DrawView(Bounds());
73bef1ed93SStephan Aßmus AddChild(fView);
74bef1ed93SStephan Aßmus fView->MakeFocus(true);
75e76d86d5SStephan Aßmus
76e76d86d5SStephan Aßmus fDesktop = new Desktop(fView, &fEngine);
77e76d86d5SStephan Aßmus fDesktop->Run();
78bef1ed93SStephan Aßmus }
79bef1ed93SStephan Aßmus
800b78f37eSStephan Aßmus // destructor
~Window()81bef1ed93SStephan Aßmus Window::~Window()
82bef1ed93SStephan Aßmus {
83*0a6ef817SStephan Aßmus fInterface.Shutdown();
84bef1ed93SStephan Aßmus fDesktop->Lock();
85bef1ed93SStephan Aßmus fDesktop->Quit();
86bef1ed93SStephan Aßmus }
87bef1ed93SStephan Aßmus
88a825e403SStephan Aßmus // QuitRequested
89a825e403SStephan Aßmus bool
QuitRequested()90a825e403SStephan Aßmus Window::QuitRequested()
91a825e403SStephan Aßmus {
92040ce757SStephan Aßmus /* if (!fQuit) {
93a825e403SStephan Aßmus fDesktop->PostMessage(MSG_QUIT);
94a825e403SStephan Aßmus fQuit = true;
95a825e403SStephan Aßmus return false;
96040ce757SStephan Aßmus }*/
97040ce757SStephan Aßmus be_app->PostMessage(B_QUIT_REQUESTED);
98a825e403SStephan Aßmus return true;
99a825e403SStephan Aßmus }
100a825e403SStephan Aßmus
101040ce757SStephan Aßmus // #pragma mark -
102040ce757SStephan Aßmus
103040ce757SStephan Aßmus void
fill_line_8(uint8 * buffer,int32 pixels,uint8 r,uint8 g,uint8 b)104040ce757SStephan Aßmus fill_line_8(uint8* buffer, int32 pixels, uint8 r, uint8 g, uint8 b)
105040ce757SStephan Aßmus {
106040ce757SStephan Aßmus for (int32 i = 0; i < pixels; i++) {
107040ce757SStephan Aßmus *buffer++ = b;
108040ce757SStephan Aßmus *buffer++ = g;
109040ce757SStephan Aßmus *buffer++ = r;
110040ce757SStephan Aßmus *buffer++ = 255;
111040ce757SStephan Aßmus }
112040ce757SStephan Aßmus }
113040ce757SStephan Aßmus
114040ce757SStephan Aßmus void
fill_line_32(uint8 * buffer,int32 pixels,uint8 r,uint8 g,uint8 b)115040ce757SStephan Aßmus fill_line_32(uint8* buffer, int32 pixels, uint8 r, uint8 g, uint8 b)
116040ce757SStephan Aßmus {
117040ce757SStephan Aßmus uint32 pixel;
118040ce757SStephan Aßmus uint32* handle = (uint32*)buffer;
119040ce757SStephan Aßmus for (int32 i = 0; i < pixels; i++) {
120040ce757SStephan Aßmus pixel = 0xff000000 | (r << 16) | (g << 8) | (b);
121040ce757SStephan Aßmus *handle++ = pixel;
122040ce757SStephan Aßmus }
123040ce757SStephan Aßmus }
124040ce757SStephan Aßmus
125040ce757SStephan Aßmus void
fill_line_64(uint8 * buffer,int32 pixels,uint8 r,uint8 g,uint8 b)126040ce757SStephan Aßmus fill_line_64(uint8* buffer, int32 pixels, uint8 r, uint8 g, uint8 b)
127040ce757SStephan Aßmus {
128040ce757SStephan Aßmus uint64 pixel;
129040ce757SStephan Aßmus uint64* handle = (uint64*)buffer;
130040ce757SStephan Aßmus pixels /= 2;
131040ce757SStephan Aßmus for (int32 i = 0; i < pixels; i++) {
132040ce757SStephan Aßmus pixel = 0xff000000 | (r << 16) | (g << 8) | (b);
133040ce757SStephan Aßmus pixel = pixel << 32;
134040ce757SStephan Aßmus pixel |= 0xff000000 | (r << 16) | (g << 8) | (b);
135040ce757SStephan Aßmus *handle++ = pixel;
136040ce757SStephan Aßmus }
137040ce757SStephan Aßmus }
138040ce757SStephan Aßmus
139040ce757SStephan Aßmus void
test1(uint8 * buffer,uint32 bpr)140040ce757SStephan Aßmus test1(uint8* buffer, uint32 bpr)
141040ce757SStephan Aßmus {
142040ce757SStephan Aßmus uint8* handle = buffer;
143040ce757SStephan Aßmus
144040ce757SStephan Aßmus /* bigtime_t start8 = system_time();
145040ce757SStephan Aßmus for (int32 x = 0; x < 1000; x++) {
146040ce757SStephan Aßmus handle = buffer;
147040ce757SStephan Aßmus for (int32 i = 0; i < 64; i++) {
148040ce757SStephan Aßmus fill_line_8(handle, 512, 255, 0, 255);
149040ce757SStephan Aßmus handle += bpr;
150040ce757SStephan Aßmus }
151040ce757SStephan Aßmus }
152040ce757SStephan Aßmus
153040ce757SStephan Aßmus bigtime_t start32 = system_time();
154040ce757SStephan Aßmus for (int32 x = 0; x < 1000; x++) {
155040ce757SStephan Aßmus handle = buffer;
156040ce757SStephan Aßmus for (int32 i = 0; i < 64; i++) {
157040ce757SStephan Aßmus fill_line_32(handle, 512, 255, 0, 255);
158040ce757SStephan Aßmus handle += bpr;
159040ce757SStephan Aßmus }
160040ce757SStephan Aßmus }
161040ce757SStephan Aßmus
162040ce757SStephan Aßmus bigtime_t start64 = system_time();
163040ce757SStephan Aßmus for (int32 x = 0; x < 1000; x++) {*/
164040ce757SStephan Aßmus handle = buffer;
165040ce757SStephan Aßmus for (int32 i = 0; i < 640; i++) {
166040ce757SStephan Aßmus fill_line_64(handle, 512, 0, 255, 255);
167040ce757SStephan Aßmus handle += bpr;
168040ce757SStephan Aßmus }
169040ce757SStephan Aßmus /* }
170040ce757SStephan Aßmus
171040ce757SStephan Aßmus
172040ce757SStephan Aßmus bigtime_t finish = system_time();
173040ce757SStephan Aßmus printf("8: %lld\n", start32 - start8);
174040ce757SStephan Aßmus printf("32: %lld\n", start64 - start32);
175040ce757SStephan Aßmus printf("64: %lld\n", finish - start64);*/
176040ce757SStephan Aßmus }
177040ce757SStephan Aßmus
178040ce757SStephan Aßmus // #pragma mark -
179040ce757SStephan Aßmus
180040ce757SStephan Aßmus void
blend_line_8(uint8 * buffer,int32 pixels,uint8 r,uint8 g,uint8 b,uint8 a)181040ce757SStephan Aßmus blend_line_8(uint8* buffer, int32 pixels, uint8 r, uint8 g, uint8 b, uint8 a)
182040ce757SStephan Aßmus {
183040ce757SStephan Aßmus for (int32 i = 0; i < pixels; i++) {
184040ce757SStephan Aßmus buffer[0] = ((b - buffer[0]) * a + (buffer[0] << 8)) >> 8;
185040ce757SStephan Aßmus buffer[1] = ((g - buffer[1]) * a + (buffer[1] << 8)) >> 8;
186040ce757SStephan Aßmus buffer[2] = ((r - buffer[2]) * a + (buffer[2] << 8)) >> 8;;
187040ce757SStephan Aßmus buffer[3] = a;
188040ce757SStephan Aßmus buffer += 4;
189040ce757SStephan Aßmus }
190040ce757SStephan Aßmus }
191040ce757SStephan Aßmus
192040ce757SStephan Aßmus union pixel {
193040ce757SStephan Aßmus uint32 data32;
194040ce757SStephan Aßmus uint8 data8[4];
195040ce757SStephan Aßmus };
196040ce757SStephan Aßmus
197040ce757SStephan Aßmus void
blend_line_32(uint8 * buffer,int32 pixels,uint8 r,uint8 g,uint8 b,uint8 a)198040ce757SStephan Aßmus blend_line_32(uint8* buffer, int32 pixels, uint8 r, uint8 g, uint8 b, uint8 a)
199040ce757SStephan Aßmus {
200040ce757SStephan Aßmus pixel p;
201040ce757SStephan Aßmus pixels /= 2;
202040ce757SStephan Aßmus for (int32 i = 0; i < pixels; i++) {
203040ce757SStephan Aßmus p.data32 = *(uint32*)buffer;
204040ce757SStephan Aßmus
205040ce757SStephan Aßmus p.data8[0] = ((b - p.data8[0]) * a + (p.data8[0] << 8)) >> 8;
206040ce757SStephan Aßmus p.data8[1] = ((g - p.data8[1]) * a + (p.data8[1] << 8)) >> 8;
207040ce757SStephan Aßmus p.data8[2] = ((r - p.data8[2]) * a + (p.data8[2] << 8)) >> 8;
208040ce757SStephan Aßmus p.data8[3] = 255;
209040ce757SStephan Aßmus *((uint32*)buffer) = p.data32;
210040ce757SStephan Aßmus buffer += 4;
211040ce757SStephan Aßmus
212040ce757SStephan Aßmus p.data32 = *(uint32*)buffer;
213040ce757SStephan Aßmus
214040ce757SStephan Aßmus p.data8[0] = ((b - p.data8[0]) * a + (p.data8[0] << 8)) >> 8;
215040ce757SStephan Aßmus p.data8[1] = ((g - p.data8[1]) * a + (p.data8[1] << 8)) >> 8;
216040ce757SStephan Aßmus p.data8[2] = ((r - p.data8[2]) * a + (p.data8[2] << 8)) >> 8;
217040ce757SStephan Aßmus p.data8[3] = 255;
218040ce757SStephan Aßmus *((uint32*)buffer) = p.data32;
219040ce757SStephan Aßmus buffer += 4;
220040ce757SStephan Aßmus }
221040ce757SStephan Aßmus }
222040ce757SStephan Aßmus
223040ce757SStephan Aßmus union pixel2 {
224040ce757SStephan Aßmus uint64 data64;
225040ce757SStephan Aßmus uint8 data8[8];
226040ce757SStephan Aßmus };
227040ce757SStephan Aßmus
228*0a6ef817SStephan Aßmus // gfxcpy32
229*0a6ef817SStephan Aßmus // * numBytes is expected to be a multiple of 4
230*0a6ef817SStephan Aßmus inline
231*0a6ef817SStephan Aßmus void
gfxcpy32(uint8 * dst,uint8 * src,int32 numBytes)232*0a6ef817SStephan Aßmus gfxcpy32(uint8* dst, uint8* src, int32 numBytes)
233*0a6ef817SStephan Aßmus {
234*0a6ef817SStephan Aßmus uint64* d64 = (uint64*)dst;
235*0a6ef817SStephan Aßmus uint64* s64 = (uint64*)src;
236*0a6ef817SStephan Aßmus int32 numBytesStart = numBytes;
237*0a6ef817SStephan Aßmus while (numBytes >= 32) {
238*0a6ef817SStephan Aßmus *d64++ = *s64++;
239*0a6ef817SStephan Aßmus *d64++ = *s64++;
240*0a6ef817SStephan Aßmus *d64++ = *s64++;
241*0a6ef817SStephan Aßmus *d64++ = *s64++;
242*0a6ef817SStephan Aßmus numBytes -= 32;
243*0a6ef817SStephan Aßmus }
244*0a6ef817SStephan Aßmus if (numBytes >= 16) {
245*0a6ef817SStephan Aßmus *d64++ = *s64++;
246*0a6ef817SStephan Aßmus *d64++ = *s64++;
247*0a6ef817SStephan Aßmus numBytes -= 16;
248*0a6ef817SStephan Aßmus }
249*0a6ef817SStephan Aßmus if (numBytes >= 8) {
250*0a6ef817SStephan Aßmus *d64++ = *s64++;
251*0a6ef817SStephan Aßmus numBytes -= 8;
252*0a6ef817SStephan Aßmus }
253*0a6ef817SStephan Aßmus if (numBytes == 4) {
254*0a6ef817SStephan Aßmus uint32* d32 = (uint32*)(dst + numBytesStart - numBytes);
255*0a6ef817SStephan Aßmus uint32* s32 = (uint32*)(src + numBytesStart - numBytes);
256*0a6ef817SStephan Aßmus *d32 = *s32;
257*0a6ef817SStephan Aßmus }
258*0a6ef817SStephan Aßmus }
259*0a6ef817SStephan Aßmus
260040ce757SStephan Aßmus void
blend_line_64(uint8 * buffer,int32 pixels,uint8 r,uint8 g,uint8 b,uint8 a)261040ce757SStephan Aßmus blend_line_64(uint8* buffer, int32 pixels, uint8 r, uint8 g, uint8 b, uint8 a)
262040ce757SStephan Aßmus {
263040ce757SStephan Aßmus pixel2 p;
264040ce757SStephan Aßmus pixels /= 2;
265*0a6ef817SStephan Aßmus
266*0a6ef817SStephan Aßmus r = (r * a) >> 8;
267*0a6ef817SStephan Aßmus g = (g * a) >> 8;
268*0a6ef817SStephan Aßmus b = (b * a) >> 8;
269*0a6ef817SStephan Aßmus a = 255 - a;
270*0a6ef817SStephan Aßmus
271*0a6ef817SStephan Aßmus uint8 tempBuffer[pixels * 8];
272*0a6ef817SStephan Aßmus
273*0a6ef817SStephan Aßmus uint8* t = tempBuffer;
274*0a6ef817SStephan Aßmus uint8* s = buffer;
275*0a6ef817SStephan Aßmus
276040ce757SStephan Aßmus for (int32 i = 0; i < pixels; i++) {
277*0a6ef817SStephan Aßmus p.data64 = *(uint64*)s;
278040ce757SStephan Aßmus
279*0a6ef817SStephan Aßmus t[0] = ((p.data8[0] * a) >> 8) + b;
280*0a6ef817SStephan Aßmus t[1] = ((p.data8[1] * a) >> 8) + g;
281*0a6ef817SStephan Aßmus t[2] = ((p.data8[2] * a) >> 8) + r;
282040ce757SStephan Aßmus
283*0a6ef817SStephan Aßmus t[4] = ((p.data8[4] * a) >> 8) + b;
284*0a6ef817SStephan Aßmus t[5] = ((p.data8[5] * a) >> 8) + g;
285*0a6ef817SStephan Aßmus t[6] = ((p.data8[6] * a) >> 8) + r;
286040ce757SStephan Aßmus
287*0a6ef817SStephan Aßmus t += 8;
288*0a6ef817SStephan Aßmus s += 8;
289040ce757SStephan Aßmus }
290*0a6ef817SStephan Aßmus
291*0a6ef817SStephan Aßmus gfxcpy32(buffer, tempBuffer, pixels * 8);
292040ce757SStephan Aßmus }
293040ce757SStephan Aßmus void
test2(uint8 * buffer,uint32 bpr)294040ce757SStephan Aßmus test2(uint8* buffer, uint32 bpr)
295040ce757SStephan Aßmus {
296040ce757SStephan Aßmus uint8* handle = buffer;
297040ce757SStephan Aßmus
298040ce757SStephan Aßmus /* bigtime_t start8 = system_time();
299040ce757SStephan Aßmus // for (int32 x = 0; x < 10; x++) {
300040ce757SStephan Aßmus handle = buffer;
301040ce757SStephan Aßmus for (int32 i = 0; i < 64; i++) {
302040ce757SStephan Aßmus blend_line_8(handle, 512, 255, 0, 0, 20);
303040ce757SStephan Aßmus handle += bpr;
304040ce757SStephan Aßmus }
305040ce757SStephan Aßmus // }
306040ce757SStephan Aßmus
307040ce757SStephan Aßmus bigtime_t start32 = system_time();
308040ce757SStephan Aßmus // for (int32 x = 0; x < 10; x++) {
309040ce757SStephan Aßmus handle = buffer;
310040ce757SStephan Aßmus for (int32 i = 0; i < 64; i++) {
311040ce757SStephan Aßmus blend_line_32(handle, 512, 255, 0, 0, 20);
312040ce757SStephan Aßmus handle += bpr;
313040ce757SStephan Aßmus }
314*0a6ef817SStephan Aßmus // }*/
315040ce757SStephan Aßmus
316*0a6ef817SStephan Aßmus bigtime_t start64 = system_time();
317040ce757SStephan Aßmus // for (int32 x = 0; x < 10; x++) {
318040ce757SStephan Aßmus handle = buffer;
319040ce757SStephan Aßmus for (int32 i = 0; i < 640; i++) {
320040ce757SStephan Aßmus blend_line_64(handle, 512, 255, 0, 0, 200);
321040ce757SStephan Aßmus handle += bpr;
322040ce757SStephan Aßmus }
323040ce757SStephan Aßmus // }
324040ce757SStephan Aßmus
325*0a6ef817SStephan Aßmus bigtime_t finish = system_time();
326*0a6ef817SStephan Aßmus // printf("8: %lld\n", start32 - start8);
327*0a6ef817SStephan Aßmus // printf("32: %lld\n", start64 - start32);
328*0a6ef817SStephan Aßmus printf("blend 64: %lld\n", finish - start64);
329040ce757SStephan Aßmus }
330040ce757SStephan Aßmus
331040ce757SStephan Aßmus // #pragma mark -
332040ce757SStephan Aßmus
333e76d86d5SStephan Aßmus // DirectConnected
334e76d86d5SStephan Aßmus void
DirectConnected(direct_buffer_info * info)335e76d86d5SStephan Aßmus Window::DirectConnected(direct_buffer_info* info)
336e76d86d5SStephan Aßmus {
337e76d86d5SStephan Aßmus // TODO: for some reason, this deadlocks
338e76d86d5SStephan Aßmus // on B_DIRECT_STOP... be aware
339040ce757SStephan Aßmus // fDesktop->LockClipping();
340e76d86d5SStephan Aßmus
341040ce757SStephan Aßmus // fEngine.Lock();
342e76d86d5SStephan Aßmus
343e76d86d5SStephan Aßmus switch(info->buffer_state & B_DIRECT_MODE_MASK) {
344e76d86d5SStephan Aßmus case B_DIRECT_START:
345e76d86d5SStephan Aßmus case B_DIRECT_MODIFY:
346e76d86d5SStephan Aßmus fBuffer.SetTo(info);
347e76d86d5SStephan Aßmus fDesktop->SetOffset(info->window_bounds.left, info->window_bounds.top);
348*0a6ef817SStephan Aßmus test2((uint8*)info->bits, info->bytes_per_row);
349e76d86d5SStephan Aßmus break;
350e76d86d5SStephan Aßmus case B_DIRECT_STOP:
351e76d86d5SStephan Aßmus fBuffer.SetTo(NULL);
352e76d86d5SStephan Aßmus break;
353e76d86d5SStephan Aßmus }
354e76d86d5SStephan Aßmus
355040ce757SStephan Aßmus // fDesktop->SetMasterClipping(&fBuffer.WindowClipping());
356e76d86d5SStephan Aßmus
357040ce757SStephan Aßmus // fEngine.Unlock();
358e76d86d5SStephan Aßmus
359040ce757SStephan Aßmus // fDesktop->UnlockClipping();
360e76d86d5SStephan Aßmus }
361e76d86d5SStephan Aßmus
362bef1ed93SStephan Aßmus // AddWindow
363bef1ed93SStephan Aßmus void
AddWindow(BRect frame,const char * name)364bef1ed93SStephan Aßmus Window::AddWindow(BRect frame, const char* name)
365bef1ed93SStephan Aßmus {
366bef1ed93SStephan Aßmus WindowLayer* window = new WindowLayer(frame, name,
367bef1ed93SStephan Aßmus fDesktop->GetDrawingEngine(),
368bef1ed93SStephan Aßmus fDesktop);
3690b78f37eSStephan Aßmus
3700b78f37eSStephan Aßmus // add a coupld children
3710b78f37eSStephan Aßmus frame.OffsetTo(B_ORIGIN);
3720b78f37eSStephan Aßmus frame.InsetBy(5.0, 5.0);
3730b78f37eSStephan Aßmus if (frame.IsValid()) {
3740b78f37eSStephan Aßmus ViewLayer* layer1 = new ViewLayer(frame, "View 1",
3750b78f37eSStephan Aßmus B_FOLLOW_ALL,
3760b78f37eSStephan Aßmus B_FULL_UPDATE_ON_RESIZE,
3770b78f37eSStephan Aßmus (rgb_color){ 180, 180, 180, 255 });
3780b78f37eSStephan Aßmus
3790b78f37eSStephan Aßmus frame.OffsetTo(B_ORIGIN);
3800b78f37eSStephan Aßmus frame.InsetBy(15.0, 15.0);
3810b78f37eSStephan Aßmus if (frame.IsValid()) {
3820b78f37eSStephan Aßmus
383f5180663SStephan Aßmus BRect f = frame;
384f5180663SStephan Aßmus f.bottom = f.top + f.Height() / 3 - 3;
385f5180663SStephan Aßmus f.right = f.left + f.Width() / 3 - 3;
3860b78f37eSStephan Aßmus
387f5180663SStephan Aßmus // top row of views
388f5180663SStephan Aßmus ViewLayer* layer;
389f5180663SStephan Aßmus layer = new ViewLayer(f, "View", B_FOLLOW_LEFT | B_FOLLOW_TOP,
390f5180663SStephan Aßmus B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 });
391f5180663SStephan Aßmus layer1->AddChild(layer);
3920b78f37eSStephan Aßmus
393f5180663SStephan Aßmus f.OffsetBy(f.Width() + 6, 0);
3940b78f37eSStephan Aßmus
395f5180663SStephan Aßmus layer = new ViewLayer(f, "View", B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP,
396f5180663SStephan Aßmus B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 });
397f5180663SStephan Aßmus layer1->AddChild(layer);
3980b78f37eSStephan Aßmus
399f5180663SStephan Aßmus f.OffsetBy(f.Width() + 6, 0);
400f5180663SStephan Aßmus
401f5180663SStephan Aßmus layer = new ViewLayer(f, "View", B_FOLLOW_RIGHT | B_FOLLOW_TOP,
402f5180663SStephan Aßmus B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 });
403f5180663SStephan Aßmus layer1->AddChild(layer);
404f5180663SStephan Aßmus
405f5180663SStephan Aßmus // middle row of views
406f5180663SStephan Aßmus f = frame;
407f5180663SStephan Aßmus f.bottom = f.top + f.Height() / 3 - 3;
408f5180663SStephan Aßmus f.right = f.left + f.Width() / 3 - 3;
409f5180663SStephan Aßmus f.OffsetBy(0, f.Height() + 6);
410f5180663SStephan Aßmus
411f5180663SStephan Aßmus layer = new ViewLayer(f, "View", B_FOLLOW_LEFT | B_FOLLOW_TOP_BOTTOM,
412f5180663SStephan Aßmus B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 });
413f5180663SStephan Aßmus layer1->AddChild(layer);
414f5180663SStephan Aßmus
415f5180663SStephan Aßmus f.OffsetBy(f.Width() + 6, 0);
416f5180663SStephan Aßmus
417f5180663SStephan Aßmus layer = new ViewLayer(f, "View", B_FOLLOW_ALL,
418f5180663SStephan Aßmus B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 });
419f5180663SStephan Aßmus layer1->AddChild(layer);
420f5180663SStephan Aßmus
421f5180663SStephan Aßmus f.OffsetBy(f.Width() + 6, 0);
422f5180663SStephan Aßmus
423f5180663SStephan Aßmus layer = new ViewLayer(f, "View", B_FOLLOW_RIGHT | B_FOLLOW_TOP_BOTTOM,
424f5180663SStephan Aßmus B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 });
425f5180663SStephan Aßmus layer1->AddChild(layer);
426f5180663SStephan Aßmus
427f5180663SStephan Aßmus // bottom row of views
428f5180663SStephan Aßmus f = frame;
429f5180663SStephan Aßmus f.bottom = f.top + f.Height() / 3 - 3;
430f5180663SStephan Aßmus f.right = f.left + f.Width() / 3 - 3;
431f5180663SStephan Aßmus f.OffsetBy(0, 2 * f.Height() + 12);
432f5180663SStephan Aßmus
433f5180663SStephan Aßmus layer = new ViewLayer(f, "View", B_FOLLOW_LEFT | B_FOLLOW_BOTTOM,
434f5180663SStephan Aßmus B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 });
435f5180663SStephan Aßmus layer1->AddChild(layer);
436f5180663SStephan Aßmus
437f5180663SStephan Aßmus f.OffsetBy(f.Width() + 6, 0);
438f5180663SStephan Aßmus
439748533bbSStephan Aßmus // layer = new ViewLayer(f, "View", B_FOLLOW_LEFT_RIGHT | B_FOLLOW_BOTTOM,
440748533bbSStephan Aßmus layer = new ViewLayer(f, "View", B_FOLLOW_LEFT | B_FOLLOW_BOTTOM,
441f5180663SStephan Aßmus B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 });
442f5180663SStephan Aßmus layer1->AddChild(layer);
443f5180663SStephan Aßmus
444f5180663SStephan Aßmus f.OffsetBy(f.Width() + 6, 0);
445f5180663SStephan Aßmus
446748533bbSStephan Aßmus // layer = new ViewLayer(f, "View", B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM,
447748533bbSStephan Aßmus layer = new ViewLayer(f, "View", B_FOLLOW_LEFT | B_FOLLOW_BOTTOM,
448f5180663SStephan Aßmus B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 });
449f5180663SStephan Aßmus layer1->AddChild(layer);
4500b78f37eSStephan Aßmus }
4510b78f37eSStephan Aßmus
4520b78f37eSStephan Aßmus window->AddChild(layer1);
4530b78f37eSStephan Aßmus }
4540b78f37eSStephan Aßmus
455bef1ed93SStephan Aßmus window->Run();
456bef1ed93SStephan Aßmus
457bef1ed93SStephan Aßmus BMessage message(MSG_ADD_WINDOW);
458bef1ed93SStephan Aßmus message.AddPointer("window", (void*)window);
459bef1ed93SStephan Aßmus fDesktop->PostMessage(&message);
460bef1ed93SStephan Aßmus }
461bef1ed93SStephan Aßmus
462bef1ed93SStephan Aßmus // Test
463bef1ed93SStephan Aßmus void
Test()464bef1ed93SStephan Aßmus Window::Test()
465bef1ed93SStephan Aßmus {
466f5180663SStephan Aßmus BRect frame(20, 20, 330, 230);
4674dd89c69SStephan Aßmus // AddWindow(frame, "Window 1");
4684dd89c69SStephan Aßmus // AddWindow(frame, "Window 2");
469f5180663SStephan Aßmus for (int32 i = 0; i < 20; i++) {
470f5180663SStephan Aßmus BString name("Window ");
471f5180663SStephan Aßmus frame.OffsetBy(20, 15);
472f5180663SStephan Aßmus name << i + 1;
473f5180663SStephan Aßmus AddWindow(frame, name.String());
474f5180663SStephan Aßmus }
475f5180663SStephan Aßmus
476d0e89d53SStephan Aßmus /* frame.Set(10, 80, 320, 290);
477f5180663SStephan Aßmus for (int32 i = 20; i < 40; i++) {
478f5180663SStephan Aßmus BString name("Window ");
479f5180663SStephan Aßmus frame.OffsetBy(20, 15);
480f5180663SStephan Aßmus name << i + 1;
481f5180663SStephan Aßmus AddWindow(frame, name.String());
482f5180663SStephan Aßmus }
483d0e89d53SStephan Aßmus
4844dd89c69SStephan Aßmus frame.Set(20, 140, 330, 230);
485f5180663SStephan Aßmus for (int32 i = 40; i < 60; i++) {
486f5180663SStephan Aßmus BString name("Window ");
487f5180663SStephan Aßmus frame.OffsetBy(20, 15);
488f5180663SStephan Aßmus name << i + 1;
489f5180663SStephan Aßmus AddWindow(frame, name.String());
490f5180663SStephan Aßmus }
491f5180663SStephan Aßmus
492f5180663SStephan Aßmus frame.Set(20, 200, 330, 230);
493f5180663SStephan Aßmus for (int32 i = 60; i < 80; i++) {
494f5180663SStephan Aßmus BString name("Window ");
495f5180663SStephan Aßmus frame.OffsetBy(20, 15);
496f5180663SStephan Aßmus name << i + 1;
497f5180663SStephan Aßmus AddWindow(frame, name.String());
498f5180663SStephan Aßmus }
499f5180663SStephan Aßmus
500f5180663SStephan Aßmus frame.Set(20, 260, 330, 230);
501f5180663SStephan Aßmus // 99 windows are ok, the 100th looper does not run anymore,
502f5180663SStephan Aßmus // I guess I'm hitting a BeOS limit (max loopers per app?)
503f5180663SStephan Aßmus for (int32 i = 80; i < 99; i++) {
504f5180663SStephan Aßmus BString name("Window ");
505f5180663SStephan Aßmus frame.OffsetBy(20, 15);
506f5180663SStephan Aßmus name << i + 1;
507f5180663SStephan Aßmus AddWindow(frame, name.String());
508f5180663SStephan Aßmus }*/
509bef1ed93SStephan Aßmus }
510bef1ed93SStephan Aßmus
511bef1ed93SStephan Aßmus // main
512bef1ed93SStephan Aßmus int
main(int argc,const char * argv[])513bef1ed93SStephan Aßmus main(int argc, const char* argv[])
514bef1ed93SStephan Aßmus {
515727653f7SStephan Aßmus srand((long int)system_time());
516727653f7SStephan Aßmus
517bef1ed93SStephan Aßmus App app;
518bef1ed93SStephan Aßmus app.Run();
519bef1ed93SStephan Aßmus return 0;
520bef1ed93SStephan Aßmus }
521