xref: /haiku/src/tests/servers/app/newerClipping/main.cpp (revision 0a6ef8179ccb4f058fc1b571c1f6bca98ef5d224)
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