/* $Header$ This is dvipdfm, a DVI to PDF translator. Copyright (C) 1998, 1999 by Mark A. Wicks This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA The author may be contacted via the e-mail address mwicks@kettering.edu */ #include #include #include "system.h" #include "mem.h" #include "mfileio.h" #include "tpic.h" #include "pdfparse.h" #include "pdfdoc.h" #include "pdfdev.h" #include "dvi.h" /* Following "constant" converts milli-inches to device (in this case PDF stream) coordinates */ #define MI2DEV (0.072/pdf_dev_scale()) double pen_size = 1.0; int fill_shape = 0; double fill_color = 0.0; double default_fill_color = 0.5; static struct path { double x, y; } *path = NULL; unsigned long path_length = 0, max_path_length = 0; static void tpic_clear_state (void) { if ((path)) RELEASE(path); path = NULL; path_length = 0; max_path_length = 0; fill_shape = 0; fill_color = 0.0; return; } static void set_pen_size (char **buffer, char *end) { char *number; skip_white (buffer, end); if ((number = parse_number(buffer, end))) { pen_size = atof (number) * MI2DEV; RELEASE (number); } else { dump (*buffer, end); fprintf (stderr, "tpic special: pn: Invalid pen size\n"); } } static void set_fill_color (char **buffer, char *end) { char *number; MEM_START fill_shape = 1; fill_color = default_fill_color; skip_white (buffer, end); if ((number = parse_number(buffer, end))) { fill_color = 1.0 - atof (number); if (fill_color > 1.0) fill_color = 1.0; if (fill_color < 0.0) fill_color = 0.0; RELEASE (number); } MEM_END } static void add_point (char **buffer, char *end) { char *x= NULL, *y= NULL; MEM_START skip_white (buffer, end); if (*buffer < end) x = parse_number (buffer, end); skip_white (buffer, end); if (*buffer < end) y = parse_number (buffer, end); if ((x) && (y)) { if (path_length >= max_path_length) { max_path_length += 256; path = RENEW (path, max_path_length, struct path); } path[path_length].x = atof(x)*MI2DEV; path[path_length].y = atof(y)*MI2DEV; path_length += 1; } else { dump (*buffer, end); fprintf (stderr, "tpic special: pa: Missing coordinate\n"); } if (x) RELEASE(x); if (y) RELEASE(y); MEM_END return; } static void show_path (int hidden) { int len; /* The semantics of a fill_color of 0.0 or 0.5 will be to use current painting color known to dvipdfm */ if (fill_shape && fill_color != 0.0) { sprintf (work_buffer, " %.2f g", fill_color); len = strlen (work_buffer); pdf_doc_add_to_page (work_buffer, len); } if (!hidden && fill_shape) { pdf_doc_add_to_page (" b", 2); } if (hidden && fill_shape) { pdf_doc_add_to_page (" f", 2); } if (!hidden && !fill_shape) pdf_doc_add_to_page (" S", 2); if (fill_shape) fill_shape = 0; fill_color = 0.0; fill_shape = 0.0; } static void flush_path (double x_user, double y_user, int hidden, double dash_dot) { int len; MEM_START /* Make pen_size == 0 equivalent to hidden */ if (pen_size == 0) hidden = 1; if (path_length > 1) { int i; sprintf (work_buffer, " q"); len = strlen (work_buffer); pdf_doc_add_to_page (work_buffer, len); if (pen_size != 0.0) { sprintf (work_buffer, " %.2f w", pen_size); len = strlen (work_buffer); } pdf_doc_add_to_page (work_buffer, len); sprintf (work_buffer, " 1 J 1 j"); len = strlen (work_buffer); pdf_doc_add_to_page (work_buffer, len); if (dash_dot != 0.0) { if (dash_dot > 0.0) { sprintf (work_buffer, " [%.1f %.1f] 0 d", dash_dot*72.0, dash_dot*36.0); len = strlen (work_buffer); } else { sprintf (work_buffer, " [%.1f %.1f] 0 d", pen_size, -dash_dot*72.0); len = strlen (work_buffer); } pdf_doc_add_to_page (work_buffer, len); } sprintf (work_buffer, " %.2f %.2f m", x_user+path[0].x, y_user-path[0].y); len = strlen (work_buffer); pdf_doc_add_to_page (work_buffer, len); for (i=0; i 2) { int i; sprintf (work_buffer, " q 1.4 M %.2f w", pen_size); len = strlen (work_buffer); pdf_doc_add_to_page (work_buffer, len); if (dash_dot != 0.0) { if (dash_dot > 0.0) { sprintf (work_buffer, " [%.1f %.1f] 0 d", dash_dot*72.0, dash_dot*36.0); len = strlen (work_buffer); } else if (dash_dot < 0.0) { sprintf (work_buffer, " [%.1f %.1f] 0 d 1 J", pen_size, -dash_dot*72.0); len = strlen (work_buffer); } pdf_doc_add_to_page (work_buffer, len); } sprintf (work_buffer, " %.2f %.2f m", x_user+path[0].x, y_user-path[0].y); len = strlen (work_buffer); pdf_doc_add_to_page (work_buffer, len); sprintf (work_buffer, " %.2f %.2f l", x_user+0.5*(path[0].x+path[1].x), y_user-0.5*(path[0].y+path[1].y)); len = strlen (work_buffer); pdf_doc_add_to_page (work_buffer, len); for (i=1; i