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
26class BPoint;
27class BRect;
28class BRegion;
29
30class DrawState;
31class Painter;
32class ServerBitmap;
33class ServerCursor;
34class ServerFont;
35
36
37class DrawingEngine : public HWInterfaceListener {
38public:
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
203private:
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_