xref: /haiku/src/servers/app/drawing/Painter/drawing_modes/PixelFormat.h (revision 52f7c9389475e19fc21487b38064b4390eeb6fea)
1 /*
2  * Copyright 2005, Stephan Aßmus <superstippi@gmx.de>.
3  * Copyright 2008, Andrej Spielmann <andrej.spielmann@seh.ox.ac.uk>
4  * All rights reserved. Distributed under the terms of the MIT License.
5  *
6  * Copyright 2002-2004 Maxim Shemanarev (http://www.antigrain.com)
7  *
8  * A class implementing the AGG "pixel format" interface which maintains
9  * a PatternHandler and pointers to blending functions implementing the
10  * different BeOS "drawing_modes".
11  *
12  */
13 
14 #ifndef PIXEL_FORMAT_H
15 #define PIXEL_FORMAT_H
16 
17 #include <agg_basics.h>
18 #include <agg_color_rgba.h>
19 #include <agg_rendering_buffer.h>
20 #include <agg_pixfmt_rgba.h>
21 
22 #include <GraphicsDefs.h>
23 
24 #include "AggCompOpAdapter.h"
25 
26 class PatternHandler;
27 
28 class PixelFormat {
29  public:
30 	typedef agg::rgba8						color_type;
31 	typedef agg::rendering_buffer			agg_buffer;
32 	typedef agg::rendering_buffer::row_data	row_data;
33 	typedef agg::order_bgra					order_type;
34 
35 	typedef agg::comp_op_rgba_src_in<color_type, order_type>	comp_src_in;
36 	typedef agg::comp_op_rgba_src_out<color_type, order_type>	comp_src_out;
37 	typedef agg::comp_op_rgba_src_atop<color_type, order_type>	comp_src_atop;
38 	typedef agg::comp_op_rgba_dst_over<color_type, order_type>	comp_dst_over;
39 	typedef agg::comp_op_rgba_dst_in<color_type, order_type>	comp_dst_in;
40 	typedef agg::comp_op_rgba_dst_out<color_type, order_type>	comp_dst_out;
41 	typedef agg::comp_op_rgba_dst_atop<color_type, order_type>	comp_dst_atop;
42 	typedef agg::comp_op_rgba_xor<color_type, order_type>		comp_xor;
43 	typedef agg::comp_op_rgba_clear<color_type, order_type>		comp_clear;
44 	typedef agg::comp_op_rgba_difference<color_type, order_type>
45 		comp_difference;
46 	typedef agg::comp_op_rgba_lighten<color_type, order_type>	comp_lighten;
47 	typedef agg::comp_op_rgba_darken<color_type, order_type>	comp_darken;
48 
49 	typedef AggCompOpAdapter<comp_src_in, agg_buffer>		alpha_src_in;
50 	typedef AggCompOpAdapter<comp_src_out, agg_buffer>		alpha_src_out;
51 	typedef AggCompOpAdapter<comp_src_atop, agg_buffer>		alpha_src_atop;
52 	typedef AggCompOpAdapter<comp_dst_over, agg_buffer>		alpha_dst_over;
53 	typedef AggCompOpAdapter<comp_dst_in, agg_buffer>		alpha_dst_in;
54 	typedef AggCompOpAdapter<comp_dst_out, agg_buffer>		alpha_dst_out;
55 	typedef AggCompOpAdapter<comp_dst_atop, agg_buffer>		alpha_dst_atop;
56 	typedef AggCompOpAdapter<comp_xor, agg_buffer>			alpha_xor;
57 	typedef AggCompOpAdapter<comp_clear, agg_buffer>		alpha_clear;
58 	typedef AggCompOpAdapter<comp_difference, agg_buffer>	alpha_difference;
59 	typedef AggCompOpAdapter<comp_lighten, agg_buffer>		alpha_lighten;
60 	typedef AggCompOpAdapter<comp_darken, agg_buffer>		alpha_darken;
61 
62 	enum base_scale_e
63 	{
64 		base_shift = color_type::base_shift,
65 		base_scale = color_type::base_scale,
66 		base_mask  = color_type::base_mask,
67 		pix_width  = 4,
68 	};
69 
70 	typedef void (*blend_pixel_f)(int x, int y, const color_type& c,
71 								  uint8 cover,
72 								  agg_buffer* buffer,
73 								  const PatternHandler* pattern);
74 
75 	typedef void (*blend_line)(int x, int y, unsigned len,
76 							   const color_type& c, uint8 cover,
77 							   agg_buffer* buffer,
78 							   const PatternHandler* pattern);
79 
80 	typedef void (*blend_solid_span)(int x, int y, unsigned len,
81 									 const color_type& c,
82 									 const uint8* covers,
83 									 agg_buffer* buffer,
84 									 const PatternHandler* pattern);
85 
86 	typedef void (*blend_color_span)(int x, int y, unsigned len,
87 									 const color_type* colors,
88 									 const uint8* covers,
89 									 uint8 cover,
90 									 agg_buffer* buffer,
91 									 const PatternHandler* pattern);
92 
93 			// PixelFormat class
94 								PixelFormat(agg::rendering_buffer& buffer,
95 											const PatternHandler* handler);
96 
97 								~PixelFormat();
98 
99 
100 			void				SetDrawingMode(drawing_mode mode,
101 											   source_alpha alphaSrcMode,
102 											   alpha_function alphaFncMode);
103 
104 			// AGG "pixel format" interface
105 	inline	unsigned			width() const
106 									{ return fBuffer->width(); }
107 	inline	unsigned			height() const
108 									{ return fBuffer->height(); }
109 	inline	int					stride() const
110 									{ return fBuffer->stride(); }
111 
112 	inline	uint8*				row_ptr(int y)
113 									{ return fBuffer->row_ptr(y); }
114 	inline	const uint8*		row_ptr(int y) const
115 									{ return fBuffer->row_ptr(y); }
116 	inline	row_data			row(int y) const
117 									{ return fBuffer->row(y); }
118 
119 	inline	uint8*				pix_ptr(int x, int y);
120 	inline	const uint8*		pix_ptr(int x, int y) const;
121 
122 	inline	static	void		make_pix(uint8* p, const color_type& c);
123 //	inline	color_type			pixel(int x, int y) const;
124 
125 	inline	void				blend_pixel(int x, int y,
126 											const color_type& c,
127 											uint8 cover);
128 
129 
130 	inline	void				blend_hline(int x, int y,
131 											unsigned len,
132 											const color_type& c,
133 											uint8 cover);
134 
135 	inline	void				blend_vline(int x, int y,
136 											unsigned len,
137 											const color_type& c,
138 											uint8 cover);
139 
140 	inline	void				blend_solid_hspan(int x, int y,
141 												  unsigned len,
142 												  const color_type& c,
143 												  const uint8* covers);
144 
145 	inline	void				blend_solid_hspan_subpix(int x, int y,
146 												  unsigned len,
147 												  const color_type& c,
148 												  const uint8* covers);
149 
150 	inline	void				blend_solid_vspan(int x, int y,
151 												  unsigned len,
152 												  const color_type& c,
153 												  const uint8* covers);
154 
155 	inline	void				blend_color_hspan(int x, int y,
156 												  unsigned len,
157 												  const color_type* colors,
158 												  const uint8* covers,
159 												  uint8 cover);
160 
161 	inline	void				blend_color_vspan(int x, int y,
162 												  unsigned len,
163 												  const color_type* colors,
164 												  const uint8* covers,
165 												  uint8 cover);
166 
167  private:
168 	agg::rendering_buffer*		fBuffer;
169 	const PatternHandler*		fPatternHandler;
170 
171 	blend_pixel_f				fBlendPixel;
172 	blend_line					fBlendHLine;
173 	blend_line					fBlendVLine;
174 	blend_solid_span			fBlendSolidHSpan;
175 	blend_solid_span            fBlendSolidHSpanSubpix;
176 	blend_solid_span			fBlendSolidVSpan;
177 	blend_color_span			fBlendColorHSpan;
178 	blend_color_span			fBlendColorVSpan;
179 
180 	template<typename T>
181 	void SetAggCompOpAdapter()
182 	{
183 		fBlendPixel = T::blend_pixel;
184 		fBlendHLine = T::blend_hline;
185 		fBlendSolidHSpanSubpix = T::blend_solid_hspan_subpix;
186 		fBlendSolidHSpan = T::blend_solid_hspan;
187 		fBlendSolidVSpan = T::blend_solid_vspan;
188 		fBlendColorHSpan = T::blend_color_hspan;
189 	}
190 };
191 
192 // inlined functions
193 
194 // pix_ptr
195 inline uint8*
196 PixelFormat::pix_ptr(int x, int y)
197 {
198 	return fBuffer->row_ptr(y) + x * pix_width;
199 }
200 
201 // pix_ptr
202 inline const uint8*
203 PixelFormat::pix_ptr(int x, int y) const
204 {
205 	return fBuffer->row_ptr(y) + x * pix_width;
206 }
207 
208 // make_pix
209 inline void
210 PixelFormat::make_pix(uint8* p, const color_type& c)
211 {
212 	p[0] = c.b;
213 	p[1] = c.g;
214 	p[2] = c.r;
215 	p[3] = c.a;
216 }
217 
218 //// pixel
219 //inline color_type
220 //PixelFormat::pixel(int x, int y) const
221 //{
222 //	const uint8* p = (const uint8*)fBuffer->row_ptr(y);
223 //	if (p) {
224 //		p += x << 2;
225 //		return color_type(p[2], p[1], p[0], p[3]);
226 //	}
227 //	return color_type::no_color();
228 //}
229 
230 // blend_pixel
231 inline void
232 PixelFormat::blend_pixel(int x, int y, const color_type& c, uint8 cover)
233 {
234 	fBlendPixel(x, y, c, cover, fBuffer, fPatternHandler);
235 }
236 
237 // blend_hline
238 inline void
239 PixelFormat::blend_hline(int x, int y, unsigned len,
240 						 const color_type& c, uint8 cover)
241 {
242 	fBlendHLine(x, y, len, c, cover, fBuffer, fPatternHandler);
243 }
244 
245 // blend_vline
246 inline void
247 PixelFormat::blend_vline(int x, int y, unsigned len,
248 						 const color_type& c, uint8 cover)
249 {
250 	fBlendVLine(x, y, len, c, cover, fBuffer, fPatternHandler);
251 }
252 
253 // blend_solid_hspan
254 inline void
255 PixelFormat::blend_solid_hspan(int x, int y, unsigned len,
256 							   const color_type& c, const uint8* covers)
257 {
258 	fBlendSolidHSpan(x, y, len, c, covers, fBuffer, fPatternHandler);
259 }
260 
261 // blend_solid_hspan_subpix
262 inline void
263 PixelFormat::blend_solid_hspan_subpix(int x, int y, unsigned len,
264 							   const color_type& c, const uint8* covers)
265 {
266 	fBlendSolidHSpanSubpix(x, y, len, c, covers, fBuffer, fPatternHandler);
267 }
268 
269 // blend_solid_vspan
270 inline void
271 PixelFormat::blend_solid_vspan(int x, int y, unsigned len,
272 							   const color_type& c, const uint8* covers)
273 {
274 	fBlendSolidVSpan(x, y, len, c, covers, fBuffer, fPatternHandler);
275 }
276 
277 // blend_color_hspan
278 inline void
279 PixelFormat::blend_color_hspan(int x, int y, unsigned len,
280 							   const color_type* colors,
281 							   const uint8* covers,
282 							   uint8 cover)
283 {
284 	fBlendColorHSpan(x, y, len, colors, covers, cover,
285 					 fBuffer, fPatternHandler);
286 }
287 
288 // blend_color_vspan
289 inline void
290 PixelFormat::blend_color_vspan(int x, int y, unsigned len,
291 							   const color_type* colors,
292 							   const uint8* covers,
293 							   uint8 cover)
294 {
295 	fBlendColorVSpan(x, y, len, colors, covers, cover,
296 					 fBuffer, fPatternHandler);
297 }
298 
299 #endif // PIXEL_FORMAT_H
300 
301