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