1/*
2 * Copyright 2001-2018, Haiku.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		DarkWyrm <bpmagic@columbus.rr.com>
7 *		Adi Oanca <adioanca@mymail.ro>
8 *		Stephan A��mus <superstippi@gmx.de>
9 *		Axel D��rfler, axeld@pinc-software.de
10 *		Julian Harnath <julian.harnath@rwth-aachen.de>
11 *		Joseph Groover <looncraz@looncraz.net>
12 */
13#ifndef _DRAW_STATE_H_
14#define _DRAW_STATE_H_
15
16
17#include <AutoDeleter.h>
18#include <AffineTransform.h>
19#include <GraphicsDefs.h>
20#include <InterfaceDefs.h>
21#include <Point.h>
22#include <Referenceable.h>
23#include <View.h>
24
25#include "AppFontManager.h"
26#include "ServerFont.h"
27#include "PatternHandler.h"
28#include "SimpleTransform.h"
29
30class AlphaMask;
31class BRegion;
32class shape_data;
33
34namespace BPrivate {
35	class LinkReceiver;
36	class LinkSender;
37};
38
39
40class DrawState {
41public:
42							DrawState();
43							DrawState(const DrawState& other);
44public:
45		virtual				~DrawState();
46
47		DrawState*			PushState();
48		DrawState*			PopState();
49		DrawState*			PreviousState() const
50								{ return fPreviousState.Get(); }
51
52		uint16				ReadFontFromLink(BPrivate::LinkReceiver& link,
53								AppFontManager* fontManager = NULL);
54								// NOTE: ReadFromLink() does not read Font state!!
55								// It was separate in ServerWindow, and I didn't
56								// want to change it without knowing implications.
57		void				ReadFromLink(BPrivate::LinkReceiver& link);
58		void				WriteToLink(BPrivate::LinkSender& link) const;
59
60							// coordinate transformation
61		void				SetOrigin(BPoint origin);
62		BPoint				Origin() const
63								{ return fOrigin; }
64		BPoint				CombinedOrigin() const
65								{ return fCombinedOrigin; }
66
67		void				SetScale(float scale);
68		float				Scale() const
69								{ return fScale; }
70		float				CombinedScale() const
71								{ return fCombinedScale; }
72
73		void				SetTransform(BAffineTransform transform);
74		BAffineTransform	Transform() const
75								{ return fTransform; }
76		BAffineTransform	CombinedTransform() const
77								{ return fCombinedTransform; }
78		void				SetTransformEnabled(bool enabled);
79
80		DrawState*			Squash() const;
81
82							// additional clipping as requested by client
83		void				SetClippingRegion(const BRegion* region);
84
85		bool				HasClipping() const;
86		bool				HasAdditionalClipping() const;
87		bool				GetCombinedClippingRegion(BRegion* region) const;
88
89		bool				ClipToRect(BRect rect, bool inverse);
90		void				ClipToShape(shape_data* shape, bool inverse);
91
92			void			SetAlphaMask(AlphaMask* mask);
93			AlphaMask*		GetAlphaMask() const;
94
95							// coordinate transformations
96				void		Transform(SimpleTransform& transform) const;
97				void		InverseTransform(SimpleTransform& transform) const;
98
99							// color
100		void				SetHighColor(rgb_color color);
101		rgb_color			HighColor() const
102								{ return fHighColor; }
103
104		void				SetLowColor(rgb_color color);
105		rgb_color			LowColor() const
106								{ return fLowColor; }
107
108		void				SetHighUIColor(color_which which, float tint);
109		color_which			HighUIColor(float* tint) const;
110
111		void				SetLowUIColor(color_which which, float tint);
112		color_which			LowUIColor(float* tint) const;
113
114		void				SetPattern(const Pattern& pattern);
115		const Pattern&		GetPattern() const
116								{ return fPattern; }
117
118							// drawing/blending mode
119		bool				SetDrawingMode(drawing_mode mode);
120		drawing_mode		GetDrawingMode() const
121								{ return fDrawingMode; }
122
123		bool				SetBlendingMode(source_alpha srcMode,
124								alpha_function fncMode);
125		source_alpha		AlphaSrcMode() const
126								{ return fAlphaSrcMode; }
127		alpha_function		AlphaFncMode() const
128								{ return fAlphaFncMode; }
129
130		void				SetDrawingModeLocked(bool locked);
131
132							// pen
133		void				SetPenLocation(BPoint location);
134		BPoint				PenLocation() const;
135
136		void				SetPenSize(float size);
137		float				PenSize() const;
138		float				UnscaledPenSize() const;
139
140							// font
141		void				SetFont(const ServerFont& font,
142								uint32 flags = B_FONT_ALL);
143		const ServerFont&	Font() const
144								{ return fFont; }
145
146		// overrides aliasing flag contained in SeverFont::Flags())
147		void				SetForceFontAliasing(bool aliasing);
148		bool				ForceFontAliasing() const
149								{ return fFontAliasing; }
150
151							// postscript style settings
152		void				SetLineCapMode(cap_mode mode);
153		cap_mode			LineCapMode() const
154								{ return fLineCapMode; }
155
156		void				SetLineJoinMode(join_mode mode);
157		join_mode			LineJoinMode() const
158								{ return fLineJoinMode; }
159
160		void				SetMiterLimit(float limit);
161		float				MiterLimit() const
162								{ return fMiterLimit; }
163
164		void				SetFillRule(int32 fillRule);
165		int32				FillRule() const
166								{ return fFillRule; }
167
168							// convenience functions
169		void				PrintToStream() const;
170
171		void				SetSubPixelPrecise(bool precise);
172		bool				SubPixelPrecise() const
173								{ return fSubPixelPrecise; }
174
175protected:
176		BPoint				fOrigin;
177		BPoint				fCombinedOrigin;
178		float				fScale;
179		float				fCombinedScale;
180		BAffineTransform	fTransform;
181		BAffineTransform	fCombinedTransform;
182
183		ObjectDeleter<BRegion>
184							fClippingRegion;
185
186		BReference<AlphaMask> fAlphaMask;
187
188		rgb_color			fHighColor;
189		rgb_color			fLowColor;
190
191		color_which			fWhichHighColor;
192		color_which			fWhichLowColor;
193		float				fWhichHighColorTint;
194		float				fWhichLowColorTint;
195		Pattern				fPattern;
196
197		drawing_mode		fDrawingMode;
198		source_alpha		fAlphaSrcMode;
199		alpha_function		fAlphaFncMode;
200		bool				fDrawingModeLocked;
201
202		BPoint				fPenLocation;
203		float				fPenSize;
204
205		ServerFont			fFont;
206		// overrides font aliasing flag
207		bool				fFontAliasing;
208
209		// This is not part of the normal state stack.
210		// The view will update it in PushState/PopState.
211		// A BView can have a flag "B_SUBPIXEL_PRECISE",
212		// I never knew what it does on R5, but I can use
213		// it in Painter to actually draw stuff with
214		// sub-pixel coordinates. It means
215		// StrokeLine(BPoint(10, 5), BPoint(20, 9));
216		// will look different from
217		// StrokeLine(BPoint(10.3, 5.8), BPoint(20.6, 9.5));
218		bool				fSubPixelPrecise;
219
220		cap_mode			fLineCapMode;
221		join_mode			fLineJoinMode;
222		float				fMiterLimit;
223		int32				fFillRule;
224		// "internal", used to calculate the size
225		// of the font (again) when the scale changes
226		float				fUnscaledFontSize;
227
228		ObjectDeleter<DrawState>
229							fPreviousState;
230};
231
232#endif	// _DRAW_STATE_H_
233