2
* Id: fbutil.c,v 1.1 1999/11/02 03:54:45 keithp Exp $
4
* Copyright Ā© 1998 Keith Packard
6
* Permission to use, copy, modify, distribute, and sell this software and its
7
* documentation for any purpose is hereby granted without fee, provided that
8
* the above copyright notice appear in all copies and that both that
9
* copyright notice and this permission notice appear in supporting
10
* documentation, and that the name of Keith Packard not be used in
11
* advertising or publicity pertaining to distribution of the software without
12
* specific, written prior permission. Keith Packard makes no
13
* representations about the suitability of this software for any purpose. It
14
* is provided "as is" without express or implied warranty.
16
* KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
17
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
18
* EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
19
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
20
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
21
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
22
* PERFORMANCE OF THIS SOFTWARE.
24
/* $XFree86: xc/programs/Xserver/fb/fbutil.c,v 1.4 2000/02/23 20:29:48 dawes Exp $ */
26
#ifdef HAVE_DIX_CONFIG_H
27
#include <dix-config.h>
33
fbReplicatePixel (Pixel p, int bpp)
37
b &= FbFullMask (bpp);
47
fbReduceRasterOp (int rop, FbBits fg, FbBits pm, FbBits *andp, FbBits *xorp)
54
case GXclear: /* 0 0 0 0 */
58
case GXand: /* 0 0 0 1 */
62
case GXandReverse: /* 0 0 1 0 */
66
case GXcopy: /* 0 0 1 1 */
70
case GXandInverted: /* 0 1 0 0 */
74
case GXnoop: /* 0 1 0 1 */
78
case GXxor: /* 0 1 1 0 */
82
case GXor: /* 0 1 1 1 */
86
case GXnor: /* 1 0 0 0 */
90
case GXequiv: /* 1 0 0 1 */
94
case GXinvert: /* 1 0 1 0 */
98
case GXorReverse: /* 1 0 1 1 */
102
case GXcopyInverted: /* 1 1 0 0 */
106
case GXorInverted: /* 1 1 0 1 */
110
case GXnand: /* 1 1 1 0 */
114
case GXset: /* 1 1 1 1 */
128
const FbMergeRopRec FbMergeRopBits[16] = {
129
{ O,O,O,O }, /* clear 0x0 0 */
130
{ I,O,O,O }, /* and 0x1 src AND dst */
131
{ I,O,I,O }, /* andReverse 0x2 src AND NOT dst */
132
{ O,O,I,O }, /* copy 0x3 src */
133
{ I,I,O,O }, /* andInverted 0x4 NOT src AND dst */
134
{ O,I,O,O }, /* noop 0x5 dst */
135
{ O,I,I,O }, /* xor 0x6 src XOR dst */
136
{ I,I,I,O }, /* or 0x7 src OR dst */
137
{ I,I,I,I }, /* nor 0x8 NOT src AND NOT dst */
138
{ O,I,I,I }, /* equiv 0x9 NOT src XOR dst */
139
{ O,I,O,I }, /* invert 0xa NOT dst */
140
{ I,I,O,I }, /* orReverse 0xb src OR NOT dst */
141
{ O,O,I,I }, /* copyInverted 0xc NOT src */
142
{ I,O,I,I }, /* orInverted 0xd NOT src OR dst */
143
{ I,O,O,I }, /* nand 0xe NOT src OR NOT dst */
144
{ O,O,O,I }, /* set 0xf 1 */
148
* Stipple masks are independent of bit/byte order as long
149
* as bitorder == byteorder. FB doesn't handle the case
152
#define BitsMask(x,w) ((FB_ALLONES << ((x) & FB_MASK)) & \
153
(FB_ALLONES >> ((FB_UNIT - ((x) + (w))) & FB_MASK)))
155
#define Mask(x,w) BitsMask((x)*(w),(w))
158
#define SelMask(b,n,w) ((((b) >> n) & 1) * Mask(n,w))
184
#define fbStipple16Bits 0
185
#define fbStipple8Bits 0
186
const FbBits fbStipple4Bits[16] = {
187
C4( 0,4), C4( 1,4), C4( 2,4), C4( 3,4), C4( 4,4), C4( 5,4),
188
C4( 6,4), C4( 7,4), C4( 8,4), C4( 9,4), C4( 10,4), C4( 11,4),
189
C4( 12,4), C4( 13,4), C4( 14,4), C4( 15,4),};
190
const FbBits fbStipple2Bits[4] = {
191
C2( 0,8), C2( 1,8), C2( 2,8), C2( 3,8),
193
const FbBits fbStipple1Bits[2] = {
194
C1( 0,16), C1( 1,16),
198
#define fbStipple16Bits 0
199
const FbBits fbStipple8Bits[256] = {
200
C8( 0,4), C8( 1,4), C8( 2,4), C8( 3,4), C8( 4,4), C8( 5,4),
201
C8( 6,4), C8( 7,4), C8( 8,4), C8( 9,4), C8( 10,4), C8( 11,4),
202
C8( 12,4), C8( 13,4), C8( 14,4), C8( 15,4), C8( 16,4), C8( 17,4),
203
C8( 18,4), C8( 19,4), C8( 20,4), C8( 21,4), C8( 22,4), C8( 23,4),
204
C8( 24,4), C8( 25,4), C8( 26,4), C8( 27,4), C8( 28,4), C8( 29,4),
205
C8( 30,4), C8( 31,4), C8( 32,4), C8( 33,4), C8( 34,4), C8( 35,4),
206
C8( 36,4), C8( 37,4), C8( 38,4), C8( 39,4), C8( 40,4), C8( 41,4),
207
C8( 42,4), C8( 43,4), C8( 44,4), C8( 45,4), C8( 46,4), C8( 47,4),
208
C8( 48,4), C8( 49,4), C8( 50,4), C8( 51,4), C8( 52,4), C8( 53,4),
209
C8( 54,4), C8( 55,4), C8( 56,4), C8( 57,4), C8( 58,4), C8( 59,4),
210
C8( 60,4), C8( 61,4), C8( 62,4), C8( 63,4), C8( 64,4), C8( 65,4),
211
C8( 66,4), C8( 67,4), C8( 68,4), C8( 69,4), C8( 70,4), C8( 71,4),
212
C8( 72,4), C8( 73,4), C8( 74,4), C8( 75,4), C8( 76,4), C8( 77,4),
213
C8( 78,4), C8( 79,4), C8( 80,4), C8( 81,4), C8( 82,4), C8( 83,4),
214
C8( 84,4), C8( 85,4), C8( 86,4), C8( 87,4), C8( 88,4), C8( 89,4),
215
C8( 90,4), C8( 91,4), C8( 92,4), C8( 93,4), C8( 94,4), C8( 95,4),
216
C8( 96,4), C8( 97,4), C8( 98,4), C8( 99,4), C8(100,4), C8(101,4),
217
C8(102,4), C8(103,4), C8(104,4), C8(105,4), C8(106,4), C8(107,4),
218
C8(108,4), C8(109,4), C8(110,4), C8(111,4), C8(112,4), C8(113,4),
219
C8(114,4), C8(115,4), C8(116,4), C8(117,4), C8(118,4), C8(119,4),
220
C8(120,4), C8(121,4), C8(122,4), C8(123,4), C8(124,4), C8(125,4),
221
C8(126,4), C8(127,4), C8(128,4), C8(129,4), C8(130,4), C8(131,4),
222
C8(132,4), C8(133,4), C8(134,4), C8(135,4), C8(136,4), C8(137,4),
223
C8(138,4), C8(139,4), C8(140,4), C8(141,4), C8(142,4), C8(143,4),
224
C8(144,4), C8(145,4), C8(146,4), C8(147,4), C8(148,4), C8(149,4),
225
C8(150,4), C8(151,4), C8(152,4), C8(153,4), C8(154,4), C8(155,4),
226
C8(156,4), C8(157,4), C8(158,4), C8(159,4), C8(160,4), C8(161,4),
227
C8(162,4), C8(163,4), C8(164,4), C8(165,4), C8(166,4), C8(167,4),
228
C8(168,4), C8(169,4), C8(170,4), C8(171,4), C8(172,4), C8(173,4),
229
C8(174,4), C8(175,4), C8(176,4), C8(177,4), C8(178,4), C8(179,4),
230
C8(180,4), C8(181,4), C8(182,4), C8(183,4), C8(184,4), C8(185,4),
231
C8(186,4), C8(187,4), C8(188,4), C8(189,4), C8(190,4), C8(191,4),
232
C8(192,4), C8(193,4), C8(194,4), C8(195,4), C8(196,4), C8(197,4),
233
C8(198,4), C8(199,4), C8(200,4), C8(201,4), C8(202,4), C8(203,4),
234
C8(204,4), C8(205,4), C8(206,4), C8(207,4), C8(208,4), C8(209,4),
235
C8(210,4), C8(211,4), C8(212,4), C8(213,4), C8(214,4), C8(215,4),
236
C8(216,4), C8(217,4), C8(218,4), C8(219,4), C8(220,4), C8(221,4),
237
C8(222,4), C8(223,4), C8(224,4), C8(225,4), C8(226,4), C8(227,4),
238
C8(228,4), C8(229,4), C8(230,4), C8(231,4), C8(232,4), C8(233,4),
239
C8(234,4), C8(235,4), C8(236,4), C8(237,4), C8(238,4), C8(239,4),
240
C8(240,4), C8(241,4), C8(242,4), C8(243,4), C8(244,4), C8(245,4),
241
C8(246,4), C8(247,4), C8(248,4), C8(249,4), C8(250,4), C8(251,4),
242
C8(252,4), C8(253,4), C8(254,4), C8(255,4),
244
const FbBits fbStipple4Bits[16] = {
245
C4( 0,8), C4( 1,8), C4( 2,8), C4( 3,8), C4( 4,8), C4( 5,8),
246
C4( 6,8), C4( 7,8), C4( 8,8), C4( 9,8), C4( 10,8), C4( 11,8),
247
C4( 12,8), C4( 13,8), C4( 14,8), C4( 15,8),};
248
const FbBits fbStipple2Bits[4] = {
249
C2( 0,16), C2( 1,16), C2( 2,16), C2( 3,16),
251
const FbBits fbStipple1Bits[2] = {
252
C1( 0,32), C1( 1,32),
256
const FbBits fbStipple16Bits[256] = {
257
C8( 0,4), C8( 1,4), C8( 2,4), C8( 3,4), C8( 4,4), C8( 5,4),
258
C8( 6,4), C8( 7,4), C8( 8,4), C8( 9,4), C8( 10,4), C8( 11,4),
259
C8( 12,4), C8( 13,4), C8( 14,4), C8( 15,4), C8( 16,4), C8( 17,4),
260
C8( 18,4), C8( 19,4), C8( 20,4), C8( 21,4), C8( 22,4), C8( 23,4),
261
C8( 24,4), C8( 25,4), C8( 26,4), C8( 27,4), C8( 28,4), C8( 29,4),
262
C8( 30,4), C8( 31,4), C8( 32,4), C8( 33,4), C8( 34,4), C8( 35,4),
263
C8( 36,4), C8( 37,4), C8( 38,4), C8( 39,4), C8( 40,4), C8( 41,4),
264
C8( 42,4), C8( 43,4), C8( 44,4), C8( 45,4), C8( 46,4), C8( 47,4),
265
C8( 48,4), C8( 49,4), C8( 50,4), C8( 51,4), C8( 52,4), C8( 53,4),
266
C8( 54,4), C8( 55,4), C8( 56,4), C8( 57,4), C8( 58,4), C8( 59,4),
267
C8( 60,4), C8( 61,4), C8( 62,4), C8( 63,4), C8( 64,4), C8( 65,4),
268
C8( 66,4), C8( 67,4), C8( 68,4), C8( 69,4), C8( 70,4), C8( 71,4),
269
C8( 72,4), C8( 73,4), C8( 74,4), C8( 75,4), C8( 76,4), C8( 77,4),
270
C8( 78,4), C8( 79,4), C8( 80,4), C8( 81,4), C8( 82,4), C8( 83,4),
271
C8( 84,4), C8( 85,4), C8( 86,4), C8( 87,4), C8( 88,4), C8( 89,4),
272
C8( 90,4), C8( 91,4), C8( 92,4), C8( 93,4), C8( 94,4), C8( 95,4),
273
C8( 96,4), C8( 97,4), C8( 98,4), C8( 99,4), C8(100,4), C8(101,4),
274
C8(102,4), C8(103,4), C8(104,4), C8(105,4), C8(106,4), C8(107,4),
275
C8(108,4), C8(109,4), C8(110,4), C8(111,4), C8(112,4), C8(113,4),
276
C8(114,4), C8(115,4), C8(116,4), C8(117,4), C8(118,4), C8(119,4),
277
C8(120,4), C8(121,4), C8(122,4), C8(123,4), C8(124,4), C8(125,4),
278
C8(126,4), C8(127,4), C8(128,4), C8(129,4), C8(130,4), C8(131,4),
279
C8(132,4), C8(133,4), C8(134,4), C8(135,4), C8(136,4), C8(137,4),
280
C8(138,4), C8(139,4), C8(140,4), C8(141,4), C8(142,4), C8(143,4),
281
C8(144,4), C8(145,4), C8(146,4), C8(147,4), C8(148,4), C8(149,4),
282
C8(150,4), C8(151,4), C8(152,4), C8(153,4), C8(154,4), C8(155,4),
283
C8(156,4), C8(157,4), C8(158,4), C8(159,4), C8(160,4), C8(161,4),
284
C8(162,4), C8(163,4), C8(164,4), C8(165,4), C8(166,4), C8(167,4),
285
C8(168,4), C8(169,4), C8(170,4), C8(171,4), C8(172,4), C8(173,4),
286
C8(174,4), C8(175,4), C8(176,4), C8(177,4), C8(178,4), C8(179,4),
287
C8(180,4), C8(181,4), C8(182,4), C8(183,4), C8(184,4), C8(185,4),
288
C8(186,4), C8(187,4), C8(188,4), C8(189,4), C8(190,4), C8(191,4),
289
C8(192,4), C8(193,4), C8(194,4), C8(195,4), C8(196,4), C8(197,4),
290
C8(198,4), C8(199,4), C8(200,4), C8(201,4), C8(202,4), C8(203,4),
291
C8(204,4), C8(205,4), C8(206,4), C8(207,4), C8(208,4), C8(209,4),
292
C8(210,4), C8(211,4), C8(212,4), C8(213,4), C8(214,4), C8(215,4),
293
C8(216,4), C8(217,4), C8(218,4), C8(219,4), C8(220,4), C8(221,4),
294
C8(222,4), C8(223,4), C8(224,4), C8(225,4), C8(226,4), C8(227,4),
295
C8(228,4), C8(229,4), C8(230,4), C8(231,4), C8(232,4), C8(233,4),
296
C8(234,4), C8(235,4), C8(236,4), C8(237,4), C8(238,4), C8(239,4),
297
C8(240,4), C8(241,4), C8(242,4), C8(243,4), C8(244,4), C8(245,4),
298
C8(246,4), C8(247,4), C8(248,4), C8(249,4), C8(250,4), C8(251,4),
299
C8(252,4), C8(253,4), C8(254,4), C8(255,4),
301
const FbBits fbStipple8Bits[256] = {
302
C8( 0,8), C8( 1,8), C8( 2,8), C8( 3,8), C8( 4,8), C8( 5,8),
303
C8( 6,8), C8( 7,8), C8( 8,8), C8( 9,8), C8( 10,8), C8( 11,8),
304
C8( 12,8), C8( 13,8), C8( 14,8), C8( 15,8), C8( 16,8), C8( 17,8),
305
C8( 18,8), C8( 19,8), C8( 20,8), C8( 21,8), C8( 22,8), C8( 23,8),
306
C8( 24,8), C8( 25,8), C8( 26,8), C8( 27,8), C8( 28,8), C8( 29,8),
307
C8( 30,8), C8( 31,8), C8( 32,8), C8( 33,8), C8( 34,8), C8( 35,8),
308
C8( 36,8), C8( 37,8), C8( 38,8), C8( 39,8), C8( 40,8), C8( 41,8),
309
C8( 42,8), C8( 43,8), C8( 44,8), C8( 45,8), C8( 46,8), C8( 47,8),
310
C8( 48,8), C8( 49,8), C8( 50,8), C8( 51,8), C8( 52,8), C8( 53,8),
311
C8( 54,8), C8( 55,8), C8( 56,8), C8( 57,8), C8( 58,8), C8( 59,8),
312
C8( 60,8), C8( 61,8), C8( 62,8), C8( 63,8), C8( 64,8), C8( 65,8),
313
C8( 66,8), C8( 67,8), C8( 68,8), C8( 69,8), C8( 70,8), C8( 71,8),
314
C8( 72,8), C8( 73,8), C8( 74,8), C8( 75,8), C8( 76,8), C8( 77,8),
315
C8( 78,8), C8( 79,8), C8( 80,8), C8( 81,8), C8( 82,8), C8( 83,8),
316
C8( 84,8), C8( 85,8), C8( 86,8), C8( 87,8), C8( 88,8), C8( 89,8),
317
C8( 90,8), C8( 91,8), C8( 92,8), C8( 93,8), C8( 94,8), C8( 95,8),
318
C8( 96,8), C8( 97,8), C8( 98,8), C8( 99,8), C8(100,8), C8(101,8),
319
C8(102,8), C8(103,8), C8(104,8), C8(105,8), C8(106,8), C8(107,8),
320
C8(108,8), C8(109,8), C8(110,8), C8(111,8), C8(112,8), C8(113,8),
321
C8(114,8), C8(115,8), C8(116,8), C8(117,8), C8(118,8), C8(119,8),
322
C8(120,8), C8(121,8), C8(122,8), C8(123,8), C8(124,8), C8(125,8),
323
C8(126,8), C8(127,8), C8(128,8), C8(129,8), C8(130,8), C8(131,8),
324
C8(132,8), C8(133,8), C8(134,8), C8(135,8), C8(136,8), C8(137,8),
325
C8(138,8), C8(139,8), C8(140,8), C8(141,8), C8(142,8), C8(143,8),
326
C8(144,8), C8(145,8), C8(146,8), C8(147,8), C8(148,8), C8(149,8),
327
C8(150,8), C8(151,8), C8(152,8), C8(153,8), C8(154,8), C8(155,8),
328
C8(156,8), C8(157,8), C8(158,8), C8(159,8), C8(160,8), C8(161,8),
329
C8(162,8), C8(163,8), C8(164,8), C8(165,8), C8(166,8), C8(167,8),
330
C8(168,8), C8(169,8), C8(170,8), C8(171,8), C8(172,8), C8(173,8),
331
C8(174,8), C8(175,8), C8(176,8), C8(177,8), C8(178,8), C8(179,8),
332
C8(180,8), C8(181,8), C8(182,8), C8(183,8), C8(184,8), C8(185,8),
333
C8(186,8), C8(187,8), C8(188,8), C8(189,8), C8(190,8), C8(191,8),
334
C8(192,8), C8(193,8), C8(194,8), C8(195,8), C8(196,8), C8(197,8),
335
C8(198,8), C8(199,8), C8(200,8), C8(201,8), C8(202,8), C8(203,8),
336
C8(204,8), C8(205,8), C8(206,8), C8(207,8), C8(208,8), C8(209,8),
337
C8(210,8), C8(211,8), C8(212,8), C8(213,8), C8(214,8), C8(215,8),
338
C8(216,8), C8(217,8), C8(218,8), C8(219,8), C8(220,8), C8(221,8),
339
C8(222,8), C8(223,8), C8(224,8), C8(225,8), C8(226,8), C8(227,8),
340
C8(228,8), C8(229,8), C8(230,8), C8(231,8), C8(232,8), C8(233,8),
341
C8(234,8), C8(235,8), C8(236,8), C8(237,8), C8(238,8), C8(239,8),
342
C8(240,8), C8(241,8), C8(242,8), C8(243,8), C8(244,8), C8(245,8),
343
C8(246,8), C8(247,8), C8(248,8), C8(249,8), C8(250,8), C8(251,8),
344
C8(252,8), C8(253,8), C8(254,8), C8(255,8),
346
const FbBits fbStipple4Bits[16] = {
347
C4( 0,16), C4( 1,16), C4( 2,16), C4( 3,16), C4( 4,16), C4( 5,16),
348
C4( 6,16), C4( 7,16), C4( 8,16), C4( 9,16), C4( 10,16), C4( 11,16),
349
C4( 12,16), C4( 13,16), C4( 14,16), C4( 15,16),};
350
const FbBits fbStipple2Bits[4] = {
351
C2( 0,32), C2( 1,32), C2( 2,32), C2( 3,32),
353
#define fbStipple1Bits 0
355
const FbBits * const fbStippleTable[] = {