ports/print/tex-xdvik/files/patch-texk-xdvik-dvi-draw.c
Hiroki Sato 90410e570d Update TeXLive to TL2015.
- print/texlive-infra was renamed with print/texlive-tlmgr.
  Note that currently tlmgr(1) does not work because of
  lack of TLPDB.  This will be fixed.

- Lua libraries used in LuaTeX are separated into
  devel/tex-libtexlua and devel/texlibtexluajit.
  USE_TEX supports them via keywords "texlua" and "texluajit".

- libsynctex is currently installed by devel/tex-web2c.
  This will be separated into a single port.

- Add graphics/libpotrace and use installed libpotrace
  and libharfbuzz.
2015-07-19 20:33:34 +00:00

1134 lines
28 KiB
C

--- 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: