diff options
Diffstat (limited to 'print/tex-xdvik/files/patch-texk-xdvik-special.c')
-rw-r--r-- | print/tex-xdvik/files/patch-texk-xdvik-special.c | 435 |
1 files changed, 0 insertions, 435 deletions
diff --git a/print/tex-xdvik/files/patch-texk-xdvik-special.c b/print/tex-xdvik/files/patch-texk-xdvik-special.c deleted file mode 100644 index cec0396066a5..000000000000 --- a/print/tex-xdvik/files/patch-texk-xdvik-special.c +++ /dev/null @@ -1,435 +0,0 @@ ---- 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; |