103b705cfSriastradh/*
203b705cfSriastradh * Copyright © 1998 Keith Packard
303b705cfSriastradh * Copyright © 2012 Intel Corporation
403b705cfSriastradh *
503b705cfSriastradh * Permission to use, copy, modify, distribute, and sell this software and its
603b705cfSriastradh * documentation for any purpose is hereby granted without fee, provided that
703b705cfSriastradh * the above copyright notice appear in all copies and that both that
803b705cfSriastradh * copyright notice and this permission notice appear in supporting
903b705cfSriastradh * documentation, and that the name of Keith Packard not be used in
1003b705cfSriastradh * advertising or publicity pertaining to distribution of the software without
1103b705cfSriastradh * specific, written prior permission.  Keith Packard makes no
1203b705cfSriastradh * representations about the suitability of this software for any purpose.  It
1303b705cfSriastradh * is provided "as is" without express or implied warranty.
1403b705cfSriastradh *
1503b705cfSriastradh * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
1603b705cfSriastradh * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
1703b705cfSriastradh * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
1803b705cfSriastradh * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
1903b705cfSriastradh * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
2003b705cfSriastradh * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
2103b705cfSriastradh * PERFORMANCE OF THIS SOFTWARE.
2203b705cfSriastradh */
2303b705cfSriastradh
2403b705cfSriastradh#include "fb.h"
2503b705cfSriastradh
2603b705cfSriastradhFbBits
2703b705cfSriastradhfbReplicatePixel(Pixel p, int bpp)
2803b705cfSriastradh{
2903b705cfSriastradh	FbBits b = p;
3003b705cfSriastradh
3103b705cfSriastradh	b &= FbFullMask(bpp);
3203b705cfSriastradh	while (bpp < FB_UNIT) {
3303b705cfSriastradh		b |= b << bpp;
3403b705cfSriastradh		bpp <<= 1;
3503b705cfSriastradh	}
3603b705cfSriastradh	return b;
3703b705cfSriastradh}
3803b705cfSriastradh
3903b705cfSriastradh/*
4003b705cfSriastradh * Stipple masks are independent of bit/byte order as long
4103b705cfSriastradh * as bitorder == byteorder.  FB doesn't handle the case
4203b705cfSriastradh * where these differ
4303b705cfSriastradh */
4403b705cfSriastradh#define __mask(x,w)	((FB_ALLONES << ((x) & FB_MASK)) & \
4503b705cfSriastradh			 (FB_ALLONES >> ((FB_UNIT - ((x) + (w))) & FB_MASK)))
4603b705cfSriastradh#define _mask(x,w)	__mask((x)*(w),(w))
4703b705cfSriastradh#define mask(b,n,w)	((((b) >> (n)) & 1) * _mask(n,w))
4803b705cfSriastradh
4903b705cfSriastradh#define _C1(b,n,w) mask(b,n,w)
5003b705cfSriastradh#define _C2(b,n,w) (_C1(b,n,w) | _C1(b,n+1,w))
5103b705cfSriastradh#define _C4(b,n,w) (_C2(b,n,w) | _C2(b,n+2,w))
5203b705cfSriastradh#define C8(b,w) (_C4(b,0,w) | _C4(b,4,w))
5303b705cfSriastradh#define C4(b,w) _C4(b,0,w)
5403b705cfSriastradh#define C2(b,w) _C2(b,0,w)
5503b705cfSriastradh#define C1(b,w) _C1(b,0,w)
5603b705cfSriastradh
5703b705cfSriastradhstatic const FbBits fbStipple8Bits[256] = {
5803b705cfSriastradh	C8(0, 4), C8(1, 4), C8(2, 4), C8(3, 4), C8(4, 4), C8(5, 4),
5903b705cfSriastradh	C8(6, 4), C8(7, 4), C8(8, 4), C8(9, 4), C8(10, 4), C8(11, 4),
6003b705cfSriastradh	C8(12, 4), C8(13, 4), C8(14, 4), C8(15, 4), C8(16, 4), C8(17, 4),
6103b705cfSriastradh	C8(18, 4), C8(19, 4), C8(20, 4), C8(21, 4), C8(22, 4), C8(23, 4),
6203b705cfSriastradh	C8(24, 4), C8(25, 4), C8(26, 4), C8(27, 4), C8(28, 4), C8(29, 4),
6303b705cfSriastradh	C8(30, 4), C8(31, 4), C8(32, 4), C8(33, 4), C8(34, 4), C8(35, 4),
6403b705cfSriastradh	C8(36, 4), C8(37, 4), C8(38, 4), C8(39, 4), C8(40, 4), C8(41, 4),
6503b705cfSriastradh	C8(42, 4), C8(43, 4), C8(44, 4), C8(45, 4), C8(46, 4), C8(47, 4),
6603b705cfSriastradh	C8(48, 4), C8(49, 4), C8(50, 4), C8(51, 4), C8(52, 4), C8(53, 4),
6703b705cfSriastradh	C8(54, 4), C8(55, 4), C8(56, 4), C8(57, 4), C8(58, 4), C8(59, 4),
6803b705cfSriastradh	C8(60, 4), C8(61, 4), C8(62, 4), C8(63, 4), C8(64, 4), C8(65, 4),
6903b705cfSriastradh	C8(66, 4), C8(67, 4), C8(68, 4), C8(69, 4), C8(70, 4), C8(71, 4),
7003b705cfSriastradh	C8(72, 4), C8(73, 4), C8(74, 4), C8(75, 4), C8(76, 4), C8(77, 4),
7103b705cfSriastradh	C8(78, 4), C8(79, 4), C8(80, 4), C8(81, 4), C8(82, 4), C8(83, 4),
7203b705cfSriastradh	C8(84, 4), C8(85, 4), C8(86, 4), C8(87, 4), C8(88, 4), C8(89, 4),
7303b705cfSriastradh	C8(90, 4), C8(91, 4), C8(92, 4), C8(93, 4), C8(94, 4), C8(95, 4),
7403b705cfSriastradh	C8(96, 4), C8(97, 4), C8(98, 4), C8(99, 4), C8(100, 4), C8(101, 4),
7503b705cfSriastradh	C8(102, 4), C8(103, 4), C8(104, 4), C8(105, 4), C8(106, 4), C8(107, 4),
7603b705cfSriastradh	C8(108, 4), C8(109, 4), C8(110, 4), C8(111, 4), C8(112, 4), C8(113, 4),
7703b705cfSriastradh	C8(114, 4), C8(115, 4), C8(116, 4), C8(117, 4), C8(118, 4), C8(119, 4),
7803b705cfSriastradh	C8(120, 4), C8(121, 4), C8(122, 4), C8(123, 4), C8(124, 4), C8(125, 4),
7903b705cfSriastradh	C8(126, 4), C8(127, 4), C8(128, 4), C8(129, 4), C8(130, 4), C8(131, 4),
8003b705cfSriastradh	C8(132, 4), C8(133, 4), C8(134, 4), C8(135, 4), C8(136, 4), C8(137, 4),
8103b705cfSriastradh	C8(138, 4), C8(139, 4), C8(140, 4), C8(141, 4), C8(142, 4), C8(143, 4),
8203b705cfSriastradh	C8(144, 4), C8(145, 4), C8(146, 4), C8(147, 4), C8(148, 4), C8(149, 4),
8303b705cfSriastradh	C8(150, 4), C8(151, 4), C8(152, 4), C8(153, 4), C8(154, 4), C8(155, 4),
8403b705cfSriastradh	C8(156, 4), C8(157, 4), C8(158, 4), C8(159, 4), C8(160, 4), C8(161, 4),
8503b705cfSriastradh	C8(162, 4), C8(163, 4), C8(164, 4), C8(165, 4), C8(166, 4), C8(167, 4),
8603b705cfSriastradh	C8(168, 4), C8(169, 4), C8(170, 4), C8(171, 4), C8(172, 4), C8(173, 4),
8703b705cfSriastradh	C8(174, 4), C8(175, 4), C8(176, 4), C8(177, 4), C8(178, 4), C8(179, 4),
8803b705cfSriastradh	C8(180, 4), C8(181, 4), C8(182, 4), C8(183, 4), C8(184, 4), C8(185, 4),
8903b705cfSriastradh	C8(186, 4), C8(187, 4), C8(188, 4), C8(189, 4), C8(190, 4), C8(191, 4),
9003b705cfSriastradh	C8(192, 4), C8(193, 4), C8(194, 4), C8(195, 4), C8(196, 4), C8(197, 4),
9103b705cfSriastradh	C8(198, 4), C8(199, 4), C8(200, 4), C8(201, 4), C8(202, 4), C8(203, 4),
9203b705cfSriastradh	C8(204, 4), C8(205, 4), C8(206, 4), C8(207, 4), C8(208, 4), C8(209, 4),
9303b705cfSriastradh	C8(210, 4), C8(211, 4), C8(212, 4), C8(213, 4), C8(214, 4), C8(215, 4),
9403b705cfSriastradh	C8(216, 4), C8(217, 4), C8(218, 4), C8(219, 4), C8(220, 4), C8(221, 4),
9503b705cfSriastradh	C8(222, 4), C8(223, 4), C8(224, 4), C8(225, 4), C8(226, 4), C8(227, 4),
9603b705cfSriastradh	C8(228, 4), C8(229, 4), C8(230, 4), C8(231, 4), C8(232, 4), C8(233, 4),
9703b705cfSriastradh	C8(234, 4), C8(235, 4), C8(236, 4), C8(237, 4), C8(238, 4), C8(239, 4),
9803b705cfSriastradh	C8(240, 4), C8(241, 4), C8(242, 4), C8(243, 4), C8(244, 4), C8(245, 4),
9903b705cfSriastradh	C8(246, 4), C8(247, 4), C8(248, 4), C8(249, 4), C8(250, 4), C8(251, 4),
10003b705cfSriastradh	C8(252, 4), C8(253, 4), C8(254, 4), C8(255, 4),
10103b705cfSriastradh};
10203b705cfSriastradh
10303b705cfSriastradhstatic const FbBits fbStipple4Bits[16] = {
10403b705cfSriastradh	C4(0, 8), C4(1, 8), C4(2, 8), C4(3, 8), C4(4, 8), C4(5, 8),
10503b705cfSriastradh	C4(6, 8), C4(7, 8), C4(8, 8), C4(9, 8), C4(10, 8), C4(11, 8),
10603b705cfSriastradh	C4(12, 8), C4(13, 8), C4(14, 8), C4(15, 8),
10703b705cfSriastradh};
10803b705cfSriastradh
10903b705cfSriastradhstatic const FbBits fbStipple2Bits[4] = {
11003b705cfSriastradh	C2(0, 16), C2(1, 16), C2(2, 16), C2(3, 16),
11103b705cfSriastradh};
11203b705cfSriastradh
11303b705cfSriastradhstatic const FbBits fbStipple1Bits[2] = {
11403b705cfSriastradh	C1(0, 32), C1(1, 32),
11503b705cfSriastradh};
11603b705cfSriastradhconst FbBits *const fbStippleTable[] = {
11703b705cfSriastradh	0,
11803b705cfSriastradh	fbStipple1Bits,
11903b705cfSriastradh	fbStipple2Bits,
12003b705cfSriastradh	0,
12103b705cfSriastradh	fbStipple4Bits,
12203b705cfSriastradh	0,
12303b705cfSriastradh	0,
12403b705cfSriastradh	0,
12503b705cfSriastradh	fbStipple8Bits,
12603b705cfSriastradh};
127