summaryrefslogtreecommitdiff
path: root/dviware/kyocera/kyodev.c
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /dviware/kyocera/kyodev.c
Initial commit
Diffstat (limited to 'dviware/kyocera/kyodev.c')
-rw-r--r--dviware/kyocera/kyodev.c168
1 files changed, 168 insertions, 0 deletions
diff --git a/dviware/kyocera/kyodev.c b/dviware/kyocera/kyodev.c
new file mode 100644
index 0000000000..fdced4ba89
--- /dev/null
+++ b/dviware/kyocera/kyodev.c
@@ -0,0 +1,168 @@
+/* kyodev.c The kyocera output driver for dvi2kyo program.
+ * Copyright 1987 State University Groningen, Netherlands
+ * Author: kees@guvaxin.uucp
+ */
+
+#include <stdio.h>
+#include "dev.h"
+#include "kyo.h"
+
+#define DEV_DPI 300 /* Device dots per inch */
+#define DEV_XOFFSET 200
+#define DEV_YOFFSET 300
+
+FILE *dev_out;
+long dev_h,dev_v;
+unsigned long dev_options;
+
+/* Map the ASCII codes 0-060 to 0240-0320
+ * because the Kyocera can not print symbols with
+ * codes 0-040 in each emulation mode, and the ASCII
+ * sequence !R! brings it into PRESCRIBE command mode
+ */
+unsigned char visual(ch)
+ unsigned long ch;
+{
+ if (ch < 060) ch += 0240;
+ return((unsigned char)ch);
+}
+
+/* Print symbol "ch" from current font
+ * and update the horizontal cursor position
+ */
+dev_setc(ch,xsize)
+ unsigned long ch;
+ int xsize;
+{
+ putc(visual(ch), dev_out);
+ dev_h += xsize;
+}
+
+/* Print symbol "c" by sending the pixel raster
+ * The raster info is converted to a vectorlike image
+ * and the symbol is printed by drawing lines
+ */
+dev_raster(c)
+ struct kyochar *c;
+{
+ int i,w,row,l,s,bw;
+ unsigned short *bp, x;
+
+ debug("Output raster info\n");
+ bp = c->kc_glyph.p;
+ bw = (c->kc_width + 15) / 16;
+ fprintf(dev_out, "!R! SCP;MRP %1d,%1d;", -(c->kc_xoffset), -(c->kc_yoffset));
+ for (row=0; row<c->kc_height; row++) {
+ l = 0; s = 0;
+ fprintf(dev_out, "SCP;MRP 0,%1d;", row);
+ debug("row: %d\n", row);
+ for (w=0; w<bw; w++) {
+ x = *bp++;
+ if ((w % 8) == 0) debug("\n");
+ debug("%o ", x);
+ for (i=15; i>=0; i--)
+ if (x & (1 << i)) {
+ if (s) {
+ fprintf(dev_out, "MRP %1d,0;", s);
+ s = 0;
+ }
+ l++;
+ } else {
+ if (l) {
+ fprintf(dev_out, "DRP %1d,0;", l);
+ l = 0;
+ }
+ s++;
+ }
+ }
+ if (l) fprintf(dev_out, "DRP %1d,0;", l);
+ fprintf(dev_out, "RPP;");
+ }
+ fprintf(dev_out, "EXIT;");
+}
+
+/* Put the cursor on position "(x,y)" */
+dev_position(x,y)
+ long x,y;
+{
+ if ((dev_h != x) || (dev_v != y))
+ fprintf(dev_out, "!R! MAP %1d,%1d;EXIT;", x, y);
+ dev_h = x; dev_v = y;
+}
+
+/* Draw a filled rectangele */
+dev_draw_box(h,w)
+ long h,w;
+{
+ fprintf(dev_out, "!R! BLK %1d,%1d;EXIT;", w, -h);
+}
+
+/* End of page */
+dev_eop()
+{
+ fprintf(dev_out,"!R! PAGE;EXIT;");
+ fflush(dev_out);
+ dev_h = dev_v = 0;
+}
+
+/* Initialize Kyocera */
+hard_init()
+{
+ fprintf(dev_out, "!R! RES;UNIT D;SLM %1d;STM %1d;SPD 1;EXIT;"
+ , DEV_XOFFSET, DEV_YOFFSET);
+ page_init();
+}
+
+/* Initialization at each page begin */
+page_init()
+{
+ dev_h = dev_v = 0;
+}
+
+/* Initialization routine called by device independent part */
+dev_init(f,options,dpi)
+ FILE *f;
+ unsigned long options;
+ long *dpi;
+{
+ dev_out = f;
+ *dpi = DEV_DPI;
+ dev_options = options;
+ hard_init();
+}
+
+/* Terminate use of device */
+dev_term()
+{
+ fprintf(dev_out, "!R! PAGE;RES; EXIT;!R! RES; EXIT;");
+ fflush(dev_out);
+}
+
+/* Print error log */
+dev_print_log(f)
+ FILE *f;
+{
+ register int ch;
+
+ if (dev_h || dev_v) putc('\f',dev_out);
+ fprintf(dev_out, "!R! FONT 1;EXIT;");
+ while (!ferror(f) && (ch = getc(f)) != EOF) {
+ if (ch == '\n') putc('\r',dev_out);
+ putc(ch,dev_out);
+ }
+ putc('\f',dev_out);
+ fflush(dev_out);
+}
+
+/* Handle special DVI commands
+ * "nchars" are copied from file "f"
+ * directly to the Kyocera
+ */
+dev_special(nchars,f)
+ int nchars;
+ FILE *f;
+{
+ while (nchars-- > 0) putc(getc(f),dev_out);
+ page_init();
+}
+