summaryrefslogtreecommitdiff
path: root/support/dktools/f2lto.c
diff options
context:
space:
mode:
Diffstat (limited to 'support/dktools/f2lto.c')
-rw-r--r--support/dktools/f2lto.c1424
1 files changed, 1424 insertions, 0 deletions
diff --git a/support/dktools/f2lto.c b/support/dktools/f2lto.c
new file mode 100644
index 0000000000..dac9ee1518
--- /dev/null
+++ b/support/dktools/f2lto.c
@@ -0,0 +1,1424 @@
+/*
+ WARNING: This file was generated by dkct.
+ Changes you make here will be lost if dkct is run again!
+ You should modify the original source and run dkct on it.
+ Original source: f2lto.ctr
+*/
+
+/*
+Copyright (C) 2013-2017, Dirk Krause
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the above opyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of the author nor the names of contributors may be used
+ to endorse or promote products derived from this software without specific
+ prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/** @file f2lto.c The f2lto module.
+*/
+
+
+#line 262 "f2lto.ctr"
+
+#include "dk3all.h"
+#include "dk3bezcu.h"
+#include "fig2lat.h"
+#include "f2lud.h"
+#include "f2lsvg.h"
+#include "dk3figto.h"
+#if 0
+#include "dkt-version.h"
+#endif
+#include "dk4vers.h"
+#include "dk3font.h"
+#include "dk3bm.h"
+#include "dk3bmeps.h"
+
+
+
+
+#line 279 "f2lto.ctr"
+
+
+
+/** LaTeX encodings for 0x00-0xFF.
+*/
+static char const * const f2l_tool_l2l_enc[] = {
+/* 000 00 */ "",
+/* 001 01 */ "",
+/* 002 02 */ "",
+/* 003 03 */ "",
+/* 004 04 */ "",
+/* 005 05 */ "",
+/* 006 06 */ "",
+/* 007 07 */ "",
+/* 008 08 */ "",
+/* 009 09 */ "\t",
+/* 010 0a */ "\\\\*",
+/* 011 0b */ "",
+/* 012 0c */ "",
+/* 013 0d */ "",
+/* 014 0e */ "",
+/* 015 0f */ "",
+/* 016 10 */ "",
+/* 017 11 */ "",
+/* 018 12 */ "",
+/* 019 13 */ "",
+/* 020 14 */ "",
+/* 021 15 */ "",
+/* 022 16 */ "",
+/* 023 17 */ "",
+/* 024 18 */ "",
+/* 025 19 */ "",
+/* 026 1a */ "",
+/* 027 1b */ "",
+/* 028 1c */ "",
+/* 029 1d */ "",
+/* 030 1e */ "",
+/* 031 1f */ "",
+/* 032 20 */ " ",
+/* 033 21 */ "!",
+/* 034 22 */ "\\textquotedbl{}",
+/* 035 23 */ "\\#",
+/* 036 24 */ "\\textdollar{}",
+/* 037 25 */ "\\%",
+/* 038 26 */ "\\&",
+/* 039 27 */ "\\textquoteright{}",
+/* 040 28 */ "(",
+/* 041 29 */ ")",
+/* 042 2a */ "\\textasteriskcentered{}",
+/* 043 2b */ "+",
+/* 044 2c */ ",",
+/* 045 2d */ "-",
+/* 046 2e */ ".",
+/* 047 2f */ "/",
+/* 048 30 */ "0",
+/* 049 31 */ "1",
+/* 050 32 */ "2",
+/* 051 33 */ "3",
+/* 052 34 */ "4",
+/* 053 35 */ "5",
+/* 054 36 */ "6",
+/* 055 37 */ "7",
+/* 056 38 */ "8",
+/* 057 39 */ "9",
+/* 058 3a */ ":",
+/* 059 3b */ ";",
+/* 060 3c */ "\\textless{}",
+/* 061 3d */ "=",
+/* 062 3e */ "\\textgreater{}",
+/* 063 3f */ "?",
+/* 064 40 */ "@",
+/* 065 41 */ "A",
+/* 066 42 */ "B",
+/* 067 43 */ "C",
+/* 068 44 */ "D",
+/* 069 45 */ "E",
+/* 070 46 */ "F",
+/* 071 47 */ "G",
+/* 072 48 */ "H",
+/* 073 49 */ "I",
+/* 074 4a */ "J",
+/* 075 4b */ "K",
+/* 076 4c */ "L",
+/* 077 4d */ "M",
+/* 078 4e */ "N",
+/* 079 4f */ "O",
+/* 080 50 */ "P",
+/* 081 51 */ "Q",
+/* 082 52 */ "R",
+/* 083 53 */ "S",
+/* 084 54 */ "T",
+/* 085 55 */ "U",
+/* 086 56 */ "V",
+/* 087 57 */ "W",
+/* 088 58 */ "X",
+/* 089 59 */ "Y",
+/* 090 5a */ "Z",
+/* 091 5b */ "[",
+/* 092 5c */ "\\textbackslash{}",
+/* 093 5d */ "]",
+/* 094 5e */ "\\textasciicircum{}",
+/* 095 5f */ "\\textunderscore{}",
+/* 096 60 */ "\\textasciigrave{}",
+/* 097 61 */ "a",
+/* 098 62 */ "b",
+/* 099 63 */ "c",
+/* 100 64 */ "d",
+/* 101 65 */ "e",
+/* 102 66 */ "f",
+/* 103 67 */ "g",
+/* 104 68 */ "h",
+/* 105 69 */ "i",
+/* 106 6a */ "j",
+/* 107 6b */ "k",
+/* 108 6c */ "l",
+/* 109 6d */ "m",
+/* 110 6e */ "n",
+/* 111 6f */ "o",
+/* 112 70 */ "p",
+/* 113 71 */ "q",
+/* 114 72 */ "r",
+/* 115 73 */ "s",
+/* 116 74 */ "t",
+/* 117 75 */ "u",
+/* 118 76 */ "v",
+/* 119 77 */ "w",
+/* 120 78 */ "x",
+/* 121 79 */ "y",
+/* 122 7a */ "z",
+/* 123 7b */ "\\textbraceleft{}",
+/* 124 7c */ "\\textbar{}",
+/* 125 7d */ "\\textbraceright{}",
+/* 126 7e */ "\\textasciitilde{}",
+/* 127 7f */ "",
+/* 128 80 */ "",
+/* 129 81 */ "",
+/* 130 82 */ "",
+/* 131 83 */ "",
+/* 132 84 */ "",
+/* 133 85 */ "",
+/* 134 86 */ "",
+/* 135 87 */ "",
+/* 136 88 */ "",
+/* 137 89 */ "",
+/* 138 8a */ "",
+/* 139 8b */ "",
+/* 140 8c */ "",
+/* 141 8d */ "",
+/* 142 8e */ "",
+/* 143 8f */ "",
+/* 144 90 */ "",
+/* 145 91 */ "",
+/* 146 92 */ "",
+/* 147 93 */ "",
+/* 148 94 */ "",
+/* 149 95 */ "",
+/* 150 96 */ "",
+/* 151 97 */ "",
+/* 152 98 */ "",
+/* 153 99 */ "",
+/* 154 9a */ "",
+/* 155 9b */ "",
+/* 156 9c */ "",
+/* 157 9d */ "",
+/* 158 9e */ "",
+/* 159 9f */ "",
+/* 160 a0 */ "",
+/* 161 a1 */ "\\textexclamdown{}",
+/* 162 a2 */ "\\textcentoldstyle{}",
+/* 163 a3 */ "\\textstirling{}",
+/* 164 a4 */ "\\textcurrency{}",
+/* 165 a5 */ "\\textyen{}",
+/* 166 a6 */ "\\textbrokenbar{}",
+/* 167 a7 */ "\\textsection{}",
+/* 168 a8 */ "\\textasciidieresis{}",
+/* 169 a9 */ "\\textcopyright{}",
+/* 170 aa */ "\\textordfeminine{}",
+/* 171 ab */ "\\quillemotleft{}",
+/* 172 ac */ "\\textlnot{}",
+/* 173 ad */ "",
+/* 174 ae */ "\\textregistered{}",
+/* 175 af */ "\\textasciimacron{}",
+/* 176 b0 */ "\\textdegree{}",
+/* 177 b1 */ "\\textpm{}",
+/* 178 b2 */ "\\texttwosuperior{}",
+/* 179 b3 */ "\\textthreesuperior{}",
+/* 180 b4 */ "\\textasciiacute{}",
+/* 181 b5 */ "\\textmu{}",
+/* 182 b6 */ "\\P{}",
+/* 183 b7 */ "\\textperiodcentered{}",
+/* 184 b8 */ "\\c{}",
+/* 185 b9 */ "\\textonesuperior{}",
+/* 186 ba */ "\\textordmasculine{}",
+/* 187 bb */ "\\quillemotright{}",
+/* 188 bc */ "\\textonequarter{}",
+/* 189 bd */ "\\textonehalf{}",
+/* 190 be */ "\\textthreequarters{}",
+/* 191 bf */ "?`",
+/* 192 c0 */ "\\`{A}",
+/* 193 c1 */ "\\'{A}",
+/* 194 c2 */ "\\^{A}",
+/* 195 c3 */ "\\~{A}",
+/* 196 c4 */ "\\\"{A}",
+/* 197 c5 */ "\\AA{}",
+/* 198 c6 */ "\\AE{}",
+/* 199 c7 */ "\\c{C}",
+/* 200 c8 */ "\\`{E}",
+/* 201 c9 */ "\\'{E}",
+/* 202 ca */ "\\^{E}",
+/* 203 cb */ "\\\"{E}",
+/* 204 cc */ "\\`{I}",
+/* 205 cd */ "\\'{I}",
+/* 206 ce */ "\\^{I}",
+/* 207 cf */ "\\\"{I}",
+/* 208 d0 */ "\\DH{}",
+/* 209 d1 */ "\\~{N}",
+/* 210 d2 */ "\\`{O}",
+/* 211 d3 */ "\\'{O}",
+/* 212 d4 */ "\\^{O}",
+/* 213 d5 */ "\\~{O}",
+/* 214 d6 */ "\\\"{O}",
+/* 215 d7 */ "\\texttimes{}",
+/* 216 d8 */ "\\O{}",
+/* 217 d9 */ "\\`{U}",
+/* 218 da */ "\\'{U}",
+/* 219 db */ "\\^{U}",
+/* 220 dc */ "\\\"{U}",
+/* 221 dd */ "\\'{Y}",
+/* 222 de */ "\\TH{}",
+/* 223 df */ "\\ss{}",
+/* 224 e0 */ "\\`{a}",
+/* 225 e1 */ "\\'{a}",
+/* 226 e2 */ "\\^{a}",
+/* 227 e3 */ "\\~{a}",
+/* 228 e4 */ "\\\"{a}",
+/* 229 e5 */ "\\aa{}",
+/* 230 e6 */ "\\ae{}",
+/* 231 e7 */ "\\c{c}",
+/* 232 e8 */ "\\`{e}",
+/* 233 e9 */ "\\'{e}",
+/* 234 ea */ "\\^{e}",
+/* 235 eb */ "\\\"{e}",
+/* 236 ec */ "\\`{i}",
+/* 237 ed */ "\\'{i}",
+/* 238 ee */ "\\^{i}",
+/* 239 ef */ "\\\"{i}",
+/* 240 f0 */ "\\dh{}",
+/* 241 f1 */ "\\~{n}",
+/* 242 f2 */ "\\`{o}",
+/* 243 f3 */ "\\'{o}",
+/* 244 f4 */ "\\^{o}",
+/* 245 f5 */ "\\~{o}",
+/* 246 f6 */ "\\\"{o}",
+/* 247 f7 */ "\\textdiv{}",
+/* 248 f8 */ "\\o{}",
+/* 249 f9 */ "\\`{u}",
+/* 250 fa */ "\\'{u}",
+/* 251 fb */ "\\^{u}",
+/* 252 fc */ "\\\"{u}",
+/* 253 fd */ "\\'{y}",
+/* 254 fe */ "\\th{}",
+/* 255 ff */ "\\\"{y}"
+};
+
+
+/** Keywords used by the module.
+*/
+static char const * const f2lto_c8_kw[] = {
+/* 0 */
+"\\begin{picture}(0,0)\n",
+
+/* 1 */
+"\\end{picture}%\n",
+
+/* 2 */
+"\\includegraphics{",
+
+/* 3 */
+"}\n",
+
+/* 4 */
+"\\setlength{\\unitlength}{1bp}%\n",
+
+/* 5 */
+"\\begin{picture}(%ld,%ld)\n",
+
+/* 6 */
+"\\newfont{",
+
+/* 7 */
+"}{",
+
+/* 8 */
+"}%\n",
+
+/* 9 */
+"\\FigToLatFont",
+
+/* 10 */
+"ptmr",
+
+/* 11 */
+" at ",
+
+/* 12 */
+"pt",
+
+/* 13 */
+"\\put(",
+
+/* 14 */
+",",
+
+/* 15 */
+"){",
+
+/* 16 */
+"}",
+
+/* 17 */
+"\\rotatebox{",
+
+/* 18 */
+"\\makebox(0,0)[",
+
+/* 19 */
+"]{",
+
+/* 20 */
+"lb",
+
+/* 21 */
+"b",
+
+/* 22 */
+"rb",
+
+/* 23 */
+"\\smash{",
+
+/* 24 */
+"\\mbox{",
+
+/* 25 */
+"\\color[rgb]{",
+
+/* 26 */
+"\n",
+
+/* 27 */
+"\\reset@font",
+
+/* 28 */
+"\\selectfont",
+
+/* 29 */
+"\\fontsize{",
+
+/* 30 */
+"\\fontfamily{\\rmdefault}",
+
+/* 31 */
+"\\fontfamily{\\sfdefault}",
+
+/* 32 */
+"\\fontfamily{\\ttdefault}",
+
+/* 33 */
+"\\fontseries{\\mddefault}",
+
+/* 34 */
+"\\fontseries{\\bfdefault}",
+
+/* 35 */
+"\\fontshape{\\updefault}",
+
+/* 36 */
+"\\fontshape{\\itdefault}",
+
+/* 37 */
+"\\fontfamily{\\familydefault}",
+
+/* 38 */
+"{",
+
+/* 39 */
+"\\end{document}\n",
+
+/* 40 */
+"\\documentclass[%lgpt]{article}\n",
+
+/* 41 */
+"\\setlength{\\paperwidth}{%ldbp}\n",
+
+/* 42 */
+"\\setlength{\\paperheight}{%ldbp}\n",
+
+/* 43 */
+"\\usepackage{pgfcore}\n",
+
+/* 44 */
+"f2lfonts.tex",
+
+/* 45 */
+"f2lother.tex",
+
+/* 46 */
+"r",
+
+NULL
+
+
+#line 737 "f2lto.ctr"
+};
+
+
+
+/** LaTeX preamble, part 1 (font encoding and font selection packages).
+*/
+static char const * const f2l_tool_preamble_1[] = {
+"% begin font setup",
+"\\usepackage[T1]{fontenc}",
+"\\usepackage{mathptmx}",
+"\\usepackage[scaled=.92]{helvet}",
+"\\usepackage{courier}",
+"% end font setup",
+NULL
+
+
+#line 752 "f2lto.ctr"
+};
+
+
+
+/** LaTex preamble, part 2 (other packages).
+*/
+static char const * const f2l_tool_preamble_2[] = {
+"% begin other packages",
+"\\usepackage{textcomp}",
+"\\usepackage[intlimits]{amsmath}",
+"% end other packages",
+NULL
+
+
+#line 765 "f2lto.ctr"
+};
+
+
+
+/** LaTeX preamble, part 3 (graphics and color).
+*/
+static char const * const f2l_tool_preamble_3[] = {
+"\\usepackage{graphicx}",
+"\\usepackage{color}",
+NULL
+
+
+#line 776 "f2lto.ctr"
+};
+
+
+
+/** LaTeX preamble, part 4 (set borders to 0).
+*/
+static char const * const f2l_tool_preamble_4[] = {
+"\\pagestyle{empty}",
+"\\setlength{\\voffset}{-1in}",
+"\\setlength{\\topmargin}{0bp}",
+"\\setlength{\\headheight}{0bp}",
+"\\setlength{\\headsep}{0bp}",
+"\\setlength{\\topskip}{0bp}",
+"\\setlength{\\hoffset}{-1in}",
+"\\setlength{\\oddsidemargin}{0bp}",
+"\\setlength{\\evensidemargin}{0bp}",
+"\\setlength{\\marginparwidth}{0bp}",
+"\\setlength{\\marginparsep}{0bp}",
+"\\setlength{\\textwidth}{\\paperwidth}",
+"\\setlength{\\textheight}{\\paperheight}",
+"\\setlength{\\parskip}{0bp}",
+"\\setlength{\\parindent}{0bp}",
+"\\setlength{\\pdfpagewidth}{\\paperwidth}",
+"\\setlength{\\pdfpageheight}{\\paperheight}",
+"\\begin{document}%",
+NULL
+
+
+#line 803 "f2lto.ctr"
+};
+
+
+
+f2l_text_handling_t *
+f2l_tool_register_font(
+ dk3_sto_t *sFonts,
+ dk3_sto_it_t *iFonts,
+ unsigned long *nFonts,
+ int fontno,
+ double fontsize,
+ dk3_app_t *app
+)
+{
+ f2l_text_handling_t myth; /* New text handling. */
+ f2l_text_handling_t *back = NULL;
+
+
+#line 820 "f2lto.ctr"
+ if((sFonts) && (iFonts) && (nFonts)) {
+ myth.fontSize = fontsize;
+
+#line 822 "f2lto.ctr"
+ myth.fontNumber = 0UL;
+ myth.psFontNo = fontno;
+
+#line 824 "f2lto.ctr"
+ back = (f2l_text_handling_t *)dk3sto_it_find_like(iFonts,(void *)(&myth),0);
+ if(!(back)) {
+
+#line 826 "f2lto.ctr"
+ back = dk3_new_app(f2l_text_handling_t,1,app);
+ if(back) {
+
+#line 828 "f2lto.ctr"
+ back->fontSize = fontsize;
+ back->fontNumber = *(nFonts);
+ back->psFontNo = fontno;
+ if(fontno < 0) { back->psFontNo = 0; }
+ if(fontno > 34) { back->psFontNo = 34; }
+ if(dk3sto_add(sFonts, (void *)back)) {
+
+#line 834 "f2lto.ctr"
+ *nFonts += 1UL;
+ if(0UL == *nFonts) {
+ back = NULL; /* Overflow */
+ }
+ } else {
+
+#line 839 "f2lto.ctr"
+ dk3_delete(back);
+ back = NULL;
+ }
+ } else {
+
+#line 843 "f2lto.ctr"
+ }
+ } else {
+
+#line 845 "f2lto.ctr"
+ }
+ }
+
+#line 847 "f2lto.ctr"
+ return back;
+}
+
+
+
+void
+f2l_tool_write_font_name(
+ FILE *of,
+ unsigned long fontno,
+ unsigned long nFonts
+)
+{
+ char buffer[64]; /* Buffer for number converted to string. */
+ char *ptr; /* Current character in buffer. */
+ size_t lgt; /* Length of current number. */
+ size_t l1; /* Length of maximum number. */
+ size_t i; /* Used to write leading zeros. */
+
+ if(of) {
+ fputs(f2lto_c8_kw[9], of);
+ sprintf(buffer, "%lu", nFonts);
+ lgt = strlen(buffer);
+ sprintf(buffer, "%lu", fontno);
+ l1 = strlen(buffer);
+ for(i = l1; i < lgt; i++) { fputc('A', of); }
+ ptr = buffer;
+ while(*ptr) {
+ switch(*ptr) {
+ case '9': { fputc('J', of); } break;
+ case '8': { fputc('I', of); } break;
+ case '7': { fputc('H', of); } break;
+ case '6': { fputc('G', of); } break;
+ case '5': { fputc('F', of); } break;
+ case '4': { fputc('E', of); } break;
+ case '3': { fputc('D', of); } break;
+ case '2': { fputc('C', of); } break;
+ case '1': { fputc('B', of); } break;
+ default: { fputc('A', of); } break;
+ }
+ ptr++;
+ }
+ }
+}
+
+
+
+void
+f2l_tool_start_tex_part_with_picture(
+ FILE *of,
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ char const *shortOutFile,
+ dk3_sto_it_t *iFonts,
+ unsigned long nFonts,
+ int wp
+)
+{
+ f2l_text_handling_t *th; /* Current text handling. */
+ char const *psfontname; /* PS font name. */
+ double fs; /* Font size. */
+
+ if(wp) {
+ /* begin{picture}(0,0) */
+ fputs(f2lto_c8_kw[0], of);
+ fputs(f2lto_c8_kw[2], of);
+ fputs(shortOutFile, of);
+ fputs(f2lto_c8_kw[3], of);
+ /* end{picture} */
+ fputs(f2lto_c8_kw[1], of);
+ fputs(f2lto_c8_kw[4], of);
+ }
+ if((iFonts) && (nFonts)) {
+ dk3sto_it_reset(iFonts);
+ while(NULL != (th = (f2l_text_handling_t *)dk3sto_it_next(iFonts))) {
+ fputs(f2lto_c8_kw[6], of);
+ /* Write font name */
+ f2l_tool_write_font_name(of, th->fontNumber, nFonts);
+ fputs(f2lto_c8_kw[7], of);
+ /* Write font description */
+ psfontname = dk3font_get_tex_font_name(th->psFontNo);
+ if(!(psfontname)) { psfontname = f2lto_c8_kw[10]; }
+ fputs(psfontname, of);
+ fputs(f2lto_c8_kw[11], of);
+ fs = th->fontSize;
+ if(job->nts > 0.0) {
+ fs = fs * job->nts;
+ }
+ fs = dk3ma_d_restrict_digits(fs, 2);
+ dk3ma_print_double_c8_no_sci(of, fs);
+ fputs(f2lto_c8_kw[12], of);
+ fputs(f2lto_c8_kw[8], of);
+ }
+ }
+ if(wp) {
+ fprintf(of, f2lto_c8_kw[5], job->lwidth, job->lheight);
+ }
+}
+
+
+
+
+void
+f2l_tool_start_tex_part(
+ FILE *of,
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ char const *shortOutFile,
+ dk3_sto_it_t *iFonts,
+ unsigned long nFonts
+)
+{
+ f2l_tool_start_tex_part_with_picture(
+ of, job, drw, shortOutFile, iFonts, nFonts, 1
+ );
+}
+
+
+
+void
+f2l_tool_end_tex_part(
+ FILE *of
+)
+{
+ fputs(f2lto_c8_kw[1], of);
+}
+
+
+
+/** Write font size to output file.
+ @param of Output file.
+ @param fs Font size.
+ @param sp Line base to line base distance.
+*/
+static
+void
+f2l_tool_write_font_size(
+ FILE *of,
+ double fs,
+ double sp
+)
+{
+
+ fputs(f2lto_c8_kw[29], of);
+ dk3ma_print_double_c8_no_sci(of, fs);
+ fputs(f2lto_c8_kw[12], of);
+ fputs(f2lto_c8_kw[7], of);
+ dk3ma_print_double_c8_no_sci(of, sp);
+ fputs(f2lto_c8_kw[12], of);
+ fputs(f2lto_c8_kw[16], of);
+}
+
+
+
+void
+f2l_tool_font_select_by_features(
+ FILE *of,
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ double fontSize,
+ int fontFeatures,
+ int useFamily
+)
+{
+ double fs; /* Font size. */
+ double sp; /* Line base to line base distance. */
+
+ fs = fontSize;
+ if(job->nts > 0.0) {
+ fs = fs * job->nts;
+ }
+ sp = 1.2 * fs;
+ fs = dk3ma_d_restrict_digits(fs, 2);
+ sp = dk3ma_d_restrict_digits(sp, 2);
+ if(useFamily) {
+ /*
+ Complete font selection.
+ */
+ if(job->resfont) {
+ fputs(f2lto_c8_kw[27], of);
+ }
+ /* Font size. */
+ f2l_tool_write_font_size(of, fs, sp);
+ /* Font family */
+ switch(fontFeatures & DK3_FONT_FAMILY) {
+ case DK3_FONT_TYPEWRITER: {
+ fputs(f2lto_c8_kw[32], of);
+ } break;
+ case DK3_FONT_SANS_SERIF: {
+ fputs(f2lto_c8_kw[31], of);
+ } break;
+ default: {
+ fputs(f2lto_c8_kw[30], of);
+ } break;
+ }
+ /* Font series */
+ fputs(f2lto_c8_kw[(fontFeatures & DK3_FONT_BOLD) ? 34 : 33], of);
+ /* Font shape */
+ /* 2013-01-22 Correction to test with DK3_FONT_ITOB.
+ */
+ fputs(f2lto_c8_kw[(fontFeatures & DK3_FONT_ITOB) ? 36 : 35], of);
+ } else {
+ /*
+ Adjust the size only.
+ */
+ f2l_tool_write_font_size(of, fs, sp);
+ fputs(f2lto_c8_kw[37], of);
+ fputs(f2lto_c8_kw[33], of);
+ fputs(f2lto_c8_kw[35], of);
+ }
+ fputs(f2lto_c8_kw[28], of);
+}
+
+
+
+void
+f2l_tool_font_selection(
+ FILE *of,
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ unsigned long nFonts
+)
+{
+ f2l_text_handling_t *th; /* Text handling. */
+ int ff; /* Font flags. */
+ int fontFeatures; /* Font features. */
+
+ ff = (obj->dt).txt.ff;
+ /*
+ No font selection... for special text.
+ */
+ if(!(ff & DK3_FIG_FONT_FLAG_SPECIAL)) {
+ if((ff & DK3_FIG_FONT_FLAG_PS) && (obj->dsd)) {
+ /*
+ Use one of the defined fonts.
+ */
+ th = (f2l_text_handling_t *)(obj->dsd);
+ f2l_tool_write_font_name(of, th->fontNumber, nFonts);
+ } else {
+ /*
+ Select font by features.
+ */
+ fontFeatures = DK3_FONT_ROMAN;
+ if(ff & DK3_FIG_FONT_FLAG_PS) {
+ /*
+ Switch from PS font to font with similar features.
+ */
+ fontFeatures = dk3font_get_features((obj->dt).txt.fo);
+ f2l_tool_font_select_by_features(
+ of, job, drw, obj, (obj->dt).txt.fs, fontFeatures, 1
+ );
+ } else {
+ /*
+ Use LaTeX font with specified features.
+ */
+ switch((obj->dt).txt.fo) {
+ case 0: {
+ f2l_tool_font_select_by_features(
+ of, job, drw, obj, (obj->dt).txt.fs, fontFeatures, 0
+ );
+ } break;
+ case 1: {
+ f2l_tool_font_select_by_features(
+ of, job, drw, obj, (obj->dt).txt.fs, fontFeatures, 1
+ );
+ } break;
+ case 2: {
+ fontFeatures |= DK3_FONT_BOLD;
+ f2l_tool_font_select_by_features(
+ of, job, drw, obj, (obj->dt).txt.fs, fontFeatures, 1
+ );
+ } break;
+ case 3: {
+ fontFeatures |= DK3_FONT_ITALIC;
+ f2l_tool_font_select_by_features(
+ of, job, drw, obj, (obj->dt).txt.fs, fontFeatures, 1
+ );
+ } break;
+ case 4: {
+ fontFeatures = DK3_FONT_SANS_SERIF;
+ f2l_tool_font_select_by_features(
+ of, job, drw, obj, (obj->dt).txt.fs, fontFeatures, 1
+ );
+ } break;
+ case 5: {
+ fontFeatures = DK3_FONT_TYPEWRITER;
+ f2l_tool_font_select_by_features(
+ of, job, drw, obj, (obj->dt).txt.fs, fontFeatures, 1
+ );
+ } break;
+ default: {
+ f2l_tool_font_select_by_features(
+ of, job, drw, obj, (obj->dt).txt.fs, fontFeatures, 1
+ );
+ } break;
+ }
+ }
+ }
+ }
+}
+
+
+
+void
+f2l_tool_tex_string(
+ FILE *of,
+ char const *txt
+)
+{
+ char const *ptr; /* Current input character to process. */
+ char const *sptr; /* Output string for current input character. */
+ char c; /* Current input character. */
+ unsigned char uc; /* Current input character conv to unsigned char. */
+ unsigned un; /* Current input character converted to unsigned. */
+
+ ptr = txt;
+ while(*ptr) {
+ c = *(ptr++);
+ uc = (unsigned char)c;
+ un = (unsigned)uc;
+ while(un > 255) {
+ un = un - 256;
+ }
+ sptr = f2l_tool_l2l_enc[un];
+ if(sptr) {
+ fputs(sptr, of);
+ }
+ }
+}
+
+
+
+/** Write string, convert to UTF-8 if necessary.
+ @param txt String to write.
+ @param fipo Output file.
+*/
+static
+void
+f2lto_utf8_out(char const *txt, FILE *fipo)
+{
+ unsigned char buf[16];
+ char const *cptr;
+ dk3_c32_t c32;
+ size_t sz;
+ size_t i;
+ char c;
+
+ cptr = txt;
+ while(*cptr) {
+ c = *(cptr++);
+ c32 = (dk3_c32_t)c;
+ c32 &= 0x000000FFUL;
+ if(c32 < 128UL) {
+ fputc(c, fipo);
+ } else {
+ sz = dk3enc_uc2utf8(c32, buf, sizeof(buf));
+ if(0 < sz) {
+ for(i = 0; i < sz; i++) {
+ fputc(buf[i], fipo);
+ }
+ }
+ }
+ }
+}
+
+
+
+void
+f2l_tool_inner_text_object(
+ FILE *of,
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ unsigned long nFonts
+)
+{
+ dk3_rgb_color_t rgb; /* Color cell for text color. */
+
+ rgb.r = rgb.g = rgb.b = 0.0;
+ dk3fig_tool_find_color(&rgb, drw, obj->pc, 20);
+ if(job->smash) {
+ /* \smash{ */
+ fputs(f2lto_c8_kw[23], of);
+ }
+ if(job->mbox) {
+ /* \mbox{ */
+ fputs(f2lto_c8_kw[24], of);
+ }
+ fputs(f2lto_c8_kw[38], of);
+ /* font selection */
+ f2l_tool_font_selection(of, job, drw, obj, nFonts);
+ fputs(f2lto_c8_kw[25], of);
+ /* red */
+ dk3ma_print_double_c8_no_sci(of, rgb.r);
+ fputs(f2lto_c8_kw[14], of);
+ /* green */
+ dk3ma_print_double_c8_no_sci(of, rgb.g);
+ fputs(f2lto_c8_kw[14], of);
+ /* blue */
+ dk3ma_print_double_c8_no_sci(of, rgb.b);
+ fputs(f2lto_c8_kw[16], of);
+ /* text */
+ if(((obj->dt).txt.ff) & DK3_FIG_FONT_FLAG_SPECIAL) {
+ if(job->stu8) {
+ f2lto_utf8_out((obj->dt).txt.st, of);
+ } else {
+ fputs((obj->dt).txt.st, of);
+ }
+ } else {
+ f2l_tool_tex_string(of, (obj->dt).txt.st);
+ }
+ fputs(f2lto_c8_kw[16], of);
+ if(job->mbox) {
+ /* } */
+ fputs(f2lto_c8_kw[16], of);
+ }
+ if(job->smash) {
+ /* } */
+ fputs(f2lto_c8_kw[16], of);
+ }
+}
+
+
+void
+f2l_tool_text_object(
+ FILE *of,
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ double x,
+ double y,
+ unsigned long nFonts
+)
+{
+ double an; /* Rotation in degree. */
+ double ian; /* Rotation as integer. */
+ int haverotation = 0; /* Flag: Have rotation. */
+
+ /* \put( */
+ fputs(f2lto_c8_kw[13], of);
+ /* x position */
+ dk3ma_print_double_c8_no_sci(of, x);
+ /* , */
+ fputs(f2lto_c8_kw[14], of);
+ /* y position */
+ dk3ma_print_double_c8_no_sci(of, y);
+ /* ){ */
+ fputs(f2lto_c8_kw[15], of);
+ if(fabs((obj->dt).txt.an) > 1.0e-6) {
+ haverotation = 1;
+ an = ((obj->dt).txt.an * 180.0) / M_PI;
+ ian = dk3ma_d_rint(an);
+ if(fabs(an - ian) < 1.0e-3) {
+ an = ian;
+ }
+ /* \rotatebox{ */
+ fputs(f2lto_c8_kw[17], of);
+ /* degrees */
+ dk3ma_print_double_c8_no_sci(of, an);
+ /* }{ */
+ fputs(f2lto_c8_kw[7], of);
+ }
+ /* \makebox(0,0)[ */
+ fputs(f2lto_c8_kw[18], of);
+ /* justification */
+ switch(obj->st) {
+ case 2: {
+ fputs(f2lto_c8_kw[22], of);
+ } break;
+ case 1: {
+ fputs(f2lto_c8_kw[21], of);
+ } break;
+ default: {
+ fputs(f2lto_c8_kw[20], of);
+ } break;
+ }
+ /* ]{ */
+ fputs(f2lto_c8_kw[19], of);
+ f2l_tool_inner_text_object(of, job, drw, obj, nFonts);
+ /* } */
+ fputs(f2lto_c8_kw[16], of);
+ if(haverotation) {
+ /* } */
+ fputs(f2lto_c8_kw[16], of);
+ }
+ /* } */
+ fputs(f2lto_c8_kw[16], of);
+ fputs(f2lto_c8_kw[26], of);
+}
+
+
+
+void
+f2l_tool_image_delete(f2l_image_t *im)
+{
+
+
+#line 1344 "f2lto.ctr"
+ if(im) {
+
+#line 1345 "f2lto.ctr"
+ dk3_release(im->filename);
+ im->xo = NULL;
+ im->width = 0UL;
+ im->height = 0UL;
+ im->xres = 0.0;
+ im->yres = 0.0;
+ im->imageNumber = 0UL;
+ im->lineno = 0UL;
+ dk3_delete(im);
+ }
+
+#line 1355 "f2lto.ctr"
+}
+
+
+
+f2l_image_t *
+f2l_tool_image_new(char const *filename, dk3_app_t *app, unsigned long li)
+{
+ dk3_ufi_t ufi; /* Unique file identifier. */
+ f2l_image_t *back = NULL;
+
+
+#line 1365 "f2lto.ctr"
+ if((filename) && (app)) {
+ if(dk3ufi_c8_get(&ufi, filename)) {
+ back = dk3_new_app(f2l_image_t,1,app);
+ if(back) {
+ dk3mem_cpy((void *)(&(back->ufi)), (void *)(&ufi), sizeof(dk3_ufi_t));
+ back->xo = NULL;
+ back->width = 0UL;
+ back->height = 0UL;
+ back->xres = 0.0;
+ back->yres = 0.0;
+ back->imageNumber = 0UL;
+ back->lineno = li;
+ back->filename = dk3str_c8_dup_app(filename, app);
+ if(!(back->filename)) {
+ f2l_tool_image_delete(back);
+ back = NULL;
+ }
+ }
+ }
+ }
+
+#line 1385 "f2lto.ctr"
+ return back;
+}
+
+
+
+int
+f2l_tool_compare_images(void const *l, void const *r, int cr)
+{
+ f2l_image_t const *pl; /* Left object. */
+ f2l_image_t const *pr; /* Right object. */
+ int back = 0;
+
+ if(l) {
+ if(r) {
+ pl = (f2l_image_t const *)l;
+ pr = (f2l_image_t const *)r;
+ switch(cr) {
+ case 1: {
+ back = dk3ufi_compare((void *)(&(pl->ufi)), r, 0);
+ } break;
+ default: {
+ back = dk3ufi_compare((void *)(&(pl->ufi)), (void *)(&(pr->ufi)), 0);
+ } break;
+ }
+ } else { back = 1; }
+ } else {
+ if(r) { back = -1; }
+ }
+ return back;
+}
+
+
+
+void
+f2l_tool_set_exit_status(f2l_job_t *job, int exval)
+{
+ if(job) {
+ if(0 == job->exval) {
+ job->exval = exval;
+ }
+ }
+}
+
+
+
+/** Write entire section of text to output file.
+ @param of Output file.
+ @param txt Pointer to array of text lines, NULL-finalized.
+*/
+static
+void
+f2l_tool_add_text_section_to_file(FILE *of, char const * const *txt)
+{
+ char const * const *ptr; /* Current line to add. */
+
+ ptr = txt;
+ while(*ptr) {
+ fputs(*ptr, of);
+ fputc('\n', of);
+ ptr++;
+ }
+}
+
+
+
+/** Write preamble part to output file, either the contents of a
+ file (if found) or a default text.
+ @param of Output file.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param fileName Name of file containing the preamble part.
+ @param preamble Default preamble text if fileName is not found.
+*/
+static
+void
+fl2_tool_write_preamble_part_or_file(
+ FILE *of,
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ char const *fileName,
+ char const * const *preamble
+)
+{
+ char line[1024]; /* Line buffer to read input file. */
+ FILE *fipo; /* Input file. */
+ int done = 0; /* Flag: Successfully handled file. */
+
+
+#line 1472 "f2lto.ctr"
+ fipo = fopen(fileName, f2lto_c8_kw[46]);
+ if(fipo) {
+
+#line 1474 "f2lto.ctr"
+ done = 1;
+ while(fgets(line, sizeof(line), fipo)) {
+
+#line 1476 "f2lto.ctr"
+ dk3str_c8_chomp(line, NULL);
+
+#line 1477 "f2lto.ctr"
+ fputs(line, of);
+
+#line 1478 "f2lto.ctr"
+ fputc('\n', of);
+
+#line 1479 "f2lto.ctr"
+ }
+ fclose(fipo);
+ } else {
+
+#line 1482 "f2lto.ctr"
+ }
+ if(!(done)) {
+
+#line 1484 "f2lto.ctr"
+ f2l_tool_add_text_section_to_file(of, preamble);
+ }
+
+
+#line 1487 "f2lto.ctr"
+}
+
+
+
+void
+f2l_tool_begin_latex_document(
+ FILE *of,
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw
+)
+{
+ fprintf(of, f2lto_c8_kw[40], job->tts);
+#if 0
+ f2l_tool_add_text_section_to_file(of, f2l_tool_preamble_1);
+#else
+ fl2_tool_write_preamble_part_or_file(
+ of, job, drw, f2lto_c8_kw[44], f2l_tool_preamble_1
+ );
+#endif
+#if 0
+ f2l_tool_add_text_section_to_file(of, f2l_tool_preamble_2);
+#else
+ fl2_tool_write_preamble_part_or_file(
+ of, job, drw, f2lto_c8_kw[45], f2l_tool_preamble_2
+ );
+#endif
+ f2l_tool_add_text_section_to_file(of, f2l_tool_preamble_3);
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_PGF:
+ case FIG2LAT_DRIVER_TEX_FULL_PGF: {
+ fputs(f2lto_c8_kw[43], of);
+ } break;
+ }
+ fprintf(of, f2lto_c8_kw[41], job->lwidth);
+ fprintf(of, f2lto_c8_kw[42], job->lheight);
+ f2l_tool_add_text_section_to_file(of, f2l_tool_preamble_4);
+}
+
+
+
+void
+f2l_tool_end_latex_document(
+ FILE *of,
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw
+)
+{
+ fputs(f2lto_c8_kw[39], of);
+}
+
+
+
+int
+f2lto_find_draw_direction(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ int *ec
+)
+{
+ dk3_fig_poly_point_t *po; /* Point set. */
+ size_t np; /* Number of points. */
+ int back = 0;
+
+
+#line 1551 "f2lto.ctr"
+ if(DK3_FIG_SRCTYPE_JFIG != drw->srctype) {
+
+#line 1552 "f2lto.ctr"
+ po = (obj->dt).pol.po;
+ np = (obj->dt).pol.np;
+ if(4 <= np) {
+
+#line 1555 "f2lto.ctr"
+ if(po[1].x > (dk3ma_d_add_ok(po[0].x, 0.5, ec))) {
+ /* 0 on the left, 1 on the right */
+ if(po[3].y > (dk3ma_d_add_ok(po[0].y, 0.5, ec))) {
+ back = 0;
+ } else {
+ back = 1;
+ }
+ } else {
+ if(po[1].x < (dk3ma_d_sub_ok(po[0].x, 0.5, ec))) {
+ /* 0 on the right, 1 on the left. */
+ if(po[3].y > (dk3ma_d_add_ok(po[0].y, 0.5, ec))) {
+ back = 2;
+ } else {
+ back = 3;
+ }
+ } else {
+ /* 0 and 1 in one row. */
+ if(po[2].x > (dk3ma_d_add_ok(po[0].x, 0.5, ec))) {
+ /* 0 and 1 left */
+ if(po[1].y > (dk3ma_d_add_ok(po[0].y, 0.5, ec))) {
+ back = 0;
+ } else {
+ back = 1;
+ }
+ } else {
+ /* 0 and 1 right */
+ if(po[1].y > (dk3ma_d_add_ok(po[0].y, 0.5, ec))) {
+ back = 2;
+ } else {
+ back = 3;
+ }
+ }
+ }
+ }
+ if((obj->dt).pol.flf) {
+
+#line 1590 "f2lto.ctr"
+ back += 4;
+ } else {
+
+#line 1592 "f2lto.ctr"
+ }
+ } else {
+
+#line 1594 "f2lto.ctr"
+ }
+ } else {
+
+#line 1596 "f2lto.ctr"
+ }
+
+#line 1597 "f2lto.ctr"
+ return back;
+}
+
+
+
+double
+f2lto_find_gap_length(f2l_job_t *job, double lw, double lsv)
+{
+ double back;
+ if(job->cols) {
+ back = lsv;
+ } else {
+ back = 0.5 * lw + 0.5 * lsv;
+ if((0.5 * back) > lw) {
+ back = 2.0 * lw;
+ }
+ }
+ return back;
+}
+