diff options
Diffstat (limited to 'src/sna/fb/fbpoint.c')
-rw-r--r-- | src/sna/fb/fbpoint.c | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/src/sna/fb/fbpoint.c b/src/sna/fb/fbpoint.c new file mode 100644 index 000000000..3df79a261 --- /dev/null +++ b/src/sna/fb/fbpoint.c @@ -0,0 +1,134 @@ +/* + * Copyright © 1998 Keith Packard + * Copyright © 2012 Intel Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "fb.h" +#include <micoord.h> + +#define DOTS fbDots8 +#define DOTS__SIMPLE fbDots8__simple +#define BITS BYTE +#include "fbpointbits.h" +#undef BITS +#undef DOTS__SIMPLE +#undef DOTS + +#define DOTS fbDots16 +#define DOTS__SIMPLE fbDots16__simple +#define BITS CARD16 +#include "fbpointbits.h" +#undef BITS +#undef DOTS__SIMPLE +#undef DOTS + +#define DOTS fbDots32 +#define DOTS__SIMPLE fbDots32__simple +#define BITS CARD32 +#include "fbpointbits.h" +#undef BITS +#undef DOTS__SIMPLE +#undef DOTS + +static void +fbDots(FbBits *dstOrig, FbStride dstStride, int dstBpp, + RegionPtr clip, + xPoint *pts, int n, + int xorg, int yorg, + int xoff, int yoff, + FbBits andOrig, FbBits xorOrig) +{ + FbStip *dst = (FbStip *) dstOrig; + FbStip and = andOrig; + FbStip xor = xorOrig; + + while (n--) { + int x = pts->x + xorg; + int y = pts->y + yorg; + pts++; + if (RegionContainsPoint(clip, x, y, NULL)) { + FbStip mask; + FbStip *d; + + x = (x + xoff) * dstBpp; + d = dst + ((y + yoff) * dstStride) + (x >> FB_STIP_SHIFT); + x &= FB_STIP_MASK; + + mask = FbStipMask(x, dstBpp); + WRITE(d, FbDoMaskRRop(READ(d), and, xor, mask)); + } + } +} + +void +fbPolyPoint(DrawablePtr drawable, GCPtr gc, + int mode, int n, xPoint *pt, unsigned flags) +{ + FbBits *dst; + FbStride dstStride; + int dstBpp; + int dstXoff, dstYoff; + void (*dots)(FbBits *dst, FbStride dstStride, int dstBpp, + RegionPtr clip, + xPoint *pts, int n, + int xorg, int yorg, + int xoff, int yoff, + FbBits and, FbBits xor); + + DBG(("%s x %d, clip=[(%d, %d), (%d, %d)]x%d\n", __FUNCTION__, n, + gc->pCompositeClip->extents.x1, gc->pCompositeClip->extents.y1, + gc->pCompositeClip->extents.x2, gc->pCompositeClip->extents.y2, + RegionNumRects(gc->pCompositeClip))); + + if (mode == CoordModePrevious) + fbFixCoordModePrevious(n, pt); + + fbGetDrawable(drawable, dst, dstStride, dstBpp, dstXoff, dstYoff); + dots = fbDots; + if ((flags & 2) == 0 && fb_gc(gc)->and == 0) { + switch (dstBpp) { + case 8: + dots = fbDots8__simple; + break; + case 16: + dots = fbDots16__simple; + break; + case 32: + dots = fbDots32__simple; + break; + } + } else { + switch (dstBpp) { + case 8: + dots = fbDots8; + break; + case 16: + dots = fbDots16; + break; + case 32: + dots = fbDots32; + break; + } + } + dots(dst, dstStride, dstBpp, gc->pCompositeClip, pt, n, + drawable->x, drawable->y, dstXoff, dstYoff, + fb_gc(gc)->and, fb_gc(gc)->xor); +} |