xref: /OK3568_Linux_fs/external/xserver/mi/mizerarc.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /************************************************************
2*4882a593Smuzhiyun 
3*4882a593Smuzhiyun Copyright 1989, 1998  The Open Group
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun Permission to use, copy, modify, distribute, and sell this software and its
6*4882a593Smuzhiyun documentation for any purpose is hereby granted without fee, provided that
7*4882a593Smuzhiyun the above copyright notice appear in all copies and that both that
8*4882a593Smuzhiyun copyright notice and this permission notice appear in supporting
9*4882a593Smuzhiyun documentation.
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun The above copyright notice and this permission notice shall be included in
12*4882a593Smuzhiyun all copies or substantial portions of the Software.
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15*4882a593Smuzhiyun IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*4882a593Smuzhiyun FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
17*4882a593Smuzhiyun OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
18*4882a593Smuzhiyun AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19*4882a593Smuzhiyun CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun Except as contained in this notice, the name of The Open Group shall not be
22*4882a593Smuzhiyun used in advertising or otherwise to promote the sale, use or other dealings
23*4882a593Smuzhiyun in this Software without prior written authorization from The Open Group.
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun ********************************************************/
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun typedef struct {
28*4882a593Smuzhiyun     int x;
29*4882a593Smuzhiyun     int y;
30*4882a593Smuzhiyun     int mask;
31*4882a593Smuzhiyun } miZeroArcPtRec;
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun typedef struct {
34*4882a593Smuzhiyun     int x, y, k1, k3, a, b, d, dx, dy;
35*4882a593Smuzhiyun     int alpha, beta;
36*4882a593Smuzhiyun     int xorg, yorg;
37*4882a593Smuzhiyun     int xorgo, yorgo;
38*4882a593Smuzhiyun     int w, h;
39*4882a593Smuzhiyun     int initialMask;
40*4882a593Smuzhiyun     miZeroArcPtRec start, altstart, end, altend;
41*4882a593Smuzhiyun     int firstx, firsty;
42*4882a593Smuzhiyun     int startAngle, endAngle;
43*4882a593Smuzhiyun } miZeroArcRec;
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun #define miCanZeroArc(arc) (((arc)->width == (arc)->height) || \
46*4882a593Smuzhiyun 			   (((arc)->width <= 800) && ((arc)->height <= 800)))
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun #define MIARCSETUP() \
49*4882a593Smuzhiyun     x = info.x; \
50*4882a593Smuzhiyun     y = info.y; \
51*4882a593Smuzhiyun     k1 = info.k1; \
52*4882a593Smuzhiyun     k3 = info.k3; \
53*4882a593Smuzhiyun     a = info.a; \
54*4882a593Smuzhiyun     b = info.b; \
55*4882a593Smuzhiyun     d = info.d; \
56*4882a593Smuzhiyun     dx = info.dx; \
57*4882a593Smuzhiyun     dy = info.dy
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun #define MIARCOCTANTSHIFT(clause) \
60*4882a593Smuzhiyun     if (a < 0) \
61*4882a593Smuzhiyun     { \
62*4882a593Smuzhiyun 	if (y == info.h) \
63*4882a593Smuzhiyun 	{ \
64*4882a593Smuzhiyun 	    d = -1; \
65*4882a593Smuzhiyun 	    a = b = k1 = 0; \
66*4882a593Smuzhiyun 	} \
67*4882a593Smuzhiyun 	else \
68*4882a593Smuzhiyun 	{ \
69*4882a593Smuzhiyun 	    dx = (k1 << 1) - k3; \
70*4882a593Smuzhiyun 	    k1 = dx - k1; \
71*4882a593Smuzhiyun 	    k3 = -k3; \
72*4882a593Smuzhiyun 	    b = b + a - (k1 >> 1); \
73*4882a593Smuzhiyun 	    d = b + ((-a) >> 1) - d + (k3 >> 3); \
74*4882a593Smuzhiyun 	    if (dx < 0) \
75*4882a593Smuzhiyun 		a = -((-dx) >> 1) - a; \
76*4882a593Smuzhiyun 	    else \
77*4882a593Smuzhiyun 		a = (dx >> 1) - a; \
78*4882a593Smuzhiyun 	    dx = 0; \
79*4882a593Smuzhiyun 	    dy = 1; \
80*4882a593Smuzhiyun 	    clause \
81*4882a593Smuzhiyun 	} \
82*4882a593Smuzhiyun     }
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun #define MIARCSTEP(move1,move2) \
85*4882a593Smuzhiyun     b -= k1; \
86*4882a593Smuzhiyun     if (d < 0) \
87*4882a593Smuzhiyun     { \
88*4882a593Smuzhiyun 	x += dx; \
89*4882a593Smuzhiyun 	y += dy; \
90*4882a593Smuzhiyun 	a += k1; \
91*4882a593Smuzhiyun 	d += b; \
92*4882a593Smuzhiyun 	move1 \
93*4882a593Smuzhiyun     } \
94*4882a593Smuzhiyun     else \
95*4882a593Smuzhiyun     { \
96*4882a593Smuzhiyun 	x++; \
97*4882a593Smuzhiyun 	y++; \
98*4882a593Smuzhiyun 	a += k3; \
99*4882a593Smuzhiyun 	d -= a; \
100*4882a593Smuzhiyun 	move2 \
101*4882a593Smuzhiyun     }
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun #define MIARCCIRCLESTEP(clause) \
104*4882a593Smuzhiyun     b -= k1; \
105*4882a593Smuzhiyun     x++; \
106*4882a593Smuzhiyun     if (d < 0) \
107*4882a593Smuzhiyun     { \
108*4882a593Smuzhiyun 	a += k1; \
109*4882a593Smuzhiyun 	d += b; \
110*4882a593Smuzhiyun     } \
111*4882a593Smuzhiyun     else \
112*4882a593Smuzhiyun     { \
113*4882a593Smuzhiyun 	y++; \
114*4882a593Smuzhiyun 	a += k3; \
115*4882a593Smuzhiyun 	d -= a; \
116*4882a593Smuzhiyun 	clause \
117*4882a593Smuzhiyun     }
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun /* mizerarc.c */
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun extern _X_EXPORT Bool miZeroArcSetup(xArc * /*arc */ ,
122*4882a593Smuzhiyun                                      miZeroArcRec * /*info */ ,
123*4882a593Smuzhiyun                                      Bool       /*ok360 */
124*4882a593Smuzhiyun     );
125