summaryrefslogtreecommitdiff
path: root/Build/source/texk/windvi/dvi-draw.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/windvi/dvi-draw.c')
-rw-r--r--Build/source/texk/windvi/dvi-draw.c1951
1 files changed, 0 insertions, 1951 deletions
diff --git a/Build/source/texk/windvi/dvi-draw.c b/Build/source/texk/windvi/dvi-draw.c
deleted file mode 100644
index ffb9afe3980..00000000000
--- a/Build/source/texk/windvi/dvi-draw.c
+++ /dev/null
@@ -1,1951 +0,0 @@
-/*========================================================================*\
-
-Copyright (c) 1990-1999 Paul Vojta
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to
-deal in the Software without restriction, including without limitation the
-rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-sell copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-PAUL VOJTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-NOTE:
- xdvi is based on prior work, as noted in the modification history
- in xdvi.c.
-
-\*========================================================================*/
-#define HAVE_BOOLEAN
-#include "xdvi-config.h"
-#include <kpathsea/c-ctype.h>
-#include <kpathsea/c-fopen.h>
-#include <kpathsea/c-vararg.h>
-#include "dvi.h"
-
-#ifdef TRANSFORM
-extern BOOL bTransfInUse;
-#endif
-
-static struct frame frame0; /* dummy head of list */
-#ifdef TEXXET
-static struct frame *scan_frame; /* head frame for scanning */
-#endif
-
-#ifndef DVI_BUFFER_LEN
-#define DVI_BUFFER_LEN 512
-#endif
-
-static ubyte dvi_buffer[DVI_BUFFER_LEN];
-static struct frame *current_frame;
-
-#ifndef TEXXET
-#define DIR 1
-#else
-#define DIR currinf.dir
-#endif
-
-/*
- * Explanation of the following constant:
- * offset_[xy] << 16: margin (defaults to one inch)
- * shrink_factor << 16: one pixel page border
- * shrink_factor << 15: rounding for pixel_conv
- */
-#define OFFSET_X (offset_x << 16) + (shrink_factor * 3 << 15)
-#define OFFSET_Y (offset_y << 16) + (shrink_factor * 3 << 15)
-
-#if (BMBYTES == 1)
-BMUNIT bit_masks[9] = {
- 0x0, 0x1, 0x3, 0x7,
- 0xf, 0x1f, 0x3f, 0x7f,
- 0xff
-};
-#else
-#if (BMBYTES == 2)
-BMUNIT bit_masks[17] = {
- 0x0, 0x1, 0x3, 0x7,
- 0xf, 0x1f, 0x3f, 0x7f,
- 0xff, 0x1ff, 0x3ff, 0x7ff,
- 0xfff, 0x1fff, 0x3fff, 0x7fff,
- 0xffff
-};
-#else /* BMBYTES == 4 */
-BMUNIT bit_masks[33] = {
- 0x0, 0x1, 0x3, 0x7,
- 0xf, 0x1f, 0x3f, 0x7f,
- 0xff, 0x1ff, 0x3ff, 0x7ff,
- 0xfff, 0x1fff, 0x3fff, 0x7fff,
- 0xffff, 0x1ffff, 0x3ffff, 0x7ffff,
- 0xfffff, 0x1fffff, 0x3fffff, 0x7fffff,
- 0xffffff, 0x1ffffff, 0x3ffffff, 0x7ffffff,
- 0xfffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff,
- 0xffffffff
-};
-#endif
-#endif
-
-#ifdef VMS
-#define off_t int
-#endif
-#ifndef WIN32
-extern off_t lseek();
-#endif /* ! WIN32 */
-
-#ifndef SEEK_SET /* if <unistd.h> is not provided (or for <X11R5) */
-#define SEEK_SET 0
-#define SEEK_CUR 1
-#define SEEK_END 2
-#endif
-
-static void draw_part();
-
-#if NeedFunctionPrototypes
-#ifndef TEXXET
-static long set_no_char(wide_ubyte ch);
-#else
-static void set_no_char(wide_ubyte cmd, wide_ubyte ch);
-#endif /* TEXXET */
-#else /* !NeedFunctionPrototypes */
-#ifndef TEXXET
-static long set_no_char();
-#else
-static void set_no_char();
-#endif /* TEXXET */
-#endif /* NeedFunctionPrototypes */
-
-#ifdef TRANSFORM
-extern HRGN hClipRgn;
-#endif
-
-/*
- * X routines.
- */
-
-/*
- * Put a rectangle on the screen.
- */
-
-/* HTEX needs this to be non-static -janl */
-void
-put_rule(x, y, w, h)
- int x, y;
- unsigned int w, h;
-{
-#ifdef WIN32
- RECT rTemp;
-#ifdef HTEX
- HDC hdc = highlight? highGC : ruleGC;
-#else
- HDC hdc = ruleGC;
-#endif
-
-#ifdef TRANSFORM
- POINT lppt[4];
- HRGN hNewClipRgn = NULL;
- XFORM xfrm, xfrm_temp;
- extern BOOL bTransfInUse;
-
- if (!allowDrawingChars)
- return;
-
- rTemp.left = x - currwin.base_x;
- rTemp.top = y - currwin.base_y;
- rTemp.right = rTemp.left + w;
- rTemp.bottom = rTemp.top + h;
-
- if (resource.use_xform && bTransfInUse) {
- RECT rTemp;
- BOOL bClipped1, bClipped2;
- extern XFORM current_transf;
- if (SetWorldTransform(hdc, &current_transf) == 0)
- Win32Error("XPutImage/SetWorldTransform/current");
-
- lppt[0].x = x - currwin.base_x;
- lppt[0].y = y - currwin.base_y;
- lppt[1].x = lppt[0].x + w;
- lppt[1].y = lppt[0].y;
- lppt[2].x = lppt[0].x + w;
- lppt[2].y = lppt[0].y + h;
- lppt[3].x = lppt[0].x;
- lppt[3].y = lppt[0].y + h;
- LPtoDP(hdc, lppt, 4);
- if ((hNewClipRgn = CreatePolygonRgn(lppt, 4, ALTERNATE)) == NULL) {
- Win32Error("XPutImage/CreatePolygonRgn");
- }
- if (SelectClipRgn(hdc, hNewClipRgn) == ERROR) {
- Win32Error("XPutImage/SelectClipRgn");
- }
- bClipped2 = RectVisible(hdc, &rTemp);
- if (!bClipped2)
- goto nothing;
- }
- else
-#endif
- {
- if (!RectVisible(hdc, &rTemp))
- goto nothing;
- }
- FillRect(hdc, &rTemp, foreBrush);
- nothing:
-#if TRANSFORM
- if (resource.use_xform && bTransfInUse) {
- SelectClipRgn(hdc, NULL);
- if (hNewClipRgn) DeleteObject(hNewClipRgn);
- ModifyWorldTransform(hdc, &xfrm_temp, MWT_IDENTITY);
- }
-#endif
-#else
- if (x < max_x && x + (int) w >= min_x
- && y < max_y && y + (int) h >= min_y) {
- if (--event_counter == 0) read_events(False);
-#ifdef HTEX
- XFillRectangle(DISP, currwin.win, highlight? highGC: ruleGC,
-#else
- XFillRectangle(DISP, currwin.win, ruleGC,
-#endif
- x - currwin.base_x, y - currwin.base_y, w ? w : 1, h ? h : 1);
- }
-#endif
-}
-
-static void
-put_bitmap(bitmap, x, y)
- struct bitmap *bitmap;
- int x, y;
-{
-
-#ifdef HTEX
- if (HTeXAnestlevel > 0) {
- htex_recordbits(x, y, bitmap->w, bitmap->h);
- }
-#endif
-
- if (debug & DBG_BITMAP)
- Printf("X(%d,%d)\n", x - currwin.base_x, y - currwin.base_y);
-#ifdef WIN32
- image->width = bitmap->w;
- image->height = bitmap->h;
- image->data = bitmap->bits;
- image->bytes_per_line = bitmap->bytes_wide;
- image->endian_permuted = &(bitmap->endian_permuted);
- image->depth = 1;
-#ifdef HTEX
- XPutImage(DISP, currwin.win, HTeXreflevel > 0? highGC: foreGC, image,
- 0, 0,
- x - currwin.base_x, y - currwin.base_y,
- bitmap->w, bitmap->h);
-#else
- XPutImage(DISP, currwin.win, foreGC, image,
- 0, 0,
- x - currwin.base_x, y - currwin.base_y,
- bitmap->w, bitmap->h);
-#endif
-
-#else
- if (x < max_x && x + (int) bitmap->w >= min_x &&
- y < max_y && y + (int) bitmap->h >= min_y) {
- if (--event_counter == 0) read_events(False);
- image->width = bitmap->w;
- image->height = bitmap->h;
- image->data = bitmap->bits;
- image->bytes_per_line = bitmap->bytes_wide;
-#ifdef HTEX
- XPutImage(DISP, currwin.win, HTeXreflevel > 0? highGC: foreGC, image,
-#else
- XPutImage(DISP, currwin.win, foreGC, image,
-#endif
- 0, 0,
- x - currwin.base_x, y - currwin.base_y,
- bitmap->w, bitmap->h);
- if (foreGC2)
- XPutImage(DISP, currwin.win, foreGC2, image,
- 0, 0,
- x - currwin.base_x, y - currwin.base_y,
- bitmap->w, bitmap->h);
- }
-#endif
-}
-
-#ifdef GREY
-static void
-put_image(g, x, y)
- struct glyph *g;
- int x, y;
-{
- XImage *img = g->image2;
-
-#ifdef HTEX
- if (HTeXAnestlevel > 0) {
- htex_recordbits(x, y, img->width, img->height);
- }
-#endif
-#ifdef WIN32
- XPutImage(DISP, currwin.win, foreGC, img,
- 0, 0,
- x - currwin.base_x, y - currwin.base_y,
- (unsigned int) img->width, (unsigned int) img->height);
-
-#else /* ! WIN32 */
- if (x < max_x && x + img->width >= min_x &&
- y < max_y && y + img->height >= min_y) {
-
- if (--event_counter == 0) read_events(False);
-
-#ifdef HTEX
- XPutImage(DISP, currwin.win, foreGC, img,
-#else
- XPutImage(DISP, currwin.win, foreGC, img,
-#endif
- 0, 0,
- x - currwin.base_x, y - currwin.base_y,
- (unsigned int) img->width, (unsigned int) img->height);
- if (foreGC2)
- XPutImage(DISP, currwin.win, foreGC2, img,
- 0, 0,
- x - currwin.base_x, y - currwin.base_y,
- (unsigned int) img->width, (unsigned int) img->height);
- if (pixeltbl_t != NULL) {
- img->data = g->pixmap2_t;
- XPutImage(DISP, currwin.win, foreGC2, img,
- 0, 0,
- x - currwin.base_x, y - currwin.base_y,
- (unsigned int) img->width, (unsigned int) img->height);
- img->data = g->pixmap2;
- }
- }
-#endif
-}
-#endif /* GREY */
-
-/*
- * Draw the border of a rectangle on the screen.
- */
-
-static void
-put_border(x, y, width, height, ourGC)
- int x, y;
- unsigned int width, height;
- GC ourGC;
-{
-
- --width;
- --height;
- /* top */
- XFillRectangle(DISP, currwin.win, ourGC, x, y, width, 1);
- /* right */
- XFillRectangle(DISP, currwin.win, ourGC, x + (int) width, y, 1, height);
- /* bottom */
- XFillRectangle(DISP, currwin.win, ourGC, x + 1, y + (int) height,
- width, 1);
- /* left */
- XFillRectangle(DISP, currwin.win, ourGC, x, y + 1, 1, height);
-}
-
-#ifdef GRID
-#ifdef WIN32
-void
-put_grid(struct WindowRec *win, unsigned int unit, GC gc1, GC gc2, GC gc3)
-{
- int i; /* looping variable */
- float sep; /* grid separation */
- int tmp; /* temporary variable */
- HDC hdc;
- unsigned int offset;
-
- if (!allowDrawingChars)
- return;
-
- switch (grid_mode) {
- case 0:
- return;
- break;
- case 1:
- sep = ((float) unit);
- hdc = gc1;
- break;
- case 2:
- sep = ((float) unit) / 2.0;
- hdc = gc2;
- break;
- case 3:
- sep = ((float) unit) / 4.0;
- hdc = gc3;
- break;
- default:
- fprintf(stderr, "Warning: invalid grid_mode %d\n", grid_mode);
- return;
- }
-#if 1
- fprintf(stderr, "Put_grid in base (%d, %d) rect (%d, %d) x (%d, %d)\n",
- win->base_x, win->base_y,
- win->min_x, win->min_y,
- win->max_x, win->max_y);
-#endif
-
- /* Horizontal Grid */
- for (i = 0, offset = (unsigned int)(sep - (win->base_y+win->min_y) % (int) sep) -1;
- win->min_y + i*sep + offset <= win->max_y;
- i++)
- XFillRectangle(DISP, win->win, (hdc), win->min_x, win->min_y + i*sep + offset,
- win->max_x - win->min_x, 1);
-
- /* Vertical Grid */
- for (i = 0, offset = (unsigned int)(sep - (win->base_x+win->min_x) % (int) sep) - 1;
- win->min_x + i*sep + offset <= win->max_x;
- i++)
- XFillRectangle(DISP, win->win, (hdc), win->min_x + i*sep + offset,
- win->min_y, 1, win->max_y - win->min_y);
-
-}
-#else /* ! WIN32 */
-/* drawing grid */
-void
-put_grid(x, y, width, height, unit, gc1, gc2, gc3)
- int x, y;
- unsigned int width, height, unit;
- GC gc1, gc2, gc3;
-{
- int i; /* looping variable */
- float sep; /* grid separation */
- int tmp; /* temporary variable */
-
- --width;
- --height;
-
-/* drawing vertial grid */
-#define DRAWGRID_VER(gc) for (i=1; \
- (tmp=x+(int) (((float) i)*sep)) < x+width; \
- i++) \
- XFillRectangle(DISP, currwin.win, (gc), \
- tmp, y, 1, height)
-/* drawing horizontal grid */
-#define DRAWGRID_HOR(gc) for (i=1; \
- (tmp=y+(int) (((float) i)*sep)) < y+height; \
- i++) \
- XFillRectangle(DISP, currwin.win, (gc), \
- x, tmp, width, 1)
-
- if ( grid_mode > 2 ) /* third level grid */
- {
- sep = (float) unit / 4.0;
- DRAWGRID_VER ( gc3 ); /* vertical grid */
- DRAWGRID_HOR ( gc3 ); /* horizontal grid */
- }
-
- if ( grid_mode > 1 ) /* second */
- {
- sep = (float) unit / 2.0;
- DRAWGRID_VER ( gc2 ); /* vertical grid */
- DRAWGRID_HOR ( gc2 ); /* horizontal grid */
- }
-
- if ( grid_mode > 0 ) /* first level */
- {
- sep = (float) unit ;
- DRAWGRID_VER ( gc1 ); /* vertical grid */
- DRAWGRID_HOR ( gc1 ); /* horizontal grid */
- }
-}
-#endif /* WIN32 */
-
-#endif /* GRID */
-
-/*
- * Byte reading routines for dvi file.
- */
-
-#define xtell(pos) ((long) (lseek(fileno(dvi_file), 0L, SEEK_CUR) - \
- (currinf.end - (pos))))
-
-static ubyte
-xxone()
-{
- if (currinf.virtual) {
- ++(currinf.pos);
- return EOP;
- }
- currinf.end = dvi_buffer +
- read(fileno(dvi_file), (char *) (currinf.pos = dvi_buffer),
- DVI_BUFFER_LEN);
- return currinf.end > dvi_buffer ? *(currinf.pos)++ : EOF;
-}
-
-#define xone() (currinf.pos < currinf.end ? *(currinf.pos)++ : xxone())
-
-static unsigned long
-xnum(size)
- ubyte size;
-{
- long x = 0;
-
- while (size--) x = (x << 8) | xone();
- return x;
-}
-
-static long
-xsnum(size)
- ubyte size;
-{
- long x;
-
-#if __STDC__
- x = (signed char) xone();
-#else
- x = xone();
- if (x & 0x80) x -= 0x100;
-#endif
- while (--size) x = (x << 8) | xone();
- return x;
-}
-
-#define xsfour() xsnum(4)
-
-static void
-xskip(offset)
- long offset;
-{
- currinf.pos += offset;
- if (!currinf.virtual && currinf.pos > currinf.end)
- (void) lseek(fileno(dvi_file), (long) (currinf.pos - currinf.end),
- SEEK_CUR);
-}
-
-#ifdef HAVE_PROTOTYPES
-static NORETURN void
-tell_oops(_Xconst char *message, ...)
-#else
-/* VARARGS */
-static NORETURN void
-tell_oops(va_alist)
- va_dcl
-#endif
-{
-#ifndef HAVE_PROTOTYPES
- _Xconst char *message;
-#endif
- va_list args;
-
- Fprintf(stderr, "%s: ", prog);
-#ifdef HAVE_PROTOTYPES
- va_start(args, message);
-#else
- va_start(args);
- message = va_arg(args, _Xconst char *);
-#endif
- (void) vfprintf(stderr, message, args);
- va_end(args);
- if (currinf.virtual)
- Fprintf(stderr, " in virtual font %s\n", currinf.virtual->fontname);
- else
- Fprintf(stderr, ", offset %ld\n", xtell(currinf.pos - 1));
-#if PS
- ps_destroy();
-#endif
- Exit(1);
-}
-
-
-/*
- * Code for debugging options.
- */
-
-static void
-print_bitmap(bitmap)
- struct bitmap *bitmap;
-{
- BMUNIT *ptr = (BMUNIT *) bitmap->bits;
- int x, y, i;
-
- if (ptr == NULL) oops("print_bitmap called with null pointer.");
- Printf("w = %d, h = %d, bytes wide = %d\n",
- bitmap->w, bitmap->h, bitmap->bytes_wide);
- for (y = 0; y < (int) bitmap->h; ++y) {
- for (x = bitmap->bytes_wide; x > 0; x -= BMBYTES) {
-#ifndef WORDS_BIGENDIAN
- for (i = 0; i < BMBITS; ++i)
-#else
- for (i = BMBITS - 1; i >= 0; --i)
-#endif
- Putchar((*ptr & (1 << i)) ? '@' : ' ');
- ++ptr;
- }
- Putchar('\n');
- }
-}
-
-static void
-print_char(ch, g)
- ubyte ch;
- struct glyph *g;
-{
- Printf("char %d", ch);
- if (ISPRINT(ch))
- Printf(" (%c)", ch);
- Putchar('\n');
- Printf("x = %d, y = %d, dvi = %ld\n", g->x, g->y, g->dvi_adv);
- print_bitmap(&g->bitmap);
-}
-
-static _Xconst char *dvi_table1[] = {
-#ifdef Omega
- "SET1", "SET2", NULL, NULL, "SETRULE", "PUT1", "PUT2", NULL,
-#else
- "SET1", NULL, NULL, NULL, "SETRULE", "PUT1", NULL, NULL,
-#endif
- NULL, "PUTRULE", "NOP", "BOP", "EOP", "PUSH", "POP", "RIGHT1",
- "RIGHT2", "RIGHT3", "RIGHT4", "W0", "W1", "W2", "W3", "W4",
- "X0", "X1", "X2", "X3", "X4", "DOWN1", "DOWN2", "DOWN3",
- "DOWN4", "Y0", "Y1", "Y2", "Y3", "Y4", "Z0", "Z1",
- "Z2", "Z3", "Z4"};
-
-static _Xconst char *dvi_table2[] = {
- "FNT1", "FNT2", "FNT3", "FNT4", "XXX1", "XXX2", "XXX3", "XXX4",
- "FNTDEF1", "FNTDEF2", "FNTDEF3", "FNTDEF4", "PRE", "POST", "POSTPOST",
- "SREFL", "EREFL", NULL, NULL, NULL, NULL};
-
-static void
-print_dvi(ch)
- ubyte ch;
-{
- _Xconst char *s;
-
- Printf("%4d %4d ", PXL_H, PXL_V);
- if (ch <= (ubyte) (SETCHAR0 + 127)) {
- Printf("SETCHAR%-3d", ch - SETCHAR0);
- if (ISPRINT(ch))
- Printf(" (%c)", ch);
- Putchar('\n');
- return;
- }
- else if (ch < FNTNUM0) s = dvi_table1[ch - 128];
- else if (ch <= (ubyte) (FNTNUM0 + 63)) {
- Printf("FNTNUM%d\n", ch - FNTNUM0);
- return;
- }
- else s = dvi_table2[ch - (FNTNUM0 + 64)];
- if (s) Puts(s);
- else
- tell_oops("unknown op-code %d", ch);
-}
-
-
-/*
- * Count the number of set bits in a given region of the bitmap
- */
-
-char sample_count[] = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};
-
-static int
-sample(bits, bytes_wide, bit_skip, w, h)
- BMUNIT *bits;
- int bytes_wide, bit_skip, w, h;
-{
- BMUNIT *ptr, *endp;
- BMUNIT *cp;
- int bits_left;
- int n, bit_shift, wid;
-
- ptr = bits + bit_skip / BMBITS;
- endp = ADD(bits, h * bytes_wide);
- bits_left = w;
-#ifndef WORDS_BIGENDIAN
- bit_shift = bit_skip % BMBITS;
-#else
- bit_shift = BMBITS - bit_skip % BMBITS;
-#endif
- n = 0;
- while (bits_left) {
-#ifndef WORDS_BIGENDIAN
- wid = BMBITS - bit_shift;
-#else
- wid = bit_shift;
-#endif
- if (wid > bits_left) wid = bits_left;
- if (wid > 4) wid = 4;
-#ifdef WORDS_BIGENDIAN
- bit_shift -= wid;
-#endif
- for (cp = ptr; cp < endp; cp = ADD(cp, bytes_wide))
- n += sample_count[(*cp >> bit_shift) & bit_masks[wid]];
-#ifndef WORDS_BIGENDIAN
- bit_shift += wid;
- if (bit_shift == BMBITS) {
- bit_shift = 0;
- ++ptr;
- }
-#else
- if (bit_shift == 0) {
- bit_shift = BMBITS;
- ++ptr;
- }
-#endif
- bits_left -= wid;
- }
- return n;
-}
-
-static void
-shrink_glyph(g)
- struct glyph *g;
-{
- int shrunk_bytes_wide, shrunk_height;
- int rows_left, rows, init_cols;
- int cols_left;
- int cols;
- BMUNIT *old_ptr, *new_ptr;
- BMUNIT m, *cp;
- int min_sample = shrink_factor * shrink_factor * density / 100;
- int rtmp;
-#ifdef WIN32
- extern PF_BSWAP bswap;
-
- /* Ensure that the original data are not permuted */
- if (g->bitmap.endian_permuted == 1) {
- bswap((BMUNIT*)g->bitmap.bits,
- (g->bitmap.bytes_wide * g->bitmap.h)/BMBYTES);
- g->bitmap.endian_permuted = 0;
- }
-#endif
- /* These machinations ensure that the character is shrunk according to
- its hot point, rather than its upper left-hand corner. */
- g->x2 = g->x / shrink_factor;
- init_cols = g->x - g->x2 * shrink_factor;
- if (init_cols <= 0) init_cols += shrink_factor;
- else ++g->x2;
- g->bitmap2.w = g->x2 + ROUNDUP((int) g->bitmap.w - g->x, shrink_factor);
- /* include row zero with the positively numbered rows */
- rtmp = g->y + 1;
- g->y2 = rtmp / shrink_factor;
- rows = rtmp - g->y2 * shrink_factor;
- if (rows <= 0) {
- rows += shrink_factor;
- --g->y2;
- }
- g->bitmap2.h = shrunk_height = g->y2 +
- ROUNDUP((int) g->bitmap.h - rtmp, shrink_factor) + 1;
- alloc_bitmap(&g->bitmap2);
- old_ptr = (BMUNIT *) g->bitmap.bits;
- new_ptr = (BMUNIT *) g->bitmap2.bits;
- shrunk_bytes_wide = g->bitmap2.bytes_wide;
- rows_left = g->bitmap.h;
- bzero((char *) new_ptr, shrunk_bytes_wide * shrunk_height);
- while (rows_left) {
- if (rows > rows_left) rows = rows_left;
- cols_left = g->bitmap.w;
-#ifndef WORDS_BIGENDIAN
- m = (1 << 0);
-#else
- m = ((BMUNIT) 1 << (BMBITS-1));
-#endif
- cp = new_ptr;
- cols = init_cols;
- while (cols_left) {
- if (cols > cols_left) cols = cols_left;
- if (sample(old_ptr, g->bitmap.bytes_wide,
- (int) g->bitmap.w - cols_left, cols, rows)
- >= min_sample)
- *cp |= m;
-#ifndef WORDS_BIGENDIAN
- if (m == ((BMUNIT)1 << (BMBITS-1))) {
- m = (1 << 0);
- ++cp;
- }
- else m <<= 1;
-#else
- if (m == (1 << 0)) {
- m = ((BMUNIT) 1 << (BMBITS-1));
- ++cp;
- }
- else m >>= 1;
-#endif
- cols_left -= cols;
- cols = shrink_factor;
- }
- *((char **) &new_ptr) += shrunk_bytes_wide;
- *((char **) &old_ptr) += rows * g->bitmap.bytes_wide;
- rows_left -= rows;
- rows = shrink_factor;
- }
- g->y2 = g->y / shrink_factor;
- if (debug & DBG_BITMAP)
- print_bitmap(&g->bitmap2);
-#ifdef WIN32
- g->bitmap2.endian_permuted = 0;
-#endif
-}
-
-#ifdef GREY
-static void
-shrink_glyph_grey(g)
- struct glyph *g;
-{
- int rows_left, rows, init_cols;
- int cols_left;
- int cols;
- int x, y;
- long thesample;
- BMUNIT *old_ptr;
- unsigned int size;
- int rtmp;
-#ifdef WIN32
- extern PF_BSWAP bswap;
-
- /* Ensure that the original data are not permuted */
- if (g->bitmap.endian_permuted == 1) {
- bswap((BMUNIT*)g->bitmap.bits,
- (g->bitmap.bytes_wide * g->bitmap.h)/BMBYTES);
- g->bitmap.endian_permuted = 0;
- }
-#endif
- /* These machinations ensure that the character is shrunk according to
- its hot point, rather than its upper left-hand corner. */
- g->x2 = g->x / shrink_factor;
- init_cols = g->x - g->x2 * shrink_factor;
- if (init_cols <= 0) init_cols += shrink_factor;
- else ++g->x2;
- g->bitmap2.w = g->x2 + ROUNDUP((int) g->bitmap.w - g->x, shrink_factor);
- /* include row zero with the positively numbered rows */
- rtmp = g->y + 1;
- g->y2 = rtmp / shrink_factor;
- rows = rtmp - g->y2 * shrink_factor;
- if (rows <= 0) {
- rows += shrink_factor;
- --g->y2;
- }
- g->bitmap2.h = g->y2 + ROUNDUP((int) g->bitmap.h - rtmp, shrink_factor)
- + 1;
-
-#ifdef WIN32
- g->image2 = XCreateImage(DISP, maneDrawDC,
- 4,
- ZPixmap, 0, (char *) NULL,
- g->bitmap2.w, g->bitmap2.h,
- BMBITS, 0);
- g->image2->endian_permuted = NULL;
-#else
- g->image2 = XCreateImage(DISP, our_visual, our_depth, ZPixmap,
- 0, (char *) NULL, g->bitmap2.w, g->bitmap2.h, BMBITS, 0);
-#endif
- size = g->image2->bytes_per_line * g->bitmap2.h;
- g->pixmap2 = g->image2->data = xmalloc(size != 0 ? size : 1);
- if (pixeltbl_t != NULL)
- g->pixmap2_t = xmalloc(size != 0 ? size : 1);
-
- old_ptr = (BMUNIT *) g->bitmap.bits;
- rows_left = g->bitmap.h;
- y = 0;
- while (rows_left) {
- x = 0;
- if (rows > rows_left) rows = rows_left;
- cols_left = g->bitmap.w;
- cols = init_cols;
- while (cols_left) {
- if (cols > cols_left) cols = cols_left;
-
- thesample = sample(old_ptr, g->bitmap.bytes_wide,
- (int) g->bitmap.w - cols_left, cols, rows);
- XPutPixel(g->image2, x, y, pixeltbl[thesample]);
- if (pixeltbl_t != NULL) {
- g->image2->data = g->pixmap2_t;
- XPutPixel(g->image2, x, y, pixeltbl_t[thesample]);
- g->image2->data = g->pixmap2;
- }
-
- cols_left -= cols;
- cols = shrink_factor;
- x++;
- }
- *((char **) &old_ptr) += rows * g->bitmap.bytes_wide;
- rows_left -= rows;
- rows = shrink_factor;
- y++;
- }
-
- while (y < (int) g->bitmap2.h) {
- for (x = 0; x < (int) g->bitmap2.w; x++) {
- XPutPixel(g->image2, x, y, *pixeltbl);
- if (pixeltbl_t != NULL) {
- g->image2->data = g->pixmap2_t;
- XPutPixel(g->image2, x, y, *pixeltbl_t);
- g->image2->data = g->pixmap2;
- }
- }
- y++;
- }
-
- g->y2 = g->y / shrink_factor;
-#ifdef WIN32
- g->bitmap2.endian_permuted = 0;
-#endif
-}
-#endif /* GREY */
-
-/*
- * Find font #n.
- */
-
-static void
-change_font(n)
- unsigned long n;
-{
- struct tn *tnp;
-
- if (n < currinf.tn_table_len) currinf.fontp = currinf.tn_table[n];
- else {
- currinf.fontp = NULL;
- for (tnp = currinf.tn_head; tnp != NULL; tnp = tnp->next)
- if (tnp->TeXnumber == n) {
- currinf.fontp = tnp->fontp;
- break;
- }
- }
- if (currinf.fontp == NULL) tell_oops("non-existent font #%d", n);
- if (currinf.fontp->set_char_p == NULL)
- tell_oops("No procedure to set font #%d",
- n,currinf.fontp->fontname);
- maxchar = currinf.fontp->maxchar;
- currinf.set_char_p = currinf.fontp->set_char_p;
-}
-
-
-/*
- * Open a font file.
- */
-
-static void
-open_font_file(fontp)
- struct font *fontp;
-{
- if (fontp->file == NULL) {
- fontp->file = xfopen_local(fontp->filename, OPEN_MODE);
- if (fontp->file == NULL)
- oops("Font file disappeared: %s", fontp->filename);
- }
-}
-
-/*
- * Read special string.
- */
-
-static char *
-read_special(nbytes)
- long nbytes;
-{
- static char *spcl = NULL;
- static long spcl_len = -1;
- char *p;
-
- if (spcl_len < nbytes) {
- if (spcl != NULL) free(spcl);
- spcl = xmalloc((unsigned) nbytes + 1);
- spcl_len = nbytes;
- }
- p = spcl;
- for (;;) {
- int i = currinf.end - currinf.pos;
-
- if (i > nbytes) i = nbytes;
- bcopy((char *) currinf.pos, p, i);
- currinf.pos += i;
- p += i;
- nbytes -= i;
- if (nbytes == 0) break;
- (void) xxone();
- --(currinf.pos);
- }
- *p = '\0';
- return spcl;
-}
-
-#if PS
-
-/*
- * Size of page interval for "Scanning pages xx-xx" message.
- */
-
-#ifndef REPORT_INCR
-#define REPORT_INCR 50
-#endif
-
-/*
- * Table used for scanning. If >= 0, then skip that many bytes.
- * M1 means end of page, M2 means special, M3 means FNTDEF,
- * M4 means unrecognizable, and M5 means doesn't belong here.
- */
-
-#define M1 255
-#define M2 254
-#define M3 253
-#define M4 252
-#define M5 251
-#define MM 251
-
-static ubyte scantable[256] = {
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* chars 0 - 127 */
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-#ifdef Omega
- 1,2, /* SET1,SET2 (128,129) */
- /* -,-,SETRULE,PUT1,PUT2,-,-,PUTRULE,NOP,BOP (130-139) */
- M4,M4,8,1,2,M4,M4,8,0,44,
-#else
-
- 1,M4, /* SET1,- (128,129) */
- /* -,-,SETRULE,PUT1,-,-,-,PUTRULE,NOP,BOP (130-139) */
- M4,M4,8,1,M4,M4,M4,8,0,44,
-#endif
- M1,0,0,1,2,3,4,0,1,2, /* EOP,PUSH,POP,RIGHT1-4,W0M2 (140-149) */
- 3,4,0,1,2,3,4,1,2,3, /* W3-4,X0-4,DOWN1-3 (150-159) */
- 4,0,1,2,3,4,0,1,2,3, /* DOWN4,Y0-4,Z0-3 (160-169) */
- 4, /* Z4 (170) */
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* change font 171 - 234 */
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 1,2,3,4,M2, /* FNT1-4,XXX1 (235-239) */
- /* XXX2-4,FNTDEF1-4,PRE,POST,POSTPOST (240-249) */
- M2,M2,M2,M3,M3,M3,M3,M5,M5,M5,
- 0,0,M4,M4,M4,M4}; /* SREFL,EREFL,-,-,-,- (250-255) */
-
-/*
- * Prescanning routine for dvi file. This looks for specials like
- * `header=' and `!'.
- */
-
-void
-prescan()
-{
- ubyte ch;
- ubyte n;
- long a;
- int nextreportpage;
- char scanmsg[40];
-#ifdef WIN32
- extern void scan_init_fore_color(void);
- extern void scan_get_last_fore_color(void);
-#endif
-
-#ifndef WIN32
- if (!resource._postscript) {
- scanned_page = total_pages;
- return;
- }
-#else
- /* debug = DBG_PS; */
- scan_init_fore_color();
-#endif
- nextreportpage = scanned_page;
- ++scanned_page;
- (void) lseek(fileno(dvi_file), page_offset[scanned_page], SEEK_SET);
- currinf.pos = currinf.end = dvi_buffer;
- for (;;) {
- if (debug & DBG_PS)
- Printf("Scanning page %d\n", scanned_page);
- if (scanned_page > nextreportpage) {
- nextreportpage += REPORT_INCR;
- if (nextreportpage > current_page)
- nextreportpage = current_page;
- Sprintf(scanmsg, "Scanning pages %d-%d",
- scanned_page + pageno_correct,
- nextreportpage + pageno_correct);
- showmessage(scanmsg);
- XFlush(DISP);
- }
- for (;;) {
- ch = xone();
- n = scantable[ch];
- if (n < MM)
- while (n-- != 0)
- (void) xone();
- else if (n == M1) break; /* end of page */
- else switch (n) {
- case M2: /* special */
- a = xnum(ch - XXX1 + 1);
- if (a > 0)
- scan_special(read_special(a));
- break;
- case M3: /* FNTDEF */
- xskip((long) (12 + ch - FNTDEF1 + 1));
- ch = xone();
- xskip((long) ch + (long) xone());
- break;
- case M4: /* unrecognizable */
- tell_oops("unknown op-code %d", ch);
- break;
- case M5: /* doesn't belong */
- tell_oops("prescan, shouldn't happen: %s encountered",
- dvi_table2[ch - (FNTNUM0 + 64)]);
- break;
- }
- }
-#ifdef WIN32
- scan_get_last_fore_color();
-#if DEBUG_SPECIALS
- fprintf(stderr, "Mid : scanned_page = %d, current_page = %d\n",
- scanned_page, current_page);
-#endif
-#endif
- if (scanned_page >= current_page) break;
- ++scanned_page;
- }
-#if DEBUG_SPECIALS
- fprintf(stderr, "End of prescan, scanned_page = %d\n", scanned_page);
-#endif
- scanned_page_bak = scanned_page;
-#ifndef WIN32
- /* I don't think this is the right place for this. */
- XClearWindow(DISP, mane.win);
-#endif
- psp.endheader();
-}
-
-#endif /* PS */
-
-/*
- * Routines to print characters.
- */
-
-#ifndef TEXXET
-#define ERRVAL 0L
-#else
-#define ERRVAL
-#endif
-
-#ifndef TEXXET
-long
-set_char P1C(wide_ubyte, ch)
-#else
-void
-set_char P2C(wide_ubyte, cmd, wide_ubyte, ch)
-#endif
-{
- struct glyph *g;
-#ifdef TEXXET
- long dvi_h_sav;
-#endif
-
- if (ch > maxchar) realloc_font(currinf.fontp, WIDENINT ch);
- if ((g = &currinf.fontp->glyph[ch])->bitmap.bits == NULL) {
- if (g->addr == 0) {
- if (!hush_chars)
- Fprintf(stderr, "Character %d not defined in font %s\n", ch,
- currinf.fontp->fontname);
- g->addr = -1;
- return ERRVAL;
- }
- if (g->addr == -1)
- return ERRVAL; /* previously flagged missing char */
- open_font_file(currinf.fontp);
- Fseek(currinf.fontp->file, g->addr, 0);
- (*currinf.fontp->read_char)(currinf.fontp, ch);
- if (debug & DBG_BITMAP) print_char((ubyte) ch, g);
- currinf.fontp->timestamp = ++current_timestamp;
- }
-
-#ifdef TEXXET
- dvi_h_sav = DVI_H;
- if (currinf.dir < 0) DVI_H -= g->dvi_adv;
-
- if (scan_frame == NULL) {
-#endif
- if (shrink_factor == 1)
- put_bitmap(&g->bitmap, PXL_H - g->x, PXL_V - g->y);
- else {
-#ifdef GREY
- if (use_grey) {
- if (g->pixmap2 == NULL) {
- shrink_glyph_grey(g);
- }
- put_image(g, PXL_H - g->x2, PXL_V - g->y2);
- } else {
- if (g->bitmap2.bits == NULL) {
- shrink_glyph(g);
- }
- put_bitmap(&g->bitmap2, PXL_H - g->x2, PXL_V - g->y2);
- }
-#else
- if (g->bitmap2.bits == NULL) {
- shrink_glyph(g);
- }
- put_bitmap(&g->bitmap2, PXL_H - g->x2, PXL_V - g->y2);
-#endif
- }
-#ifndef TEXXET
- return g->dvi_adv;
-#else
- }
-#ifdef Omega
- if ((cmd == PUT1) || (cmd == PUT2))
-#else
- if (cmd == PUT1)
-#endif
- DVI_H = dvi_h_sav;
- else
- if (currinf.dir > 0) DVI_H += g->dvi_adv;
-#endif
-}
-
-
-#ifndef TEXXET
-static long set_empty_char P1C(wide_ubyte, ch)
-{ return 0; }
-#else
-static void set_empty_char P2C(wide_ubyte, cmd, wide_ubyte, ch)
-{ return; }
-#endif
-
-#ifndef TEXXET
-long load_n_set_char P1C(wide_ubyte, ch)
-#else
-void load_n_set_char P2C(wide_ubyte, cmd, wide_ubyte, ch)
-#endif
-{
- if (load_font(currinf.fontp)) { /* if not found */
- Fputs("Character(s) will be left blank.\n", stderr);
- currinf.set_char_p = currinf.fontp->set_char_p = set_empty_char;
- currinf.fontp->glyph = NULL; /* init for read_postamble */
-#ifndef TEXXET
- return 0;
-#else
- return;
-#endif
- }
- maxchar = currinf.fontp->maxchar;
- currinf.set_char_p = currinf.fontp->set_char_p;
-#ifndef TEXXET
- return (*currinf.set_char_p)(ch);
-#else
- (*currinf.set_char_p)(cmd, ch);
- return;
-#endif
-}
-
-
-#ifndef TEXXET
-long
-set_vf_char P1C(wide_ubyte, ch)
-#else
-void
-set_vf_char P2C(wide_ubyte, cmd, wide_ubyte, ch)
-#endif
-{
- struct macro *m;
- struct drawinf oldinfo;
-#ifdef Omega
- wide_ubyte oldmaxchar;
-#else
- ubyte oldmaxchar;
-#endif
- static ubyte c;
-#ifdef TEXXET
- long dvi_h_sav;
-#endif
-
- if (ch > maxchar) realloc_virtual_font(currinf.fontp, ch);
- if ((m = &currinf.fontp->macro[ch])->pos == NULL) {
- if (!hush_chars)
- Fprintf(stderr, "Character %d not defined in font %s\n", ch,
- currinf.fontp->fontname);
- m->pos = m->end = &c;
- return ERRVAL;
- }
-#ifdef TEXXET
- dvi_h_sav = DVI_H;
- if (currinf.dir < 0) DVI_H -= m->dvi_adv;
- if (scan_frame == NULL) {
-#endif
- oldinfo = currinf;
- oldmaxchar = maxchar;
- WW = XX = YY = ZZ = 0;
- currinf.tn_table_len = VFTABLELEN;
- currinf.tn_table = currinf.fontp->vf_table;
- currinf.tn_head = currinf.fontp->vf_chain;
- currinf.pos = m->pos;
- currinf.end = m->end;
- currinf.virtual = currinf.fontp;
- draw_part(current_frame, currinf.fontp->dimconv);
- if (currinf.pos != currinf.end + 1)
- tell_oops("virtual character macro does not end correctly");
- currinf = oldinfo;
- maxchar = oldmaxchar;
-#ifndef TEXXET
- return m->dvi_adv;
-#else
- }
-#ifdef Omega
- if ((cmd == PUT1) || (cmd == PUT2))
-#else
- if (cmd == PUT1)
-#endif
- DVI_H = dvi_h_sav;
- else
- if (currinf.dir > 0) DVI_H += m->dvi_adv;
-#endif
-}
-
-
-#ifndef TEXXET
-static long
-set_no_char P1C(wide_ubyte, ch)
-#else
-static void
-set_no_char P2C(wide_ubyte, cmd, wide_ubyte, ch)
-#endif
-{
- if (currinf.virtual) {
- currinf.fontp = currinf.virtual->first_font;
- if (currinf.fontp != NULL) {
- maxchar = currinf.fontp->maxchar;
- currinf.set_char_p = currinf.fontp->set_char_p;
-#ifndef TEXXET
- return (*currinf.set_char_p)(ch);
-#else
- (*currinf.set_char_p)(cmd, ch);
- return;
-#endif
- }
- }
- tell_oops("attempt to set character of unknown font");
- /* NOTREACHED */
-}
-
-
-/*
- * Set rule. Arguments are coordinates of lower left corner.
- */
-
-static void
-set_rule(h, w)
- int h, w;
-{
-#ifndef TEXXET
- put_rule(PXL_H, PXL_V - h + 1, (unsigned int) w, (unsigned int) h);
-#else
- put_rule(PXL_H - (currinf.dir < 0 ? w - 1 : 0), PXL_V - h + 1,
- (unsigned int) w, (unsigned int) h);
-#endif
-}
-
-#define xspell_conv(n) spell_conv0(n, current_dimconv)
-
-static void
-draw_part(minframe, current_dimconv)
- struct frame *minframe;
- double current_dimconv;
-{
- ubyte ch;
-#ifdef TEXXET
- struct drawinf oldinfo;
- ubyte oldmaxchar;
- off_t file_pos;
- int refl_count;
-#endif
- float curr_pt_size; // added SU
- static char *spc_bak = NULL;
-
- currinf.fontp = NULL;
- currinf.set_char_p = set_no_char;
-#ifdef TEXXET
- currinf.dir = 1;
- scan_frame = NULL; /* indicates we're not scanning */
-#endif
- // delay_src = False;
- for (;;) {
- ch = xone();
- if (debug & DBG_DVI)
- print_dvi(ch);
- if (ch <= (ubyte) (SETCHAR0 + 127)) {
-#ifndef TEXXET
- DVI_H += (*currinf.set_char_p)(ch);
-#else
- (*currinf.set_char_p)(ch, ch);
-#endif
- /* check if there are delayed src specials */
- if (delay_src) {
- // fprintf(stderr, "now calling src spec \n");
- applicationDoSpecial(spc_bak, 1);
- // delay_src = false;
- }
- else {
- // fprintf(stderr, "NOT calling src spec \n");
- }
- }
- else if (FNTNUM0 <= ch && ch <= (ubyte) (FNTNUM0 + 63)) {
- change_font((unsigned long) (ch - FNTNUM0));
- // fprintf(stderr, "changing font\n");
- }
- else {
- long a, b;
-
- switch (ch) {
- case SET1:
- case PUT1:
-#ifndef TEXXET
- a = (*currinf.set_char_p)(xone());
- if (ch != PUT1) DVI_H += a;
-#else
- (*currinf.set_char_p)(ch, xone());
-#endif
- break;
-
-#ifdef Omega
- case SET2:
- case PUT2:
-#ifndef TEXXET
- a = (*currinf.set_char_p)(xnum(2));
- if (ch != PUT2) DVI_H += a;
-#else
- (*currinf.set_char_p)(ch, xnum(2));
-#endif
- break;
-#endif /* Omega */
-
- case SETRULE:
- /* Be careful, dvicopy outputs rules with
- height = 0x80000000. We don't want any
- SIGFPE here. */
- a = xsfour();
- b = xspell_conv(xsfour());
-#ifndef TEXXET
- if (a > 0 && b > 0)
-#else
- if (a > 0 && b > 0 && scan_frame == NULL)
-#endif
- set_rule(pixel_round(xspell_conv(a)),
- pixel_round(b));
- DVI_H += DIR * b;
- break;
-
- case PUTRULE:
- a = xspell_conv(xsfour());
- b = xspell_conv(xsfour());
-#ifndef TEXXET
- if (a > 0 && b > 0)
-#else
- if (a > 0 && b > 0 && scan_frame == NULL)
-#endif
- set_rule(pixel_round(a), pixel_round(b));
- break;
-
- case NOP:
- break;
-
- case BOP:
- xskip((long) 11 * 4);
- DVI_H = OFFSET_X;
- DVI_V = OFFSET_Y;
- PXL_V = pixel_conv(DVI_V);
- WW = XX = YY = ZZ = 0;
- break;
-
- case EOP:
- if (current_frame != minframe)
- tell_oops("stack not empty at EOP");
- return;
-
- case PUSH:
- if (current_frame->next == NULL) {
- struct frame *newp = xmalloc(sizeof(struct frame));
- current_frame->next = newp;
- newp->prev = current_frame;
- newp->next = NULL;
- }
- current_frame = current_frame->next;
- current_frame->data = currinf.data;
- break;
-
- case POP:
- if (current_frame == minframe)
- tell_oops("more POPs than PUSHes");
- currinf.data = current_frame->data;
- current_frame = current_frame->prev;
- break;
-
-#ifdef TEXXET
- case SREFL:
- if (scan_frame == NULL) {
- /* we're not scanning: save some info. */
- oldinfo = currinf;
- oldmaxchar = maxchar;
- if (!currinf.virtual)
- file_pos = xtell(currinf.pos);
- scan_frame = current_frame; /* now we're scanning */
- refl_count = 0;
- break;
- }
- /* we are scanning */
- if (current_frame == scan_frame) ++refl_count;
- break;
-
- case EREFL:
- if (scan_frame != NULL) { /* if we're scanning */
- if (current_frame == scan_frame && --refl_count < 0)
- {
- /* we've hit the end of our scan */
- scan_frame = NULL;
- /* first: push */
- if (current_frame->next == NULL) {
- struct frame *newp =
- xmalloc(sizeof(struct frame));
- current_frame->next = newp;
- newp->prev = current_frame;
- newp->next = NULL;
- }
- current_frame = current_frame->next;
- current_frame->data = currinf.data;
- /* next: restore old file position, XX, etc. */
- if (!currinf.virtual) {
- off_t bgn_pos = xtell(dvi_buffer);
-
- if (file_pos >= bgn_pos) {
- oldinfo.pos = dvi_buffer
- + (file_pos - bgn_pos);
- oldinfo.end = currinf.end;
- }
- else {
- (void) lseek(fileno(dvi_file), file_pos,
- SEEK_SET);
- oldinfo.pos = oldinfo.end;
- }
- }
- currinf = oldinfo;
- maxchar = oldmaxchar;
- /* and then: recover position info. */
- DVI_H = current_frame->data.dvi_h;
- DVI_V = current_frame->data.dvi_v;
- PXL_V = current_frame->data.pxl_v;
- /* and finally, reverse direction */
- currinf.dir = -currinf.dir;
- }
- break;
- }
- /* we're not scanning, */
- /* so just reverse direction and then pop */
- currinf.dir = -currinf.dir;
- currinf.data = current_frame->data;
- current_frame = current_frame->prev;
- break;
-#endif /* TEXXET */
-
- case RIGHT1:
- case RIGHT2:
- case RIGHT3:
- case RIGHT4:
- DVI_H += DIR * xspell_conv(xsnum(ch - RIGHT1 + 1));
- break;
-
- case W1:
- case W2:
- case W3:
- case W4:
- WW = xspell_conv(xsnum(ch - W0));
- case W0:
- DVI_H += DIR * WW;
- break;
-
- case X1:
- case X2:
- case X3:
- case X4:
- XX = xspell_conv(xsnum(ch - X0));
- case X0:
- DVI_H += DIR * XX;
- break;
-
- case DOWN1:
- case DOWN2:
- case DOWN3:
- case DOWN4:
- DVI_V += xspell_conv(xsnum(ch - DOWN1 + 1));
- PXL_V = pixel_conv(DVI_V);
- break;
-
- case Y1:
- case Y2:
- case Y3:
- case Y4:
- YY = xspell_conv(xsnum(ch - Y0));
- case Y0:
- DVI_V += YY;
- PXL_V = pixel_conv(DVI_V);
- break;
-
- case Z1:
- case Z2:
- case Z3:
- case Z4:
- ZZ = xspell_conv(xsnum(ch - Z0));
- case Z0:
- DVI_V += ZZ;
- PXL_V = pixel_conv(DVI_V);
- break;
-
- case FNT1:
- case FNT2:
- case FNT3:
- case FNT4:
- change_font(xnum(ch - FNT1 + 1));
- break;
-
- case XXX1:
- case XXX2:
- case XXX3:
- case XXX4:
- a = xnum(ch - XXX1 + 1);
- if (a > 0) {
- spc_bak = read_special(a);
- applicationDoSpecial(spc_bak, 0);
- }
- break;
-
- case FNTDEF1:
- case FNTDEF2:
- case FNTDEF3:
- case FNTDEF4:
- xskip((long) (12 + ch - FNTDEF1 + 1));
- a = (long) xone();
- xskip(a + (long) xone());
- break;
-
-#ifndef TEXXET
- case SREFL:
- case EREFL:
-#endif
- case PRE:
- case POST:
- case POSTPOST:
- tell_oops("shouldn't happen: %s encountered",
- dvi_table2[ch - (FNTNUM0 + 64)]);
- break;
-
- default:
- tell_oops("unknown op-code %d", ch);
- } /* end switch*/
- } /* end else (ch not a SETCHAR or FNTNUM) */
- } /* end for */
-}
-
-#undef xspell_conv
-
-#ifdef HTEX
-static void
-check_for_anchor() /* see if anchor requested, if so go to it */
-{
- if (anchor_name != NULL) {
- htex_reinit(); /* Set up hypertext stuff */
- htex_do_loc(anchor_name);
- free(anchor_name);
- anchor_name = NULL;
- }
-}
-#endif /* HTEX */
-
-void draw_page P1C()
-{
- extern HDC magDC, magMemDC;
-
- /* Check for changes in dvi file. */
- if (!check_dvi_file()) return;
-
-#ifdef WIN32
- if (! allowDrawingChars && !isPrinting)
- bColorPage = FALSE;
-#endif
-#if PS
- if (scanned_page < current_page) prescan();
-#ifdef WIN32
- {
- if (!bMagDisp && !allowDrawingChars && !isPrinting) {
- psToDisplay = False;
- }
- }
-#endif
-#endif
-
- if (!allowDrawingChars && !isPrinting) {
- RECT r;
- COLORREF new_back_Pixel = get_back_color(current_page);
-#if 0
- extern void dump_colors(char *);
- dump_colors("draw_page()");
-#endif
- if ( back_Pixel != new_back_Pixel ) {
- back_Pixel = new_back_Pixel;
- if (backBrush)
- DeleteObject(backBrush);
-#if 0 /* DEBUG_COLOR */
- fprintf(stderr, "Creating back brush %-8x\n", back_Pixel);
-#endif
- backBrush = CreateSolidBrush(back_Pixel);
- }
-#if 0
- fprintf(stderr, "draw_page filling bg with color %-8x\n", back_Pixel);
-#endif
- r.left = min_x - currwin.base_x;
- r.top = min_y - currwin.base_y;
- r.right = min(page_w - currwin.base_x, max_x);
- r.bottom = min(page_h - currwin.base_y, max_y);
- FillRect(foreGC, &r, backBrush);
- }
-
-#ifdef WIN32
- if (!isPrinting) {
- /* FIXME : we should ensure that base_x and base_y
- do correspond to Scroll variables everywhere ! */
- extern int xCurrentScroll, yCurrentScroll;
- if (1) {
- put_border(-currwin.base_x, -currwin.base_y,
- ROUNDUP(unshrunk_paper_w, shrink_factor) + 2,
- ROUNDUP(unshrunk_paper_h, shrink_factor) + 2, highGC);
- }
- else {
- put_border(-xCurrentScroll, -yCurrentScroll,
- ROUNDUP(unshrunk_paper_w, shrink_factor) + 2,
- ROUNDUP(unshrunk_paper_h, shrink_factor) + 2, highGC);
- }
- }
-#else
- put_border(-currwin.base_x, -currwin.base_y,
- ROUNDUP(unshrunk_paper_w, shrink_factor) + 2,
- ROUNDUP(unshrunk_paper_h, shrink_factor) + 2, highGC);
-#endif
-#if 0
-#ifdef GRID
- if ( grid_mode > 0 ) /* grid is wanted */
- put_grid(-currwin.base_x, -currwin.base_y,
- ROUNDUP(unshrunk_paper_w, shrink_factor) + 2,
- ROUNDUP(unshrunk_paper_h, shrink_factor) + 2,
- ROUNDUP(unshrunk_paper_unit, shrink_factor),
- grid1GC, grid2GC, grid3GC);
-#endif /* GRID */
-#endif
- (void) lseek(fileno(dvi_file), page_offset[current_page], SEEK_SET);
-
- bzero((char *) &currinf.data, sizeof(currinf.data));
- currinf.tn_table_len = TNTABLELEN;
- currinf.tn_table = tn_table;
- currinf.tn_head = tn_head;
- currinf.pos = currinf.end = dvi_buffer;
- currinf.virtual = NULL;
-#ifdef HTEX
- htex_initpage(); /* Start up the hypertext stuff for this page */
-#endif
- psfig_begun = False;
- draw_part(current_frame = &frame0, dimconv);
-#ifdef HTEX
- htex_donepage(current_page, 1); /* Finish up the hypertext stuff for this page */
- check_for_anchor(); /* see if a new anchor was requested */
-#endif
-#if PS
- psp.endpage();
-#endif
-#ifdef WIN32
-#ifdef GRID
- if ( grid_mode > 0 ) { /* grid is wanted */
- extern unsigned int xCurrentScroll, yCurrentScroll;
- put_grid(&currwin,
- ROUNDUP(unshrunk_paper_unit, shrink_factor),
-#if 0
- grid1GC, grid2GC, grid3GC
-#else
- highGC, highGC, highGC
-#endif
- );
- }
-#endif /* GRID */
-#endif
-}
-
-#ifdef HTEX
-extern int *htex_parsedpages; /* List of pages parsed */
-
-/* Parse dvi pages not yet scanned by xdvi, searching for html anchors */
-void htex_parsepages()
-{
- int i;
-
- for (i=0; i < total_pages; i++) {
- if (htex_parsedpages[i] != 0) continue;
- htex_parse_page(i);
- }
- /* Return to original position in dvi file? */
-}
-
-void htex_parse_page(i)
-int i;
-{
- /* Skip to beginning of page i */
-/* Stuff from draw_page in dvi_draw.c: */
- (void) lseek(fileno(dvi_file), page_offset[i], SEEK_SET);
- bzero((char *) &currinf.data, sizeof(currinf.data));
- currinf.tn_head = tn_head;
- currinf.pos = currinf.end = dvi_buffer;
- currinf.virtual = NULL;
- htex_initpage();
- htex_scanpage(i);
- htex_donepage(i, 0);
-}
-
-
-/* HTeX parse page without drawing it function: */
-/* Basically the same as is done by draw_part, except we don't
- do anything other than record html anchors */
-/* Assumes page has been set up properly as above */
-void htex_scanpage(pageno)
-int pageno;
-{
- ubyte ch;
- long a;
-
- /* Read in page, searching for XXX1 to XXX4 (\special)
- sections and ignoring everything else */
- for (;;) {
- ch = xone();
- if (ch <= SETCHAR0 + 127) { /* It's a character - do nothing */
- } else if (FNTNUM0 <= ch && ch <= FNTNUM0 + 63) {
- /* It's a previously numbered font - again do nothing */
- } else {
- switch(ch) {
- case PUSH: /* No args */
- case POP: /* No args */
- case NOP: /* Nothing! */
- break;
- case SET1:
- case PUT1:
- xskip((long) 1); /* Set or put 1 char - skip it */
- break;
-#ifdef Omega
- case SET2:
- case PUT2:
- xskip((long) 2); /* Set or put 16-bit char - skip it */
- break;
-#endif
- case SETRULE:
- case PUTRULE:
- xskip((long) 8); /* two integers a and b */
- break;
- case BOP: /* Beginning of page stuff */
- xskip((long) 11*4);
- break;
- case EOP: /* End of the page! */
- return;
- case SREFL:
- case EREFL:
- break;
- case RIGHT1:
- case RIGHT2:
- case RIGHT3:
- case RIGHT4:
- xskip(ch - RIGHT1 + 1);
- break;
- case W1:
- case W2:
- case W3:
- case W4:
- xskip(ch - W0);
- case W0:
- break;
- case X1:
- case X2:
- case X3:
- case X4:
- xskip(ch - X0);
- case X0:
- break;
- case DOWN1:
- case DOWN2:
- case DOWN3:
- case DOWN4:
- xskip(ch - DOWN1 + 1);
- break;
- case Y1:
- case Y2:
- case Y3:
- case Y4:
- xskip(ch - Y0);
- case Y0:
- break;
- case Z1:
- case Z2:
- case Z3:
- case Z4:
- xskip(ch - Z0);
- case Z0:
- break;
- case FNT1:
- case FNT2:
- case FNT3:
- case FNT4:
- xskip(ch - FNT1 + 1);
- break;
- case XXX1:
- case XXX2:
- case XXX3:
- case XXX4: /* Only thing we pay attention to! */
- a = xnum(ch - XXX1 + 1);
- if (a > 0)
- htex_dospecial(a, pageno);
- break;
- case FNTDEF1:
- case FNTDEF2:
- case FNTDEF3:
- case FNTDEF4:
- xskip((long) (12 + ch - FNTDEF1 + 1));
- xskip((long) xone() + (long) xone());
- break;
- case PRE:
- case POST:
- case POSTPOST:
- default:
- break;
- }
- }
- }
-}
-
-/* Do the same same stuff as special() in dvi_draw.c */
-/* But only check HTeX specials */
-void htex_dospecial(nbytes, pageno)
-long nbytes;
-int pageno;
-{
- static char *cmd = NULL;
- static long cmdlen = -1;
- char *p;
-
- if (cmdlen < nbytes) {
- if (cmd) free(cmd);
- cmd = xmalloc((unsigned) nbytes+1);
- cmdlen = nbytes;
- }
- p = cmd;
- for (;;) {
- int i = currinf.end - currinf.pos;
- if (i > nbytes) i = nbytes;
- bcopy((_Xconst char *) currinf.pos, p, i);
- currinf.pos += i;
- p += i;
- nbytes -= i;
- if (nbytes == 0) break;
- (void) xxone();
- --(currinf.pos);
- }
- *p = '\0';
- p = cmd;
- while (isspace(*p)) ++p;
- checkHyperTeX(p, pageno);
-}
-#endif /* HTEX */