xref: /haiku/src/servers/app/drawing/DrawingEngine.h (revision a5061ecec55353a5f394759473f1fd6df04890da)
1 /*
2  * Copyright 2001-2018, Haiku, Inc.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		DarkWyrm <bpmagic@columbus.rr.com>
7  *		Gabe Yoder <gyoder@stny.rr.com>
8  *		Stephan Aßmus <superstippi@gmx.de>
9  *		Julian Harnath <julian.harnath@rwth-aachen.de>
10  */
11 #ifndef DRAWING_ENGINE_H_
12 #define DRAWING_ENGINE_H_
13 
14 
15 #include <AutoDeleter.h>
16 #include <Accelerant.h>
17 #include <Font.h>
18 #include <Locker.h>
19 #include <Point.h>
20 #include <Gradient.h>
21 #include <ServerProtocolStructs.h>
22 
23 #include "HWInterface.h"
24 
25 
26 class BPoint;
27 class BRect;
28 class BRegion;
29 
30 class DrawState;
31 class Painter;
32 class ServerBitmap;
33 class ServerCursor;
34 class ServerFont;
35 
36 
37 class DrawingEngine : public HWInterfaceListener {
38 public:
39 							DrawingEngine(HWInterface* interface = NULL);
40 	virtual					~DrawingEngine();
41 
42 	// HWInterfaceListener interface
43 	virtual	void			FrameBufferChanged();
44 
45 	// for "changing" hardware
46 			void			SetHWInterface(HWInterface* interface);
47 
48 	virtual	void			SetCopyToFrontEnabled(bool enable);
49 			bool			CopyToFrontEnabled() const
50 								{ return fCopyToFront; }
51 	virtual	void			CopyToFront(/*const*/ BRegion& region);
52 
53 	// locking
54 			bool			LockParallelAccess();
55 #if DEBUG
56 	virtual	bool			IsParallelAccessLocked() const;
57 #endif
58 			void			UnlockParallelAccess();
59 
60 			bool			LockExclusiveAccess();
61 	virtual	bool			IsExclusiveAccessLocked() const;
62 			void			UnlockExclusiveAccess();
63 
64 	// for screen shots
65 			ServerBitmap*	DumpToBitmap();
66 	virtual	status_t		ReadBitmap(ServerBitmap *bitmap, bool drawCursor,
67 								BRect bounds);
68 
69 	// clipping for all drawing functions, passing a NULL region
70 	// will remove any clipping (drawing allowed everywhere)
71 	virtual	void			ConstrainClippingRegion(const BRegion* region);
72 
73 	virtual	void			SetDrawState(const DrawState* state,
74 								int32 xOffset = 0, int32 yOffset = 0);
75 
76 	virtual	void			SetHighColor(const rgb_color& color);
77 	virtual	void			SetLowColor(const rgb_color& color);
78 	virtual	void			SetPenSize(float size);
79 	virtual	void			SetStrokeMode(cap_mode lineCap, join_mode joinMode,
80 								float miterLimit);
81 	virtual void			SetFillRule(int32 fillRule);
82 	virtual	void			SetPattern(const struct pattern& pattern);
83 	virtual	void			SetDrawingMode(drawing_mode mode);
84 	virtual	void			SetDrawingMode(drawing_mode mode,
85 								drawing_mode& oldMode);
86 	virtual	void			SetBlendingMode(source_alpha srcAlpha,
87 								alpha_function alphaFunc);
88 	virtual	void			SetFont(const ServerFont& font);
89 	virtual	void			SetFont(const DrawState* state);
90 	virtual	void			SetTransform(const BAffineTransform& transform,
91 								int32 xOffset, int32 yOffset);
92 
93 			void			SuspendAutoSync();
94 			void			Sync();
95 
96 	// drawing functions
97 	virtual	void			CopyRegion(/*const*/ BRegion* region,
98 								int32 xOffset, int32 yOffset);
99 
100 	virtual	void			InvertRect(BRect r);
101 
102 	virtual	void			DrawBitmap(ServerBitmap* bitmap,
103 								const BRect& bitmapRect, const BRect& viewRect,
104 								uint32 options = 0);
105 	// drawing primitives
106 	virtual	void			DrawArc(BRect r, const float& angle,
107 								const float& span, bool filled);
108 	virtual	void			FillArc(BRect r, const float& angle,
109 								const float& span, const BGradient& gradient);
110 
111 	virtual	void			DrawBezier(BPoint* pts, bool filled);
112 	virtual	void			FillBezier(BPoint* pts, const BGradient& gradient);
113 
114 	virtual	void			DrawEllipse(BRect r, bool filled);
115 	virtual	void			FillEllipse(BRect r, const BGradient& gradient);
116 
117 	virtual	void			DrawPolygon(BPoint* ptlist, int32 numpts,
118 								BRect bounds, bool filled, bool closed);
119 	virtual	void			FillPolygon(BPoint* ptlist, int32 numpts,
120 								BRect bounds, const BGradient& gradient,
121 								bool closed);
122 
123 	// these rgb_color versions are used internally by the server
124 	virtual	void			StrokePoint(const BPoint& point,
125 								const rgb_color& color);
126 	virtual	void			StrokeRect(BRect rect, const rgb_color &color);
127 	virtual	void			FillRect(BRect rect, const rgb_color &color);
128 	virtual	void			FillRegion(BRegion& region, const rgb_color& color);
129 
130 	virtual	void			StrokeRect(BRect rect);
131 	virtual	void			FillRect(BRect rect);
132 	virtual	void			FillRect(BRect rect, const BGradient& gradient);
133 
134 	virtual	void			FillRegion(BRegion& region);
135 	virtual	void			FillRegion(BRegion& region,
136 								const BGradient& gradient);
137 
138 	virtual	void			DrawRoundRect(BRect rect, float xrad,
139 								float yrad, bool filled);
140 	virtual	void			FillRoundRect(BRect rect, float xrad,
141 								float yrad, const BGradient& gradient);
142 
143 	virtual	void			DrawShape(const BRect& bounds,
144 								int32 opcount, const uint32* oplist,
145 								int32 ptcount, const BPoint* ptlist,
146 								bool filled, const BPoint& viewToScreenOffset,
147 								float viewScale);
148 	virtual	void			FillShape(const BRect& bounds,
149 								int32 opcount, const uint32* oplist,
150 							 	int32 ptcount, const BPoint* ptlist,
151 							 	const BGradient& gradient,
152 							 	const BPoint& viewToScreenOffset,
153 								float viewScale);
154 
155 	virtual	void			DrawTriangle(BPoint* points, const BRect& bounds,
156 								bool filled);
157 	virtual	void			FillTriangle(BPoint* points, const BRect& bounds,
158 								const BGradient& gradient);
159 
160 	// these versions are used by the Decorator
161 	virtual	void			StrokeLine(const BPoint& start,
162 								const BPoint& end, const rgb_color& color);
163 
164 	virtual	void			StrokeLine(const BPoint& start,
165 								const BPoint& end);
166 
167 	virtual	void			StrokeLineArray(int32 numlines,
168 								const ViewLineArrayInfo* data);
169 
170 	// -------- text related calls
171 
172 	// returns the pen position behind the (virtually) drawn
173 	// string
174 	virtual	BPoint			DrawString(const char* string, int32 length,
175 								const BPoint& pt,
176 								escapement_delta* delta = NULL);
177 	virtual	BPoint			DrawString(const char* string, int32 length,
178 								const BPoint* offsets);
179 
180 			float			StringWidth(const char* string, int32 length,
181 								escapement_delta* delta = NULL);
182 
183 	// convenience function which is independent of graphics
184 	// state (to be used by Decorator or ServerApp etc)
185 			float			StringWidth(const char* string,
186 								int32 length, const ServerFont& font,
187 								escapement_delta* delta = NULL);
188 
189 			BPoint			DrawStringDry(const char* string, int32 length,
190 								const BPoint& pt,
191 								escapement_delta* delta = NULL);
192 			BPoint			DrawStringDry(const char* string, int32 length,
193 								const BPoint* offsets);
194 
195 
196 	// software rendering backend invoked by CopyRegion() for the sorted
197 	// individual rects
198 	virtual	BRect			CopyRect(BRect rect, int32 xOffset,
199 								int32 yOffset) const;
200 
201 			void			SetRendererOffset(int32 offsetX, int32 offsetY);
202 
203 private:
204 	friend class DrawTransaction;
205 
206 			void			_CopyRect(uint8* bits, uint32 width,
207 								uint32 height, uint32 bytesPerRow,
208 								int32 xOffset, int32 yOffset) const;
209 
210 			ObjectDeleter<Painter>
211 							fPainter;
212 			HWInterface*	fGraphicsCard;
213 			uint32			fAvailableHWAccleration;
214 			int32			fSuspendSyncLevel;
215 			bool			fCopyToFront;
216 };
217 
218 #endif // DRAWING_ENGINE_H_
219