diff options
Diffstat (limited to 'support/dktools/f2lto.c')
-rw-r--r-- | support/dktools/f2lto.c | 1424 |
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; +} + |