xref: /haiku/src/servers/app/drawing/AlphaMask.h (revision 610f99c838cb661ff85377789ffd3ad4ff672a08)
1 /*
2  * Copyright 2014-2015, Haiku, Inc.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 #ifndef ALPHA_MASK_H
7 #define ALPHA_MASK_H
8 
9 #include <Referenceable.h>
10 #include <locks.h>
11 
12 #include "agg_clipped_alpha_mask.h"
13 #include "ServerPicture.h"
14 
15 #include "DrawState.h"
16 #include "drawing/Painter/defines.h"
17 #include "IntRect.h"
18 
19 
20 class BShape;
21 class ServerBitmap;
22 class ServerPicture;
23 class shape_data;
24 class UtilityBitmap;
25 
26 
27 // #pragma mark - AlphaMask
28 
29 
30 class AlphaMask : public BReferenceable {
31 public:
32 								AlphaMask(AlphaMask* previousMask,
33 									bool inverse);
34 								AlphaMask(AlphaMask* previousMask,
35 									AlphaMask* other);
36 								AlphaMask(uint8 backgroundOpacity);
37 	virtual						~AlphaMask();
38 
39 			IntPoint			SetCanvasGeometry(IntPoint origin,
40 									IntRect bounds);
41 
42 			scanline_unpacked_masked_type* Scanline()
43 								{ return &fScanline; }
44 
45 			agg::clipped_alpha_mask* Mask()
46 								{ return &fMask; }
47 
48 			size_t				BitmapSize() const;
49 
50 			bool				IsInverted() const
51 								{ return fInverse; }
52 
53 			bool				IsClipped() const
54 								{ return fClippedToCanvas; }
55 
56 			uint8				OutsideOpacity() const
57 								{ return fOutsideOpacity; }
58 
59 protected:
60 			ServerBitmap*		_CreateTemporaryBitmap(BRect bounds) const;
61 			void				_Generate();
62 			void				_SetNoClipping();
63 			const IntRect&		_PreviousMaskBounds() const;
64 	virtual	void				_AddToCache() = 0;
65 			void				_SetOutsideOpacity();
66 
67 private:
68 	virtual	ServerBitmap*		_RenderSource(const IntRect& canvasBounds) = 0;
69  	virtual	IntPoint			_Offset() = 0;
70 
71 			void				_AttachMaskToBuffer();
72 
73 protected:
74 			BReference<AlphaMask> fPreviousMask;
75 			IntRect				fBounds;
76 			bool				fClippedToCanvas;
77 			recursive_lock		fLock;
78 
79 private:
80 	friend class AlphaMaskCache;
81 
82 			IntPoint			fCanvasOrigin;
83 			IntRect				fCanvasBounds;
84 			const bool			fInverse;
85 			uint8				fBackgroundOpacity;
86 			uint8				fOutsideOpacity;
87 
88 			int32				fNextMaskCount;
89 			bool				fInCache;
90 			uint32				fIndirectCacheReferences;
91 									// number of times this mask has been
92 									// seen as "previous mask" of another
93 									// one in the cache, without being
94 									// in the cache itself
95 
96 			BReference<UtilityBitmap> fBits;
97 			agg::rendering_buffer fBuffer;
98 			agg::clipped_alpha_mask fMask;
99 			scanline_unpacked_masked_type fScanline;
100 };
101 
102 
103 class UniformAlphaMask : public AlphaMask {
104 public:
105 								UniformAlphaMask(uint8 opacity);
106 
107 private:
108 	virtual	ServerBitmap*		_RenderSource(const IntRect& canvasBounds);
109 	virtual	IntPoint			_Offset();
110 	virtual void				_AddToCache();
111 };
112 
113 
114 // #pragma mark - VectorAlphaMask
115 
116 
117 template<class VectorMaskType>
118 class VectorAlphaMask : public AlphaMask {
119 public:
120 								VectorAlphaMask(AlphaMask* previousMask,
121 									BPoint where, bool inverse);
122 								VectorAlphaMask(AlphaMask* previousMask,
123 									VectorAlphaMask* other);
124 
125 private:
126 	virtual	ServerBitmap*		_RenderSource(const IntRect& canvasBounds);
127 	virtual	IntPoint			_Offset();
128 
129 protected:
130 			BPoint				fWhere;
131 };
132 
133 
134 // #pragma mark - PictureAlphaMask
135 
136 
137 class PictureAlphaMask : public VectorAlphaMask<PictureAlphaMask> {
138 public:
139 								PictureAlphaMask(AlphaMask* previousMask,
140 									ServerPicture* picture,
141 									const DrawState& drawState, BPoint where,
142 									bool inverse);
143 	virtual						~PictureAlphaMask();
144 
145 			void				DrawVectors(Canvas* canvas);
146 			BRect				DetermineBoundingBox() const;
147 			const DrawState&	GetDrawState() const;
148 
149 private:
150 	virtual void				_AddToCache();
151 
152 private:
153 			BReference<ServerPicture> fPicture;
154 			ObjectDeleter<DrawState> fDrawState;
155 };
156 
157 
158 // #pragma mark - ShapeAlphaMask
159 
160 
161 class ShapeAlphaMask : public VectorAlphaMask<ShapeAlphaMask> {
162 private:
163 								ShapeAlphaMask(AlphaMask* previousMask,
164 									const shape_data& shape,
165 									BPoint where, bool inverse);
166 								ShapeAlphaMask(AlphaMask* previousMask,
167 									ShapeAlphaMask* other);
168 
169 public:
170 	virtual						~ShapeAlphaMask();
171 
172 	static	ShapeAlphaMask*		Create(AlphaMask* previousMask,
173 									const shape_data& shape,
174 									BPoint where, bool inverse);
175 
176 			void				DrawVectors(Canvas* canvas);
177 			BRect				DetermineBoundingBox() const;
178 			const DrawState&	GetDrawState() const;
179 
180 private:
181 	virtual void				_AddToCache();
182 
183 private:
184 	friend class AlphaMaskCache;
185 
186 			BReference<shape_data> fShape;
187 			BRect				fShapeBounds;
188 	static	DrawState*			fDrawState;
189 };
190 
191 
192 #endif // ALPHA_MASK_H
193