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