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