2 * Export from Aven as HPGL.
4 /* Copyright (C) 1993-2024 Olly Betts
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
26 #include "export.h" // For SURF, etc
30 /*# define HPGL_USE_SR */ /* for text sized relative to page size */
32 # define HPGL_EOL "\003" /* terminates labelling commands: LB<string>\003 */
35 # define HPGL_SO "\016" /* shift in & shift out of extended character set */
36 # define HPGL_SI "\017"
39 # define HPGL_CROSS_SIZE 28 /* length of cross arms (in HPGL units) */
41 static bool fNewLines
= true;
43 /* Check if this line intersects the current page */
44 /* Initialise HPGL routines. */
45 void HPGL::header(const char *, const char *, time_t,
46 double, double, double, double, double, double)
50 /* INitialise; Select Pen 1; */
53 "CA-1;GM0,800;" /* Char set Alternate -1; Get Memory; */
56 // SR scales characters relative to P1 and P2.
57 // (0.5,1.0) is 2/3 of the default size.
60 // SI scales characters to size given (in cm).
64 if (fNewLines
) PUTC('\n', fh
);
67 /* define degree and copyright symbols */
68 fputs("DL32,10,30,12,30,13,29,13,27,12,26,10,26,9,27,9,29,"
69 "10,30;DL40,0,0;", fh
); /* Hope this works! Seems to for BP */
70 if (fNewLines
) PUTC('\n', fh
);
72 fputs("DL67,16,14,16,18,17,22,19,25,22,28,26,30,31,31,37,32,"
73 "43,32,49,31,53,30,58,28,61,25,63,22,64,18,64,14,63,10,"
74 "61,7,58,4,53,2,49,1,43,0,37,0,31,1,26,2,22,4,19,7,17,10,"
76 if (fNewLines
) PUTC('\n', fh
);
78 fputs("DL41,4,20,3,19,0,23,-4,24,-9,24,-14,23,-17,22,-20,19,"
79 "-21,16,-20,13,-17,10,-14,9,-9,8,-4,8,0,9,3,11,4,12;", fh
);
80 if (fNewLines
) PUTC('\n', fh
);
83 // FIXME: This was needed when printhpgl supported splitting a plot over
84 // multiple pages, but is it useful now we leave that to the OS printer
86 int PaperWidth
, PaperDepth
; // In mm
87 xpPageWidth
= (long)(HPGL_UNITS_PER_MM
* (double)PaperWidth
);
88 ypPageDepth
= (long)(HPGL_UNITS_PER_MM
* (double)PaperDepth
);
90 /* and set clipping (Input Window!) on plotter (left,bottom,right,top) */
91 fprintf(fh
, "IW%ld,%ld,%ld,%ld;", clip
.x_min
, clip
.y_min
,
92 clip
.x_min
+ xpPageWidth
, clip
.y_min
+ ypPageDepth
);
97 HPGL::line(const img_point
*p1
, const img_point
*p
, unsigned flags
, bool fPending
)
99 // Pens 1 to 6 are apparently supported by HPGL.
100 enum { PEN_LEG
= 1, PEN_SPLAY
= 2, PEN_SURF
= 3 };
101 int new_pen
= PEN_LEG
;
104 } else if (flags
& SPLAYS
) {
107 if (new_pen
!= pen
) {
108 fprintf(fh
, "SP%d;", new_pen
);
112 fprintf(fh
, "PU%ld,%ld;", long(p1
->x
* factor
), long(p1
->y
* factor
));
114 fprintf(fh
, "PD%ld,%ld;", long(p
->x
* factor
), long(p
->y
* factor
));
117 #define CS HPGL_CROSS_SIZE
118 #define CS2 (2 * HPGL_CROSS_SIZE)
120 HPGL::cross(const img_point
*p
, const wxString
&, int)
126 fprintf(fh
, "PU%ld,%ld;", long(p
->x
* factor
), long(p
->y
* factor
));
127 /* SM plots a symbol at each point, but it isn't very convenient here */
128 /* We can write PDPR%d,%dPR%d,%d... but the HP7475A manual doesn't say */
129 /* clearly if this will work on older plotters (such as the HP9872) */
130 fprintf(fh
, "PD;PR%d,%d;PR%d,%d;PU%d,0;PD%d,%d;PU%d,%d;PA;",
131 CS
, CS
, -CS2
, -CS2
, CS2
, /*0,*/ -CS2
, CS2
, CS
, -CS
);
132 if (fNewLines
) PUTC('\n', fh
);
138 HPGL::label(const img_point
*p
, const wxString
& str
, int /*sflags*/, int)
144 const char* s
= str
.utf8_str();
145 /* LB is a text label, terminated with a ^C */
146 fprintf(fh
, "PU%ld,%ld;LB", long(p
->x
* factor
), long(p
->y
* factor
));
151 /* draw a degree sign */
152 fputs(HPGL_EOL
";UC1.25,7.5,99,.25,0,.125,-.25,0,-.5,"
153 "-.125,-.25,-.25,0,-.125,.25,0,.5,.125,.25;LB", fh
);
155 /* KLUDGE: this prints the degree sign if the plotter supports
156 * extended chars or a space if not, since we tried to redefine
157 * space. Nifty, eh? */
158 fputs(HPGL_SO
" " HPGL_SI
, fh
);
163 /* (C) needs two chars to look right! */
164 /* This bit does the circle of the (C) symbol: */
165 fputs(HPGL_EOL
";", fh
);
166 if (fNewLines
) PUTC('\n', fh
);
167 fputs("UC2,3.5,99,0,1,0.125,1,0.25,.75,0.375,.75,"
168 ".5,.5,.625,.25,.75,.25,.75,0,.75,-.25,.625,-.25,"
169 ".5,-.5,.375,-.75,.25,-.75,.125,-1,0,-1,-0.125,-1,"
170 "-0.25,-.75,-0.375,-.75,-.5,-.5,-.625,-.25,-.75,-.25,"
171 "-.75,0,-.75,.25,-.625,.25,-.5,.5,-.375,.75,-.25,.75,"
173 if (fNewLines
) PUTC('\n', fh
);
174 /* And this bit's the c in the middle: */
175 fputs("UC.5,5,99,-.125,.25,-.375,.5,-.5,.25,-.625,0,"
176 "-.625,-.25,-.375,-.25,-.375,-.75,-.125,-.75,.125,-.75,"
177 ".375,-.75,.375,-.25,.625,-.25,.625,0,.5,.25,.375,.5,"
179 if (fNewLines
) PUTC('\n', fh
);
182 fputs(HPGL_SO
"(C)" HPGL_SI
, fh
);
190 fputs(HPGL_EOL
";", fh
);
191 if (fNewLines
) PUTC('\n', fh
);
197 /* Clear clipping window; New page. NB PG is a no-op on the HP7475A */
199 if (fNewLines
) PUTC('\n', fh
);