[PATCH 11/18] Shadow: Add support for Atari iplan2p4
Geert Uytterhoeven
geert at linux-m68k.org
Wed Mar 27 06:20:44 PDT 2013
Add support for Atari-style interleaved bitplanes, with 2 bytes interleave
and 4 bits per pixel.
Signed-off-by: Geert Uytterhoeven <geert at linux-m68k.org>
---
miext/shadow/Makefile.am | 1 +
miext/shadow/shadow.h | 3 +
miext/shadow/shiplan2p4.c | 136 +++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 140 insertions(+), 0 deletions(-)
create mode 100644 miext/shadow/shiplan2p4.c
diff --git a/miext/shadow/Makefile.am b/miext/shadow/Makefile.am
index 30f7bda..adb10bf 100644
--- a/miext/shadow/Makefile.am
+++ b/miext/shadow/Makefile.am
@@ -10,6 +10,7 @@ libshadow_la_SOURCES = \
shadow.c \
shadow.h \
shalloc.c \
+ shiplan2p4.c \
shpacked.c \
shplanar8.c \
shplanar.c \
diff --git a/miext/shadow/shadow.h b/miext/shadow/shadow.h
index 83de22c..d62903c 100644
--- a/miext/shadow/shadow.h
+++ b/miext/shadow/shadow.h
@@ -96,6 +96,9 @@ shadowInit(ScreenPtr pScreen, ShadowUpdateProc update, ShadowWindowProc window);
extern _X_EXPORT void *shadowAlloc(int width, int height, int bpp);
extern _X_EXPORT void
+ shadowUpdateIplan2p4(ScreenPtr pScreen, shadowBufPtr pBuf);
+
+extern _X_EXPORT void
shadowUpdatePacked(ScreenPtr pScreen, shadowBufPtr pBuf);
extern _X_EXPORT void
diff --git a/miext/shadow/shiplan2p4.c b/miext/shadow/shiplan2p4.c
new file mode 100644
index 0000000..79ada99
--- /dev/null
+++ b/miext/shadow/shiplan2p4.c
@@ -0,0 +1,136 @@
+/*
+ *
+ * Copyright © 2013 Geert Uytterhoeven
+ *
+ * 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 Geert Uytterhoeven not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Geert Uytterhoeven makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * GEERT UYTTERHOEVEN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL GEERT UYTTERHOEVEN 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.
+ *
+ * Based on shpacked.c, which is Copyright © 2000 Keith Packard
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <stdlib.h>
+
+#include <X11/X.h>
+#include "scrnintstr.h"
+#include "windowstr.h"
+#include <X11/fonts/font.h>
+#include "dixfontstr.h"
+#include <X11/fonts/fontstruct.h>
+#include "mi.h"
+#include "regionstr.h"
+#include "globals.h"
+#include "gcstruct.h"
+#include "shadow.h"
+#include "fb.h"
+#include "c2p_core.h"
+
+
+ /*
+ * Perform a full C2P step on 16 4-bit pixels, stored in 2 32-bit words
+ * containing
+ * - 16 4-bit chunky pixels on input
+ * - permutated planar data (2 planes per 32-bit word) on output
+ */
+
+static void c2p_16x4(CARD32 d[2])
+{
+ transp2(d, 8);
+ transp2(d, 2);
+ transp2x(d, 1);
+ transp2(d, 16);
+ transp2(d, 4);
+ transp2(d, 1);
+}
+
+
+ /*
+ * Store a full block of iplan2p4 data after c2p conversion
+ */
+
+static inline void store_iplan2p4(void *dst, const CARD32 d[2])
+{
+ CARD32 *p = dst;
+
+ *p++ = d[0];
+ *p++ = d[1];
+}
+
+
+void
+shadowUpdateIplan2p4(ScreenPtr pScreen, shadowBufPtr pBuf)
+{
+ RegionPtr damage = shadowDamage(pBuf);
+ PixmapPtr pShadow = pBuf->pPixmap;
+ int nbox = RegionNumRects(damage);
+ BoxPtr pbox = RegionRects(damage);
+ FbBits *shaBase;
+ CARD16 *shaLine, *sha;
+ FbStride shaStride;
+ int scrLine;
+ _X_UNUSED int shaBpp, shaXoff, shaYoff;
+ int x, y, w, h;
+ int i, n;
+ CARD16 *win;
+ _X_UNUSED CARD32 winSize;
+ union {
+ CARD8 bytes[8];
+ CARD32 words[2];
+ } d;
+
+ fbGetDrawable(&pShadow->drawable, shaBase, shaStride, shaBpp, shaXoff,
+ shaYoff);
+ shaStride *= sizeof(FbBits) / sizeof(CARD16);
+
+ while (nbox--) {
+ x = pbox->x1;
+ y = pbox->y1;
+ w = pbox->x2 - pbox->x1;
+ h = pbox->y2 - pbox->y1;
+
+ scrLine = (x & -16) / 2;
+ shaLine = (CARD16 *)shaBase + y * shaStride + scrLine / sizeof(CARD16);
+
+ n = ((x & 15) + w + 15) / 16; /* number of c2p units in scanline */
+
+ while (h--) {
+ sha = shaLine;
+ win = (CARD16 *) (*pBuf->window) (pScreen,
+ y,
+ scrLine,
+ SHADOW_WINDOW_WRITE,
+ &winSize,
+ pBuf->closure);
+ if (!win)
+ return;
+ for (i = 0; i < n; i++) {
+ memcpy(d.bytes, sha, sizeof(d.bytes));
+ c2p_16x4(d.words);
+ store_iplan2p4(win, d.words);
+ sha += sizeof(d.bytes) / sizeof(*sha);
+ win += sizeof(d.bytes) / sizeof(*win);
+ }
+ shaLine += shaStride;
+ y++;
+ }
+ pbox++;
+ }
+}
--
1.7.0.4
More information about the xorg-devel
mailing list