summaryrefslogtreecommitdiff
path: root/src/sna/fb/fbpoint.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sna/fb/fbpoint.c')
-rw-r--r--src/sna/fb/fbpoint.c134
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);
+}