xref: /haiku/src/tests/servers/app/painter/Painter.h (revision 7749d0bb0c358a3279b1b9cc76d8376e900130a5)
1 // Painter.h
2 
3 #ifndef PAINTER_H
4 #define PAINTER_H
5 
6 #include <Font.h>
7 #include <Rect.h>
8 #include <FontServer.h>
9 #include <ServerFont.h>
10 
11 #include "defines.h"
12 #include "forwarding_pixfmt.h"
13 
14 #include "RGBColor.h"
15 
16 class AGGTextRenderer;
17 class BBitmap;
18 class BRegion;
19 class DrawData;
20 class PatternHandler;
21 class RenderingBuffer;
22 class ServerBitmap;
23 class ServerFont;
24 
25 class Painter {
26  public:
27 								Painter();
28 	virtual						~Painter();
29 
30 								// frame buffer stuff
31 			void				AttachToBuffer(RenderingBuffer* buffer);
32 			void				DetachFromBuffer();
33 
34 			void				ConstrainClipping(const BRegion& region);
35 			void				SetDrawData(const DrawData* data);
36 
37 								// object settings
38 			void				SetHighColor(const rgb_color& color);
39 	inline	void				SetHighColor(uint8 r, uint8 g, uint8 b, uint8 a = 255);
40 	inline	void				SetHighColor(const RGBColor& color)
41 									{ SetHighColor(color.GetColor32()); }
42 			void				SetLowColor(const rgb_color& color);
43 	inline	void				SetLowColor(uint8 r, uint8 g, uint8 b, uint8 a = 255);
44 	inline	void				SetLowColor(const RGBColor& color)
45 									{ SetLowColor(color.GetColor32()); }
46 
47 			void				SetScale(float scale);
48 			void				SetPenSize(float size);
49 			void				SetOrigin(const BPoint& origin);
50 			void				SetDrawingMode(drawing_mode mode);
51 			void				SetBlendingMode(source_alpha alphaSrcMode,
52 												alpha_function alphaFncMode);
53 			void				SetPenLocation(const BPoint& location);
54 			void				SetFont(const BFont& font);
55 			void				SetFont(const ServerFont& font);
56 
57 								// BView API compatibility (for easier testing)
58 			void				Sync() {}
59 	inline	void				MovePenTo(const BPoint& location)
60 									{ SetPenLocation(location); }
61 	inline	void				SetFont(const BFont* font)
62 									{ if (font) SetFont(*font); }
63 
64 								// painting functions
65 
66 								// lines
67 			BRect				StrokeLine(		BPoint a,
68 												BPoint b,
69 												const pattern& p = B_SOLID_HIGH);
70 
71 			BRect				StrokeLine(		BPoint b,
72 												const pattern& p = B_SOLID_HIGH);
73 
74 			// return true if the line was either vertical or horizontal
75 			// draws a solid one pixel wide line of color c, no blending
76 			bool				StraightLine(	BPoint a,
77 												BPoint b,
78 												const rgb_color& c) const;
79 
80 								// triangles
81 			void				StrokeTriangle(	BPoint pt1,
82 												BPoint pt2,
83 												BPoint pt3,
84 												const pattern& p = B_SOLID_HIGH) const;
85 
86 			void				FillTriangle(	BPoint pt1,
87 												BPoint pt2,
88 												BPoint pt3,
89 												const pattern& p = B_SOLID_HIGH) const;
90 
91 								// polygons
92 			void				StrokePolygon(	const BPoint* ptArray,
93 												int32 numPts,
94 											    bool  closed = true,
95 												const pattern& p = B_SOLID_HIGH) const;
96 
97 			void				FillPolygon(	const BPoint* ptArray,
98 												int32 numPts,
99 											    bool  closed = true,
100 												const pattern& p = B_SOLID_HIGH) const;
101 
102 								// bezier curves
103 			void				StrokeBezier(	const BPoint* controlPoints,
104 												const pattern& p = B_SOLID_HIGH) const;
105 
106 			void				FillBezier(		const BPoint* controlPoints,
107 												const pattern& p = B_SOLID_HIGH) const;
108 
109 								// shapes
110 			void				StrokeShape(	/*const */BShape* shape,
111 												const pattern& p = B_SOLID_HIGH) const;
112 
113 			void				FillShape(		/*const */BShape* shape,
114 												const pattern& p = B_SOLID_HIGH) const;
115 
116 
117 								// rects
118 			BRect				StrokeRect(		const BRect& r,
119 												const pattern& p = B_SOLID_HIGH) const;
120 
121 			// strokes a one pixel wide solid rect, no blending
122 			void				StrokeRect(		const BRect& r,
123 												const rgb_color& c) const;
124 
125 			BRect				FillRect(		const BRect& r,
126 												const pattern& p = B_SOLID_HIGH) const;
127 
128 			// fills a solid rect with color c, no blending
129 			void				FillRect(		const BRect& r,
130 												const rgb_color& c) const;
131 
132 								// round rects
133 			void				StrokeRoundRect(const BRect& r,
134 												float xRadius,
135 												float yRadius,
136 												const pattern& p = B_SOLID_HIGH) const;
137 
138 			void				FillRoundRect(	const BRect& r,
139 												float xRadius,
140 												float yRadius,
141 												const pattern& p = B_SOLID_HIGH) const;
142 
143 								// ellipses
144 			void				StrokeEllipse(	BPoint center,
145 												float xRadius,
146 												float yRadius,
147 												const pattern& p = B_SOLID_HIGH) const;
148 
149 			void				FillEllipse(	BPoint center,
150 												float xRadius,
151 												float yRadius,
152 												const pattern& p = B_SOLID_HIGH) const;
153 
154 								// arcs
155 			void				StrokeArc(		BPoint center,
156 												float xRadius,
157 												float yRadius,
158 												float angle,
159 												float span,
160 												const pattern& p = B_SOLID_HIGH) const;
161 
162 			void				FillArc(		BPoint center,
163 												float xRadius,
164 												float yRadius,
165 												float angle,
166 												float span,
167 												const pattern& p = B_SOLID_HIGH) const;
168 
169 								// strings
170 			BRect				DrawChar(		char aChar);
171 
172 			BRect				DrawChar(		char aChar,
173 												BPoint baseLine);
174 
175 			BRect				DrawString(		const char* utf8String,
176 												uint32 length,
177 												const escapement_delta* delta = NULL);
178 
179 			BRect				DrawString(		const char* utf8String,
180 												uint32 length,
181 												BPoint baseLine,
182 												const escapement_delta* delta = NULL);
183 
184 			BRect				DrawString(		const char* utf8String,
185 												const escapement_delta* delta = NULL);
186 
187 			BRect				DrawString(		const char* utf8String,
188 												BPoint baseLine,
189 												const escapement_delta* delta = NULL);
190 
191 								// bitmaps
192 			void				DrawBitmap(		const BBitmap* bitmap,
193 												BRect bitmapRect,
194 												BRect viewRect) const;
195 
196 			void				DrawBitmap(		const ServerBitmap* bitmap,
197 												BRect bitmapRect,
198 												BRect viewRect) const;
199 
200 								// some convenience stuff
201 			void				FillRegion(		const BRegion* region,
202 												const pattern& p = B_SOLID_HIGH) const;
203 
204 			void				InvertRect(		const BRect& r) const;
205 
206 			BRect				BoundingBox(	const char* utf8String,
207 												uint32 length,
208 												const BPoint& baseLine) const;
209 
210 	inline	BRect				ClipRect(const BRect& rect) const
211 									{ return _Clipped(rect); }
212 
213  private:
214 			void				_MakeEmpty();
215 
216 			void				_Transform(BPoint* point,
217 										   bool centerOffset = true) const;
218 			BPoint				_Transform(const BPoint& point,
219 										   bool centerOffset = true) const;
220 			void				_Transform(float* width) const;
221 			float				_Transform(const float& width) const;
222 			void				_Transform(BRect* rect) const;
223 			BRect				_Transform(const BRect& rect) const;
224 			BRect				_Clipped(const BRect& rect) const;
225 
226 			void				_RebuildClipping();
227 
228 			void				_UpdateFont();
229 			void				_UpdateLineWidth();
230 
231 								// drawing functions stroke/fill
232 			void				_DrawTriangle(	BPoint pt1,
233 												BPoint pt2,
234 												BPoint pt3,
235 												const pattern& p,
236 												bool fill) const;
237 			void				_DrawEllipse(	BPoint center,
238 												float xRadius,
239 												float yRadius,
240 												const pattern& p,
241 												bool fill) const;
242 			void				_DrawShape(		/*const */BShape* shape,
243 												const pattern& p,
244 												bool fill) const;
245 			void				_DrawPolygon(	const BPoint* ptArray,
246 												int32 numPts,
247 											    bool  closed,
248 												const pattern& p,
249 												bool fill) const;
250 
251 			void				_DrawBitmap(	const agg::rendering_buffer& srcBuffer,
252 												color_space format,
253 												BRect actualBitmapRect,
254 												BRect bitmapRect,
255 												BRect viewRect) const;
256 			void				_DrawBitmap32(	const agg::rendering_buffer& srcBuffer,
257 												BRect actualBitmapRect,
258 												BRect bitmapRect,
259 												BRect viewRect) const;
260 
261 			void				_InvertRect32(BRect r) const;
262 
263 
264 			template<class VertexSource>
265 			BRect				_BoundingBox(VertexSource& path) const;
266 
267 			template<class VertexSource>
268 			BRect				_StrokePath(VertexSource& path,
269 											const pattern& p) const;
270 			template<class VertexSource>
271 			BRect				_FillPath(VertexSource& path,
272 
273 										  const pattern& p) const;
274 
275 			void				_SetPattern(const pattern& p) const;
276 			void				_SetRendererColor(const rgb_color& color) const;
277 
278 	agg::rendering_buffer*		fBuffer;
279 
280 	// AGG rendering and rasterization classes
281 	pixfmt*						fPixelFormat;
282 	renderer_base*				fBaseRenderer;
283 
284 	outline_renderer_type*		fOutlineRenderer;
285 	outline_rasterizer_type*	fOutlineRasterizer;
286 
287 	scanline_type*				fScanline;
288 	rasterizer_type*			fRasterizer;
289 	renderer_type*				fRenderer;
290 
291 	font_renderer_solid_type*	fFontRendererSolid;
292 	font_renderer_bin_type*		fFontRendererBin;
293 
294 	agg::line_profile_aa		fLineProfile;
295 
296 	// for internal coordinate rounding/transformation,
297 	// does not concern rendering
298 	bool						fSubpixelPrecise;
299 
300 	float						fScale;
301 	float						fPenSize;
302 	BPoint						fOrigin;
303 	BRegion*					fClippingRegion; // NULL indicates no clipping at all
304 	drawing_mode				fDrawingMode;
305 	source_alpha				fAlphaSrcMode;
306 	alpha_function				fAlphaFncMode;
307 	BPoint						fPenLocation;
308 	PatternHandler*				fPatternHandler;
309 
310 	ServerFont					fFont;
311 	// a class handling rendering and caching of glyphs
312 	// it is setup to load from a specific Freetype supported
313 	// font file, it uses the FontManager to locate a file
314 	// by Family and Style
315 	AGGTextRenderer*			fTextRenderer;
316 	uint32						fLastFamilyAndStyle;
317 };
318 
319 // SetHighColor
320 inline void
321 Painter::SetHighColor(uint8 r, uint8 g, uint8 b, uint8 a)
322 {
323 	rgb_color color;
324 	color.red = r;
325 	color.green = g;
326 	color.blue = b;
327 	color.alpha = a;
328 	SetHighColor(color);
329 }
330 
331 // SetLowColor
332 inline void
333 Painter::SetLowColor(uint8 r, uint8 g, uint8 b, uint8 a)
334 {
335 	rgb_color color;
336 	color.red = r;
337 	color.green = g;
338 	color.blue = b;
339 	color.alpha = a;
340 	SetLowColor(color);
341 }
342 
343 
344 #endif // PAINTER_H
345 
346 
347