xref: /haiku/src/servers/app/drawing/interface/remote/RemoteDrawingEngine.h (revision d99d8dbdd291ce586abc97b973626acfe138f12f)
1 /*
2  * Copyright 2009, Haiku, Inc.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Michael Lotz <mmlr@mlotz.ch>
7  */
8 #ifndef REMOTE_DRAWING_ENGINE_H
9 #define REMOTE_DRAWING_ENGINE_H
10 
11 #include "DrawingEngine.h"
12 #include "DrawState.h"
13 #include "RemoteHWInterface.h"
14 #include "ServerFont.h"
15 
16 #include <AutoDeleter.h>
17 
18 class BPoint;
19 class BRect;
20 class BRegion;
21 
22 class BitmapDrawingEngine;
23 class ServerBitmap;
24 
25 class RemoteDrawingEngine : public DrawingEngine {
26 public:
27 								RemoteDrawingEngine(
28 									RemoteHWInterface* interface);
29 	virtual						~RemoteDrawingEngine();
30 
31 	// HWInterfaceListener interface
32 	virtual	void				FrameBufferChanged();
33 
34 	virtual	void				SetCopyToFrontEnabled(bool enabled);
35 
36 	// for screen shots
37 	virtual	status_t			ReadBitmap(ServerBitmap* bitmap,
38 									bool drawCursor, BRect bounds);
39 
40 	// clipping for all drawing functions, passing a NULL region
41 	// will remove any clipping (drawing allowed everywhere)
42 	virtual	void				ConstrainClippingRegion(const BRegion* region);
43 
44 	virtual	void				SetDrawState(const DrawState* state,
45 									int32 xOffset = 0, int32 yOffset = 0);
46 
47 	virtual	void				SetHighColor(const rgb_color& color);
48 	virtual	void				SetLowColor(const rgb_color& color);
49 	virtual	void				SetPenSize(float size);
50 	virtual	void				SetStrokeMode(cap_mode lineCap,
51 									join_mode joinMode, float miterLimit);
52 	virtual	void				SetPattern(const struct pattern& pattern);
53 	virtual	void				SetDrawingMode(drawing_mode mode);
54 	virtual	void				SetDrawingMode(drawing_mode mode,
55 									drawing_mode& oldMode);
56 	virtual	void				SetBlendingMode(source_alpha srcAlpha,
57 									alpha_function alphaFunc);
58 	virtual	void				SetFont(const ServerFont& font);
59 	virtual	void				SetFont(const DrawState* state);
60 	virtual	void				SetTransform(const BAffineTransform& transform,
61 									int32 xOffset, int32 yOffset);
62 
63 	// drawing functions
64 	virtual	void				InvertRect(BRect rect);
65 
66 	virtual	void				DrawBitmap(ServerBitmap* bitmap,
67 									const BRect& bitmapRect,
68 									const BRect& viewRect, uint32 options = 0);
69 
70 	// drawing primitives
71 	virtual	void				DrawArc(BRect rect, const float& angle,
72 									const float& span, bool filled);
73 	virtual	void				FillArc(BRect rect, const float& angle,
74 									const float& span,
75 									const BGradient& gradient);
76 
77 	virtual	void				DrawBezier(BPoint* points, bool filled);
78 	virtual	void				FillBezier(BPoint* points,
79 									const BGradient& gradient);
80 
81 	virtual	void				DrawEllipse(BRect rect, bool filled);
82 	virtual	void				FillEllipse(BRect rect,
83 									const BGradient& gradient);
84 
85 	virtual	void				DrawPolygon(BPoint* pointList, int32 numPoints,
86 									BRect bounds, bool filled, bool closed);
87 	virtual	void				FillPolygon(BPoint* pointList, int32 numPoints,
88 									BRect bounds, const BGradient& gradient,
89 									bool closed);
90 
91 	// these rgb_color versions are used internally by the server
92 	virtual	void				StrokePoint(const BPoint& point,
93 									const rgb_color& color);
94 	virtual	void				StrokeRect(BRect rect, const rgb_color &color);
95 	virtual	void				FillRect(BRect rect, const rgb_color &color);
96 	virtual	void				FillRegion(BRegion& region,
97 									const rgb_color& color);
98 
99 	virtual	void				StrokeRect(BRect rect);
100 	virtual	void				FillRect(BRect rect);
101 	virtual	void				FillRect(BRect rect, const BGradient& gradient);
102 
103 	virtual	void				FillRegion(BRegion& region);
104 	virtual	void				FillRegion(BRegion& region,
105 									const BGradient& gradient);
106 
107 	virtual	void				DrawRoundRect(BRect rect, float xRadius,
108 									float yRadius, bool filled);
109 	virtual	void				FillRoundRect(BRect rect, float xRadius,
110 									float yRadius, const BGradient& gradient);
111 
112 	virtual	void				DrawShape(const BRect& bounds,
113 									int32 opCount, const uint32* opList,
114 									int32 pointCount, const BPoint* pointList,
115 									bool filled,
116 									const BPoint& viewToScreenOffset,
117 									float viewScale);
118 	virtual	void				FillShape(const BRect& bounds,
119 									int32 opCount, const uint32* opList,
120 									int32 pointCount, const BPoint* pointList,
121 									const BGradient& gradient,
122 									const BPoint& viewToScreenOffset,
123 									float viewScale);
124 
125 	virtual	void				DrawTriangle(BPoint* points,
126 									const BRect& bounds, bool filled);
127 	virtual	void				FillTriangle(BPoint* points,
128 									const BRect& bounds,
129 									const BGradient& gradient);
130 
131 	// these versions are used by the Decorator
132 	virtual	void				StrokeLine(const BPoint& start,
133 									const BPoint& end, const rgb_color& color);
134 	virtual	void				StrokeLine(const BPoint& start,
135 									const BPoint& end);
136 	virtual	void				StrokeLineArray(int32 numlines,
137 									const ViewLineArrayInfo* data);
138 
139 	// returns the pen position behind the (virtually) drawn string
140 	virtual	BPoint				DrawString(const char* string, int32 length,
141 									const BPoint& point,
142 									escapement_delta* delta = NULL);
143 	virtual	BPoint				DrawString(const char* string, int32 length,
144 									const BPoint* offsets);
145 
146 	virtual	float				StringWidth(const char* string, int32 length,
147 									escapement_delta* delta = NULL);
148 
149 	// software rendering backend invoked by CopyRegion() for the sorted
150 	// individual rects
151 	virtual	BRect				CopyRect(BRect rect, int32 xOffset,
152 									int32 yOffset) const;
153 
154 private:
155 			status_t			_AddCallback();
156 
157 	static	bool				_DrawingEngineResult(void* cookie,
158 									RemoteMessage& message);
159 
160 			BRect				_BuildBounds(BPoint* points, int32 pointCount);
161 			status_t			_ExtractBitmapRegions(ServerBitmap& bitmap,
162 									uint32 options, const BRect& bitmapRect,
163 									const BRect& viewRect, double xScale,
164 									double yScale, BRegion& region,
165 									UtilityBitmap**& bitmaps);
166 
167 			RemoteHWInterface*	fHWInterface;
168 			int32				fToken;
169 
170 			DrawState			fState;
171 			BRegion				fClippingRegion;
172 			float				fExtendWidth;
173 
174 			bool				fCallbackAdded;
175 			sem_id				fResultNotify;
176 			BPoint				fDrawStringResult;
177 			float				fStringWidthResult;
178 			BBitmap*			fReadBitmapResult;
179 
180 			ObjectDeleter<BitmapDrawingEngine>
181 								fBitmapDrawingEngine;
182 };
183 
184 #endif // REMOTE_DRAWING_ENGINE_H
185