fbutil.c revision 05b261ec
105b261ecSmrg/*
205b261ecSmrg * Copyright © 1998 Keith Packard
305b261ecSmrg *
405b261ecSmrg * Permission to use, copy, modify, distribute, and sell this software and its
505b261ecSmrg * documentation for any purpose is hereby granted without fee, provided that
605b261ecSmrg * the above copyright notice appear in all copies and that both that
705b261ecSmrg * copyright notice and this permission notice appear in supporting
805b261ecSmrg * documentation, and that the name of Keith Packard not be used in
905b261ecSmrg * advertising or publicity pertaining to distribution of the software without
1005b261ecSmrg * specific, written prior permission.  Keith Packard makes no
1105b261ecSmrg * representations about the suitability of this software for any purpose.  It
1205b261ecSmrg * is provided "as is" without express or implied warranty.
1305b261ecSmrg *
1405b261ecSmrg * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
1505b261ecSmrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
1605b261ecSmrg * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
1705b261ecSmrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
1805b261ecSmrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
1905b261ecSmrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
2005b261ecSmrg * PERFORMANCE OF THIS SOFTWARE.
2105b261ecSmrg */
2205b261ecSmrg
2305b261ecSmrg#ifdef HAVE_DIX_CONFIG_H
2405b261ecSmrg#include <dix-config.h>
2505b261ecSmrg#endif
2605b261ecSmrg
2705b261ecSmrg#include "fb.h"
2805b261ecSmrg
2905b261ecSmrgFbBits
3005b261ecSmrgfbReplicatePixel (Pixel p, int bpp)
3105b261ecSmrg{
3205b261ecSmrg    FbBits  b = p;
3305b261ecSmrg
3405b261ecSmrg    b &= FbFullMask (bpp);
3505b261ecSmrg    while (bpp < FB_UNIT)
3605b261ecSmrg    {
3705b261ecSmrg	b |= b << bpp;
3805b261ecSmrg	bpp <<= 1;
3905b261ecSmrg    }
4005b261ecSmrg    return b;
4105b261ecSmrg}
4205b261ecSmrg
4305b261ecSmrgvoid
4405b261ecSmrgfbReduceRasterOp (int rop, FbBits fg, FbBits pm, FbBits *andp, FbBits *xorp)
4505b261ecSmrg{
4605b261ecSmrg    FbBits	and, xor;
4705b261ecSmrg
4805b261ecSmrg    switch (rop)
4905b261ecSmrg    {
5005b261ecSmrg    default:
5105b261ecSmrg    case GXclear:	    /* 0 0 0 0 */
5205b261ecSmrg    	and = 0;
5305b261ecSmrg    	xor = 0;
5405b261ecSmrg	break;
5505b261ecSmrg    case GXand:		    /* 0 0 0 1 */
5605b261ecSmrg	and = fg;
5705b261ecSmrg	xor = 0;
5805b261ecSmrg	break;
5905b261ecSmrg    case GXandReverse:	    /* 0 0 1 0 */
6005b261ecSmrg	and = fg;
6105b261ecSmrg	xor = fg;
6205b261ecSmrg	break;
6305b261ecSmrg    case GXcopy:	    /* 0 0 1 1 */
6405b261ecSmrg	and = 0;
6505b261ecSmrg	xor = fg;
6605b261ecSmrg	break;
6705b261ecSmrg    case GXandInverted:	    /* 0 1 0 0 */
6805b261ecSmrg	and = ~fg;
6905b261ecSmrg	xor = 0;
7005b261ecSmrg	break;
7105b261ecSmrg    case GXnoop:	    /* 0 1 0 1 */
7205b261ecSmrg	and = FB_ALLONES;
7305b261ecSmrg	xor = 0;
7405b261ecSmrg	break;
7505b261ecSmrg    case GXxor:		    /* 0 1 1 0 */
7605b261ecSmrg	and = FB_ALLONES;
7705b261ecSmrg	xor = fg;
7805b261ecSmrg	break;
7905b261ecSmrg    case GXor:		    /* 0 1 1 1 */
8005b261ecSmrg	and = ~fg;
8105b261ecSmrg	xor = fg;
8205b261ecSmrg	break;
8305b261ecSmrg    case GXnor:		    /* 1 0 0 0 */
8405b261ecSmrg	and = ~fg;
8505b261ecSmrg	xor = ~fg;
8605b261ecSmrg	break;
8705b261ecSmrg    case GXequiv:	    /* 1 0 0 1 */
8805b261ecSmrg	and = FB_ALLONES;
8905b261ecSmrg	xor = ~fg;
9005b261ecSmrg	break;
9105b261ecSmrg    case GXinvert:	    /* 1 0 1 0 */
9205b261ecSmrg	and = FB_ALLONES;
9305b261ecSmrg	xor = FB_ALLONES;
9405b261ecSmrg	break;
9505b261ecSmrg    case GXorReverse:	    /* 1 0 1 1 */
9605b261ecSmrg	and = ~fg;
9705b261ecSmrg	xor = FB_ALLONES;
9805b261ecSmrg	break;
9905b261ecSmrg    case GXcopyInverted:    /* 1 1 0 0 */
10005b261ecSmrg	and = 0;
10105b261ecSmrg	xor = ~fg;
10205b261ecSmrg	break;
10305b261ecSmrg    case GXorInverted:	    /* 1 1 0 1 */
10405b261ecSmrg	and = fg;
10505b261ecSmrg	xor = ~fg;
10605b261ecSmrg	break;
10705b261ecSmrg    case GXnand:	    /* 1 1 1 0 */
10805b261ecSmrg	and = fg;
10905b261ecSmrg	xor = FB_ALLONES;
11005b261ecSmrg	break;
11105b261ecSmrg    case GXset:		    /* 1 1 1 1 */
11205b261ecSmrg	and = 0;
11305b261ecSmrg	xor = FB_ALLONES;
11405b261ecSmrg	break;
11505b261ecSmrg    }
11605b261ecSmrg    and |= ~pm;
11705b261ecSmrg    xor &= pm;
11805b261ecSmrg    *andp = and;
11905b261ecSmrg    *xorp = xor;
12005b261ecSmrg}
12105b261ecSmrg
12205b261ecSmrg#define O 0
12305b261ecSmrg#define I FB_ALLONES
12405b261ecSmrg
12505b261ecSmrgconst FbMergeRopRec FbMergeRopBits[16] = {
12605b261ecSmrg    { O,O,O,O },   /* clear	    0x0		0 */
12705b261ecSmrg    { I,O,O,O },   /* and	    0x1		src AND dst */
12805b261ecSmrg    { I,O,I,O },   /* andReverse    0x2		src AND NOT dst */
12905b261ecSmrg    { O,O,I,O },   /* copy	    0x3		src */
13005b261ecSmrg    { I,I,O,O },   /* andInverted   0x4		NOT src AND dst */
13105b261ecSmrg    { O,I,O,O },   /* noop	    0x5		dst */
13205b261ecSmrg    { O,I,I,O },   /* xor	    0x6		src XOR dst */
13305b261ecSmrg    { I,I,I,O },   /* or	    0x7		src OR dst */
13405b261ecSmrg    { I,I,I,I },   /* nor	    0x8		NOT src AND NOT dst */
13505b261ecSmrg    { O,I,I,I },   /* equiv	    0x9		NOT src XOR dst */
13605b261ecSmrg    { O,I,O,I },   /* invert	    0xa		NOT dst */
13705b261ecSmrg    { I,I,O,I },   /* orReverse	    0xb		src OR NOT dst */
13805b261ecSmrg    { O,O,I,I },   /* copyInverted  0xc		NOT src */
13905b261ecSmrg    { I,O,I,I },   /* orInverted    0xd		NOT src OR dst */
14005b261ecSmrg    { I,O,O,I },   /* nand	    0xe		NOT src OR NOT dst */
14105b261ecSmrg    { O,O,O,I },   /* set	    0xf		1 */
14205b261ecSmrg};
14305b261ecSmrg
14405b261ecSmrg/*
14505b261ecSmrg * Stipple masks are independent of bit/byte order as long
14605b261ecSmrg * as bitorder == byteorder.  FB doesn't handle the case
14705b261ecSmrg * where these differ
14805b261ecSmrg */
14905b261ecSmrg#define BitsMask(x,w)	((FB_ALLONES << ((x) & FB_MASK)) & \
15005b261ecSmrg			 (FB_ALLONES >> ((FB_UNIT - ((x) + (w))) & FB_MASK)))
15105b261ecSmrg
15205b261ecSmrg#define Mask(x,w)	BitsMask((x)*(w),(w))
15305b261ecSmrg
15405b261ecSmrg
15505b261ecSmrg#define SelMask(b,n,w)	((((b) >> n) & 1) * Mask(n,w))
15605b261ecSmrg
15705b261ecSmrg#define C1(b,w) \
15805b261ecSmrg    (SelMask(b,0,w))
15905b261ecSmrg
16005b261ecSmrg#define C2(b,w) \
16105b261ecSmrg    (SelMask(b,0,w) | \
16205b261ecSmrg     SelMask(b,1,w))
16305b261ecSmrg
16405b261ecSmrg#define C4(b,w) \
16505b261ecSmrg    (SelMask(b,0,w) | \
16605b261ecSmrg     SelMask(b,1,w) | \
16705b261ecSmrg     SelMask(b,2,w) | \
16805b261ecSmrg     SelMask(b,3,w))
16905b261ecSmrg
17005b261ecSmrg#define C8(b,w) \
17105b261ecSmrg    (SelMask(b,0,w) | \
17205b261ecSmrg     SelMask(b,1,w) | \
17305b261ecSmrg     SelMask(b,2,w) | \
17405b261ecSmrg     SelMask(b,3,w) | \
17505b261ecSmrg     SelMask(b,4,w) | \
17605b261ecSmrg     SelMask(b,5,w) | \
17705b261ecSmrg     SelMask(b,6,w) | \
17805b261ecSmrg     SelMask(b,7,w))
17905b261ecSmrg
18005b261ecSmrg#if FB_UNIT == 16
18105b261ecSmrg#define fbStipple16Bits 0
18205b261ecSmrg#define fbStipple8Bits 0
18305b261ecSmrgconst FbBits fbStipple4Bits[16] = {
18405b261ecSmrg    C4(  0,4), C4(  1,4), C4(  2,4), C4(  3,4), C4(  4,4), C4(  5,4),
18505b261ecSmrg    C4(  6,4), C4(  7,4), C4(  8,4), C4(  9,4), C4( 10,4), C4( 11,4),
18605b261ecSmrg    C4( 12,4), C4( 13,4), C4( 14,4), C4( 15,4),};
18705b261ecSmrgconst FbBits fbStipple2Bits[4] = {
18805b261ecSmrg    C2(  0,8), C2(  1,8), C2(  2,8), C2(  3,8),
18905b261ecSmrg};
19005b261ecSmrgconst FbBits fbStipple1Bits[2] = {
19105b261ecSmrg    C1(  0,16), C1(  1,16),
19205b261ecSmrg};
19305b261ecSmrg#endif
19405b261ecSmrg#if FB_UNIT == 32
19505b261ecSmrg#define fbStipple16Bits 0
19605b261ecSmrgconst FbBits fbStipple8Bits[256] = {
19705b261ecSmrg    C8(  0,4), C8(  1,4), C8(  2,4), C8(  3,4), C8(  4,4), C8(  5,4),
19805b261ecSmrg    C8(  6,4), C8(  7,4), C8(  8,4), C8(  9,4), C8( 10,4), C8( 11,4),
19905b261ecSmrg    C8( 12,4), C8( 13,4), C8( 14,4), C8( 15,4), C8( 16,4), C8( 17,4),
20005b261ecSmrg    C8( 18,4), C8( 19,4), C8( 20,4), C8( 21,4), C8( 22,4), C8( 23,4),
20105b261ecSmrg    C8( 24,4), C8( 25,4), C8( 26,4), C8( 27,4), C8( 28,4), C8( 29,4),
20205b261ecSmrg    C8( 30,4), C8( 31,4), C8( 32,4), C8( 33,4), C8( 34,4), C8( 35,4),
20305b261ecSmrg    C8( 36,4), C8( 37,4), C8( 38,4), C8( 39,4), C8( 40,4), C8( 41,4),
20405b261ecSmrg    C8( 42,4), C8( 43,4), C8( 44,4), C8( 45,4), C8( 46,4), C8( 47,4),
20505b261ecSmrg    C8( 48,4), C8( 49,4), C8( 50,4), C8( 51,4), C8( 52,4), C8( 53,4),
20605b261ecSmrg    C8( 54,4), C8( 55,4), C8( 56,4), C8( 57,4), C8( 58,4), C8( 59,4),
20705b261ecSmrg    C8( 60,4), C8( 61,4), C8( 62,4), C8( 63,4), C8( 64,4), C8( 65,4),
20805b261ecSmrg    C8( 66,4), C8( 67,4), C8( 68,4), C8( 69,4), C8( 70,4), C8( 71,4),
20905b261ecSmrg    C8( 72,4), C8( 73,4), C8( 74,4), C8( 75,4), C8( 76,4), C8( 77,4),
21005b261ecSmrg    C8( 78,4), C8( 79,4), C8( 80,4), C8( 81,4), C8( 82,4), C8( 83,4),
21105b261ecSmrg    C8( 84,4), C8( 85,4), C8( 86,4), C8( 87,4), C8( 88,4), C8( 89,4),
21205b261ecSmrg    C8( 90,4), C8( 91,4), C8( 92,4), C8( 93,4), C8( 94,4), C8( 95,4),
21305b261ecSmrg    C8( 96,4), C8( 97,4), C8( 98,4), C8( 99,4), C8(100,4), C8(101,4),
21405b261ecSmrg    C8(102,4), C8(103,4), C8(104,4), C8(105,4), C8(106,4), C8(107,4),
21505b261ecSmrg    C8(108,4), C8(109,4), C8(110,4), C8(111,4), C8(112,4), C8(113,4),
21605b261ecSmrg    C8(114,4), C8(115,4), C8(116,4), C8(117,4), C8(118,4), C8(119,4),
21705b261ecSmrg    C8(120,4), C8(121,4), C8(122,4), C8(123,4), C8(124,4), C8(125,4),
21805b261ecSmrg    C8(126,4), C8(127,4), C8(128,4), C8(129,4), C8(130,4), C8(131,4),
21905b261ecSmrg    C8(132,4), C8(133,4), C8(134,4), C8(135,4), C8(136,4), C8(137,4),
22005b261ecSmrg    C8(138,4), C8(139,4), C8(140,4), C8(141,4), C8(142,4), C8(143,4),
22105b261ecSmrg    C8(144,4), C8(145,4), C8(146,4), C8(147,4), C8(148,4), C8(149,4),
22205b261ecSmrg    C8(150,4), C8(151,4), C8(152,4), C8(153,4), C8(154,4), C8(155,4),
22305b261ecSmrg    C8(156,4), C8(157,4), C8(158,4), C8(159,4), C8(160,4), C8(161,4),
22405b261ecSmrg    C8(162,4), C8(163,4), C8(164,4), C8(165,4), C8(166,4), C8(167,4),
22505b261ecSmrg    C8(168,4), C8(169,4), C8(170,4), C8(171,4), C8(172,4), C8(173,4),
22605b261ecSmrg    C8(174,4), C8(175,4), C8(176,4), C8(177,4), C8(178,4), C8(179,4),
22705b261ecSmrg    C8(180,4), C8(181,4), C8(182,4), C8(183,4), C8(184,4), C8(185,4),
22805b261ecSmrg    C8(186,4), C8(187,4), C8(188,4), C8(189,4), C8(190,4), C8(191,4),
22905b261ecSmrg    C8(192,4), C8(193,4), C8(194,4), C8(195,4), C8(196,4), C8(197,4),
23005b261ecSmrg    C8(198,4), C8(199,4), C8(200,4), C8(201,4), C8(202,4), C8(203,4),
23105b261ecSmrg    C8(204,4), C8(205,4), C8(206,4), C8(207,4), C8(208,4), C8(209,4),
23205b261ecSmrg    C8(210,4), C8(211,4), C8(212,4), C8(213,4), C8(214,4), C8(215,4),
23305b261ecSmrg    C8(216,4), C8(217,4), C8(218,4), C8(219,4), C8(220,4), C8(221,4),
23405b261ecSmrg    C8(222,4), C8(223,4), C8(224,4), C8(225,4), C8(226,4), C8(227,4),
23505b261ecSmrg    C8(228,4), C8(229,4), C8(230,4), C8(231,4), C8(232,4), C8(233,4),
23605b261ecSmrg    C8(234,4), C8(235,4), C8(236,4), C8(237,4), C8(238,4), C8(239,4),
23705b261ecSmrg    C8(240,4), C8(241,4), C8(242,4), C8(243,4), C8(244,4), C8(245,4),
23805b261ecSmrg    C8(246,4), C8(247,4), C8(248,4), C8(249,4), C8(250,4), C8(251,4),
23905b261ecSmrg    C8(252,4), C8(253,4), C8(254,4), C8(255,4),
24005b261ecSmrg};
24105b261ecSmrgconst FbBits fbStipple4Bits[16] = {
24205b261ecSmrg    C4(  0,8), C4(  1,8), C4(  2,8), C4(  3,8), C4(  4,8), C4(  5,8),
24305b261ecSmrg    C4(  6,8), C4(  7,8), C4(  8,8), C4(  9,8), C4( 10,8), C4( 11,8),
24405b261ecSmrg    C4( 12,8), C4( 13,8), C4( 14,8), C4( 15,8),};
24505b261ecSmrgconst FbBits fbStipple2Bits[4] = {
24605b261ecSmrg    C2(  0,16), C2(  1,16), C2(  2,16), C2(  3,16),
24705b261ecSmrg};
24805b261ecSmrgconst FbBits fbStipple1Bits[2] = {
24905b261ecSmrg    C1(  0,32), C1(  1,32),
25005b261ecSmrg};
25105b261ecSmrg#endif
25205b261ecSmrg#if FB_UNIT == 64
25305b261ecSmrgconst FbBits fbStipple16Bits[256] = {
25405b261ecSmrg    C8(  0,4), C8(  1,4), C8(  2,4), C8(  3,4), C8(  4,4), C8(  5,4),
25505b261ecSmrg    C8(  6,4), C8(  7,4), C8(  8,4), C8(  9,4), C8( 10,4), C8( 11,4),
25605b261ecSmrg    C8( 12,4), C8( 13,4), C8( 14,4), C8( 15,4), C8( 16,4), C8( 17,4),
25705b261ecSmrg    C8( 18,4), C8( 19,4), C8( 20,4), C8( 21,4), C8( 22,4), C8( 23,4),
25805b261ecSmrg    C8( 24,4), C8( 25,4), C8( 26,4), C8( 27,4), C8( 28,4), C8( 29,4),
25905b261ecSmrg    C8( 30,4), C8( 31,4), C8( 32,4), C8( 33,4), C8( 34,4), C8( 35,4),
26005b261ecSmrg    C8( 36,4), C8( 37,4), C8( 38,4), C8( 39,4), C8( 40,4), C8( 41,4),
26105b261ecSmrg    C8( 42,4), C8( 43,4), C8( 44,4), C8( 45,4), C8( 46,4), C8( 47,4),
26205b261ecSmrg    C8( 48,4), C8( 49,4), C8( 50,4), C8( 51,4), C8( 52,4), C8( 53,4),
26305b261ecSmrg    C8( 54,4), C8( 55,4), C8( 56,4), C8( 57,4), C8( 58,4), C8( 59,4),
26405b261ecSmrg    C8( 60,4), C8( 61,4), C8( 62,4), C8( 63,4), C8( 64,4), C8( 65,4),
26505b261ecSmrg    C8( 66,4), C8( 67,4), C8( 68,4), C8( 69,4), C8( 70,4), C8( 71,4),
26605b261ecSmrg    C8( 72,4), C8( 73,4), C8( 74,4), C8( 75,4), C8( 76,4), C8( 77,4),
26705b261ecSmrg    C8( 78,4), C8( 79,4), C8( 80,4), C8( 81,4), C8( 82,4), C8( 83,4),
26805b261ecSmrg    C8( 84,4), C8( 85,4), C8( 86,4), C8( 87,4), C8( 88,4), C8( 89,4),
26905b261ecSmrg    C8( 90,4), C8( 91,4), C8( 92,4), C8( 93,4), C8( 94,4), C8( 95,4),
27005b261ecSmrg    C8( 96,4), C8( 97,4), C8( 98,4), C8( 99,4), C8(100,4), C8(101,4),
27105b261ecSmrg    C8(102,4), C8(103,4), C8(104,4), C8(105,4), C8(106,4), C8(107,4),
27205b261ecSmrg    C8(108,4), C8(109,4), C8(110,4), C8(111,4), C8(112,4), C8(113,4),
27305b261ecSmrg    C8(114,4), C8(115,4), C8(116,4), C8(117,4), C8(118,4), C8(119,4),
27405b261ecSmrg    C8(120,4), C8(121,4), C8(122,4), C8(123,4), C8(124,4), C8(125,4),
27505b261ecSmrg    C8(126,4), C8(127,4), C8(128,4), C8(129,4), C8(130,4), C8(131,4),
27605b261ecSmrg    C8(132,4), C8(133,4), C8(134,4), C8(135,4), C8(136,4), C8(137,4),
27705b261ecSmrg    C8(138,4), C8(139,4), C8(140,4), C8(141,4), C8(142,4), C8(143,4),
27805b261ecSmrg    C8(144,4), C8(145,4), C8(146,4), C8(147,4), C8(148,4), C8(149,4),
27905b261ecSmrg    C8(150,4), C8(151,4), C8(152,4), C8(153,4), C8(154,4), C8(155,4),
28005b261ecSmrg    C8(156,4), C8(157,4), C8(158,4), C8(159,4), C8(160,4), C8(161,4),
28105b261ecSmrg    C8(162,4), C8(163,4), C8(164,4), C8(165,4), C8(166,4), C8(167,4),
28205b261ecSmrg    C8(168,4), C8(169,4), C8(170,4), C8(171,4), C8(172,4), C8(173,4),
28305b261ecSmrg    C8(174,4), C8(175,4), C8(176,4), C8(177,4), C8(178,4), C8(179,4),
28405b261ecSmrg    C8(180,4), C8(181,4), C8(182,4), C8(183,4), C8(184,4), C8(185,4),
28505b261ecSmrg    C8(186,4), C8(187,4), C8(188,4), C8(189,4), C8(190,4), C8(191,4),
28605b261ecSmrg    C8(192,4), C8(193,4), C8(194,4), C8(195,4), C8(196,4), C8(197,4),
28705b261ecSmrg    C8(198,4), C8(199,4), C8(200,4), C8(201,4), C8(202,4), C8(203,4),
28805b261ecSmrg    C8(204,4), C8(205,4), C8(206,4), C8(207,4), C8(208,4), C8(209,4),
28905b261ecSmrg    C8(210,4), C8(211,4), C8(212,4), C8(213,4), C8(214,4), C8(215,4),
29005b261ecSmrg    C8(216,4), C8(217,4), C8(218,4), C8(219,4), C8(220,4), C8(221,4),
29105b261ecSmrg    C8(222,4), C8(223,4), C8(224,4), C8(225,4), C8(226,4), C8(227,4),
29205b261ecSmrg    C8(228,4), C8(229,4), C8(230,4), C8(231,4), C8(232,4), C8(233,4),
29305b261ecSmrg    C8(234,4), C8(235,4), C8(236,4), C8(237,4), C8(238,4), C8(239,4),
29405b261ecSmrg    C8(240,4), C8(241,4), C8(242,4), C8(243,4), C8(244,4), C8(245,4),
29505b261ecSmrg    C8(246,4), C8(247,4), C8(248,4), C8(249,4), C8(250,4), C8(251,4),
29605b261ecSmrg    C8(252,4), C8(253,4), C8(254,4), C8(255,4),
29705b261ecSmrg};
29805b261ecSmrgconst FbBits fbStipple8Bits[256] = {
29905b261ecSmrg    C8(  0,8), C8(  1,8), C8(  2,8), C8(  3,8), C8(  4,8), C8(  5,8),
30005b261ecSmrg    C8(  6,8), C8(  7,8), C8(  8,8), C8(  9,8), C8( 10,8), C8( 11,8),
30105b261ecSmrg    C8( 12,8), C8( 13,8), C8( 14,8), C8( 15,8), C8( 16,8), C8( 17,8),
30205b261ecSmrg    C8( 18,8), C8( 19,8), C8( 20,8), C8( 21,8), C8( 22,8), C8( 23,8),
30305b261ecSmrg    C8( 24,8), C8( 25,8), C8( 26,8), C8( 27,8), C8( 28,8), C8( 29,8),
30405b261ecSmrg    C8( 30,8), C8( 31,8), C8( 32,8), C8( 33,8), C8( 34,8), C8( 35,8),
30505b261ecSmrg    C8( 36,8), C8( 37,8), C8( 38,8), C8( 39,8), C8( 40,8), C8( 41,8),
30605b261ecSmrg    C8( 42,8), C8( 43,8), C8( 44,8), C8( 45,8), C8( 46,8), C8( 47,8),
30705b261ecSmrg    C8( 48,8), C8( 49,8), C8( 50,8), C8( 51,8), C8( 52,8), C8( 53,8),
30805b261ecSmrg    C8( 54,8), C8( 55,8), C8( 56,8), C8( 57,8), C8( 58,8), C8( 59,8),
30905b261ecSmrg    C8( 60,8), C8( 61,8), C8( 62,8), C8( 63,8), C8( 64,8), C8( 65,8),
31005b261ecSmrg    C8( 66,8), C8( 67,8), C8( 68,8), C8( 69,8), C8( 70,8), C8( 71,8),
31105b261ecSmrg    C8( 72,8), C8( 73,8), C8( 74,8), C8( 75,8), C8( 76,8), C8( 77,8),
31205b261ecSmrg    C8( 78,8), C8( 79,8), C8( 80,8), C8( 81,8), C8( 82,8), C8( 83,8),
31305b261ecSmrg    C8( 84,8), C8( 85,8), C8( 86,8), C8( 87,8), C8( 88,8), C8( 89,8),
31405b261ecSmrg    C8( 90,8), C8( 91,8), C8( 92,8), C8( 93,8), C8( 94,8), C8( 95,8),
31505b261ecSmrg    C8( 96,8), C8( 97,8), C8( 98,8), C8( 99,8), C8(100,8), C8(101,8),
31605b261ecSmrg    C8(102,8), C8(103,8), C8(104,8), C8(105,8), C8(106,8), C8(107,8),
31705b261ecSmrg    C8(108,8), C8(109,8), C8(110,8), C8(111,8), C8(112,8), C8(113,8),
31805b261ecSmrg    C8(114,8), C8(115,8), C8(116,8), C8(117,8), C8(118,8), C8(119,8),
31905b261ecSmrg    C8(120,8), C8(121,8), C8(122,8), C8(123,8), C8(124,8), C8(125,8),
32005b261ecSmrg    C8(126,8), C8(127,8), C8(128,8), C8(129,8), C8(130,8), C8(131,8),
32105b261ecSmrg    C8(132,8), C8(133,8), C8(134,8), C8(135,8), C8(136,8), C8(137,8),
32205b261ecSmrg    C8(138,8), C8(139,8), C8(140,8), C8(141,8), C8(142,8), C8(143,8),
32305b261ecSmrg    C8(144,8), C8(145,8), C8(146,8), C8(147,8), C8(148,8), C8(149,8),
32405b261ecSmrg    C8(150,8), C8(151,8), C8(152,8), C8(153,8), C8(154,8), C8(155,8),
32505b261ecSmrg    C8(156,8), C8(157,8), C8(158,8), C8(159,8), C8(160,8), C8(161,8),
32605b261ecSmrg    C8(162,8), C8(163,8), C8(164,8), C8(165,8), C8(166,8), C8(167,8),
32705b261ecSmrg    C8(168,8), C8(169,8), C8(170,8), C8(171,8), C8(172,8), C8(173,8),
32805b261ecSmrg    C8(174,8), C8(175,8), C8(176,8), C8(177,8), C8(178,8), C8(179,8),
32905b261ecSmrg    C8(180,8), C8(181,8), C8(182,8), C8(183,8), C8(184,8), C8(185,8),
33005b261ecSmrg    C8(186,8), C8(187,8), C8(188,8), C8(189,8), C8(190,8), C8(191,8),
33105b261ecSmrg    C8(192,8), C8(193,8), C8(194,8), C8(195,8), C8(196,8), C8(197,8),
33205b261ecSmrg    C8(198,8), C8(199,8), C8(200,8), C8(201,8), C8(202,8), C8(203,8),
33305b261ecSmrg    C8(204,8), C8(205,8), C8(206,8), C8(207,8), C8(208,8), C8(209,8),
33405b261ecSmrg    C8(210,8), C8(211,8), C8(212,8), C8(213,8), C8(214,8), C8(215,8),
33505b261ecSmrg    C8(216,8), C8(217,8), C8(218,8), C8(219,8), C8(220,8), C8(221,8),
33605b261ecSmrg    C8(222,8), C8(223,8), C8(224,8), C8(225,8), C8(226,8), C8(227,8),
33705b261ecSmrg    C8(228,8), C8(229,8), C8(230,8), C8(231,8), C8(232,8), C8(233,8),
33805b261ecSmrg    C8(234,8), C8(235,8), C8(236,8), C8(237,8), C8(238,8), C8(239,8),
33905b261ecSmrg    C8(240,8), C8(241,8), C8(242,8), C8(243,8), C8(244,8), C8(245,8),
34005b261ecSmrg    C8(246,8), C8(247,8), C8(248,8), C8(249,8), C8(250,8), C8(251,8),
34105b261ecSmrg    C8(252,8), C8(253,8), C8(254,8), C8(255,8),
34205b261ecSmrg};
34305b261ecSmrgconst FbBits fbStipple4Bits[16] = {
34405b261ecSmrg    C4(  0,16), C4(  1,16), C4(  2,16), C4(  3,16), C4(  4,16), C4(  5,16),
34505b261ecSmrg    C4(  6,16), C4(  7,16), C4(  8,16), C4(  9,16), C4( 10,16), C4( 11,16),
34605b261ecSmrg    C4( 12,16), C4( 13,16), C4( 14,16), C4( 15,16),};
34705b261ecSmrgconst FbBits fbStipple2Bits[4] = {
34805b261ecSmrg    C2(  0,32), C2(  1,32), C2(  2,32), C2(  3,32),
34905b261ecSmrg};
35005b261ecSmrg#define fbStipple1Bits 0
35105b261ecSmrg#endif
35205b261ecSmrgconst FbBits	* const fbStippleTable[] = {
35305b261ecSmrg    0,
35405b261ecSmrg    fbStipple1Bits,
35505b261ecSmrg    fbStipple2Bits,
35605b261ecSmrg    0,
35705b261ecSmrg    fbStipple4Bits,
35805b261ecSmrg    0,
35905b261ecSmrg    0,
36005b261ecSmrg    0,
36105b261ecSmrg    fbStipple8Bits,
36205b261ecSmrg};
363