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