fbpoint.c revision 1b5d61b8
1/* 2 * Copyright © 1998 Keith Packard 3 * 4 * Permission to use, copy, modify, distribute, and sell this software and its 5 * documentation for any purpose is hereby granted without fee, provided that 6 * the above copyright notice appear in all copies and that both that 7 * copyright notice and this permission notice appear in supporting 8 * documentation, and that the name of Keith Packard not be used in 9 * advertising or publicity pertaining to distribution of the software without 10 * specific, written prior permission. Keith Packard makes no 11 * representations about the suitability of this software for any purpose. It 12 * is provided "as is" without express or implied warranty. 13 * 14 * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 16 * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR 17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 20 * PERFORMANCE OF THIS SOFTWARE. 21 */ 22 23#ifdef HAVE_DIX_CONFIG_H 24#include <dix-config.h> 25#endif 26 27#include "fb.h" 28 29typedef void (*FbDots) (FbBits * dst, 30 FbStride dstStride, 31 int dstBpp, 32 BoxPtr pBox, 33 xPoint * pts, 34 int npt, 35 int xorg, 36 int yorg, int xoff, int yoff, FbBits and, FbBits xor); 37 38static void 39fbDots(FbBits * dstOrig, 40 FbStride dstStride, 41 int dstBpp, 42 BoxPtr pBox, 43 xPoint * pts, 44 int npt, 45 int xorg, int yorg, int xoff, int yoff, FbBits andOrig, FbBits xorOrig) 46{ 47 FbStip *dst = (FbStip *) dstOrig; 48 int x1, y1, x2, y2; 49 int x, y; 50 FbStip *d; 51 FbStip and = andOrig; 52 FbStip xor = xorOrig; 53 54 dstStride = FbBitsStrideToStipStride(dstStride); 55 x1 = pBox->x1; 56 y1 = pBox->y1; 57 x2 = pBox->x2; 58 y2 = pBox->y2; 59 while (npt--) { 60 x = pts->x + xorg; 61 y = pts->y + yorg; 62 pts++; 63 if (x1 <= x && x < x2 && y1 <= y && y < y2) { 64 FbStip mask; 65 x = (x + xoff) * dstBpp; 66 d = dst + ((y + yoff) * dstStride) + (x >> FB_STIP_SHIFT); 67 x &= FB_STIP_MASK; 68 69 mask = FbStipMask(x, dstBpp); 70 WRITE(d, FbDoMaskRRop(READ(d), and, xor, mask)); 71 } 72 } 73} 74 75void 76fbPolyPoint(DrawablePtr pDrawable, 77 GCPtr pGC, int mode, int nptInit, xPoint * pptInit) 78{ 79 FbGCPrivPtr pPriv = fbGetGCPrivate(pGC); 80 RegionPtr pClip = fbGetCompositeClip(pGC); 81 FbBits *dst; 82 FbStride dstStride; 83 int dstBpp; 84 int dstXoff, dstYoff; 85 FbDots dots; 86 FbBits and, xor; 87 xPoint *ppt; 88 int npt; 89 BoxPtr pBox; 90 int nBox; 91 92 /* make pointlist origin relative */ 93 ppt = pptInit; 94 npt = nptInit; 95 if (mode == CoordModePrevious) { 96 npt--; 97 while (npt--) { 98 ppt++; 99 ppt->x += (ppt - 1)->x; 100 ppt->y += (ppt - 1)->y; 101 } 102 } 103 fbGetDrawable(pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff); 104 and = pPriv->and; 105 xor = pPriv->xor; 106 dots = fbDots; 107 switch (dstBpp) { 108 case 8: 109 dots = fbDots8; 110 break; 111 case 16: 112 dots = fbDots16; 113 break; 114 case 32: 115 dots = fbDots32; 116 break; 117 } 118 for (nBox = RegionNumRects(pClip), pBox = RegionRects(pClip); 119 nBox--; pBox++) 120 (*dots) (dst, dstStride, dstBpp, pBox, pptInit, nptInit, 121 pDrawable->x, pDrawable->y, dstXoff, dstYoff, and, xor); 122 fbFinishAccess(pDrawable); 123} 124