summaryrefslogtreecommitdiff
path: root/sys/dev/wscons/wscons_rops.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/wscons/wscons_rops.c')
-rw-r--r--sys/dev/wscons/wscons_rops.c217
1 files changed, 217 insertions, 0 deletions
diff --git a/sys/dev/wscons/wscons_rops.c b/sys/dev/wscons/wscons_rops.c
new file mode 100644
index 00000000000..f571bf184d3
--- /dev/null
+++ b/sys/dev/wscons/wscons_rops.c
@@ -0,0 +1,217 @@
+/* $NetBSD: wscons_rops.c,v 1.1 1996/04/12 02:00:55 cgd Exp $ */
+
+/*
+ * Copyright (c) 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Lawrence Berkeley Laboratory.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)rcons_subr.c 8.1 (Berkeley) 6/11/93
+ */
+
+#include <sys/param.h>
+#include <sys/device.h>
+
+#include <dev/rcons/raster.h>
+#include <alpha/wscons/wscons_raster.h>
+
+/*
+ * Paint (or unpaint) the cursor.
+ * Pays no lip service to hardware cursors.
+ */
+void
+rcons_cursor(id, on, row, col)
+ void *id;
+ int on, row, col;
+{
+ register struct rcons *rc = id;
+ register int x, y;
+
+ /* turn the cursor off */
+ if (!on) {
+ /* make sure it's on */
+ if ((rc->rc_bits & RC_CURSOR) == 0)
+ return;
+
+ row = *rc->rc_crowp;
+ col = *rc->rc_ccolp;
+ } else {
+ /* unpaint the old copy. */
+ *rc->rc_crowp = row;
+ *rc->rc_ccolp = col;
+ }
+
+ x = col * rc->rc_font->width + rc->rc_xorigin;
+ y = row * rc->rc_font->height + rc->rc_yorigin;
+
+ raster_op(rc->rc_sp, x, y,
+#ifdef notdef
+ /* XXX This is the right way but too slow */
+ rc->rc_font->chars[(int)' '].r->width,
+ rc->rc_font->chars[(int)' '].r->height,
+#else
+ rc->rc_font->width, rc->rc_font->height,
+#endif
+ RAS_INVERT,
+ (struct raster *) 0, 0, 0);
+
+ rc->rc_bits ^= RC_CURSOR;
+}
+
+/*
+ * Actually write a string to the frame buffer.
+ */
+void
+rcons_putstr(id, row, col, str, n)
+ void *id;
+ int row, col, n;
+ char *str;
+{
+ struct rcons *rc = id;
+ register int x, y, op;
+
+ x = col * rc->rc_font->width + rc->rc_xorigin;
+ y = row * rc->rc_font->height + rc->rc_font_ascent + rc->rc_yorigin;
+
+ op = RAS_SRC;
+ if (((rc->rc_bits & RC_STANDOUT) != 0) ^
+ ((rc->rc_bits & RC_INVERT) != 0))
+ op = RAS_NOT(op);
+ raster_textn(rc->rc_sp, x, y, op, rc->rc_font, str, n);
+}
+
+/*
+ * Possibly change to white-on-black or black-on-white modes.
+ */
+void
+rcons_invert(id, inverted)
+ void *id;
+ int inverted;
+{
+ struct rcons *rc = id;
+
+ if (((rc->rc_bits & RC_INVERT) != 0) ^ inverted) {
+ /* Invert the display */
+ raster_op(rc->rc_sp, 0, 0, rc->rc_sp->width, rc->rc_sp->height,
+ RAS_INVERT, (struct raster *) 0, 0, 0);
+
+ /* Swap things around */
+ rc->rc_ras_blank = RAS_NOT(rc->rc_ras_blank);
+ rc->rc_bits ^= RC_INVERT;
+ }
+}
+
+/*
+ * Copy columns (characters) in a row (line).
+ */
+void
+rcons_copycols(id, row, srccol, dstcol, ncols)
+ void *id;
+ int row, srccol, dstcol, ncols;
+{
+ struct rcons *rc = id;
+ int y, srcx, dstx, nx;
+
+ y = rc->rc_yorigin + rc->rc_font->height * row;
+ srcx = rc->rc_xorigin + rc->rc_font->width * srccol;
+ dstx = rc->rc_xorigin + rc->rc_font->width * dstcol;
+ nx = rc->rc_font->width * ncols;
+
+ raster_op(rc->rc_sp, dstx, y,
+ nx, rc->rc_font->height, RAS_SRC,
+ rc->rc_sp, srcx, y);
+}
+
+/*
+ * Clear columns (characters) in a row (line).
+ */
+void
+rcons_erasecols(id, row, startcol, ncols)
+ void *id;
+ int row, startcol, ncols;
+{
+ struct rcons *rc = id;
+ int y, startx, nx;
+
+ y = rc->rc_yorigin + rc->rc_font->height * row;
+ startx = rc->rc_xorigin + rc->rc_font->width * startcol;
+ nx = rc->rc_font->width * ncols;
+
+ raster_op(rc->rc_sp, startx, y,
+ nx, rc->rc_font->height, rc->rc_ras_blank,
+ (struct raster *) 0, 0, 0);
+}
+
+/*
+ * Copy rows (lines).
+ */
+void
+rcons_copyrows(id, srcrow, dstrow, nrows)
+ void *id;
+ int srcrow, dstrow, nrows;
+{
+ struct rcons *rc = id;
+ int srcy, dsty, ny;
+
+ srcy = rc->rc_yorigin + rc->rc_font->height * srcrow;
+ dsty = rc->rc_yorigin + rc->rc_font->height * dstrow;
+ ny = rc->rc_font->height * nrows;
+
+ raster_op(rc->rc_sp, rc->rc_xorigin, dsty,
+ rc->rc_raswidth, ny, RAS_SRC,
+ rc->rc_sp, rc->rc_xorigin, srcy);
+}
+
+/*
+ * Erase rows (lines).
+ */
+void
+rcons_eraserows(id, startrow, nrows)
+ void *id;
+ int startrow, nrows;
+{
+ struct rcons *rc = id;
+ int starty, ny;
+
+ starty = rc->rc_yorigin + rc->rc_font->height * startrow;
+ ny = rc->rc_font->height * nrows;
+
+ raster_op(rc->rc_sp, rc->rc_xorigin, starty,
+ rc->rc_raswidth, ny, rc->rc_ras_blank,
+ (struct raster *) 0, 0, 0);
+}