1428d7b3dSmrg#include <stdbool.h>
2428d7b3dSmrg
3428d7b3dSmrg#ifndef SNA_TRAPEZOIDS_H
4428d7b3dSmrg#define SNA_TRAPEZOIDS_H
5428d7b3dSmrg
6428d7b3dSmrg#define NO_ACCEL 0
7428d7b3dSmrg#define FORCE_FALLBACK 0
8428d7b3dSmrg#define NO_ALIGNED_BOXES 0
9428d7b3dSmrg#define NO_UNALIGNED_BOXES 0
10428d7b3dSmrg#define NO_SCAN_CONVERTER 0
11428d7b3dSmrg#define NO_GPU_THREADS 0
12428d7b3dSmrg
13428d7b3dSmrg#define NO_IMPRECISE 0
14428d7b3dSmrg#define NO_PRECISE 0
15428d7b3dSmrg
16428d7b3dSmrg#if 0
17428d7b3dSmrg#define __DBG DBG
18428d7b3dSmrg#else
19428d7b3dSmrg#define __DBG(x)
20428d7b3dSmrg#endif
21428d7b3dSmrg
22428d7b3dSmrgbool
23428d7b3dSmrgcomposite_aligned_boxes(struct sna *sna,
24428d7b3dSmrg			CARD8 op,
25428d7b3dSmrg			PicturePtr src,
26428d7b3dSmrg			PicturePtr dst,
27428d7b3dSmrg			PictFormatPtr maskFormat,
28428d7b3dSmrg			INT16 src_x, INT16 src_y,
29428d7b3dSmrg			int ntrap, const xTrapezoid *traps,
30428d7b3dSmrg			bool force_fallback);
31428d7b3dSmrg
32428d7b3dSmrgbool
33428d7b3dSmrgcomposite_unaligned_boxes(struct sna *sna,
34428d7b3dSmrg			  CARD8 op,
35428d7b3dSmrg			  PicturePtr src,
36428d7b3dSmrg			  PicturePtr dst,
37428d7b3dSmrg			  PictFormatPtr maskFormat,
38428d7b3dSmrg			  INT16 src_x, INT16 src_y,
39428d7b3dSmrg			  int ntrap, const xTrapezoid *traps,
40428d7b3dSmrg			  bool force_fallback);
41428d7b3dSmrg
42428d7b3dSmrgbool
43428d7b3dSmrgmono_trapezoids_span_converter(struct sna *sna,
44428d7b3dSmrg			       CARD8 op, PicturePtr src, PicturePtr dst,
45428d7b3dSmrg			       INT16 src_x, INT16 src_y,
46428d7b3dSmrg			       int ntrap, xTrapezoid *traps);
47428d7b3dSmrg
48428d7b3dSmrgbool
49428d7b3dSmrgmono_trapezoid_span_inplace(struct sna *sna,
50428d7b3dSmrg			    CARD8 op,
51428d7b3dSmrg			    PicturePtr src,
52428d7b3dSmrg			    PicturePtr dst,
53428d7b3dSmrg			    INT16 src_x, INT16 src_y,
54428d7b3dSmrg			    int ntrap, xTrapezoid *traps);
55428d7b3dSmrg
56428d7b3dSmrgbool
57428d7b3dSmrgmono_triangles_span_converter(struct sna *sna,
58428d7b3dSmrg			      CARD8 op, PicturePtr src, PicturePtr dst,
59428d7b3dSmrg			      INT16 src_x, INT16 src_y,
60428d7b3dSmrg			      int count, xTriangle *tri);
61428d7b3dSmrg
62428d7b3dSmrgbool
63428d7b3dSmrgimprecise_trapezoid_span_inplace(struct sna *sna,
64428d7b3dSmrg				 CARD8 op, PicturePtr src, PicturePtr dst,
65428d7b3dSmrg				 PictFormatPtr maskFormat, unsigned flags,
66428d7b3dSmrg				 INT16 src_x, INT16 src_y,
67428d7b3dSmrg				 int ntrap, xTrapezoid *traps,
68428d7b3dSmrg				 bool fallback);
69428d7b3dSmrg
70428d7b3dSmrgbool
71428d7b3dSmrgimprecise_trapezoid_span_converter(struct sna *sna,
72428d7b3dSmrg				   CARD8 op, PicturePtr src, PicturePtr dst,
73428d7b3dSmrg				   PictFormatPtr maskFormat, unsigned int flags,
74428d7b3dSmrg				   INT16 src_x, INT16 src_y,
75428d7b3dSmrg				   int ntrap, xTrapezoid *traps);
76428d7b3dSmrg
77428d7b3dSmrgbool
78428d7b3dSmrgimprecise_trapezoid_mask_converter(CARD8 op, PicturePtr src, PicturePtr dst,
79428d7b3dSmrg				   PictFormatPtr maskFormat, unsigned flags,
80428d7b3dSmrg				   INT16 src_x, INT16 src_y,
81428d7b3dSmrg				   int ntrap, xTrapezoid *traps);
82428d7b3dSmrg
83428d7b3dSmrgbool
84428d7b3dSmrgimprecise_trapezoid_span_fallback(CARD8 op, PicturePtr src, PicturePtr dst,
85428d7b3dSmrg				  PictFormatPtr maskFormat, unsigned flags,
86428d7b3dSmrg				  INT16 src_x, INT16 src_y,
87428d7b3dSmrg				  int ntrap, xTrapezoid *traps);
88428d7b3dSmrg
89428d7b3dSmrgbool
90428d7b3dSmrgprecise_trapezoid_span_inplace(struct sna *sna,
91428d7b3dSmrg				 CARD8 op, PicturePtr src, PicturePtr dst,
92428d7b3dSmrg				 PictFormatPtr maskFormat, unsigned flags,
93428d7b3dSmrg				 INT16 src_x, INT16 src_y,
94428d7b3dSmrg				 int ntrap, xTrapezoid *traps,
95428d7b3dSmrg				 bool fallback);
96428d7b3dSmrg
97428d7b3dSmrgbool
98428d7b3dSmrgprecise_trapezoid_span_converter(struct sna *sna,
99428d7b3dSmrg				   CARD8 op, PicturePtr src, PicturePtr dst,
100428d7b3dSmrg				   PictFormatPtr maskFormat, unsigned int flags,
101428d7b3dSmrg				   INT16 src_x, INT16 src_y,
102428d7b3dSmrg				   int ntrap, xTrapezoid *traps);
103428d7b3dSmrg
104428d7b3dSmrgbool
105428d7b3dSmrgprecise_trapezoid_mask_converter(CARD8 op, PicturePtr src, PicturePtr dst,
106428d7b3dSmrg				   PictFormatPtr maskFormat, unsigned flags,
107428d7b3dSmrg				   INT16 src_x, INT16 src_y,
108428d7b3dSmrg				   int ntrap, xTrapezoid *traps);
109428d7b3dSmrg
110428d7b3dSmrgbool
111428d7b3dSmrgprecise_trapezoid_span_fallback(CARD8 op, PicturePtr src, PicturePtr dst,
112428d7b3dSmrg				PictFormatPtr maskFormat, unsigned flags,
113428d7b3dSmrg				INT16 src_x, INT16 src_y,
114428d7b3dSmrg				int ntrap, xTrapezoid *traps);
115428d7b3dSmrg
116428d7b3dSmrgstatic inline bool is_mono(PicturePtr dst, PictFormatPtr mask)
117428d7b3dSmrg{
118428d7b3dSmrg	return mask ? mask->depth < 8 : dst->polyEdge==PolyEdgeSharp;
119428d7b3dSmrg}
120428d7b3dSmrg
121428d7b3dSmrgstatic inline bool is_precise(PicturePtr dst, PictFormatPtr mask)
122428d7b3dSmrg{
123428d7b3dSmrg	return dst->polyMode == PolyModePrecise && !is_mono(dst, mask);
124428d7b3dSmrg}
125428d7b3dSmrg
126428d7b3dSmrgstatic inline bool
127428d7b3dSmrgtrapezoid_span_inplace(struct sna *sna,
128428d7b3dSmrg		       CARD8 op, PicturePtr src, PicturePtr dst,
129428d7b3dSmrg		       PictFormatPtr maskFormat, unsigned flags,
130428d7b3dSmrg		       INT16 src_x, INT16 src_y,
131428d7b3dSmrg		       int ntrap, xTrapezoid *traps,
132428d7b3dSmrg		       bool fallback)
133428d7b3dSmrg{
134428d7b3dSmrg	if (NO_SCAN_CONVERTER)
135428d7b3dSmrg		return false;
136428d7b3dSmrg
137428d7b3dSmrg	if (dst->alphaMap) {
138428d7b3dSmrg		DBG(("%s: fallback -- dst alphamap\n",
139428d7b3dSmrg		     __FUNCTION__));
140428d7b3dSmrg		return false;
141428d7b3dSmrg	}
142428d7b3dSmrg
143428d7b3dSmrg	if (!fallback && is_gpu(sna, dst->pDrawable, PREFER_GPU_SPANS)) {
144428d7b3dSmrg		DBG(("%s: fallback -- can not perform operation in place, destination busy\n",
145428d7b3dSmrg		     __FUNCTION__));
146428d7b3dSmrg
147428d7b3dSmrg		return false;
148428d7b3dSmrg	}
149428d7b3dSmrg
150428d7b3dSmrg	if (is_mono(dst, maskFormat))
151428d7b3dSmrg		return mono_trapezoid_span_inplace(sna, op, src, dst, src_x, src_y, ntrap, traps);
152428d7b3dSmrg	else if (is_precise(dst, maskFormat))
153428d7b3dSmrg		return precise_trapezoid_span_inplace(sna, op, src, dst, maskFormat, flags, src_x, src_y, ntrap, traps, fallback);
154428d7b3dSmrg	else
155428d7b3dSmrg		return imprecise_trapezoid_span_inplace(sna, op, src, dst, maskFormat, flags, src_x, src_y, ntrap, traps, fallback);
156428d7b3dSmrg}
157428d7b3dSmrg
158428d7b3dSmrgstatic inline bool
159428d7b3dSmrgtrapezoid_span_converter(struct sna *sna,
160428d7b3dSmrg			 CARD8 op, PicturePtr src, PicturePtr dst,
161428d7b3dSmrg			 PictFormatPtr maskFormat, unsigned int flags,
162428d7b3dSmrg			 INT16 src_x, INT16 src_y,
163428d7b3dSmrg			 int ntrap, xTrapezoid *traps)
164428d7b3dSmrg{
165428d7b3dSmrg	if (NO_SCAN_CONVERTER)
166428d7b3dSmrg		return false;
167428d7b3dSmrg
168428d7b3dSmrg	if (is_mono(dst, maskFormat))
169428d7b3dSmrg		return mono_trapezoids_span_converter(sna, op, src, dst, src_x, src_y, ntrap, traps);
170428d7b3dSmrg	else if (is_precise(dst, maskFormat))
171428d7b3dSmrg		return precise_trapezoid_span_converter(sna, op, src, dst, maskFormat, flags, src_x, src_y, ntrap, traps);
172428d7b3dSmrg	else
173428d7b3dSmrg		return imprecise_trapezoid_span_converter(sna, op, src, dst, maskFormat, flags, src_x, src_y, ntrap, traps);
174428d7b3dSmrg}
175428d7b3dSmrg
176428d7b3dSmrgstatic inline bool
177428d7b3dSmrgtrapezoid_mask_converter(CARD8 op, PicturePtr src, PicturePtr dst,
178428d7b3dSmrg			 PictFormatPtr maskFormat, unsigned flags,
179428d7b3dSmrg			 INT16 src_x, INT16 src_y,
180428d7b3dSmrg			 int ntrap, xTrapezoid *traps)
181428d7b3dSmrg{
182428d7b3dSmrg	if (NO_SCAN_CONVERTER)
183428d7b3dSmrg		return false;
184428d7b3dSmrg
185428d7b3dSmrg	if (is_precise(dst, maskFormat))
186428d7b3dSmrg		return precise_trapezoid_mask_converter(op, src, dst, maskFormat, flags, src_x, src_y, ntrap, traps);
187428d7b3dSmrg	else
188428d7b3dSmrg		return imprecise_trapezoid_mask_converter(op, src, dst, maskFormat, flags, src_x, src_y, ntrap, traps);
189428d7b3dSmrg}
190428d7b3dSmrg
191428d7b3dSmrgstatic inline bool
192428d7b3dSmrgtrapezoid_span_fallback(CARD8 op, PicturePtr src, PicturePtr dst,
193428d7b3dSmrg			PictFormatPtr maskFormat, unsigned flags,
194428d7b3dSmrg			INT16 src_x, INT16 src_y,
195428d7b3dSmrg			int ntrap, xTrapezoid *traps)
196428d7b3dSmrg{
197428d7b3dSmrg	if (NO_SCAN_CONVERTER)
198428d7b3dSmrg		return false;
199428d7b3dSmrg
200428d7b3dSmrg	if (is_precise(dst, maskFormat))
201428d7b3dSmrg		return precise_trapezoid_span_fallback(op, src, dst, maskFormat, flags, src_x, src_y, ntrap, traps);
202428d7b3dSmrg	else
203428d7b3dSmrg		return imprecise_trapezoid_span_fallback(op, src, dst, maskFormat, flags, src_x, src_y, ntrap, traps);
204428d7b3dSmrg}
205428d7b3dSmrg
206428d7b3dSmrgbool
207428d7b3dSmrgmono_trap_span_converter(struct sna *sna,
208428d7b3dSmrg			 PicturePtr dst,
209428d7b3dSmrg			 INT16 x, INT16 y,
210428d7b3dSmrg			 int ntrap, xTrap *traps);
211428d7b3dSmrg
212428d7b3dSmrgbool
213428d7b3dSmrgprecise_trap_span_converter(struct sna *sna,
214428d7b3dSmrg			    PicturePtr dst,
215428d7b3dSmrg			    INT16 src_x, INT16 src_y,
216428d7b3dSmrg			    int ntrap, xTrap *trap);
217428d7b3dSmrg
218428d7b3dSmrgbool
219428d7b3dSmrgimprecise_trap_span_converter(struct sna *sna,
220428d7b3dSmrg			      PicturePtr dst,
221428d7b3dSmrg			      INT16 src_x, INT16 src_y,
222428d7b3dSmrg			      int ntrap, xTrap *trap);
223428d7b3dSmrg
224428d7b3dSmrgstatic inline bool
225428d7b3dSmrgtrap_span_converter(struct sna *sna,
226428d7b3dSmrg		    PicturePtr dst,
227428d7b3dSmrg		    INT16 src_x, INT16 src_y,
228428d7b3dSmrg		    int ntrap, xTrap *trap)
229428d7b3dSmrg{
230428d7b3dSmrg	if (NO_SCAN_CONVERTER)
231428d7b3dSmrg		return false;
232428d7b3dSmrg
233428d7b3dSmrg	if (dst->polyEdge == PolyEdgeSharp || dst->pDrawable->depth < 8)
234428d7b3dSmrg		return mono_trap_span_converter(sna, dst, src_x, src_y, ntrap, trap);
235428d7b3dSmrg	else if (dst->polyMode == PolyModePrecise)
236428d7b3dSmrg		return precise_trap_span_converter(sna, dst, src_x, src_y, ntrap, trap);
237428d7b3dSmrg	else
238428d7b3dSmrg		return imprecise_trap_span_converter(sna, dst, src_x, src_y, ntrap, trap);
239428d7b3dSmrg}
240428d7b3dSmrg
241428d7b3dSmrgbool
242428d7b3dSmrgtrap_mask_converter(struct sna *sna,
243428d7b3dSmrg		    PicturePtr picture,
244428d7b3dSmrg		    INT16 x, INT16 y,
245428d7b3dSmrg		    int ntrap, xTrap *trap);
246428d7b3dSmrg
247428d7b3dSmrgbool
248428d7b3dSmrgtriangles_span_converter(struct sna *sna,
249428d7b3dSmrg			 CARD8 op, PicturePtr src, PicturePtr dst,
250428d7b3dSmrg			 PictFormatPtr maskFormat, INT16 src_x, INT16 src_y,
251428d7b3dSmrg			 int count, xTriangle *tri);
252428d7b3dSmrg
253428d7b3dSmrgbool
254428d7b3dSmrgtriangles_mask_converter(CARD8 op, PicturePtr src, PicturePtr dst,
255428d7b3dSmrg			 PictFormatPtr maskFormat, INT16 src_x, INT16 src_y,
256428d7b3dSmrg			 int count, xTriangle *tri);
257428d7b3dSmrg
258428d7b3dSmrgbool
259428d7b3dSmrgmono_tristrip_span_converter(struct sna *sna,
260428d7b3dSmrg			     CARD8 op, PicturePtr src, PicturePtr dst,
261428d7b3dSmrg			     INT16 src_x, INT16 src_y,
262428d7b3dSmrg			     int count, xPointFixed *points);
263428d7b3dSmrgbool
264428d7b3dSmrgimprecise_tristrip_span_converter(struct sna *sna,
265428d7b3dSmrg				  CARD8 op, PicturePtr src, PicturePtr dst,
266428d7b3dSmrg				  PictFormatPtr maskFormat, INT16 src_x, INT16 src_y,
267428d7b3dSmrg				  int count, xPointFixed *points);
268428d7b3dSmrgbool
269428d7b3dSmrgprecise_tristrip_span_converter(struct sna *sna,
270428d7b3dSmrg				CARD8 op, PicturePtr src, PicturePtr dst,
271428d7b3dSmrg				PictFormatPtr maskFormat, INT16 src_x, INT16 src_y,
272428d7b3dSmrg				int count, xPointFixed *points);
273428d7b3dSmrg
274428d7b3dSmrgstatic inline bool
275428d7b3dSmrgtristrip_span_converter(struct sna *sna,
276428d7b3dSmrg			CARD8 op, PicturePtr src, PicturePtr dst,
277428d7b3dSmrg			PictFormatPtr maskFormat, INT16 src_x, INT16 src_y,
278428d7b3dSmrg			int count, xPointFixed *points)
279428d7b3dSmrg{
280428d7b3dSmrg	if (NO_SCAN_CONVERTER)
281428d7b3dSmrg		return false;
282428d7b3dSmrg
283428d7b3dSmrg	if (is_mono(dst, maskFormat))
284428d7b3dSmrg		return mono_tristrip_span_converter(sna, op, src, dst, src_x, src_y, count, points);
285428d7b3dSmrg	else if (is_precise(dst, maskFormat))
286428d7b3dSmrg		return precise_tristrip_span_converter(sna, op, src, dst, maskFormat, src_x, src_y, count, points);
287428d7b3dSmrg	else
288428d7b3dSmrg		return imprecise_tristrip_span_converter(sna, op, src, dst, maskFormat, src_x, src_y, count, points);
289428d7b3dSmrg}
290428d7b3dSmrg
291428d7b3dSmrginline static void trapezoid_origin(const xLineFixed *l, int16_t *x, int16_t *y)
292428d7b3dSmrg{
293428d7b3dSmrg	if (l->p1.y < l->p2.y) {
294428d7b3dSmrg		*x = pixman_fixed_to_int(l->p1.x);
295428d7b3dSmrg		*y = pixman_fixed_to_int(l->p1.y);
296428d7b3dSmrg	} else {
297428d7b3dSmrg		*x = pixman_fixed_to_int(l->p2.x);
298428d7b3dSmrg		*y = pixman_fixed_to_int(l->p2.y);
299428d7b3dSmrg	}
300428d7b3dSmrg}
301428d7b3dSmrg
302428d7b3dSmrg#define ONE_HALF 0x7f
303428d7b3dSmrg#define RB_MASK 0x00ff00ff
304428d7b3dSmrg#define RB_ONE_HALF 0x007f007f
305428d7b3dSmrg#define RB_MASK_PLUS_ONE 0x01000100
306428d7b3dSmrg#define G_SHIFT 8
307428d7b3dSmrg
308428d7b3dSmrgstatic force_inline uint32_t
309428d7b3dSmrgmul8x2_8 (uint32_t a, uint8_t b)
310428d7b3dSmrg{
311428d7b3dSmrg	uint32_t t = (a & RB_MASK) * b + RB_ONE_HALF;
312428d7b3dSmrg	return ((t + ((t >> G_SHIFT) & RB_MASK)) >> G_SHIFT) & RB_MASK;
313428d7b3dSmrg}
314428d7b3dSmrg
315428d7b3dSmrgstatic force_inline uint32_t
316428d7b3dSmrgadd8x2_8x2(uint32_t a, uint32_t b)
317428d7b3dSmrg{
318428d7b3dSmrg	uint32_t t = a + b;
319428d7b3dSmrg	t |= RB_MASK_PLUS_ONE - ((t >> G_SHIFT) & RB_MASK);
320428d7b3dSmrg	return t & RB_MASK;
321428d7b3dSmrg}
322428d7b3dSmrg
323428d7b3dSmrgstatic force_inline uint32_t
324428d7b3dSmrglerp8x4(uint32_t src, uint8_t a, uint32_t dst)
325428d7b3dSmrg{
326428d7b3dSmrg	return (add8x2_8x2(mul8x2_8(src, a),
327428d7b3dSmrg			   mul8x2_8(dst, ~a)) |
328428d7b3dSmrg		add8x2_8x2(mul8x2_8(src >> G_SHIFT, a),
329428d7b3dSmrg			   mul8x2_8(dst >> G_SHIFT, ~a)) << G_SHIFT);
330428d7b3dSmrg}
331428d7b3dSmrg
332428d7b3dSmrgstatic force_inline uint8_t
333428d7b3dSmrgmul_8_8(uint8_t a, uint8_t b)
334428d7b3dSmrg{
335428d7b3dSmrg    uint16_t t = a * (uint16_t)b + 0x7f;
336428d7b3dSmrg    return ((t >> 8) + t) >> 8;
337428d7b3dSmrg}
338428d7b3dSmrg
339428d7b3dSmrgstatic inline uint32_t multa(uint32_t s, uint8_t a, int shift)
340428d7b3dSmrg{
341428d7b3dSmrg	return mul_8_8((s >> shift) & 0xff, a) << shift;
342428d7b3dSmrg}
343428d7b3dSmrg
344428d7b3dSmrgstatic inline uint32_t mul_4x8_8(uint32_t color, uint8_t alpha)
345428d7b3dSmrg{
346428d7b3dSmrg	uint32_t v;
347428d7b3dSmrg
348428d7b3dSmrg	v = 0;
349428d7b3dSmrg	v |= multa(color, alpha, 24);
350428d7b3dSmrg	v |= multa(color, alpha, 16);
351428d7b3dSmrg	v |= multa(color, alpha, 8);
352428d7b3dSmrg	v |= multa(color, alpha, 0);
353428d7b3dSmrg
354428d7b3dSmrg	return v;
355428d7b3dSmrg}
356428d7b3dSmrg
357428d7b3dSmrgstatic inline bool
358428d7b3dSmrgxTriangleValid(const xTriangle *t)
359428d7b3dSmrg{
360428d7b3dSmrg	xPointFixed v1, v2;
361428d7b3dSmrg
362428d7b3dSmrg	v1.x = t->p2.x - t->p1.x;
363428d7b3dSmrg	v1.y = t->p2.y - t->p1.y;
364428d7b3dSmrg
365428d7b3dSmrg	v2.x = t->p3.x - t->p1.x;
366428d7b3dSmrg	v2.y = t->p3.y - t->p1.y;
367428d7b3dSmrg
368428d7b3dSmrg	/* if the length of any edge is zero, the area must be zero */
369428d7b3dSmrg	if (v1.x == 0 && v1.y == 0)
370428d7b3dSmrg		return false;
371428d7b3dSmrg	if (v2.x == 0 && v2.y == 0)
372428d7b3dSmrg		return false;
373428d7b3dSmrg
374428d7b3dSmrg	/* if the cross-product is zero, so it the size */
375428d7b3dSmrg	return v2.y * v1.x != v1.y * v2.x;
376428d7b3dSmrg}
377428d7b3dSmrg
378428d7b3dSmrg#define SAMPLES_X 17
379428d7b3dSmrg#define SAMPLES_Y 15
380428d7b3dSmrg
381428d7b3dSmrg#define FAST_SAMPLES_shift 2
382428d7b3dSmrg#define FAST_SAMPLES_X (1<<FAST_SAMPLES_shift)
383428d7b3dSmrg#define FAST_SAMPLES_Y (1<<FAST_SAMPLES_shift)
384428d7b3dSmrg#define FAST_SAMPLES_mask ((1<<FAST_SAMPLES_shift)-1)
385428d7b3dSmrg
386428d7b3dSmrg#define pixman_fixed_integer_floor(V) pixman_fixed_to_int(V)
387428d7b3dSmrg#define pixman_fixed_integer_ceil(V) pixman_fixed_to_int(pixman_fixed_ceil(V))
388428d7b3dSmrg
389428d7b3dSmrgstatic inline int pixman_fixed_to_fast(pixman_fixed_t v)
390428d7b3dSmrg{
391428d7b3dSmrg	return (v + (1<<(16-FAST_SAMPLES_shift-1))) >> (16 - FAST_SAMPLES_shift);
392428d7b3dSmrg}
393428d7b3dSmrg
394428d7b3dSmrgbool trapezoids_bounds(int n, const xTrapezoid *t, BoxPtr box);
395428d7b3dSmrg
396428d7b3dSmrg#define TOR_INPLACE_SIZE 128
397428d7b3dSmrg
398428d7b3dSmrg#endif /* SNA_TRAPEZOIDS_H */
399