ports/print/tex-xdvik/files/patch-texk-xdvik-special.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

435 lines
12 KiB
C

--- texk/xdvik/special.c.orig 2008-02-16 21:43:15 UTC
+++ texk/xdvik/special.c
@@ -691,6 +691,12 @@ static size_t g_bbox_info_max_size = 0;
contains these coordinates.
*/
+double bbox_matrix[2][2] = {{1.0, 0.0}, {0.0, 1.0}};
+Boolean bbox_scaled = False, bbox_rotated = False;
+
+#define bbox_xscale bbox_matrix[0][0]
+#define bbox_yscale bbox_matrix[1][1]
+
static void
append_bbox_info(int x, int y, int w, int h, int angle)
{
@@ -735,25 +741,25 @@ draw_bbox0(int xcorner, int ycorner)
do_color_change();
#endif
- if (bbox_angle == 0) {
- ycorner -= bbox_voffset;
- XDrawRectangle(DISP, currwin.win, globals.gc.high, xcorner, ycorner, bbox_width, bbox_height);
+ if (! bbox_rotated) {
+ ycorner -= bbox_voffset * bbox_yscale;
+ XDrawRectangle(DISP, currwin.win, globals.gc.high, xcorner, ycorner,
+ bbox_width * bbox_xscale, bbox_height * bbox_yscale);
if (resource.postscript == 0) {
if (htex_inside_href) {
- htex_set_anchorsize(xcorner, ycorner, xcorner + bbox_width, ycorner + bbox_height);
+ htex_set_anchorsize(xcorner, ycorner, xcorner + bbox_width * bbox_xscale,
+ ycorner + bbox_height * bbox_yscale);
htex_set_objecttype(HTEX_IMG);
}
}
}
else {
- float sin_a = sin(bbox_angle * (TWOPI / 360));
- float cos_a = cos(bbox_angle * (TWOPI / 360));
float a, b, c, d;
- a = cos_a * bbox_width;
- b = -sin_a * bbox_width;
- c = -sin_a * bbox_height;
- d = -cos_a * bbox_height;
+ a = bbox_matrix[0][0] * bbox_width;
+ b = bbox_matrix[1][0] * bbox_width;
+ c = -bbox_matrix[0][1] * bbox_height;
+ d = -bbox_matrix[1][1] * bbox_height;
XDrawLine(DISP, currwin.win, globals.gc.high,
xcorner, ycorner,
@@ -782,27 +788,27 @@ display_bboxes(void)
size_t i;
for (i = 0; i < g_bbox_info_size; i++) {
- if (globals.debug & DBG_PS) {
- fprintf(stderr, "drawing bbox %lu at %d %d, %d x %d, angle %d\n",
- (unsigned long)i,
- g_bbox_info[i].x,
- g_bbox_info[i].y,
- g_bbox_info[i].w,
- g_bbox_info[i].h,
- g_bbox_info[i].angle);
- }
+ if (globals.debug & DBG_PS) {
+ fprintf(stderr, "drawing bbox %lu at %d %d, %d x %d, angle %d\n",
+ (unsigned long)i,
+ g_bbox_info[i].x,
+ g_bbox_info[i].y,
+ g_bbox_info[i].w,
+ g_bbox_info[i].h,
+ g_bbox_info[i].angle);
+ }
#if 0
- XDrawRectangle(DISP, currwin.win, globals.gc.high,
- g_bbox_info[i].x,
- g_bbox_info[i].y,
- g_bbox_info[i].w,
- g_bbox_info[i].h);
+ XDrawRectangle(DISP, currwin.win, globals.gc.high,
+ g_bbox_info[i].x,
+ g_bbox_info[i].y,
+ g_bbox_info[i].w,
+ g_bbox_info[i].h);
#else
- bbox_valid = True;
- bbox_width = g_bbox_info[i].w;
- bbox_height = bbox_voffset = g_bbox_info[i].h;
- bbox_angle = g_bbox_info[i].angle;
- draw_bbox0(g_bbox_info[i].x, g_bbox_info[i].y + bbox_height);
+ bbox_valid = True;
+ bbox_width = g_bbox_info[i].w;
+ bbox_height = bbox_voffset = g_bbox_info[i].h;
+ bbox_angle = g_bbox_info[i].angle;
+ draw_bbox0(g_bbox_info[i].x, g_bbox_info[i].y + bbox_height);
#endif
}
bbox_angle = 0;
@@ -829,6 +835,9 @@ save_bbox(void)
ycorner -= bbox_voffset;
append_bbox_info(xcorner, ycorner, bbox_width, bbox_height, bbox_angle);
+ if (currwin.win == mane.win && resource.postscript != 1) {
+ draw_bbox();
+ }
/* register boundaries of this box as anchor boundaries */
if (htex_inside_href) {
@@ -907,6 +916,11 @@ ps_startup2(void)
}
+typedef struct {
+ double matrix[2][2];
+ double x, y;
+} ROTATE_STACK;
+
/*
* dumb parsing of PostScript - search for rotation H. Zeller 1/97
* Returns true if we find a potentially non-supported command that
@@ -916,6 +930,52 @@ static Boolean
ps_parseraw(const char *PostScript_cmd)
{
const char *p;
+ double xscale, yscale, angle, sin_a, cos_a, a, b, c, d;
+ int n;
+ static int rotate_stack_len = 0;
+ static int rotate_stack_ptr = 0;
+ static ROTATE_STACK *rotate_stack = NULL;
+
+ p = strstr(PostScript_cmd, "currentpoint grestore moveto");
+ if (p != NULL) {
+ if (rotate_stack_ptr > 0) {
+ double r;
+ rotate_stack_ptr--;
+ r = sqrt(((DVI_H - rotate_stack[rotate_stack_ptr].x)
+ * (DVI_H - rotate_stack[rotate_stack_ptr].x)
+ + (DVI_V - rotate_stack[rotate_stack_ptr].y)
+ * (DVI_V - rotate_stack[rotate_stack_ptr].y))
+ / (bbox_matrix[0][0] * bbox_matrix[0][0]
+ + bbox_matrix[1][0] * bbox_matrix[1][0]))
+ * (rotate_stack[rotate_stack_ptr].matrix[0][0]
+ * bbox_matrix[1][0]
+ - rotate_stack[rotate_stack_ptr].matrix[1][0]
+ * bbox_matrix[0][0])
+ / (rotate_stack[rotate_stack_ptr].matrix[0][0]
+ * rotate_stack[rotate_stack_ptr].matrix[0][0]
+ + rotate_stack[rotate_stack_ptr].matrix[1][0]
+ * rotate_stack[rotate_stack_ptr].matrix[1][0]);
+ DVI_H += r * rotate_stack[rotate_stack_ptr].matrix[1][0];
+ DVI_V += r * rotate_stack[rotate_stack_ptr].matrix[0][0];
+ PXL_V = pixel_conv(DVI_V);
+ bcopy(rotate_stack[rotate_stack_ptr].matrix, bbox_matrix,
+ sizeof(bbox_matrix));
+ bbox_rotated
+ = (bbox_matrix[0][1] != 0.0 || bbox_matrix[1][0] != 0.0)
+ ? True : False;
+ bbox_scaled
+ = (bbox_rotated
+ || bbox_matrix[0][0] != 1.0 || bbox_matrix[1][1] != 1.0)
+ ? True : False;
+ }
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "current angle %f: %s\n",
+ bbox_matrix[0][0] != 0
+ ? -atan(bbox_matrix[1][0] / bbox_matrix[0][0])
+ * (360 / TWOPI)
+ : bbox_matrix[1][0] >= 0 ? (double)90 : (double)-90,
+ PostScript_cmd);
+ }
bbox_angle = 0;
p = strstr(PostScript_cmd, "rotate");
@@ -924,9 +984,137 @@ ps_parseraw(const char *PostScript_cmd)
--p;
while (*p != '\0' && isdigit((int)*p))
--p;
+ if (*p == '.') --p;
+ while (*p != '\0' && isdigit(*p)) --p;
if (*p != '+' && *p != '-')
++p;
- sscanf(p, "%d neg rotate", &bbox_angle);
+ n = sscanf(p, "%lf neg rotate", &angle);
+ if (n != 1) {
+ fprintf(stderr, "%s: cannot get angle.\n", globals.program_name);
+ angle = 0.0;
+ }
+ bbox_angle = angle;
+ if (rotate_stack_ptr >= rotate_stack_len) {
+ rotate_stack_len += 0x10;
+ rotate_stack = (ROTATE_STACK *)
+ xrealloc(rotate_stack,
+ sizeof(ROTATE_STACK) * rotate_stack_len);
+ }
+ bcopy(bbox_matrix, rotate_stack[rotate_stack_ptr].matrix,
+ sizeof(bbox_matrix));
+ rotate_stack[rotate_stack_ptr].x = DVI_H;
+ rotate_stack[rotate_stack_ptr].y = DVI_V;
+ rotate_stack_ptr++;
+
+ sin_a = sin(-angle * (TWOPI / 360));
+ cos_a = cos(-angle * (TWOPI / 360));
+ a = bbox_matrix[0][0] * cos_a + bbox_matrix[0][1] * sin_a;
+ b = - bbox_matrix[0][0] * sin_a + bbox_matrix[0][1] * cos_a;
+ c = bbox_matrix[1][0] * cos_a + bbox_matrix[1][1] * sin_a;
+ d = - bbox_matrix[1][0] * sin_a + bbox_matrix[1][1] * cos_a;
+ bbox_matrix[0][0] = a;
+ bbox_matrix[0][1] = b;
+ bbox_matrix[1][0] = c;
+ bbox_matrix[1][1] = d;
+ bbox_rotated = (b != 0.0 || c != 0.0) ? True : False;
+ bbox_scaled
+ = (bbox_rotated
+ || bbox_matrix[0][0] != 1.0 || bbox_matrix[1][1] != 1.0)
+ ? True : False;
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "current angle %f: %s\n",
+ bbox_matrix[0][0] != 0
+ ? -atan(bbox_matrix[1][0] / bbox_matrix[0][0])
+ * (360 / TWOPI)
+ : bbox_matrix[1][0] >= 0 ? (double)90 : (double)-90,
+ PostScript_cmd);
+ }
+
+ p = strstr(PostScript_cmd, "scale");
+ if (p != NULL) {
+ if (strncmp(p - 4, "div", 3) == 0) {
+ while (*p != '\0' && !isdigit(*p)) --p;
+ while (*p != '\0' && isdigit(*p)) --p;
+ if (*p == '.') --p;
+ while (*p != '\0' && isdigit(*p)) --p;
+ while (*p != '\0' && !isdigit(*p)) --p;
+ while (*p != '\0' && isdigit(*p)) --p;
+ while (*p != '\0' && !isdigit(*p)) --p;
+ while (*p != '\0' && isdigit(*p)) --p;
+ if (*p == '.') --p;
+ while (*p != '\0' && isdigit(*p)) --p;
+ while (*p != '\0' && !isdigit(*p)) --p;
+ while (*p != '\0' && isdigit(*p)) --p;
+ ++p;
+ n = sscanf(p, "1 %lf div 1 %lf div scale", &xscale, &yscale);
+ if (n == 2) {
+#ifdef PTEX
+ if(TATE) {
+ double temp;
+ temp = xscale;
+ xscale = 1.0/yscale;
+ yscale = 1.0/temp;
+ }
+ else {
+ xscale = 1.0/xscale;
+ yscale = 1.0/yscale;
+ }
+#else
+ xscale = 1.0/xscale;
+ yscale = 1.0/yscale;
+#endif
+ } else {
+ fprintf(stderr,
+ "%s: cannot get scaling factors.\n",
+ globals.program_name);
+ xscale = yscale = 1.0;
+ }
+ } else {
+ while (*p != '\0' && !isdigit(*p)) --p;
+ while (*p != '\0' && isdigit(*p)) --p;
+ if (*p == '.') --p;
+ while (*p != '\0' && isdigit(*p)) --p;
+ while (*p != '\0' && !isdigit(*p)) --p;
+ while (*p != '\0' && isdigit(*p)) --p;
+ if (*p == '.') --p;
+ while (*p != '\0' && isdigit(*p)) --p;
+ if (*p != '+' && *p != '-') ++p;
+ n = sscanf(p, "%lf %lf scale", &xscale, &yscale);
+#ifdef PTEX
+ if(TATE) {
+ double temp;
+ temp = xscale;
+ xscale = yscale;
+ yscale = temp;
+ }
+#endif
+ if (n != 2) {
+ fprintf(stderr,
+ "%s: cannot get scaling factors.\n",
+ globals.program_name);
+ xscale = yscale = 1.0;
+ }
+ }
+ bbox_matrix[0][0] *= xscale;
+ bbox_matrix[0][1] *= yscale;
+ bbox_matrix[1][0] *= xscale;
+ bbox_matrix[1][1] *= yscale;
+ bbox_scaled
+ = (bbox_rotated
+ || bbox_matrix[0][0] != 1.0 || bbox_matrix[1][1] != 1.0)
+ ? True : False;
+ if (globals.debug & DBG_PS)
+ fprintf(stderr, "current scale %f,%f: %s\n",
+ bbox_xscale, bbox_yscale, PostScript_cmd);
+ angle = 0.0;
+ if (strstr(PostScript_cmd, "neg rotate")) {
+ n = sscanf(p, "%lf neg rotate", &angle);
+ if (n != 1) {
+ fprintf(stderr, "%s: cannot get angle. (%s)\n", globals.program_name,p);
+ angle = 0.0;
+ }
+ }
+ bbox_angle = angle;
return True;
}
if (strstr(PostScript_cmd, " scale ") != NULL)
@@ -1477,10 +1665,10 @@ psfig_special(char *cp)
#endif
/* also raw PostScript, but no extra colon to skip */
#if PS
- if (INSIDE_MANE_WIN) {
- if (ps_parseraw(cp))
+ if (ps_parseraw(cp) && INSIDE_MANE_WIN)
have_raw_postscript = True;
+ if (INSIDE_MANE_WIN) {
if (psfig_begun)
psp.drawraw(cp);
else {
@@ -2325,6 +2513,100 @@ scan_papersize(const char *cp0)
}
/*
+** Modified 22/3/95.
+*/
+
+typedef struct psh_node {
+ char *this_file;
+ struct psh_node *next;
+} t_pshnode;
+
+static t_pshnode *psh_head = (t_pshnode *) NULL, *psh_tail = (t_pshnode *) NULL;
+
+/*
+** Include one header file.
+*/
+
+static void psh_includehfile(cp, beginning)
+char *cp;
+int beginning;
+
+{
+ static char rawstring[] = " stop\n%%xdvimark\nH userdict begin\0";
+
+ if (!beginning)
+ psp.drawbegin(PXL_H - currwin.base_x, PXL_V - currwin.base_y, "");
+ psp.drawraw(rawstring);
+ send_ps_file(cp, kpse_pict_format);
+ psp.drawend(" end\n");
+}
+
+/*
+** Include all header files.
+*/
+
+void psh_includeall()
+
+{
+ t_pshnode *this_node;
+
+ this_node = psh_head;
+ while (this_node != (t_pshnode *) NULL) {
+ psh_includehfile(this_node->this_file, 1);
+ this_node = this_node->next;
+ }
+}
+
+/*
+** Deal with the "header=<file>" special.
+*/
+
+static void psh_header(cp)
+char *cp;
+
+{
+ t_pshnode *this_node;
+ char *psheader;
+
+ /*
+ ** Find the file.
+ */
+
+ psheader = kpse_find_file ( cp+7, kpse_tex_ps_header_format, true );
+
+ if (psheader) {
+
+ /*
+ ** Include the file directly in /userdict.
+ */
+
+ /* psh_includehfile(psheader, 0); */
+ /* deleted by Kazuaki NAKAYAMA (nakayama@ripms.shinshu-u.ac.jp) */
+
+ /*
+ ** Add a new node to the list of header files.
+ */
+
+ this_node = (t_pshnode *) xmalloc(sizeof(t_pshnode));
+ this_node->this_file = strcpy(xmalloc((strlen(psheader) + 1) * sizeof(char)), psheader);
+ this_node->next = (t_pshnode *) NULL;
+ if (psh_head == (t_pshnode *) NULL)
+ psh_head = psh_tail = this_node;
+ else {
+ psh_tail->next = this_node;
+ psh_tail = this_node;
+ }
+
+ } else
+ XDVI_WARNING((stderr, "Included PostScript header file %s not found", cp + 7));
+}
+
+/*
+** End Modifications
+*/
+
+
+/*
* The following copyright message applies to the rest of this file. --PV
*/
@@ -2555,6 +2837,8 @@ applicationDoSpecial(char *cp, size_t le
case CMD('b', 'k'):
blacken_last();
return;
+ case CMD('h', 'e'):
+ psh_header(cp); return;
case CMD('i', 'p'): /* throw away the path -- jansteen */
path_len = 0;
return;