1/*
2 * Copyright © 1998 Keith Packard
3 * Copyright © 2012 Intel Corporation
4 *
5 * Permission to use, copy, modify, distribute, and sell this software and its
6 * documentation for any purpose is hereby granted without fee, provided that
7 * the above copyright notice appear in all copies and that both that
8 * copyright notice and this permission notice appear in supporting
9 * documentation, and that the name of Keith Packard not be used in
10 * advertising or publicity pertaining to distribution of the software without
11 * specific, written prior permission.  Keith Packard makes no
12 * representations about the suitability of this software for any purpose.  It
13 * is provided "as is" without express or implied warranty.
14 *
15 * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
16 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
17 * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
18 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
19 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
20 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
21 * PERFORMANCE OF THIS SOFTWARE.
22 */
23
24#define isClipped(c,ul,lr)  (((c) | ((c) - (ul)) | ((lr) - (c))) & 0x80008000)
25#define RROP(b,a,x)	WRITE((b), FbDoRRop (READ(b), (a), (x)))
26
27#define WRITE_ADDR1(n)	    (n)
28#define WRITE_ADDR2(n)	    (n)
29#define WRITE_ADDR4(n)	    (n)
30
31#define WRITE1(d,n,fg)	    WRITE(d + WRITE_ADDR1(n), (BITS) (fg))
32
33#ifdef BITS2
34#define WRITE2(d,n,fg)	    WRITE((BITS2 *) &((d)[WRITE_ADDR2(n)]), (BITS2) (fg))
35#else
36#define WRITE2(d,n,fg)	    (WRITE1(d,n,fg), WRITE1(d,(n)+1,fg))
37#endif
38
39#ifdef BITS4
40#define WRITE4(d,n,fg)	    WRITE((BITS4 *) &((d)[WRITE_ADDR4(n)]), (BITS4) (fg))
41#else
42#define WRITE4(d,n,fg)	    (WRITE2(d,n,fg), WRITE2(d,(n)+2,fg))
43#endif
44
45static void
46GLYPH(FbBits * dstBits,
47      FbStride dstStride,
48      int dstBpp, FbStip * stipple, FbBits fg, int x, int height)
49{
50	int lshift;
51	FbStip bits;
52	BITS *dstLine;
53	BITS *dst;
54	int n;
55	int shift;
56
57	dstLine = (BITS *) dstBits;
58	dstLine += x & ~3;
59	dstStride *= (sizeof(FbBits) / sizeof(BITS));
60	shift = x & 3;
61	lshift = 4 - shift;
62	while (height--) {
63		bits = *stipple++;
64		dst = (BITS *) dstLine;
65		n = lshift;
66		while (bits) {
67			switch (FbStipMoveLsb(FbLeftStipBits(bits, n), 4, n)) {
68			case 0:
69				break;
70			case 1:
71				WRITE1(dst, 0, fg);
72				break;
73			case 2:
74				WRITE1(dst, 1, fg);
75				break;
76			case 3:
77				WRITE2(dst, 0, fg);
78				break;
79			case 4:
80				WRITE1(dst, 2, fg);
81				break;
82			case 5:
83				WRITE1(dst, 0, fg);
84				WRITE1(dst, 2, fg);
85				break;
86			case 6:
87				WRITE1(dst, 1, fg);
88				WRITE1(dst, 2, fg);
89				break;
90			case 7:
91				WRITE2(dst, 0, fg);
92				WRITE1(dst, 2, fg);
93				break;
94			case 8:
95				WRITE1(dst, 3, fg);
96				break;
97			case 9:
98				WRITE1(dst, 0, fg);
99				WRITE1(dst, 3, fg);
100				break;
101			case 10:
102				WRITE1(dst, 1, fg);
103				WRITE1(dst, 3, fg);
104				break;
105			case 11:
106				WRITE2(dst, 0, fg);
107				WRITE1(dst, 3, fg);
108				break;
109			case 12:
110				WRITE2(dst, 2, fg);
111				break;
112			case 13:
113				WRITE1(dst, 0, fg);
114				WRITE2(dst, 2, fg);
115				break;
116			case 14:
117				WRITE1(dst, 1, fg);
118				WRITE2(dst, 2, fg);
119				break;
120			case 15:
121				WRITE4(dst, 0, fg);
122				break;
123			}
124			bits = FbStipLeft(bits, n);
125			n = 4;
126			dst += 4;
127		}
128		dstLine += dstStride;
129	}
130}
131
132#undef WRITE_ADDR1
133#undef WRITE_ADDR2
134#undef WRITE_ADDR4
135#undef WRITE1
136#undef WRITE2
137#undef WRITE4
138
139#undef RROP
140#undef isClipped
141