summaryrefslogtreecommitdiff
path: root/print/tex-xdvik/files/patch-texk-xdvik-dvi-draw.c
diff options
context:
space:
mode:
Diffstat (limited to 'print/tex-xdvik/files/patch-texk-xdvik-dvi-draw.c')
-rw-r--r--print/tex-xdvik/files/patch-texk-xdvik-dvi-draw.c1134
1 files changed, 0 insertions, 1134 deletions
diff --git a/print/tex-xdvik/files/patch-texk-xdvik-dvi-draw.c b/print/tex-xdvik/files/patch-texk-xdvik-dvi-draw.c
deleted file mode 100644
index 716ae5720429..000000000000
--- a/print/tex-xdvik/files/patch-texk-xdvik-dvi-draw.c
+++ /dev/null
@@ -1,1134 +0,0 @@
---- texk/xdvik/dvi-draw.c.orig 2013-09-01 05:55:44 UTC
-+++ texk/xdvik/dvi-draw.c
-@@ -56,6 +56,9 @@ in xdvi.c.
- #include "statusline.h"
- #include "hypertex.h"
- #include "special.h"
-+#ifdef PTEX
-+#include "ptexmap.h"
-+#endif
- #include "my-snprintf.h"
- #include "kpathsea/tex-file.h"
- #include "mag.h"
-@@ -531,8 +534,8 @@ print_char(ubyte ch, struct glyph *g)
- }
-
- static const char *dvi_table1[] = {
-- "SET1", "SET2", NULL, NULL, "SETRULE", "PUT1", "PUT2", NULL,
-- NULL, "PUTRULE", "NOP", "BOP", "EOP", "PUSH", "POP", "RIGHT1",
-+ "SET1", "SET2", "SET3", "SET4", "SETRULE", "PUT1", "PUT2", "PUT3",
-+ "PUT4", "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",
-@@ -542,7 +545,12 @@ static const char *dvi_table1[] = {
- static const char *dvi_table2[] = {
- "FNT1", "FNT2", "FNT3", "FNT4", "XXX1", "XXX2", "XXX3", "XXX4",
- "FNTDEF1", "FNTDEF2", "FNTDEF3", "FNTDEF4", "PRE", "POST", "POSTPOST",
-- "SREFL", "EREFL", NULL, NULL, NULL, NULL
-+ "SREFL", "EREFL", NULL, NULL, NULL,
-+#ifdef PTEX
-+ "DIRECTION"
-+#else /* !PTEX */
-+ NULL
-+#endif /* !PTEX */
- };
-
- static void
-@@ -667,6 +675,146 @@ sample(bmUnitT *bits, int bytes_wide, in
- return n;
- }
-
-+extern double bbox_matrix[2][2];
-+extern Boolean bbox_scaled, bbox_rotated;
-+
-+static void moveH(int dir, long dx)
-+{
-+ int pint=TATE;
-+ if (pint&2) { pint&=1; dx=-dx;}
-+ if (pint) {
-+ DVI_H -= dx * bbox_matrix[1][0];
-+ DVI_V += dx * bbox_matrix[0][0];
-+ } else {
-+ DVI_H += dir * dx * bbox_matrix[0][0];
-+ DVI_V += dir * dx * bbox_matrix[1][0];
-+ }
-+ PXL_V = pixel_conv(DVI_V);
-+}
-+
-+static void moveV(int dir, long dy)
-+{
-+ int pint=TATE;
-+ if (pint&2) { pint&=1; dy=-dy;}
-+ if (pint) {
-+ DVI_H -= dy * bbox_matrix[1][1];
-+ DVI_V += dy * bbox_matrix[0][1];
-+ } else {
-+ DVI_H += dir * dy * bbox_matrix[0][1];
-+ DVI_V += dir * dy * bbox_matrix[1][1];
-+ }
-+ PXL_V = pixel_conv(DVI_V);
-+}
-+
-+#define PUSH_POSITION do { \
-+ dvi_h_sav = DVI_H; \
-+ dvi_v_sav = DVI_V; \
-+ pxl_v_sav = PXL_V; } while (0)
-+#define POP_POSITION do { \
-+ DVI_H = dvi_h_sav; \
-+ DVI_V = dvi_v_sav; \
-+ PXL_V = pxl_v_sav; } while (0)
-+#define DEFINE_POSITION_VAL \
-+ long dvi_h_sav, dvi_v_sav, pxl_v_sav
-+
-+#ifndef WORDS_BIGENDIAN
-+#define EXTREME_LEFT_BIT (1 << 0)
-+#define EXTREME_RIGHT_BIT ((bmUnitT)(1 << (BMBITS-1)))
-+#define SHIFT_RIGHT(a) ((a) <<= 1)
-+#else /* WORDS_BIGENDIAN */
-+#define EXTREME_LEFT_BIT ((bmUnitT)(1 << (BMBITS-1)))
-+#define EXTREME_RIGHT_BIT (1 << 0)
-+#define SHIFT_RIGHT(a) ((a) >>= 1)
-+#endif /* WORDS_BIGENDIAN */
-+
-+static void
-+bbox_scale_bitmap(struct glyph *g)
-+{
-+ bmUnitT *new_ptr;
-+ int xmax, ymax, xmin, ymin, x, y;
-+ double d;
-+
-+ if (g->bitmap3.bits) {
-+ if (g->matrix[0][0] == (float) bbox_matrix[0][0]
-+ && g->matrix[0][1] == (float) bbox_matrix[0][1]
-+ && g->matrix[1][0] == (float) bbox_matrix[1][0]
-+ && g->matrix[1][1] == (float) bbox_matrix[1][1])
-+ return;
-+ else
-+ free(g->bitmap.bits);
-+ } else {
-+ g->bitmap3 = g->bitmap;
-+ g->x3 = g->x;
-+ g->y3 = g->y;
-+ }
-+
-+ xmax = ymax = xmin = ymin = 0;
-+ x = g->bitmap3.w * bbox_matrix[0][0];
-+ y = g->bitmap3.w * bbox_matrix[1][0];
-+ if (xmax < x) xmax = x;
-+ else if (xmin > x) xmin = x;
-+ if (ymax < y) ymax = y;
-+ else if (ymin > y) ymin = y;
-+ x = g->bitmap3.w * bbox_matrix[0][0] + g->bitmap3.h * bbox_matrix[0][1];
-+ y = g->bitmap3.w * bbox_matrix[1][0] + g->bitmap3.h * bbox_matrix[1][1];
-+ if (xmax < x) xmax = x;
-+ else if (xmin > x) xmin = x;
-+ if (ymax < y) ymax = y;
-+ else if (ymin > y) ymin = y;
-+ x = g->bitmap3.h * bbox_matrix[0][1];
-+ y = g->bitmap3.h * bbox_matrix[1][1];
-+ if (xmax < x) xmax = x;
-+ else if (xmin > x) xmin = x;
-+ if (ymax < y) ymax = y;
-+ else if (ymin > y) ymin = y;
-+ xmin--; ymin--; xmax++; ymax++;
-+
-+ d = bbox_matrix[0][0] * bbox_matrix[1][1]
-+ - bbox_matrix[0][1] * bbox_matrix[1][0];
-+
-+ g->x = g->x3 * bbox_matrix[0][0] + g->y3 * bbox_matrix[0][1] - xmin;
-+ g->y = g->x3 * bbox_matrix[1][0] + g->y3 * bbox_matrix[1][1] - ymin;
-+ g->matrix[0][0] = (float) bbox_matrix[0][0];
-+ g->matrix[0][1] = (float) bbox_matrix[0][1];
-+ g->matrix[1][0] = (float) bbox_matrix[1][0];
-+ g->matrix[1][1] = (float) bbox_matrix[1][1];
-+
-+ free_bitmap2(g);
-+ g->bitmap.w = xmax - xmin + 1;
-+ g->bitmap.h = ymax - ymin + 1;
-+ alloc_bitmap(&g->bitmap);
-+ clear_bitmap(&g->bitmap);
-+
-+ new_ptr = (bmUnitT *) g->bitmap.bits;
-+ for (y = ymin; y <= ymax; y++) {
-+ register bmUnitT m, *cp;
-+
-+ cp = new_ptr;
-+ m = EXTREME_LEFT_BIT;
-+ for (x = xmin; x <= xmax; x++) {
-+ int bx, by;
-+ bx = (x * bbox_matrix[1][1] - y * bbox_matrix[0][1]) / d;
-+ by = (y * bbox_matrix[0][0] - x * bbox_matrix[1][0]) / d;
-+ if (bx >= 0 && bx < g->bitmap3.w
-+ && by >= 0 && by < g->bitmap3.h
-+ && *((bmUnitT *)g->bitmap3.bits
-+ + by * (g->bitmap3.bytes_wide / BMBYTES) + bx / BMBITS)
-+#ifndef WORDS_BIGENDIAN
-+ & (1 << (bx % BMBITS)))
-+#else
-+ & (1 << (BMBITS - 1 - bx % BMBITS)))
-+#endif
-+ *cp |= m;
-+ if (m == EXTREME_RIGHT_BIT) {
-+ m = EXTREME_LEFT_BIT;
-+ ++cp;
-+ }
-+ else SHIFT_RIGHT(m);
-+ }
-+ new_ptr = ADD(new_ptr, g->bitmap.bytes_wide);
-+ }
-+}
-+
- static void
- shrink_glyph(struct glyph *g)
- {
-@@ -757,6 +905,89 @@ shrink_glyph(struct glyph *g)
- print_bitmap(&g->bitmap2);
- }
-
-+#ifdef PTEX
-+void
-+rotate_bitmap(struct bitmap *bm)
-+{
-+ struct bitmap new_bm;
-+ bmUnitT *old_ptr, *new_ptr, *cp;
-+ int x, y;
-+ bmUnitT m1, m2;
-+
-+ new_bm.h = bm->w;
-+ new_bm.w = bm->h;
-+ alloc_bitmap(&new_bm);
-+ clear_bitmap(&new_bm);
-+ old_ptr = ADD(bm->bits, bm->bytes_wide * bm->h);
-+ new_ptr = (bmUnitT *)new_bm.bits;
-+
-+ m1 = EXTREME_LEFT_BIT;
-+ for (y = 0; y < bm->h; y++) {
-+ old_ptr = SUB(old_ptr, bm->bytes_wide);
-+ cp = old_ptr;
-+ m2 = EXTREME_LEFT_BIT;
-+ for (x = 0; x < bm->w; x++) {
-+ if (*cp & m2)
-+ *ADD(new_ptr, x*new_bm.bytes_wide) |= m1;
-+ if (m2 == EXTREME_RIGHT_BIT) {
-+ m2 = EXTREME_LEFT_BIT;
-+ ++cp;
-+ }
-+ else SHIFT_RIGHT(m2);
-+ }
-+ if (m1 == EXTREME_RIGHT_BIT) {
-+ m1 = EXTREME_LEFT_BIT;
-+ ++new_ptr;
-+ }
-+ else SHIFT_RIGHT(m1);
-+ }
-+
-+ free(bm->bits);
-+ *bm = new_bm;
-+}
-+
-+
-+void
-+reverse_rotate_bitmap(struct bitmap *bm)
-+{
-+ struct bitmap new_bm;
-+ bmUnitT *old_ptr, *new_ptr, *cp;
-+ int x, y;
-+ bmUnitT m1, m2;
-+
-+ new_bm.h = bm->w;
-+ new_bm.w = bm->h;
-+ alloc_bitmap(&new_bm);
-+ clear_bitmap(&new_bm);
-+ old_ptr = (bmUnitT *)bm->bits;
-+ new_ptr = (bmUnitT *)new_bm.bits;
-+
-+ m1 = EXTREME_LEFT_BIT;
-+ for (y = 0; y < bm->h; y++) {
-+ cp = old_ptr;
-+ old_ptr = ADD(old_ptr, bm->bytes_wide);
-+ m2 = EXTREME_LEFT_BIT;
-+ for (x = bm->w; x--;) {
-+ if (*cp & m2)
-+ *ADD(new_ptr, x * new_bm.bytes_wide) |= m1;
-+ if (m2 == EXTREME_RIGHT_BIT) {
-+ m2 = EXTREME_LEFT_BIT;
-+ ++cp;
-+ }
-+ else SHIFT_RIGHT(m2);
-+ }
-+ if (m1 == EXTREME_RIGHT_BIT) {
-+ m1 = EXTREME_LEFT_BIT;
-+ ++new_ptr;
-+ }
-+ else SHIFT_RIGHT(m1);
-+ }
-+
-+ free(bm->bits);
-+ *bm = new_bm;
-+}
-+#endif /* PTEX */
-+
- #ifdef GREY
-
- #ifdef RGB_ANTI_ALIASING
-@@ -970,6 +1201,7 @@ shrink_glyph_grey(struct glyph *g)
- BMBITS, 0);
- size = g->image2->bytes_per_line * g->bitmap2.h;
- g->pixmap2 = g->image2->data = xmalloc(size != 0 ? size : 1);
-+ ASSERT(g->pixmap2_gc2 == NULL, "pixmap2_gc2 is not NULL.");
- }
- /* ... and the pixmap used for globals.gc.fore2: */
- if (globals.gc.fore2 != NULL && g->pixmap2_gc2 == NULL) {
-@@ -1283,8 +1515,13 @@ static ubyte scantable[256] = {
- 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, /* SET1,SET2 (128,129) */
-- /* -,-,SETRULE,PUT1,PUT2,-,-,PUTRULE,NOP,BOP (130-139) */
-+#ifdef PTEX
-+ /* SET3,SET4,SETRULE,PUT1,PUT2,PUT3,PUT4,PUTRULE,NOP,BOP (130-139) */
-+ 3, 4, 8, 1, 2, 3, 4, 8, 0, 44,
-+#else
-+ /* -,-,SETRULE,PUT1,PUT2,-,-,PUTRULE,NOP,BOP (132-139) */
- M4, M4, 8, 1, 2, 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) */
-@@ -1337,9 +1574,11 @@ spcl_scan(Boolean (*spcl_proc)(char *str
- ch = xone(fp);
- xskip(fp, (long)ch + (long)xone(fp));
- break;
-+#ifndef PTEX
- case M4: /* unrecognizable */
- XDVI_FATAL((stderr, "unknown op-code %d", ch));
- break;
-+#endif /* !PTEX */
- case M5: /* doesn't belong */
- dvi_fmt_error("spcl_scan: shouldn't happen: %s encountered",
- dvi_table2[ch - (FNTNUM0 + 64)]);
-@@ -1453,6 +1692,46 @@ prescan(FILE *fp)
- * Routines to print characters.
- */
-
-+#ifdef PTEX
-+static void
-+set_char_rotate_glyph(struct glyph *g)
-+{
-+ int tmp, rot = TATE - g->tdir;
-+ if (rot<0) rot+=4;
-+ switch(rot) {
-+ case 2:
-+ rotate_bitmap(&g->bitmap);
-+ tmp = g->x;
-+ g->x = g->bitmap.w - g->y;
-+ g->y = tmp;
-+ g->tdir = TATE;
-+ free_bitmap2(g);
-+ case 1:
-+ rotate_bitmap(&g->bitmap);
-+ tmp = g->x;
-+ g->x = g->bitmap.w - g->y;
-+ g->y = tmp;
-+ g->tdir = TATE;
-+ free_bitmap2(g);
-+ break;
-+ case 3:
-+ reverse_rotate_bitmap(&g->bitmap);
-+ tmp = g->x;
-+ g->x = g->y;
-+ g->y = g->bitmap.h - tmp;
-+ g->tdir = TATE;
-+ free_bitmap2(g);
-+ }
-+}
-+#endif /* PTEX */
-+
-+static setcharRetvalT
-+common_set_char(
-+#ifdef TEXXET
-+ wide_ubyte,
-+#endif
-+ struct glyph *);
-+
- setcharRetvalT
- set_char(
- #ifdef TEXXET
-@@ -1461,9 +1740,6 @@ set_char(
- wide_ubyte ch)
- {
- struct glyph *g;
--#ifdef TEXXET
-- long dvi_h_sav;
--#endif
-
- if (ch > maxchar)
- realloc_font(currinf.fontp, (wide_ubyte)ch);
-@@ -1497,14 +1773,41 @@ set_char(
- print_char((ubyte) ch, g);
- currinf.fontp->timestamp = ++current_timestamp;
- }
-+#ifdef PTEX
-+ set_char_rotate_glyph(g);
-+#endif /* PTEX */
-+#ifdef TEXXET
-+ common_set_char(cmd, g);
-+#else
-+ return common_set_char(g);
-+#endif
-+}
-
-+static setcharRetvalT
-+common_set_char(
- #ifdef TEXXET
-- dvi_h_sav = DVI_H;
-- if (currinf.dir < 0)
-- DVI_H -= g->dvi_adv;
-+ wide_ubyte cmd,
-+#endif
-+ struct glyph *g)
-+{
-+#ifdef TEXXET
-+ DEFINE_POSITION_VAL;
-+ PUSH_POSITION;
-+ if (! TATE && currinf.dir < 0)
-+ moveH(1, -g->dvi_adv);
-
- if (scan_frame == NULL) {
- #endif
-+ if (bbox_scaled)
-+ bbox_scale_bitmap(g);
-+ else if (g->bitmap3.bits) {
-+ free(g->bitmap.bits);
-+ g->bitmap = g->bitmap3;
-+ g->bitmap3.bits = NULL;
-+ g->x = g->x3;
-+ g->y = g->y3;
-+ free_bitmap2(g);
-+ }
-
- #ifdef RGB_ANTI_ALIASING
- if (currwin.shrinkfactor == -1) {
-@@ -1546,9 +1849,9 @@ set_char(
- #ifdef TEXXET
- }
- if (cmd == PUT1 || (resource.omega && cmd == PUT2))
-- DVI_H = dvi_h_sav;
-- else if (currinf.dir > 0)
-- DVI_H += g->dvi_adv;
-+ POP_POSITION;
-+ else if (TATE || currinf.dir > 0)
-+ moveH(1, g->dvi_adv);
- return;
- #else
- return g->dvi_adv;
-@@ -1603,6 +1906,33 @@ set_empty_char(
- #endif
- }
-
-+#ifdef PTEX
-+setcharRetvalT
-+set_char2(
-+#ifdef TEXXET
-+ wide_ubyte cmd,
-+#endif
-+ wide_ubyte ch)
-+{
-+ struct glyph *g;
-+
-+ if (ch > currinf.fontp->maxchar ||
-+ (g = currinf.fontp->kglyph[ch]) == NULL || g->bitmap.bits == NULL) {
-+ (*currinf.fontp->read_char)(currinf.fontp, ch);
-+ g = currinf.fontp->kglyph[ch];
-+ free_bitmap2(g);
-+ g->tdir = currinf.fontp->dir;
-+ if (globals.debug & DBG_BITMAP) print_char((ubyte) ch, g);
-+ }
-+ set_char_rotate_glyph(g);
-+#ifdef TEXXET
-+ common_set_char(cmd, g);
-+#else
-+ return common_set_char(g);
-+#endif
-+}
-+#endif /* PTEX */
-+
- setcharRetvalT
- load_n_set_char(
- #ifdef TEXXET
-@@ -1650,7 +1980,7 @@ set_vf_char(
- wide_ubyte oldmaxchar;
- static ubyte c;
- #ifdef TEXXET
-- long dvi_h_sav;
-+ DEFINE_POSITION_VAL;
- #endif
-
- if (ch > maxchar)
-@@ -1666,9 +1996,9 @@ set_vf_char(
- #endif
- }
- #ifdef TEXXET
-- dvi_h_sav = DVI_H;
-- if (currinf.dir < 0)
-- DVI_H -= m->dvi_adv;
-+ PUSH_POSITION;
-+ if (! TATE && currinf.dir < 0)
-+ moveH(1, -m->dvi_adv);
- if (scan_frame == NULL) {
- #endif
- oldinfo = currinf;
-@@ -1693,9 +2023,9 @@ set_vf_char(
- #ifdef TEXXET
- }
- if (cmd == PUT1 || (resource.omega && cmd == PUT2))
-- DVI_H = dvi_h_sav;
-- else if (currinf.dir > 0)
-- DVI_H += m->dvi_adv;
-+ POP_POSITION;
-+ else if (TATE || currinf.dir > 0)
-+ moveH(1, m->dvi_adv);
- return;
- #else
- return m->dvi_adv;
-@@ -1813,9 +2143,64 @@ set_no_char(
- * Set rule. Arguments are coordinates of lower left corner.
- */
-
-+static void
-+set_rotated_rule(long h, long w)
-+{
-+ XPoint points[4];
-+ int pint = TATE;
-+ if (pint&2) { pint&=1;
-+ w=-w; h=-h;
-+ }
-+ points[0].x = PXL_H - currwin.base_x;
-+ points[0].y = PXL_V - currwin.base_y;
-+#ifdef PTEX
-+ if (pint) {
-+ points[1].x = -w * bbox_matrix[1][0];
-+ points[1].y = w * bbox_matrix[0][0];
-+ points[2].x = h * bbox_matrix[1][1];
-+ points[2].y = -h * bbox_matrix[0][1];
-+ } else
-+#endif /* PTEX */
-+ {
-+ points[1].x = DIR * w * bbox_matrix[0][0];
-+ points[1].y = DIR * w * bbox_matrix[1][0];
-+ points[2].x = -h * bbox_matrix[0][1];
-+ points[2].y = -h * bbox_matrix[1][1];
-+ }
-+ points[3].x = -points[1].x;
-+ points[3].y = -points[1].y;
-+
-+ if (--globals.ev.ctr == 0) {
-+ if (read_events(EV_NOWAIT) & EV_GE_MAG_GONE) {
-+ /* fprintf(stderr, "longjmp1!\n"); */
-+ longjmp(globals.ev.canit, 1);
-+ }
-+ }
-+#if COLOR
-+ if (fg_active != fg_current)
-+ do_color_change();
-+#endif
-+ XFillPolygon(DISP, currwin.win,
-+ htex_inside_href ? globals.gc.high: globals.gc.rule,
-+ points, 4, Convex, CoordModePrevious);
-+}
-+
- static void
- set_rule(int h, int w)
- {
-+ if (bbox_rotated) {
-+ set_rotated_rule(h, w);
-+ return;
-+ }
-+ h = h * bbox_matrix[1][1];
-+ w = w * bbox_matrix[0][0];
-+#ifdef PTEX
-+ if (TATE==1)
-+ put_rule(PXL_H, PXL_V, (unsigned int)h, (unsigned int)w);
-+ else if (TATE==3) /* dtou */
-+ put_rule(PXL_H - h + 1, PXL_V - w + 1, (unsigned int)h, (unsigned int)w);
-+ else
-+#endif /* PTEX */
- #ifdef TEXXET
- put_rule(PXL_H - (currinf.dir < 0 ? w - 1 : 0), PXL_V - h + 1,
- (unsigned int)w, (unsigned int)h);
-@@ -1860,7 +2245,7 @@ draw_part(FILE *fp, struct frame *minfra
- #ifdef TEXXET
- (*currinf.set_char_p) (ch, ch);
- #else
-- DVI_H += (*currinf.set_char_p) (ch);
-+ moveH(1, (*currinf.set_char_p) (ch));
- #endif
- }
- else if (FNTNUM0 <= ch && ch <= (ubyte) (FNTNUM0 + 63)) {
-@@ -1877,7 +2262,7 @@ draw_part(FILE *fp, struct frame *minfra
- #else
- a = (*currinf.set_char_p) (xone(fp));
- if (ch != PUT1)
-- DVI_H += a;
-+ moveH(1, a);
- #endif
- break;
-
-@@ -1892,7 +2277,39 @@ draw_part(FILE *fp, struct frame *minfra
- #else
- a = (*currinf.set_char_p) (xnum(fp, 2));
- if (ch != PUT2)
-- DVI_H += a;
-+ moveH(1, a);
-+#endif
-+ }
-+ break;
-+
-+ case SET3:
-+ case PUT3:
-+ if (!resource.omega)
-+ dvi_fmt_error("%s:%d: draw_part: op-code %d only works with the \"-omega\" option",
-+ __FILE__, __LINE__, ch);
-+ else {
-+#ifdef TEXXET
-+ (*currinf.set_char_p) (ch, xnum(fp, 3));
-+#else
-+ a = (*currinf.set_char_p) (xnum(fp, 3));
-+ if (ch != PUT3)
-+ moveH(1, a);
-+#endif
-+ }
-+ break;
-+
-+ case SET4:
-+ case PUT4:
-+ if (!resource.omega)
-+ dvi_fmt_error("%s:%d: draw_part: op-code %d only works with the \"-omega\" option",
-+ __FILE__, __LINE__, ch);
-+ else {
-+#ifdef TEXXET
-+ (*currinf.set_char_p) (ch, xnum(fp, 4));
-+#else
-+ a = (*currinf.set_char_p) (xnum(fp, 4));
-+ if (ch != PUT4)
-+ moveH(1, a);
- #endif
- }
- break;
-@@ -1910,7 +2327,7 @@ draw_part(FILE *fp, struct frame *minfra
- ) {
- set_rule(pixel_round(xspell_conv(a)), pixel_round(b));
- }
-- DVI_H += DIR * b;
-+ moveH(DIR, b);
- break;
-
- case PUTRULE:
-@@ -1934,6 +2351,9 @@ draw_part(FILE *fp, struct frame *minfra
- DVI_V = OFFSET_Y;
- PXL_V = pixel_conv(DVI_V);
- WW = XX = YY = ZZ = 0;
-+ bbox_matrix[0][0] = bbox_matrix[1][1] = 1.0;
-+ bbox_matrix[0][1] = bbox_matrix[1][0] = 0.0;
-+ bbox_scaled = bbox_rotated = False;
- break;
-
- case EOP:
-@@ -2028,7 +2448,7 @@ draw_part(FILE *fp, struct frame *minfra
- case RIGHT2:
- case RIGHT3:
- case RIGHT4:
-- DVI_H += DIR * xspell_conv(xsnum(fp, ch - RIGHT1 + 1));
-+ moveH(DIR, xspell_conv(xsnum(fp, ch - RIGHT1 + 1)));
- break;
-
- case W1:
-@@ -2037,7 +2457,7 @@ draw_part(FILE *fp, struct frame *minfra
- case W4:
- WW = xspell_conv(xsnum(fp, ch - W0));
- case W0:
-- DVI_H += DIR * WW;
-+ moveH(DIR, WW);
- break;
-
- case X1:
-@@ -2046,15 +2466,14 @@ draw_part(FILE *fp, struct frame *minfra
- case X4:
- XX = xspell_conv(xsnum(fp, ch - X0));
- case X0:
-- DVI_H += DIR * XX;
-+ moveH(DIR, XX);
- break;
-
- case DOWN1:
- case DOWN2:
- case DOWN3:
- case DOWN4:
-- DVI_V += xspell_conv(xsnum(fp, ch - DOWN1 + 1));
-- PXL_V = pixel_conv(DVI_V);
-+ moveV(1, xspell_conv(xsnum(fp, ch - DOWN1 + 1)));
- break;
-
- case Y1:
-@@ -2063,8 +2482,7 @@ draw_part(FILE *fp, struct frame *minfra
- case Y4:
- YY = xspell_conv(xsnum(fp, ch - Y0));
- case Y0:
-- DVI_V += YY;
-- PXL_V = pixel_conv(DVI_V);
-+ moveV(1, YY);
- break;
-
- case Z1:
-@@ -2073,8 +2491,7 @@ draw_part(FILE *fp, struct frame *minfra
- case Z4:
- ZZ = xspell_conv(xsnum(fp, ch - Z0));
- case Z0:
-- DVI_V += ZZ;
-- PXL_V = pixel_conv(DVI_V);
-+ moveV(1, ZZ);
- break;
-
- case FNT1:
-@@ -2121,6 +2538,11 @@ draw_part(FILE *fp, struct frame *minfra
- dvi_fmt_error("%s:%d: draw_part: shouldn't happen: %s encountered",
- __FILE__, __LINE__, dvi_table2[ch - (FNTNUM0 + 64)]);
- break;
-+#ifdef PTEX
-+ case TDIR:
-+ TATE = xone(fp);
-+ break;
-+#endif /* PTEX */
-
- default:
- dvi_fmt_error("%s:%d: draw_part: unknown op-code %d", __FILE__, __LINE__, ch);
-@@ -2311,7 +2733,7 @@ draw_page(void)
- psp.endpage();
- #endif
- if (currwin.win == mane.win && resource.postscript != 1) {
-- display_bboxes();
-+ display_bboxes();
- }
- if (search_have_match(current_page)) {
- /* highlight search match */
-@@ -2921,7 +3343,15 @@ do_char(wide_ubyte ch,
- last_dvi_h1 = DVI_H;
- last_u_glyph = u_glyph;
- last_pxl_v = pxl_v1;
-+#ifdef PTEX
-+ if (currinf.fontp->flags & FONT_KANJI) {
-+ last_dvi_h2 = DVI_H + currinf.fontp->kglyph[ch]->dvi_adv;
-+ } else {
-+#endif /* PTEX */
- last_dvi_h2 = DVI_H + currinf.fontp->glyph[ch].dvi_adv;
-+#ifdef PTEX
-+ }
-+#endif /* PTEX */
- last_x = x2;
- }
-
-@@ -2935,6 +3365,10 @@ text_do_char(FILE *fp, struct scan_info
- return 0; /* error; we'll catch it later */
- maxchar = currinf.fontp->maxchar;
- currinf.set_char_p = currinf.fontp->set_char_p;
-+#if FREETYPE
-+ if (currinf.set_char_p == set_ft_char)
-+ do_load_freetype_font();
-+#endif
- }
-
- if (currinf.set_char_p == set_empty_char)
-@@ -2962,10 +3396,6 @@ text_do_char(FILE *fp, struct scan_info
- }
- maxchar = currinf.fontp->maxchar;
- currinf.set_char_p = currinf.fontp->set_char_p;
--#if FREETYPE
-- if (currinf.set_char_p == set_ft_char)
-- do_load_freetype_font();
--#endif
- }
-
- if (currinf.set_char_p == set_char) {
-@@ -2993,25 +3423,56 @@ text_do_char(FILE *fp, struct scan_info
- }
- #ifdef TEXXET
- if (geom_scan_frame == NULL) {
-- long dvi_h_sav = DVI_H;
-- if (currinf.dir < 0)
-- DVI_H -= g->dvi_adv;
-+ DEFINE_POSITION_VAL;
-+ PUSH_POSITION;
-+ if (! TATE && currinf.dir < 0)
-+ moveH(1, -g->dvi_adv);
- #endif
- x = G_PXL_H - g->x;
- y = PXL_V - g->y;
- do_char(ch, currinf, info, PXL_V, y, x, x + g->bitmap.w - 1, g);
- #ifdef TEXXET
-- DVI_H = dvi_h_sav;
-+ POP_POSITION;
-+ }
-+#endif
-+ return DIR * g->dvi_adv;
-+ }
-+#ifdef PTEX
-+ else if (currinf.set_char_p == set_char2) {
-+ struct glyph *g;
-+ long x, y;
-+
-+ g = currinf.fontp->kglyph[ch];
-+ if (g == NULL || g->bitmap.bits == NULL) {
-+ (*currinf.fontp->read_char)(currinf.fontp, ch);
-+ g = currinf.fontp->kglyph[ch];
-+ free_bitmap2(g);
-+ g->tdir = currinf.fontp->dir;
-+ }
-+
-+#ifdef TEXXET
-+ if (geom_scan_frame == NULL) {
-+ DEFINE_POSITION_VAL;
-+ PUSH_POSITION;
-+ if (! TATE && currinf.dir < 0)
-+ moveH(1, -g->dvi_adv);
-+#endif
-+ x = G_PXL_H - g->x;
-+ y = PXL_V - g->y;
-+ do_char(ch, currinf, info, PXL_V, y, x, x + g->bitmap.w - 1, g);
-+#ifdef TEXXET
-+ POP_POSITION;
- }
- #endif
- return DIR * g->dvi_adv;
- }
-+#endif /* PTEX */
- else if (currinf.set_char_p == set_vf_char) {
- struct macro *m;
- struct drawinf oldinfo;
- wide_ubyte oldmaxchar;
- #ifdef TEXXET
-- long dvi_h_sav;
-+ DEFINE_POSITION_VAL;
- #endif
-
- if (ch > maxchar)
-@@ -3019,9 +3480,9 @@ text_do_char(FILE *fp, struct scan_info
- if ((m = &currinf.fontp->macro[ch])->pos == NULL)
- return 0; /* catch the error later */
- #ifdef TEXXET
-- dvi_h_sav = DVI_H;
-- if (currinf.dir < 0)
-- DVI_H -= m->dvi_adv;
-+ PUSH_POSITION;
-+ if (! TATE && currinf.dir < 0)
-+ moveH(1, -m->dvi_adv);
- if (geom_scan_frame == NULL) {
- #endif
- oldinfo = currinf;
-@@ -3037,7 +3498,7 @@ text_do_char(FILE *fp, struct scan_info
- currinf = oldinfo;
- maxchar = oldmaxchar;
- #ifdef TEXXET
-- DVI_H = dvi_h_sav;
-+ POP_POSITION;
- }
- #endif
- return DIR * m->dvi_adv;
-@@ -3049,6 +3510,11 @@ text_do_char(FILE *fp, struct scan_info
- return 0;
- }
-
-+#define xmoveH(dir,dx) \
-+ do { moveH(dir,dx); PXL_V = xpixel_conv(DVI_V); } while(0)
-+#define xmoveV(dir,dy) \
-+ do { moveV(dir,dy); PXL_V = xpixel_conv(DVI_V); } while(0)
-+
- /*
- * Handle a character in geometric scanning routine.
- */
-@@ -3064,6 +3530,10 @@ geom_do_char(FILE *fp, struct scan_info
- return 0; /* error; we'll catch it later */
- maxchar = currinf.fontp->maxchar;
- currinf.set_char_p = currinf.fontp->set_char_p;
-+#if FREETYPE
-+ if (currinf.set_char_p == set_ft_char)
-+ do_load_freetype_font();
-+#endif
- }
-
- if (currinf.set_char_p == set_empty_char)
-@@ -3091,10 +3561,6 @@ geom_do_char(FILE *fp, struct scan_info
- }
- maxchar = currinf.fontp->maxchar;
- currinf.set_char_p = currinf.fontp->set_char_p;
--#if FREETYPE
-- if (currinf.set_char_p == set_ft_char)
-- do_load_freetype_font();
--#endif
- }
-
- if (currinf.set_char_p == set_char) {
-@@ -3122,27 +3588,58 @@ geom_do_char(FILE *fp, struct scan_info
- }
- #ifdef TEXXET
- if (geom_scan_frame == NULL) {
-- long dvi_h_sav = DVI_H;
-- if (currinf.dir < 0)
-- DVI_H -= g->dvi_adv;
-+ DEFINE_POSITION_VAL;
-+ PUSH_POSITION;
-+ if (! TATE && currinf.dir < 0)
-+ moveH(1, -g->dvi_adv);
- #endif
- x = G_PXL_H - g->x;
- y = PXL_V - g->y;
- g_info->geom_box(info, x, y,
- x + g->bitmap.w - 1, y + g->bitmap.h - 1);
-+#ifdef TEXXET
-+ POP_POSITION;
-+ }
-+#endif
-+ return DIR * g->dvi_adv;
-+ }
-+#ifdef PTEX
-+ else if (currinf.set_char_p == set_char2) {
-+ struct glyph *g;
-+ long x, y;
-+
-+ g = currinf.fontp->kglyph[ch];
-+ if (g == NULL || g->bitmap.bits == NULL) {
-+ (*currinf.fontp->read_char)(currinf.fontp, ch);
-+ g = currinf.fontp->kglyph[ch];
-+ free_bitmap2(g);
-+ g->tdir = currinf.fontp->dir;
-+ }
-
- #ifdef TEXXET
-- DVI_H = dvi_h_sav;
-+ if (geom_scan_frame == NULL) {
-+ DEFINE_POSITION_VAL;
-+ PUSH_POSITION;
-+ if (! TATE && currinf.dir < 0)
-+ moveH(1, -g->dvi_adv);
-+#endif
-+ x = G_PXL_H - g->x;
-+ y = PXL_V - g->y;
-+ g_info->geom_box(info, x, y,
-+ x + g->bitmap.w - 1, y + g->bitmap.h - 1);
-+#ifdef TEXXET
-+ POP_POSITION;
- }
- #endif
- return DIR * g->dvi_adv;
- }
-+#endif /* PTEX */
- else if (currinf.set_char_p == set_vf_char) {
- struct macro *m;
- struct drawinf oldinfo;
- wide_ubyte oldmaxchar;
- #ifdef TEXXET
-- long dvi_h_sav;
-+ DEFINE_POSITION_VAL;
- #endif
-
- if (ch > maxchar)
-@@ -3150,9 +3647,9 @@ geom_do_char(FILE *fp, struct scan_info
- if ((m = &currinf.fontp->macro[ch])->pos == NULL)
- return 0; /* catch the error later */
- #ifdef TEXXET
-- dvi_h_sav = DVI_H;
-- if (currinf.dir < 0)
-- DVI_H -= m->dvi_adv;
-+ PUSH_POSITION;
-+ if (! TATE && currinf.dir < 0)
-+ moveH(1, -m->dvi_adv);
- if (geom_scan_frame == NULL) {
- #endif
- oldinfo = currinf;
-@@ -3168,7 +3665,7 @@ geom_do_char(FILE *fp, struct scan_info
- currinf = oldinfo;
- maxchar = oldmaxchar;
- #ifdef TEXXET
-- DVI_H = dvi_h_sav;
-+ POP_POSITION;
- }
- #endif
- return DIR * m->dvi_adv;
-@@ -3188,21 +3685,35 @@ static void
- geom_do_rule(struct scan_info *info, long h, long w)
- {
- long x, y;
-+ struct geom_info *g_info = info->data;
- #ifdef TEXXET
-- long dvi_h_save = DVI_H;
-+ DEFINE_POSITION_VAL;
-+ PUSH_POSITION;
- #endif
-- struct geom_info *g_info = info->data;
--
-+
-+ if (bbox_rotated) {
-+ fprintf(stderr, "geom_do_rotated_rule(h, w) is not implemented!\n");
-+ return;
-+ }
-+ h = h * bbox_matrix[1][1];
-+ w = w * bbox_matrix[0][0];
-+
- #ifdef TEXXET
-- if (currinf.dir < 0)
-- DVI_H -= w - 1;
-+ if (! TATE && currinf.dir < 0)
-+ moveH(1, - w + 1);
- #endif
- x = G_PXL_H;
- y = PXL_V;
-+#ifdef PTEX
-+ if (TATE)
-+ g_info->geom_box(info, x, y, x + xpixel_round(h) - 1,
-+ y + xpixel_round(w) - 1);
-+ else
-+#endif /* PTEX */
- g_info->geom_box(info, x, y - xpixel_round(h) + 1,
- x + xpixel_round(w) - 1, y);
- #ifdef TEXXET
-- DVI_H = dvi_h_save;
-+ POP_POSITION;
- #endif
- }
-
-@@ -3232,7 +3743,7 @@ geom_scan_part(long(*char_proc)(FILE *,
- for (;;) {
- ch = xone(fp);
- if (ch <= (ubyte)(SETCHAR0 + 127))
-- DVI_H += char_proc(fp, info, ch);
-+ xmoveH(1, char_proc(fp, info, ch));
- else if (FNTNUM0 <= ch && ch <= (ubyte) (FNTNUM0 + 63)) {
- change_font((unsigned long)(ch - FNTNUM0));
- }
-@@ -3244,7 +3755,7 @@ geom_scan_part(long(*char_proc)(FILE *,
- case PUT1:
- a = char_proc(fp, info, xone(fp));
- if (ch != PUT1)
-- DVI_H += a;
-+ xmoveH(1, a);
- break;
-
- case SET2:
-@@ -3258,7 +3769,39 @@ geom_scan_part(long(*char_proc)(FILE *,
- #else
- a = char_proc(fp, info, xnum(fp, 2));
- if (ch != PUT2)
-- DVI_H += a;
-+ xmoveH(1, a);
-+#endif
-+ }
-+ break;
-+
-+ case SET3:
-+ case PUT3:
-+ if (!resource.omega)
-+ dvi_fmt_error("%s:%d: draw_part: op-code %d only works with the \"-omega\" option",
-+ __FILE__, __LINE__, ch);
-+ else {
-+#ifdef TEXXET
-+ char_proc(fp, info, xnum(fp, 3));
-+#else
-+ a = char_proc(fp, info, xnum(fp, 3));
-+ if (ch != PUT3)
-+ xmoveH(1, a);
-+#endif
-+ }
-+ break;
-+
-+ case SET4:
-+ case PUT4:
-+ if (!resource.omega)
-+ dvi_fmt_error("%s:%d: draw_part: op-code %d only works with the \"-omega\" option",
-+ __FILE__, __LINE__, ch);
-+ else {
-+#ifdef TEXXET
-+ char_proc(fp, info, xnum(fp, 4));
-+#else
-+ a = char_proc(fp, info, xnum(fp, 4));
-+ if (ch != PUT4)
-+ xmoveH(1, a);
- #endif
- }
- break;
-@@ -3278,7 +3821,7 @@ geom_scan_part(long(*char_proc)(FILE *,
- if (info->geom_special != NULL)
- geom_do_rule(info, xspell_conv(a), b);
- }
-- DVI_H += DIR * b;
-+ moveH(DIR, b);
- break;
-
- case PUTRULE:
-@@ -3399,7 +3942,7 @@ geom_scan_part(long(*char_proc)(FILE *,
- case RIGHT2:
- case RIGHT3:
- case RIGHT4:
-- DVI_H += DIR * xspell_conv(xsnum(fp, ch - RIGHT1 + 1));
-+ xmoveH(DIR, xspell_conv(xsnum(fp, ch - RIGHT1 + 1)));
- break;
-
- case W1:
-@@ -3408,7 +3951,7 @@ geom_scan_part(long(*char_proc)(FILE *,
- case W4:
- WW = xspell_conv(xsnum(fp, ch - W0));
- case W0:
-- DVI_H += DIR * WW;
-+ xmoveH(DIR, WW);
- break;
-
- case X1:
-@@ -3417,15 +3960,14 @@ geom_scan_part(long(*char_proc)(FILE *,
- case X4:
- XX = xspell_conv(xsnum(fp, ch - X0));
- case X0:
-- DVI_H += DIR * XX;
-+ xmoveH(DIR, XX);
- break;
-
- case DOWN1:
- case DOWN2:
- case DOWN3:
- case DOWN4:
-- DVI_V += xspell_conv(xsnum(fp, ch - DOWN1 + 1));
-- PXL_V = xpixel_conv(DVI_V);
-+ xmoveV(1, xspell_conv(xsnum(fp, ch - DOWN1 + 1)));
- break;
-
- case Y1:
-@@ -3434,8 +3976,7 @@ geom_scan_part(long(*char_proc)(FILE *,
- case Y4:
- YY = xspell_conv(xsnum(fp, ch - Y0));
- case Y0:
-- DVI_V += YY;
-- PXL_V = xpixel_conv(DVI_V);
-+ xmoveV(1, YY);
- break;
-
- case Z1:
-@@ -3444,8 +3985,7 @@ geom_scan_part(long(*char_proc)(FILE *,
- case Z4:
- ZZ = xspell_conv(xsnum(fp, ch - Z0));
- case Z0:
-- DVI_V += ZZ;
-- PXL_V = xpixel_conv(DVI_V);
-+ xmoveV(1, ZZ);
- break;
-
- case FNT1:
-@@ -3482,6 +4022,12 @@ geom_scan_part(long(*char_proc)(FILE *,
- xskip(fp, a + (long)xone(fp));
- break;
-
-+#ifdef PTEX
-+ case TDIR:
-+ TATE = xone(fp);
-+ break;
-+#endif /* PTEX */
-+
- #ifndef TEXXET
- case SREFL:
- case EREFL: