xref: /haiku/src/apps/mandelbrot/FractalEngine.h (revision 5bd0fbd13a1e832f91643aaa921fbc0879abd518)
1 /*
2  * Copyright 2016, Haiku, Inc. All rights reserved.
3  * Distributed under the terms of the MIT license.
4  *
5  * Authors:
6  *		Augustin Cavalier <waddlesplash>
7  *		kerwizzy
8  */
9 #ifndef FRACTALENGINE_H
10 #define FRACTALENGINE_H
11 
12 #include <SupportDefs.h>
13 #include <Looper.h>
14 #include <Messenger.h>
15 
16 class BBitmap;
17 
18 
19 #define MAX_RENDER_THREADS 16
20 
21 
22 class FractalEngine : public BLooper {
23 public:
24 	enum {
25 		MSG_CHANGE_SET = 'Frct',
26 		MSG_SET_PALETTE,
27 		MSG_SET_ITERATIONS,
28 		MSG_RESIZE,
29 		MSG_BUFFER_CREATED,
30 		MSG_RENDER,
31 		MSG_RENDER_COMPLETE,
32 		MSG_THREAD_RENDER_COMPLETE,
33 	};
34 
35 	FractalEngine(BHandler* parent, BLooper* looper);
36 	~FractalEngine();
37 
38 	virtual void MessageReceived(BMessage* msg);
39 	void WriteToBitmap(BBitmap*);
40 
41 private:
42 	uint16 fWidth;
43 	uint16 fHeight;
44 
45 	uint8* fRenderBuffer;
46 	uint32 fRenderBufferLen;
47 
48 	BMessenger fMessenger;
49 
50 	uint8 fThreadCount;
51 	thread_id fRenderThreads[MAX_RENDER_THREADS];
52 	sem_id fRenderSem;
53 
54 	uint8 fThreadsRendering;
55 	bool fRestartRenderThread[MAX_RENDER_THREADS];
56 	bool fRenderThreadRunning[MAX_RENDER_THREADS];
57 
58 	double fLocationX;
59 	double fLocationY;
60 	double fSize;
61 
62 	uint16 fIterations;
63 
64 	const uint8* fColorset;
65 
66 	int32 (FractalEngine::*fDoSet)(double real, double imaginary);
67 
68 	void Render(double locationX, double locationY, double size);
69 	static status_t RenderThread(void* data);
70 	void RenderPixel(uint32 x, uint32 y);
71 
72 	int32 DoSet_Mandelbrot(double real, double imaginary);
73 	int32 DoSet_BurningShip(double real, double imaginary);
74 	int32 DoSet_Tricorn(double real, double imaginary);
75 	int32 DoSet_Julia(double real, double imaginary);
76 	int32 DoSet_OrbitTrap(double real, double imaginary);
77 	int32 DoSet_Multibrot(double real, double imaginary);
78 };
79 
80 
81 #endif	/* FRACTALENGINE_H */
82