%% options copyright owner = Dirk Krause copyright year = 2013-2014 license = bsd %% header #include "dk3all.h" #include "dk3font.h" #include "fig2lat.h" #include "f2lsvg.h" #include "f2lsvgst.h" #include "dk3figto.h" /** @defgroup svgstyleflags SVG style flags */ /**@{*/ /** Stroke color defined. */ #define DK3_SVG_FLAGS_COLOR_STROKE 1 /** Fill color defined. */ #define DK3_SVG_FLAGS_COLOR_FILL 2 /** Text align defined. */ #define DK3_SVG_FLAGS_TEXT_ALIGN 4 /** Font defined. */ #define DK3_SVG_FLAGS_FONT 8 /** Font is a PS font (LaTeX font otherwise). */ #define DK3_SVG_FLAGS_PS_FONT 16 /** Line width defined. */ #define DK3_SVG_FLAGS_LINEWIDTH 32 /** Line style defined. */ #define DK3_SVG_FLAGS_LINESTYLE 64 /** Line cap defined. */ #define DK3_SVG_FLAGS_LINE_CAP 128 /** Line join defined. */ #define DK3_SVG_FLAGS_LINE_JOIN 256 /**@}*/ /** Fill pattern. */ typedef struct { unsigned long pn; /**< Pattern number. */ int fn; /**< Fig pattern number 41 - 62. */ int sr; /**< Stroke color red. */ int sg; /**< Stroke color green. */ int sb; /**< Stroke color blue. */ int fr; /**< Fill color red. */ int fg; /**< Fill color green. */ int fb; /**< Fill color blue. */ } f2l_svg_fill_pattern_t; /** SVG object style information. */ typedef struct { f2l_svg_fill_pattern_t *fp; /**< Fill pattern. */ double ts; /**< Text size. */ double lw; /**< Line width. */ double lsv; /**< Line style value. */ unsigned long sn; /**< Style number. */ int tf; /**< Text font. */ int flags; /**< Flags, see @ref svgstyleflags. */ int sr; /**< Stroke color red. */ int sg; /**< Stroke color green. */ int sb; /**< Stroke color blue. */ int fr; /**< Fill color red. */ int fg; /**< Fill color green. */ int fb; /**< Fill color blue. */ int ls; /**< Line style. */ int al; /**< Text align. */ int lc; /**< Line cap. */ int lj; /**< Line join. */ } f2l_svg_style_t; /** Complete collection of style information for an SVG object. */ typedef struct { dk3_sto_t *sPatterns; /**< Storage for fill patterns. */ dk3_sto_it_t *iPatterns; /**< Iterator through fill patterns storage. */ dk3_sto_t *sStyles; /**< Storage for object styles. */ dk3_sto_it_t *iStyles; /**< Iterator through object styles storage. */ unsigned long nPatterns; /**< Number of patterns in storage. */ unsigned long nStyles; /**< Number of styles in storage. */ int *psFontsUsed; /**< Flag for 35 PS fonts, used or not. */ int ec; /**< Error code. */ } f2l_svg_t; #ifdef __cplusplus extern "C" { #endif /** Compare two fill pattern structures. @param l Left fill pattern structure. @param r Right fill pattern structure. @param cr Comparison criteria (ignored). @return Comparison result. */ int f2lsvgst_compare_pattern(void const *l, void const *r, int cr); /** Compare two object styles. @param l Left object. @param r Right object. @param cr Comparison criteria (ignored). @return Comparison result. */ int f2lsvgst_compare_object_styles(void const *l, void const *r, int cr); /** Create new SVG structure. @param app Application structure for diagnostics. @return Pointer to new structure on success, NULL on error. */ f2l_svg_t * f2lsvgst_new_app(dk3_app_t *app); /** Delete SVG structure. @param psvg Structure to delete. */ void f2lsvgst_delete(f2l_svg_t *psvg); /** Retrieve error code for last error and reset error code. @param psvg SVG structure to retrieve error for. */ int f2lsvgst_get_error_code(f2l_svg_t *psvg); /** Create fill pattern structure, allocate memory. @param psvg Pointer to SVG structure. @return Pointer to new structure on success, NULL on error. */ f2l_svg_fill_pattern_t * f2lsvgst_pattern_new(f2l_svg_t *psvg); /** Destroy fill pattern structure, release memory. @param pa Structure to release. */ void f2lsvgst_pattern_delete(f2l_svg_fill_pattern_t *pa); /** Create object style structure, allocate memory. @param psvg Pointer to SVG structure. @return Pointer to new structure on success, NULL on error. */ f2l_svg_style_t * f2lsvgst_style_new(f2l_svg_t *psvg); /** Destroy object style structure, release memory. @param st Structure to release. */ void f2lsvgst_style_delete(f2l_svg_style_t *st); /** Initialize style structure. @param st Style structure to initialize. */ void f2lsvgst_style_initialize(f2l_svg_style_t *st); /** Add new pattern to SVG structure if necessary. @param psvg SVG structure to modify. @param src New pattern. @return Pointer to new or existing pattern on success, NULL on error. */ f2l_svg_fill_pattern_t * f2lsvgst_pattern_add(f2l_svg_t *psvg, f2l_svg_fill_pattern_t *src); /** Add new style to SVG structure if necessary. @param psvg SVG structure to modify. @param src New style. @return Pointer to new or existing style on success, NULL on error. */ f2l_svg_style_t * f2lsvgst_style_add(f2l_svg_t *psvg, f2l_svg_style_t *src); /** Set font for style. @param psvg SVG style collection. @param pst SVG style to modify. @param ps Flag: PS font (1) or LaTeX font (0). @param tf Text font (PS font or LaTeX font, depending on ps). @param ts Text size. */ void f2lsvgst_style_set_text( f2l_svg_t *psvg, f2l_svg_style_t *pst, int ps, int tf, double ts ); /** Set text align for a style. @param pst SVG style to modify. @param al New text alignment value. */ void f2lsvgst_style_set_text_align(f2l_svg_style_t *pst, int al); /** Set line width for strokes. @param pst Style to modify. @param lw New line width. */ void f2lsvgst_style_set_line_width( f2l_svg_style_t *pst, double lw ); /** Set line style for strokes. @param pst Style to modify. @param ls New line style. @param lsv Style value (gap and segment length). */ void f2lsvgst_style_set_line_style( f2l_svg_style_t *pst, int ls, double lsv ); /** Set line color for strokes. @param pst Style to modify. @param r Red. @param g Green. @param b Blue. */ void f2lsvgst_style_set_line_color( f2l_svg_style_t *pst, int r, int g, int b ); /** Set fill color. @param pst Style to modify. @param r Red. @param g Green. @param b Blue. */ void f2lsvgst_style_set_fill_color( f2l_svg_style_t *pst, int r, int g, int b ); /** Set fill pattern. @param psvg SVG structure to modify. @param pst Style to modify. @param ppat Pattern for fill operations. @return 1 on success, 0 on error. */ int f2lsvgst_style_set_pattern( f2l_svg_t *psvg, f2l_svg_style_t *pst, f2l_svg_fill_pattern_t *ppat ); /** Set line cap for a style. @param pst SVG style to modify. @param lc New line cap value. */ void f2lsvgst_style_set_text_line_cap(f2l_svg_style_t *pst, int lc); /** Set line join for a style. @param pst SVG style to modify. @param lj New line joint style. */ void f2lsvgst_style_set_text_line_join(f2l_svg_style_t *pst, int lj); /** Check whether any PS font is used in an SVG style collection. @param psvg SVG style collection. @return 1 if any PS font is in use, 0 otherwise. */ int f2lsvgst_any_ps_font_used(f2l_svg_t *psvg); /** Write all patterns used to the SVG output file. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. */ void f2lsvgst_write_patterns( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg ); /** Write pattern ID. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. */ void f2lsvgst_pattern_id( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat ); /** Write styles to output file. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. */ void f2lsvgst_write_styles( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg ); /** Write style ID. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pst Style. */ void f2lsvgst_style_id( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_style_t *pst ); /** Write style information for current object. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pobj Current object in processing. */ void f2lsvgst_write_style_for_object( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, dk3_fig_obj_t *pobj ); /** Write pattern ID. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern used for current object. */ void f2lsvgst_write_pattern_id( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat ); /** Write style ID. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pst Style used by current object. */ void f2lsvgst_write_style_id( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_style_t *pst ); #ifdef __cplusplus } #endif %% module #include "f2lsvgst.h" $!trace-include /** Keywords used by the module. */ static char const * const f2lsvgst_c8_kw[] = { $!string-table # # 0: Newline. # \n # # 1 # svg: # # 2 # < # # 3 # pattern # # 4 # / # # 5 # > # # 6 # < # # 7 # id=" # # 8 # p # # 9 # " x="0" y="0" width="%lg" height="%lg"\npatternUnits="userSpaceOnUse"\n>\n # # 10 # rect # # 11 # x="0" y="0" width="%lg" height="%lg"\n # # 12 # style="fill: #%02X%02X%02X; stroke: none;"\n # # 13 # />\n # # 14 # style="stroke: none; fill: #%02X%02X%02X;"\n # # 15 # points="0,0 0.9,0 7.2,3.64 7.2,4.16 6.3,4.16 0,0.52" # # 16 # points="0,3.64 0.9,4.16 0,4.16" # # 17 # points="6.3,0 7.2,0.52 7.2,0" # # 18 # polyline # # 19 20 21 # points="0,4.16 0.9,4.16 7.2,0.52 7.2,0 6.3,0 0,3.64" points="0,0.52 0.9,0 0,0" points="6.3,4.16 7.2,4.16 7.2,3.64" # # 22 # style="fill: none; stroke: #%02X%02X%02X; stroke-width: 0.9; stroke-linecap: round;" # # 23 24 # points="0,0 7.2,4.16" points="0,4.16 7.2,0" # # 25 26 27 # points="0,0 0.64,0 10.18,9.54 10.18,10.18 9.54,10.18 0,0.64" points="0,9.54 0.64,10.18 0,10.18" points="9.54,0 10.18,0.64 10.18,0" # # 28 29 30 # points="0,10.18 0.64,10.18 10.18,0.64 10.18,0 9.54,0 0,9.54" points="0,0.64 0.64,0 0,0" points="9.54,10.18 10.18,10.18 10.18,9.54" # # 31 32 # points="0,0 10.18,10.18" points="0,10.18 10.18,0" # # 33 34 35 36 37 38 39 # points="3.6,0 3.6,7.2" points="18,0 18,7.2" points="10.8,7.2 10.8,14.4" points="25.2,7.2 25.2,14.4" points="0,0 28.8,0" points="0,14.4 28.8,14.4" points="0,7.2 28.8,7.2" # # 40 41 42 43 44 45 46 # points="0,3.6 7.2,3.6" points="0,18 7.2,18" points="7.2,10.8 14.4,10.8" points="7.2,25.2 14.4,25.2" points="0,0 0,28.8" points="7.2,0 7.2,28.8" points="14.4,0 14.4,28.8" # # 47 48 # points="0,0 3.6,0" points="0,3.6 3.6,3.6" # # 49 50 # points="0,0 0,3.6" points="3.6,0 3.6,3.6" # # 51 # polygon # # 52 # points="0,0 0,3.6 3.6,3.6 3.6,0" # # 53 54 55 56 57 58 59 60 61 # points="0.45,7.2 3.15,0" points="4.05,14.4 6.75,7.2" points="7.65,21.6 10.35,14.4" points="11.25,28.8 13.95,21.6" points="0,0 14.4,0" points="0,7.2 14.4,7.2" points="0,14.4 14.4,14.4" points="0,21.6 14.4,21.6" points="0,28.8 14.4,28.8" # # 62 63 64 65 66 67 68 69 70 # points="0,0 3.6,7.2" points="10.8,7.2 14.4,14.4" points="7.2,14.4 10.8,21.6" points="3.6,21.6 7.2,28.8" points="0,0 14.4,0" points="0,7.2 14.4,7.2" points="0,14.4 14.4,14.4" points="0,21.6 14.4,21.6" points="0,28.8 14.4,28.8" # # 71 72 73 74 75 76 77 78 79 # points="0,10.8 7.2,14.4" points="7.2,7.2 14.4,10.8" points="14.4,3.6 21.6,7.2" points="21.6,0 28.8,3.6" points="0,0 0,14.4" points="7.2,0 7.2,14.4" points="14.4,0 14.4,14.4" points="21.6,0 21.6,14.4" points="28.8,0 28.8,14.4" # # 80 81 82 83 84 85 86 87 88 # points="0,14.4 7.2,10.8" points="7.2,3.6 14.4,0" points="14.4,7.2 21.6,3.6" points="21.6,10.8 28.8,7.2" points="0,0 0,14.4" points="7.2,0 7.2,14.4" points="14.4,0 14.4,14.4" points="21.6,0 21.6,14.4" points="28.8,0 28.8,14.4" # # 89 # path # # 90 91 92 93 94 # d="M0,0A9 9 0 0 0 14.54,0" d="M0,7.4A9 9 0 0 0 7.27,3.7" d="M7.27,3.7A9 9 0 0 0 14.54,7.4" d="M0,0A9 9 0 0 0 7.27,-3.7" d="M7.27,-3.7A9 9 0 0 0 14.54,0" # # 95 96 97 98 99 # d="M0,0A3.6 3.6 0 0 0 7.2,0" d="M0,7.2A3.6 3.6 0 0 0 3.6,3.6" d="M3.6,3.6A3.6 3.6 0 0 0 7.2,7.2" d="M0,0A3.6 3.6 0 0 0 3.6,-3.6" d="M3.6,-3.6A3.6 3.6 0 0 0 7.2,0" # # 100 # circle # # 101 # style="fill: none; stroke: #%02X%02X%02X; stroke-width: 0.9;" # # 102 # cx="7.2" cy="7.2" r="7.2" # # 103 104 105 106 # points="3.6,0 0,6.24 3.6,12.47 10.8,12.47 14.4,6.24 10.8,0" points="14.4,6.24 21.6,6.24" points="21.6,6.24 25.2,0" points="21.6,6.24 25.2,12.47" # # 107 108 # points="0,4.22 4.22,0 10.18,0 14.4,4.22 14.4,10.18 10.18,14.4 4.22,14.4 0,10.18" # # 109 # points="0,1.8 3.6,5.4 7.2,1.8" # # 110 # points="1.8,0 5.4,3.6 1.8,7.2" # # 111 # s # # 112 # . # # 113 # {\n # # 114 # }\n # # 115 # font-family: " # # 116 # ",serif;\n # # 117 # ",sans-serif;\n # # 118 # ",monospace;\n # # 119 # font-style: normal;\n # # 120 # font-style: italic;\n # # 121 # font-style: oblique;\n # # 122 # font-weight: %d;\n # # 123 124 125 # font-family: serif;\n font-family: sans-serif;\n font-family: monospace;\n # # 126 127 # font-style: normal;\n font-style: italic;\n # # 128 129 # font-weight: normal;\n font-weight: bold;\n # # 130 # font-size: %lgpt;\n # # 131 132 133 # text-anchor: start;\n text-anchor: middle;\n text-anchor: end;\n # # 134 135 # fill: url(# );\nfillrule: evenodd;\n # # 136 # fill: #%02X%02X%02X;\nfillrule: evenodd;\n # # 137 # fill: none;\n # # 138 # stroke: #%02X%02X%02X;\n # # 139 # stroke-width: %lg;\n # # 140 141 142 # stroke-linecap: square;\n stroke-linecap: round;\n stroke-linecap: butt;\n # # 143 144 145 # stroke-linejoin: bevel;\n stroke-linejoin: round;\n stroke-linejoin: miter;\n # # 146 147 # stroke-dasharray: ;\n # # 148 # none # # 149 150 151 152 # %lg,%lg %lg,%lg,%lg,%lg %lg,%lg,%lg,%lg,%lg,%lg %lg,%lg,%lg,%lg,%lg,%lg,%lg,%lg # # 153 154 155 156 # font-family="' ',serif"\n ',sans-serif"\n ',monospace"\n # # 157 158 # font-style="oblique"\n font-style="italic"\n # # 159 # font-weight="%d"\n # # 160 # font-size="%lgpt"\n # # 161 162 163 # font-family="serif"\n font-family="sans-serif"\n font-family="monospace"\n # # 164 # font-weight="bold"\n # # 165 166 # text-anchor="middle"\n text-anchor="end"\n # # 167 168 # fill="url(# )"\n # # 169 # fill="#%02X%02X%02X"\n # # 170 # fill="none"\n # # 171 # stroke="#%02X%02X%02X"\n # # 172 # stroke-width="%lg"\n # # 173 174 175 176 # stroke-dasharray="%lg,%lg"\n stroke-dasharray="%lg,%lg,%lg,%lg"\n stroke-dasharray="%lg,%lg,%lg,%lg,%lg,%lg"\n stroke-dasharray="%lg,%lg,%lg,%lg,%lg,%lg,%lg,%lg"\n # # 177 178 # stroke-linecap="square"\n stroke-linecap="round"\n # # 179 180 # stroke-linejoin="bevel"\n stroke-linejoin="round"\n # # 181 182 # class=" "\n # # 183 # fill: #%02X%02X%02X;\n # # 184 # fill="#%02X%02X%02X"\nfillrule="evenodd"\n # # 185 186 # stroke-miterlimit: 20;\n stroke-miterlimit="20"\n # # 187 188 # "," ',' $!end }; /** Compare two integer values. @param x Left value. @param y Right value. @return Comparison result. */ int f2lsvgst_compare_int(int x, int y) { int back = 0; $? "+ f2lsvgst_compare_int %d %d", x, y if(x > y) { back = 1; } else { if(x < y) { back = -1; } } $? "- f2lsvgst_compare_int %d", back return back; } int f2lsvgst_compare_pattern(void const *l, void const *r, int cr) { int back = 0; f2l_svg_fill_pattern_t const *pl; f2l_svg_fill_pattern_t const *pr; if(l) { if(r) { pl = (f2l_svg_fill_pattern_t const *)l; pr = (f2l_svg_fill_pattern_t const *)r; back = f2lsvgst_compare_int(pl->fn, pr->fn); if(0 == back) { back = f2lsvgst_compare_int(pl->sr, pr->sr); if(0 == back) { back = f2lsvgst_compare_int(pl->sg, pr->sg); if(0 == back) { back = f2lsvgst_compare_int(pl->sb, pr->sb); if(0 == back) { back = f2lsvgst_compare_int(pl->fr, pr->fr); if(0 == back) { back = f2lsvgst_compare_int(pl->fg, pr->fg); if(0 == back) { back = f2lsvgst_compare_int(pl->fb, pr->fb); } } } } } } } else { back = 1; } } else { if(r) { back = -1; } } return back; } int f2lsvgst_compare_object_styles(void const *l, void const *r, int cr) { f2l_svg_style_t const *pl; f2l_svg_style_t const *pr; int back = 0; $? "+ f2lsvgst_compare_object_styles" if(l) { if(r) { pl = (f2l_svg_style_t const *)l; pr = (f2l_svg_style_t const *)r; /* Stroke color. */ $? ". by stroke color" if((pl->flags) & DK3_SVG_FLAGS_COLOR_STROKE) { if((pr->flags) & DK3_SVG_FLAGS_COLOR_STROKE) { back = f2lsvgst_compare_int(pl->sr, pr->sr); $? ". %d", back if(0 == back) { back = f2lsvgst_compare_int(pl->sg, pr->sg); $? ". %d", back if(0 == back) { back = f2lsvgst_compare_int(pl->sb, pr->sb); $? ". %d", back } } } else { back = 1; $? ". 1" } } else { if((pr->flags) & DK3_SVG_FLAGS_COLOR_STROKE) { back = -1; $? ". -1" } } /* Line width. */ if(0 == back) { $? ". by line width" if((pl->flags) & DK3_SVG_FLAGS_LINEWIDTH) { if((pr->flags) & DK3_SVG_FLAGS_LINEWIDTH) { if(pl->lw > (pr->lw + 1.0e-6)) { back = 1; $? ". 1" } else { if(pr->lw > (pl->lw + 1.0e-6)) { back = -1; $? ". -1" } } } else { back = 1; $? ". 1" } } else { if((pr->flags) & DK3_SVG_FLAGS_LINEWIDTH) { back = -1; $? ". -1" } } } /* Line cap. */ if(0 == back) { $? ". by line cap" if((pl->flags) & DK3_SVG_FLAGS_LINE_CAP) { if((pr->flags) & DK3_SVG_FLAGS_LINE_CAP) { back = f2lsvgst_compare_int(pl->lc, pr->lc); $? ". %d", back } else { back = 1; $? ". 1" } } else { if((pr->flags) & DK3_SVG_FLAGS_LINE_CAP) { back = -1; $? ". -1" } } } /* Line join. */ if(0 == back) { $? ". by line join" if((pl->flags) & DK3_SVG_FLAGS_LINE_JOIN) { if((pr->flags) & DK3_SVG_FLAGS_LINE_JOIN) { back = f2lsvgst_compare_int(pl->lj, pr->lj); $? ". %d", back } else { back = 1; $? ". 1" } } else { if((pr->flags) & DK3_SVG_FLAGS_LINE_JOIN) { back = -1; $? ". -1" } } } /* Line style. */ if(0 == back) { $? ". by line style" if((pl->flags) & DK3_SVG_FLAGS_LINESTYLE) { if((pr->flags) & DK3_SVG_FLAGS_LINESTYLE) { if(pl->ls > pr->ls) { back = 1; $? ". 1" } else { if(pr->ls > pl->ls) { back = -1; $? ". -1" } else { if((0 != pl->ls) && (0 != pr->ls)) { if(pl->lsv > (pr->lsv + 1.0e-6)) { back = 1; $? ". 1" } else { if(pr->lsv > (pl->lsv + 1.0e-6)) { back = -1; $? ". -1" } } } } } } else { back = 1; $? ". 1" } } else { if((pr->flags) & DK3_SVG_FLAGS_LINESTYLE) { back = -1; $? ". -1" } } } /* Fill pattern or fill color. */ if(0 == back) { $? ". by filling" if(pl->fp) { if(pr->fp) { back = f2lsvgst_compare_pattern((void *)(pl->fp),(void *)(pr->fp),0); $? ". %d", back } else { back = 1; $? ". 1" } } else { if(pr->fp) { back = -1; $? ". -1" } else { /* Fill color only if both objects do not have fill patterns. */ if(0 == back) { if((pl->flags) & DK3_SVG_FLAGS_COLOR_FILL) { if((pr->flags) & DK3_SVG_FLAGS_COLOR_FILL) { back = f2lsvgst_compare_int(pl->fr, pr->fr); $? ". %d", back if(0 == back) { back = f2lsvgst_compare_int(pl->fg, pr->fg); $? ". %d", back if(0 == back) { back = f2lsvgst_compare_int(pl->fb, pr->fb); $? ". %d", back } } } else { back = 1; $? ". 1" } } else { if((pr->flags) & DK3_SVG_FLAGS_COLOR_FILL) { back = -1; $? ". -1" } } } } } } /* Font. */ if(0 == back) { $? ". by font" if((pl->flags) & DK3_SVG_FLAGS_FONT) { if((pr->flags) & DK3_SVG_FLAGS_FONT) { if((pl->flags) & DK3_SVG_FLAGS_PS_FONT) { if((pr->flags) & DK3_SVG_FLAGS_PS_FONT) { back = f2lsvgst_compare_int(pl->tf, pr->tf); $? ". %d", back if(0 == back) { if(pl->ts > (pr->ts + 1.0e-6)) { back = 1; $? ". 1" } else { if(pl->ts < (pr->ts - 1.0e-6)) { back = -1; $? ". -1" } } } } else { back = 1; $? ". 1" } } else { if((pr->flags) & DK3_SVG_FLAGS_PS_FONT) { back = -1; $? ". -1" } else { back = f2lsvgst_compare_int(pl->tf, pr->tf); $? ". %d", back if(0 == back) { if(pl->ts > (pr->ts + 1.0e-6)) { back = 1; $? ". 1" } else { if(pl->ts < (pr->ts - 1.0e-6)) { back = -1; $? ". -1" } } } } } } else { back = 1; $? ". 1" } } else { if((pr->flags) & DK3_SVG_FLAGS_FONT) { back = -1; $? ". -1" } } } /* Text align. */ if(0 == back) { $? ". by text align" if((pl->flags) & DK3_SVG_FLAGS_TEXT_ALIGN) { if((pr->flags) & DK3_SVG_FLAGS_TEXT_ALIGN) { back = f2lsvgst_compare_int(pl->al, pr->al); $? ". %d", back } else { back = 1; $? ". 1" } } else { if((pr->flags) & DK3_SVG_FLAGS_TEXT_ALIGN) { back = -1; $? ". -1" } } } } else { $? ". 1" back = 1; } } else { if(r) { back = -1; $? ". -1" } } $? "- f2lsvgst_compare_object_styles %d", back return back; } void f2lsvgst_pattern_delete(f2l_svg_fill_pattern_t *pa) { $? "+ f2lsvgst_pattern_delete %s", TR_PTR(pa) if(pa) { $? ". pa = %lu %d %d %d %d %d %d %d", pa->pn, pa->fn, pa->sr, pa->sg, pa->sb, pa->fr, pa->fg, pa->fb } dk3_delete(pa); $? "- f2lsvgst_pattern_delete" } f2l_svg_fill_pattern_t * f2lsvgst_pattern_new(f2l_svg_t *psvg) { f2l_svg_fill_pattern_t *back = NULL; $? "+ f2lsvgst_pattern_new %s", TR_PTR(psvg) if(psvg) { back = dk3_new(f2l_svg_fill_pattern_t,1); if(back) { back->pn = 0UL; back->fn = 0; back->sr = 0; back->sg = 0; back->sb = 0; back->fr = 0; back->fg = 0; back->fb = 0; } else { psvg->ec = DK3_ERROR_MEMORY; } } $? "- f2lsvgst_pattern_new %s", TR_PTR(back) return back; } void f2lsvgst_style_initialize(f2l_svg_style_t *st) { $? "+ f2lsvgst_style_initialize %s", TR_PTR(st) if(st) { /* 2013-01-25: Same order as in typedef makes completeness checking easier. */ st->fp = NULL; st->ts = 0.0; st->lw = 0.0; st->lsv = 0.0; st->sn = 0UL; st->tf = 0; st->flags = 0; st->sr = 0; st->sg = 0; st->sb = 0; st->fr = 0; st->fg = 0; st->fb = 0; st->ls = 0; st->al = 0; st->lc = 0; st->lj = 0; } $? "- f2lsvgst_style_initialize" } #if TRACE_DEBUG /** Report style contents. @param pst SVG style to report. */ static void f2lsvgst_style_report(f2l_svg_style_t *pst) { FILE *tf; tf = dktrace_file(); if(tf) { if((pst->flags) & DK3_SVG_FLAGS_COLOR_STROKE) { fprintf(tf, "Stroke: #%02X%02X%02X\n", pst->sr, pst->sg, pst->sb); } if((pst->flags) & DK3_SVG_FLAGS_LINEWIDTH) { fprintf(tf, "Line width: %lg\n", pst->lw); } if((pst->flags) & DK3_SVG_FLAGS_LINESTYLE) { fprintf(tf, "Line style: %d %lg\n", pst->ls, pst->lsv); } if((pst->flags) & DK3_SVG_FLAGS_LINE_CAP) { fprintf(tf, "Line cap: %d\n", pst->lc); } if((pst->flags) & DK3_SVG_FLAGS_LINE_JOIN) { fprintf(tf, "Line join: %d\n", pst->lj); } if(pst->fp) { fprintf(tf, "Fill: pattern\n"); } else { if((pst->flags) & DK3_SVG_FLAGS_COLOR_FILL) { fprintf(tf, "Fill: #%02X%02X%02X", pst->fr, pst->fg, pst->fb); } } if((pst->flags) & DK3_SVG_FLAGS_FONT) { fprintf(tf, "Font: PS=%d NUMBER=%d SIZE=%lg\n", (((pst->flags) & DK3_SVG_FLAGS_PS_FONT) ? 1 : 0), pst->tf, pst->ts); } if((pst->flags) & DK3_SVG_FLAGS_TEXT_ALIGN) { fprintf(tf, "Text align: %d\n", pst->al); } } } #endif void f2lsvgst_style_delete(f2l_svg_style_t *st) { $? "+ f2lsvgst_style_delete" if(st) { f2lsvgst_style_initialize(st); dk3_delete(st); } $? "- f2lsvgst_style_delete" } f2l_svg_style_t * f2lsvgst_style_new(f2l_svg_t *psvg) { f2l_svg_style_t *back = NULL; $? "+ f2lsvgst_style_new %s", TR_PTR(psvg) if(psvg) { back = dk3_new(f2l_svg_style_t,1); if(back) { f2lsvgst_style_initialize(back); } else { psvg->ec = DK3_ERROR_MEMORY; } } $? "- f2lsvgst_style_new %s", TR_PTR(back) return back; } void f2lsvgst_delete(f2l_svg_t *psvg) { f2l_svg_style_t *st; f2l_svg_fill_pattern_t *pa; $? "+ f2lsvgst_delete" if(psvg) { dk3_release(psvg->psFontsUsed); if(psvg->sStyles) { if(psvg->iStyles) { dk3sto_it_reset(psvg->iStyles); while(NULL != (st = (f2l_svg_style_t *)dk3sto_it_next(psvg->iStyles))) { f2lsvgst_style_delete(st); } dk3sto_it_close(psvg->iStyles); } dk3sto_close(psvg->sStyles); } psvg->sStyles = NULL; psvg->iStyles = NULL; if(psvg->sPatterns) { if(psvg->iPatterns) { dk3sto_it_reset(psvg->iPatterns); do { pa = (f2l_svg_fill_pattern_t *)dk3sto_it_next(psvg->iPatterns); if(pa) { f2lsvgst_pattern_delete(pa); } } while(pa); dk3sto_it_close(psvg->iPatterns); } dk3sto_close(psvg->sPatterns); } psvg->sPatterns = NULL; psvg->iPatterns = NULL; dk3_delete(psvg); } $? "- f2lsvgst_delete" } f2l_svg_t * f2lsvgst_new_app(dk3_app_t *app) { f2l_svg_t *back = NULL; size_t i; int ok = 0; $? "+ f2lsvgst_new_app %s", TR_PTR(app) back = dk3_new_app(f2l_svg_t,1,app); if(back) { back->sPatterns = NULL; back->iPatterns = NULL; back->sStyles = NULL; back->iStyles = NULL; back->nPatterns = 0UL; back->nStyles = 0UL; back->psFontsUsed = NULL; back->ec = 0; back->sPatterns = dk3sto_open_app(app); if(back->sPatterns) { dk3sto_set_comp(back->sPatterns, f2lsvgst_compare_pattern, 0); back->iPatterns = dk3sto_it_open(back->sPatterns); if(back->iPatterns) { back->sStyles = dk3sto_open_app(app); if(back->sStyles) { dk3sto_set_comp(back->sStyles, f2lsvgst_compare_object_styles, 0); back->iStyles = dk3sto_it_open(back->sStyles); if(back->iStyles) { back->psFontsUsed = dk3_new_app(int,35,app); if(back) { for(i = 0; i < 35; i++) { (back->psFontsUsed)[i] = 0; } ok = 1; } } } } } if(!(ok)) { f2lsvgst_delete(back); back = NULL; } } $? "- f2lsvgst_new_app %s", TR_PTR(back) return back; } int f2lsvgst_get_error_code(f2l_svg_t *psvg) { int back = 0; if(psvg) { back = psvg->ec; psvg->ec = 0; } $? "= f2lsvgst_get_error_code %d", back return back; } f2l_svg_fill_pattern_t * f2lsvgst_pattern_add(f2l_svg_t *psvg, f2l_svg_fill_pattern_t *src) { f2l_svg_fill_pattern_t *back = NULL; $? "+ f2lsvgst_pattern_add %s %s", TR_PTR(psvg), TR_PTR(src) if((psvg) && (src)) { back = (f2l_svg_fill_pattern_t *)dk3sto_it_find_like( psvg->iPatterns, (void *)src, 0 ); if(!(back)) { if(0UL != (1UL + psvg->nPatterns)) { back = f2lsvgst_pattern_new(psvg); if(back) { dk3mem_cpy((void *)back, (void *)src, sizeof(f2l_svg_fill_pattern_t)); if(dk3sto_add(psvg->sPatterns, (void *)back)) { back->pn = psvg->nPatterns; psvg->nPatterns += 1UL; } else { f2lsvgst_pattern_delete(back); back = NULL; } } } else { psvg->ec = DK3_ERROR_MATH_OVERFLOW; } } } $? "- f2lsvgst_pattern_add %s", TR_PTR(back) return back; } f2l_svg_style_t * f2lsvgst_style_add(f2l_svg_t *psvg, f2l_svg_style_t *src) { f2l_svg_style_t *back = NULL; $? "+ f2lsvgst_style_add %s %s", TR_PTR(psvg), TR_PTR(src) if((psvg) && (src)) { back = (f2l_svg_style_t *)dk3sto_it_find_like( psvg->iStyles, (void *)src, 0 ); if(!(back)) { $? ". must create new style" if(0UL != (1UL + psvg->nStyles)) { $? ". no overflow" back = f2lsvgst_style_new(psvg); if(back) { $? ". allocated" dk3mem_cpy((void *)back, (void *)src, sizeof(f2l_svg_style_t)); if(dk3sto_add(psvg->sStyles, (void *)back)) { back->sn = psvg->nStyles; psvg->nStyles += 1UL; } else { f2lsvgst_style_delete(back); back = NULL; } } else { $? "! memory" } } else { psvg->ec = DK3_ERROR_MATH_OVERFLOW; } } else { $? ". style already found" } } $? "- f2lsvgst_style_add %s", TR_PTR(back) return back; } int f2lsvgst_style_set_pattern( f2l_svg_t *psvg, f2l_svg_style_t *pst, f2l_svg_fill_pattern_t *ppat ) { int back = 0; $? "+ f2lsvgst_style_set_pattern %s %s %s", TR_PTR(psvg), TR_PTR(pst), TR_PTR(ppat) if((psvg) && (pst) && (ppat)) { if(!(pst->fp)) { pst->fp = f2lsvgst_pattern_add(psvg, ppat); if(pst->fp) { back = 1; } } } $? "- f2lsvgst_style_set_pattern %d", back return back; } void f2lsvgst_style_set_text( f2l_svg_t *psvg, f2l_svg_style_t *pst, int ps, int tf, double ts ) { $? "+ f2lsvgst_style_set_text %s %s %d %lg", TR_PTR(psvg), TR_PTR(pst), tf, ts if(pst) { pst->tf = tf; pst->ts = ts; pst->flags |= (DK3_SVG_FLAGS_FONT); if(ps) { pst->flags |= (DK3_SVG_FLAGS_PS_FONT); } else { pst->flags &= (~(DK3_SVG_FLAGS_PS_FONT)); } } if((psvg) && (ps)) { if((0 <= tf) && (tf < 35)) { (psvg->psFontsUsed)[tf] = 1; } } $? "- f2lsvgst_style_set_text" } void f2lsvgst_style_set_line_width( f2l_svg_style_t *pst, double lw ) { $? "+ f2lsvgst_style_set_line_width %s %lg", TR_PTR(pst), lw if(pst) { pst->lw = lw; pst->flags |= (DK3_SVG_FLAGS_LINEWIDTH); } $? "- f2lsvgst_style_set_line_width" } void f2lsvgst_style_set_line_style( f2l_svg_style_t *pst, int ls, double lsv ) { $? "+ f2lsvgst_style_set_line_style %s %d %lg", TR_PTR(pst), ls, lsv if(pst) { pst->ls = ls; pst->lsv = lsv; pst->flags|= (DK3_SVG_FLAGS_LINESTYLE); } $? "- f2lsvgst_style_set_line_style" } void f2lsvgst_style_set_line_color( f2l_svg_style_t *pst, int r, int g, int b ) { $? "+ f2lsvgst_style_set_line_color %s %d %d %d", TR_PTR(pst), r, g, b if(pst) { pst->sr = r; pst->sg = g; pst->sb = b; pst->flags |= (DK3_SVG_FLAGS_COLOR_STROKE); } $? "- f2lsvgst_style_set_line_color" } void f2lsvgst_style_set_fill_color( f2l_svg_style_t *pst, int r, int g, int b ) { $? "+ f2lsvgst_style_set_fill_color %s %d %d %d", TR_PTR(pst), r, g, b if(pst) { pst->fr = r; pst->fg = g; pst->fb = b; pst->flags |= (DK3_SVG_FLAGS_COLOR_FILL); } $? "- f2lsvgst_style_set_fill_color" } int f2lsvgst_any_ps_font_used(f2l_svg_t *psvg) { size_t i; int back = 0; for(i = 0; i < 35; i++) { if((psvg->psFontsUsed)[i]) { back = 1; } } return back; } void f2lsvgst_style_set_text_align(f2l_svg_style_t *pst, int al) { if(pst) { pst->al = al; pst->flags |= (DK3_SVG_FLAGS_TEXT_ALIGN); } } void f2lsvgst_style_set_text_line_cap(f2l_svg_style_t *pst, int lc) { if(pst) { pst->lc = lc; pst->flags |= (DK3_SVG_FLAGS_LINE_CAP); } } void f2lsvgst_style_set_text_line_join(f2l_svg_style_t *pst, int lj) { if(pst) { pst->lj = lj; pst->flags |= (DK3_SVG_FLAGS_LINE_JOIN); } } /** Write one tag name, either with or without svg: prefix. @param job Job structure. @param ind Index of tag name in f2lsvgst_c8_kw. */ static void f2lsvgst_tag( f2l_job_t *job, size_t ind ) { if(job->fragment) { fputs(f2lsvgst_c8_kw[1], job->of1); } fputs(f2lsvgst_c8_kw[ind], job->of1); } /** Write a number as string. @param job Job structure. @param current Current value. @param max Maximum value. */ static void f2lsvgst_write_id( f2l_job_t *job, unsigned long current, unsigned long max ) { char buf[128]; char *ptr; size_t maxlgt; size_t lgt; size_t i; sprintf(buf, "%lu", max); maxlgt = strlen(buf); sprintf(buf, "%lu", current); lgt = strlen(buf); for(i = lgt; i < maxlgt; i++) { fputc('A', job->of1); } ptr = buf; while(*ptr) { switch(*ptr) { case '0': { *ptr = 'A'; } break; case '1': { *ptr = 'B'; } break; case '2': { *ptr = 'C'; } break; case '3': { *ptr = 'D'; } break; case '4': { *ptr = 'E'; } break; case '5': { *ptr = 'F'; } break; case '6': { *ptr = 'G'; } break; case '7': { *ptr = 'H'; } break; case '8': { *ptr = 'I'; } break; case '9': { *ptr = 'J'; } break; } ptr++; } fputs(buf, job->of1); } void f2lsvgst_write_pattern_id( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat ) { $? "+ f2lsvgst_pattern_id %lu %lu", pat->pn, psvg->nPatterns fputs(f2lsvgst_c8_kw[8], job->of1); f2lsvgst_write_id(job, pat->pn, psvg->nPatterns); $? "- f2lsvgst_pattern_id" } void f2lsvgst_write_style_id( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_style_t *pst ) { $? "+ f2lsvgst_style_id %lu %lu", pst->sn, psvg->nStyles fputs(f2lsvgst_c8_kw[111], job->of1); f2lsvgst_write_id(job, pst->sn, psvg->nStyles); $? "- f2lsvgst_style_id" } /** Write opening pattern tag. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. @param w Pattern width. @param h Pattern height. */ static void f2lsvgst_write_opening_pattern_tag( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat, double w, double h ) { fputs(f2lsvgst_c8_kw[6], job->of1); f2lsvgst_tag(job, 3); fputs(f2lsvgst_c8_kw[7], job->of1); f2lsvgst_write_pattern_id(job, drw, psvg, pat); fprintf(job->of1, f2lsvgst_c8_kw[9], w, h); } /** Write opening pattern tag. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. @param w Pattern width. @param h Pattern height. */ static void f2lsvgst_pattern_background( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat, double w, double h ) { fputs(f2lsvgst_c8_kw[6], job->of1); f2lsvgst_tag(job, 10); fprintf(job->of1, f2lsvgst_c8_kw[11], w, h); fprintf(job->of1, f2lsvgst_c8_kw[12], pat->fr, pat->fg, pat->fb); fputs(f2lsvgst_c8_kw[13], job->of1); } /** Draw foreground line in pattern. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. @param ind Index of points line in f2lsvgst_c8_kw. */ static void f2lsvgst_pattern_foreground_line( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat, size_t ind ) { fputs(f2lsvgst_c8_kw[6], job->of1); f2lsvgst_tag(job, 18); fprintf(job->of1, f2lsvgst_c8_kw[14], pat->sr, pat->sg, pat->sb); fputs(f2lsvgst_c8_kw[ind], job->of1); fputs(f2lsvgst_c8_kw[0], job->of1); fputs(f2lsvgst_c8_kw[13], job->of1); } /** Draw foreground line in pattern. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. @param ind Index of points line in f2lsvgst_c8_kw. */ static void f2lsvgst_pattern_foreground_line_lcr( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat, size_t ind ) { fputs(f2lsvgst_c8_kw[6], job->of1); f2lsvgst_tag(job, 18); fputs(f2lsvgst_c8_kw[0], job->of1); fprintf(job->of1, f2lsvgst_c8_kw[22], pat->sr, pat->sg, pat->sb); fputs(f2lsvgst_c8_kw[0], job->of1); fputs(f2lsvgst_c8_kw[ind], job->of1); fputs(f2lsvgst_c8_kw[0], job->of1); fputs(f2lsvgst_c8_kw[13], job->of1); } /** Draw foreground polygon in pattern. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. @param ind Index of points line in f2lsvgst_c8_kw. */ static void f2lsvgst_pattern_foreground_polygon_lcr( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat, size_t ind ) { fputs(f2lsvgst_c8_kw[6], job->of1); f2lsvgst_tag(job, 51); fputs(f2lsvgst_c8_kw[0], job->of1); fprintf(job->of1, f2lsvgst_c8_kw[22], pat->sr, pat->sg, pat->sb); fputs(f2lsvgst_c8_kw[0], job->of1); fputs(f2lsvgst_c8_kw[ind], job->of1); fputs(f2lsvgst_c8_kw[0], job->of1); fputs(f2lsvgst_c8_kw[13], job->of1); } /** Draw foreground polygon in pattern, 2 data lines. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. @param i1 Index of points line in f2lsvgst_c8_kw. @param i2 Index of points line 2. */ static void f2lsvgst_pattern_foreground_polygon_lcr_l2( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat, size_t i1, size_t i2 ) { fputs(f2lsvgst_c8_kw[6], job->of1); f2lsvgst_tag(job, 51); fputs(f2lsvgst_c8_kw[0], job->of1); fprintf(job->of1, f2lsvgst_c8_kw[22], pat->sr, pat->sg, pat->sb); fputs(f2lsvgst_c8_kw[0], job->of1); fputs(f2lsvgst_c8_kw[i1], job->of1); fputs(f2lsvgst_c8_kw[0], job->of1); fputs(f2lsvgst_c8_kw[i2], job->of1); fputs(f2lsvgst_c8_kw[0], job->of1); fputs(f2lsvgst_c8_kw[13], job->of1); } /** Draw foreground path in pattern @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. @param ind Index of data line in f2lsvgst_c8_kw. */ static void f2lsvgst_pattern_foreground_path_lcr( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat, size_t ind ) { fputs(f2lsvgst_c8_kw[6], job->of1); f2lsvgst_tag(job, 89); fputs(f2lsvgst_c8_kw[0], job->of1); fprintf(job->of1, f2lsvgst_c8_kw[22], pat->sr, pat->sg, pat->sb); fputs(f2lsvgst_c8_kw[0], job->of1); fputs(f2lsvgst_c8_kw[ind], job->of1); fputs(f2lsvgst_c8_kw[0], job->of1); fputs(f2lsvgst_c8_kw[13], job->of1); } /** Draw foreground circle in pattern @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. */ static void f2lsvgst_pattern_foreground_circle_lcr( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat ) { fputs(f2lsvgst_c8_kw[6], job->of1); f2lsvgst_tag(job, 100); fputs(f2lsvgst_c8_kw[102], job->of1); fputs(f2lsvgst_c8_kw[0], job->of1); fprintf(job->of1, f2lsvgst_c8_kw[101], pat->sr, pat->sg, pat->sb); fputs(f2lsvgst_c8_kw[0], job->of1); fputs(f2lsvgst_c8_kw[13], job->of1); } /** Write pattern 41 definition to SVG output file. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. */ static void f2lsvgst_pattern_41( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat ) { /* Opening pattern tag. */ f2lsvgst_write_opening_pattern_tag(job, drw, psvg, pat, 7.2, 4.16); /* Pattern contents 1: background. */ f2lsvgst_pattern_background(job, drw, psvg, pat, 7.2, 4.16); /* Pattern contents 2: lines. */ f2lsvgst_pattern_foreground_line(job, drw, psvg, pat, 15); f2lsvgst_pattern_foreground_line(job, drw, psvg, pat, 16); f2lsvgst_pattern_foreground_line(job, drw, psvg, pat, 17); /* Close pattern tag. */ fputs(f2lsvgst_c8_kw[6], job->of1); fputs(f2lsvgst_c8_kw[4], job->of1); f2lsvgst_tag(job, 3); fputs(f2lsvgst_c8_kw[5], job->of1); fputs(f2lsvgst_c8_kw[0], job->of1); } /** Write pattern 42 definition to SVG output file. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. */ static void f2lsvgst_pattern_42( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat ) { /* Opening pattern tag. */ f2lsvgst_write_opening_pattern_tag(job, drw, psvg, pat, 7.2, 4.16); /* Pattern contents 1: background. */ f2lsvgst_pattern_background(job, drw, psvg, pat, 7.2, 4.16); /* Pattern contents 2: lines. */ f2lsvgst_pattern_foreground_line(job, drw, psvg, pat, 19); f2lsvgst_pattern_foreground_line(job, drw, psvg, pat, 20); f2lsvgst_pattern_foreground_line(job, drw, psvg, pat, 21); /* Close pattern tag. */ fputs(f2lsvgst_c8_kw[6], job->of1); fputs(f2lsvgst_c8_kw[4], job->of1); f2lsvgst_tag(job, 3); fputs(f2lsvgst_c8_kw[5], job->of1); fputs(f2lsvgst_c8_kw[0], job->of1); } /** Write pattern 43 definition to SVG output file. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. */ static void f2lsvgst_pattern_43( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat ) { /* Opening pattern tag. */ f2lsvgst_write_opening_pattern_tag(job, drw, psvg, pat, 7.2, 4.16); /* Pattern contents 1: background. */ f2lsvgst_pattern_background(job, drw, psvg, pat, 7.2, 4.16); /* Pattern contents 2: lines. */ #if 1 f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 23); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 24); #else f2lsvgst_pattern_foreground_line(job, drw, psvg, pat, 15); f2lsvgst_pattern_foreground_line(job, drw, psvg, pat, 16); f2lsvgst_pattern_foreground_line(job, drw, psvg, pat, 17); f2lsvgst_pattern_foreground_line(job, drw, psvg, pat, 19); f2lsvgst_pattern_foreground_line(job, drw, psvg, pat, 20); f2lsvgst_pattern_foreground_line(job, drw, psvg, pat, 21); #endif /* Close pattern tag. */ fputs(f2lsvgst_c8_kw[6], job->of1); fputs(f2lsvgst_c8_kw[4], job->of1); f2lsvgst_tag(job, 3); fputs(f2lsvgst_c8_kw[5], job->of1); fputs(f2lsvgst_c8_kw[0], job->of1); } /** Write pattern 44 definition to SVG output file. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. */ static void f2lsvgst_pattern_44( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat ) { /* Opening pattern tag. */ f2lsvgst_write_opening_pattern_tag(job, drw, psvg, pat, 10.18, 10.18); /* Pattern contents 1: background. */ f2lsvgst_pattern_background(job, drw, psvg, pat, 10.18, 10.18); /* Pattern contents 2: lines. */ f2lsvgst_pattern_foreground_line(job, drw, psvg, pat, 25); f2lsvgst_pattern_foreground_line(job, drw, psvg, pat, 26); f2lsvgst_pattern_foreground_line(job, drw, psvg, pat, 27); /* Close pattern tag. */ fputs(f2lsvgst_c8_kw[6], job->of1); fputs(f2lsvgst_c8_kw[4], job->of1); f2lsvgst_tag(job, 3); fputs(f2lsvgst_c8_kw[5], job->of1); fputs(f2lsvgst_c8_kw[0], job->of1); } /** Write pattern 45 definition to SVG output file. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. */ static void f2lsvgst_pattern_45( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat ) { /* Opening pattern tag. */ f2lsvgst_write_opening_pattern_tag(job, drw, psvg, pat, 10.18, 10.18); /* Pattern contents 1: background. */ f2lsvgst_pattern_background(job, drw, psvg, pat, 10.18, 10.18); /* Pattern contents 2: lines. */ f2lsvgst_pattern_foreground_line(job, drw, psvg, pat, 28); f2lsvgst_pattern_foreground_line(job, drw, psvg, pat, 29); f2lsvgst_pattern_foreground_line(job, drw, psvg, pat, 30); /* Close pattern tag. */ fputs(f2lsvgst_c8_kw[6], job->of1); fputs(f2lsvgst_c8_kw[4], job->of1); f2lsvgst_tag(job, 3); fputs(f2lsvgst_c8_kw[5], job->of1); fputs(f2lsvgst_c8_kw[0], job->of1); } /** Write pattern 46 definition to SVG output file. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. */ static void f2lsvgst_pattern_46( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat ) { /* Opening pattern tag. */ f2lsvgst_write_opening_pattern_tag(job, drw, psvg, pat, 10.18, 10.18); /* Pattern contents 1: background. */ f2lsvgst_pattern_background(job, drw, psvg, pat, 10.18, 10.18); /* Pattern contents 2: lines. */ #if 1 f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 31); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 32); #else f2lsvgst_pattern_foreground_line(job, drw, psvg, pat, 25); f2lsvgst_pattern_foreground_line(job, drw, psvg, pat, 26); f2lsvgst_pattern_foreground_line(job, drw, psvg, pat, 27); f2lsvgst_pattern_foreground_line(job, drw, psvg, pat, 28); f2lsvgst_pattern_foreground_line(job, drw, psvg, pat, 29); f2lsvgst_pattern_foreground_line(job, drw, psvg, pat, 30); #endif /* Close pattern tag. */ fputs(f2lsvgst_c8_kw[6], job->of1); fputs(f2lsvgst_c8_kw[4], job->of1); f2lsvgst_tag(job, 3); fputs(f2lsvgst_c8_kw[5], job->of1); fputs(f2lsvgst_c8_kw[0], job->of1); } /** Write pattern 47 definition to SVG output file. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. */ static void f2lsvgst_pattern_47( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat ) { /* Opening pattern tag. */ f2lsvgst_write_opening_pattern_tag(job, drw, psvg, pat, 28.8, 14.4); /* Pattern contents 1: background. */ f2lsvgst_pattern_background(job, drw, psvg, pat, 28.8, 14.4); /* Pattern contents 2: lines. */ f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 33); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 34); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 35); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 36); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 37); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 38); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 39); /* Close pattern tag. */ fputs(f2lsvgst_c8_kw[6], job->of1); fputs(f2lsvgst_c8_kw[4], job->of1); f2lsvgst_tag(job, 3); fputs(f2lsvgst_c8_kw[5], job->of1); fputs(f2lsvgst_c8_kw[0], job->of1); } /** Write pattern 48 definition to SVG output file. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. */ static void f2lsvgst_pattern_48( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat ) { /* Opening pattern tag. */ f2lsvgst_write_opening_pattern_tag(job, drw, psvg, pat, 14.4, 28.8); /* Pattern contents 1: background. */ f2lsvgst_pattern_background(job, drw, psvg, pat, 14.4, 28.8); /* Pattern contents 2: lines. */ f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 40); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 41); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 42); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 43); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 44); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 45); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 46); /* Close pattern tag. */ fputs(f2lsvgst_c8_kw[6], job->of1); fputs(f2lsvgst_c8_kw[4], job->of1); f2lsvgst_tag(job, 3); fputs(f2lsvgst_c8_kw[5], job->of1); fputs(f2lsvgst_c8_kw[0], job->of1); } /** Write pattern 49 definition to SVG output file. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. */ static void f2lsvgst_pattern_49( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat ) { /* Opening pattern tag. */ f2lsvgst_write_opening_pattern_tag(job, drw, psvg, pat, 3.6, 3.6); /* Pattern contents 1: background. */ f2lsvgst_pattern_background(job, drw, psvg, pat, 3.6, 3.6); /* Pattern contents 2: lines. */ f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 47); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 48); /* Close pattern tag. */ fputs(f2lsvgst_c8_kw[6], job->of1); fputs(f2lsvgst_c8_kw[4], job->of1); f2lsvgst_tag(job, 3); fputs(f2lsvgst_c8_kw[5], job->of1); fputs(f2lsvgst_c8_kw[0], job->of1); } /** Write pattern 50 definition to SVG output file. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. */ static void f2lsvgst_pattern_50( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat ) { /* Opening pattern tag. */ f2lsvgst_write_opening_pattern_tag(job, drw, psvg, pat, 3.6, 3.6); /* Pattern contents 1: background. */ f2lsvgst_pattern_background(job, drw, psvg, pat, 3.6, 3.6); /* Pattern contents 2: lines. */ f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 49); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 50); /* Close pattern tag. */ fputs(f2lsvgst_c8_kw[6], job->of1); fputs(f2lsvgst_c8_kw[4], job->of1); f2lsvgst_tag(job, 3); fputs(f2lsvgst_c8_kw[5], job->of1); fputs(f2lsvgst_c8_kw[0], job->of1); } /** Write pattern 51 definition to SVG output file. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. */ static void f2lsvgst_pattern_51( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat ) { /* Opening pattern tag. */ f2lsvgst_write_opening_pattern_tag(job, drw, psvg, pat, 3.6, 3.6); /* Pattern contents 1: background. */ f2lsvgst_pattern_background(job, drw, psvg, pat, 3.6, 3.6); /* Pattern contents 2: lines. */ f2lsvgst_pattern_foreground_polygon_lcr(job, drw, psvg, pat, 52); /* Close pattern tag. */ fputs(f2lsvgst_c8_kw[6], job->of1); fputs(f2lsvgst_c8_kw[4], job->of1); f2lsvgst_tag(job, 3); fputs(f2lsvgst_c8_kw[5], job->of1); fputs(f2lsvgst_c8_kw[0], job->of1); } /** Write pattern 52 definition to SVG output file. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. */ static void f2lsvgst_pattern_52( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat ) { /* Opening pattern tag. */ f2lsvgst_write_opening_pattern_tag(job, drw, psvg, pat, 14.4, 28.8); /* Pattern contents 1: background. */ f2lsvgst_pattern_background(job, drw, psvg, pat, 14.4, 28.8); /* Pattern contents 2: lines. */ f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 53); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 54); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 55); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 56); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 57); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 58); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 59); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 60); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 61); /* Close pattern tag. */ fputs(f2lsvgst_c8_kw[6], job->of1); fputs(f2lsvgst_c8_kw[4], job->of1); f2lsvgst_tag(job, 3); fputs(f2lsvgst_c8_kw[5], job->of1); fputs(f2lsvgst_c8_kw[0], job->of1); } /** Write pattern 53 definition to SVG output file. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. */ static void f2lsvgst_pattern_53( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat ) { /* Opening pattern tag. */ f2lsvgst_write_opening_pattern_tag(job, drw, psvg, pat, 14.4, 28.8); /* Pattern contents 1: background. */ f2lsvgst_pattern_background(job, drw, psvg, pat, 14.4, 28.8); /* Pattern contents 2: lines. */ f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 62); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 63); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 64); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 65); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 66); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 67); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 68); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 69); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 70); /* Close pattern tag. */ fputs(f2lsvgst_c8_kw[6], job->of1); fputs(f2lsvgst_c8_kw[4], job->of1); f2lsvgst_tag(job, 3); fputs(f2lsvgst_c8_kw[5], job->of1); fputs(f2lsvgst_c8_kw[0], job->of1); } /** Write pattern 54 definition to SVG output file. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. */ static void f2lsvgst_pattern_54( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat ) { /* Opening pattern tag. */ f2lsvgst_write_opening_pattern_tag(job, drw, psvg, pat, 28.8, 14.4); /* Pattern contents 1: background. */ f2lsvgst_pattern_background(job, drw, psvg, pat, 28.8, 14.4); /* Pattern contents 2: lines. */ f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 71); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 72); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 73); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 74); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 75); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 76); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 77); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 78); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 79); /* Close pattern tag. */ fputs(f2lsvgst_c8_kw[6], job->of1); fputs(f2lsvgst_c8_kw[4], job->of1); f2lsvgst_tag(job, 3); fputs(f2lsvgst_c8_kw[5], job->of1); fputs(f2lsvgst_c8_kw[0], job->of1); } /** Write pattern 55 definition to SVG output file. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. */ static void f2lsvgst_pattern_55( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat ) { /* Opening pattern tag. */ f2lsvgst_write_opening_pattern_tag(job, drw, psvg, pat, 28.8, 14.4); /* Pattern contents 1: background. */ f2lsvgst_pattern_background(job, drw, psvg, pat, 28.8, 14.4); /* Pattern contents 2: lines. */ f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 80); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 81); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 82); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 83); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 84); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 85); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 86); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 87); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 88); /* Close pattern tag. */ fputs(f2lsvgst_c8_kw[6], job->of1); fputs(f2lsvgst_c8_kw[4], job->of1); f2lsvgst_tag(job, 3); fputs(f2lsvgst_c8_kw[5], job->of1); fputs(f2lsvgst_c8_kw[0], job->of1); } /** Write pattern 56 definition to SVG output file. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. */ static void f2lsvgst_pattern_56( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat ) { /* Opening pattern tag. */ f2lsvgst_write_opening_pattern_tag(job, drw, psvg, pat, 14.54, 7.4); /* Pattern contents 1: background. */ f2lsvgst_pattern_background(job, drw, psvg, pat, 14.54, 7.4); /* Pattern contents 2: lines. */ f2lsvgst_pattern_foreground_path_lcr(job, drw, psvg, pat, 90); f2lsvgst_pattern_foreground_path_lcr(job, drw, psvg, pat, 91); f2lsvgst_pattern_foreground_path_lcr(job, drw, psvg, pat, 92); f2lsvgst_pattern_foreground_path_lcr(job, drw, psvg, pat, 93); f2lsvgst_pattern_foreground_path_lcr(job, drw, psvg, pat, 94); /* Close pattern tag. */ fputs(f2lsvgst_c8_kw[6], job->of1); fputs(f2lsvgst_c8_kw[4], job->of1); f2lsvgst_tag(job, 3); fputs(f2lsvgst_c8_kw[5], job->of1); fputs(f2lsvgst_c8_kw[0], job->of1); } /** Write pattern 57 definition to SVG output file. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. */ static void f2lsvgst_pattern_57( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat ) { /* Opening pattern tag. */ f2lsvgst_write_opening_pattern_tag(job, drw, psvg, pat, 7.2, 7.2); /* Pattern contents 1: background. */ f2lsvgst_pattern_background(job, drw, psvg, pat, 7.2, 7.2); /* Pattern contents 2: lines. */ f2lsvgst_pattern_foreground_path_lcr(job, drw, psvg, pat, 95); f2lsvgst_pattern_foreground_path_lcr(job, drw, psvg, pat, 96); f2lsvgst_pattern_foreground_path_lcr(job, drw, psvg, pat, 97); f2lsvgst_pattern_foreground_path_lcr(job, drw, psvg, pat, 98); f2lsvgst_pattern_foreground_path_lcr(job, drw, psvg, pat, 99); /* Close pattern tag. */ fputs(f2lsvgst_c8_kw[6], job->of1); fputs(f2lsvgst_c8_kw[4], job->of1); f2lsvgst_tag(job, 3); fputs(f2lsvgst_c8_kw[5], job->of1); fputs(f2lsvgst_c8_kw[0], job->of1); } /** Write pattern 58 definition to SVG output file. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. */ static void f2lsvgst_pattern_58( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat ) { /* Opening pattern tag. */ f2lsvgst_write_opening_pattern_tag(job, drw, psvg, pat, 14.4, 14.4); /* Pattern contents 1: background. */ f2lsvgst_pattern_background(job, drw, psvg, pat, 14.4, 14.4); /* Pattern contents 2: lines. */ f2lsvgst_pattern_foreground_circle_lcr(job, drw, psvg, pat); /* Close pattern tag. */ fputs(f2lsvgst_c8_kw[6], job->of1); fputs(f2lsvgst_c8_kw[4], job->of1); f2lsvgst_tag(job, 3); fputs(f2lsvgst_c8_kw[5], job->of1); fputs(f2lsvgst_c8_kw[0], job->of1); } /** Write pattern 59 definition to SVG output file. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. */ static void f2lsvgst_pattern_59( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat ) { /* Opening pattern tag. */ f2lsvgst_write_opening_pattern_tag(job, drw, psvg, pat, 21.6, 12.47); /* Pattern contents 1: background. */ f2lsvgst_pattern_background(job, drw, psvg, pat, 21.6, 12.47); /* Pattern contents 2: lines. */ f2lsvgst_pattern_foreground_polygon_lcr(job, drw, psvg, pat, 103); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 104); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 105); f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 106); /* Close pattern tag. */ fputs(f2lsvgst_c8_kw[6], job->of1); fputs(f2lsvgst_c8_kw[4], job->of1); f2lsvgst_tag(job, 3); fputs(f2lsvgst_c8_kw[5], job->of1); fputs(f2lsvgst_c8_kw[0], job->of1); } /** Write pattern 60 definition to SVG output file. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. */ static void f2lsvgst_pattern_60( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat ) { /* Opening pattern tag. */ f2lsvgst_write_opening_pattern_tag(job, drw, psvg, pat, 14.4, 14.4); /* Pattern contents 1: background. */ f2lsvgst_pattern_background(job, drw, psvg, pat, 14.4, 14.4); /* Pattern contents 2: lines. */ f2lsvgst_pattern_foreground_polygon_lcr_l2(job, drw, psvg, pat, 107, 108); /* Close pattern tag. */ fputs(f2lsvgst_c8_kw[6], job->of1); fputs(f2lsvgst_c8_kw[4], job->of1); f2lsvgst_tag(job, 3); fputs(f2lsvgst_c8_kw[5], job->of1); fputs(f2lsvgst_c8_kw[0], job->of1); } /** Write pattern 61 definition to SVG output file. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. */ static void f2lsvgst_pattern_61( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat ) { /* Opening pattern tag. */ f2lsvgst_write_opening_pattern_tag(job, drw, psvg, pat, 7.2, 7.2); /* Pattern contents 1: background. */ f2lsvgst_pattern_background(job, drw, psvg, pat, 7.2, 7.2); /* Pattern contents 2: lines. */ f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 109); /* Close pattern tag. */ fputs(f2lsvgst_c8_kw[6], job->of1); fputs(f2lsvgst_c8_kw[4], job->of1); f2lsvgst_tag(job, 3); fputs(f2lsvgst_c8_kw[5], job->of1); fputs(f2lsvgst_c8_kw[0], job->of1); } /** Write pattern 62 definition to SVG output file. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. */ static void f2lsvgst_pattern_62( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat ) { /* Opening pattern tag. */ f2lsvgst_write_opening_pattern_tag(job, drw, psvg, pat, 7.2, 7.2); /* Pattern contents 1: background. */ f2lsvgst_pattern_background(job, drw, psvg, pat, 7.2, 7.2); /* Pattern contents 2: lines. */ f2lsvgst_pattern_foreground_line_lcr(job, drw, psvg, pat, 110); /* Close pattern tag. */ fputs(f2lsvgst_c8_kw[6], job->of1); fputs(f2lsvgst_c8_kw[4], job->of1); f2lsvgst_tag(job, 3); fputs(f2lsvgst_c8_kw[5], job->of1); fputs(f2lsvgst_c8_kw[0], job->of1); } /** Write one pattern definition to SVG output file. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pat Pattern to write. */ static void f2lsvgst_write_one_pattern( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_fill_pattern_t *pat ) { switch(pat->fn) { case 41: { f2lsvgst_pattern_41(job, drw, psvg, pat); } break; case 42: { f2lsvgst_pattern_42(job, drw, psvg, pat); } break; case 43: { f2lsvgst_pattern_43(job, drw, psvg, pat); } break; case 44: { f2lsvgst_pattern_44(job, drw, psvg, pat); } break; case 45: { f2lsvgst_pattern_45(job, drw, psvg, pat); } break; case 46: { f2lsvgst_pattern_46(job, drw, psvg, pat); } break; case 47: { f2lsvgst_pattern_47(job, drw, psvg, pat); } break; case 48: { f2lsvgst_pattern_48(job, drw, psvg, pat); } break; case 49: { f2lsvgst_pattern_49(job, drw, psvg, pat); } break; case 50: { f2lsvgst_pattern_50(job, drw, psvg, pat); } break; case 51: { f2lsvgst_pattern_51(job, drw, psvg, pat); } break; case 52: { f2lsvgst_pattern_52(job, drw, psvg, pat); } break; case 53: { f2lsvgst_pattern_53(job, drw, psvg, pat); } break; case 54: { f2lsvgst_pattern_54(job, drw, psvg, pat); } break; case 55: { f2lsvgst_pattern_55(job, drw, psvg, pat); } break; case 56: { f2lsvgst_pattern_56(job, drw, psvg, pat); } break; case 57: { f2lsvgst_pattern_57(job, drw, psvg, pat); } break; case 58: { f2lsvgst_pattern_58(job, drw, psvg, pat); } break; case 59: { f2lsvgst_pattern_59(job, drw, psvg, pat); } break; case 60: { f2lsvgst_pattern_60(job, drw, psvg, pat); } break; case 61: { f2lsvgst_pattern_61(job, drw, psvg, pat); } break; case 62: { f2lsvgst_pattern_62(job, drw, psvg, pat); } break; } } void f2lsvgst_write_patterns( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg ) { f2l_svg_fill_pattern_t *pat; if((psvg->sPatterns) && (psvg->iPatterns)) { dk3sto_it_reset(psvg->iPatterns); do { pat = (f2l_svg_fill_pattern_t *)dk3sto_it_next(psvg->iPatterns); if(pat) { f2lsvgst_write_one_pattern(job, drw, psvg, pat); } } while(pat); } } /** Write one style to SVG output file. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pst Style definition to write. */ static void f2lsvgst_write_one_style( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_style_t *pst ) { char const * const *rffn; /* Replacement font family name. */ double ts; /* Text size. */ double gw; /* Gap width in line styles. */ int ff; /* Font family */ if(pst->tf < 0) { pst->tf = 0; } if(pst->tf > 34) { pst->tf = 34; } fputs(f2lsvgst_c8_kw[112], job->of1); f2lsvgst_write_style_id(job, drw, psvg, pst); fputs(f2lsvgst_c8_kw[113], job->of1); if((pst->flags) & DK3_SVG_FLAGS_FONT) { if((pst->flags) & DK3_SVG_FLAGS_PS_FONT) { /* Font family */ fputs(f2lsvgst_c8_kw[115], job->of1); fputs(dk3font_get_svg_family(pst->tf), job->of1); if(job->otherfonts) { /* PS family name. */ fputs(f2lsvgst_c8_kw[187], job->of1); fputs(dk3font_get_ps_family(pst->tf), job->of1); /* Replacement family names. */ rffn = dk3font_get_replacement_families(pst->tf); while(*rffn) { fputs(f2lsvgst_c8_kw[187], job->of1); fputs(*rffn, job->of1); rffn++; } } ff = dk3font_get_svg_features(pst->tf); switch(ff & DK3_FONT_FAMILY) { case DK3_FONT_TYPEWRITER: { fputs(f2lsvgst_c8_kw[118], job->of1); } break; case DK3_FONT_SANS_SERIF: { fputs(f2lsvgst_c8_kw[117], job->of1); } break; default: { fputs(f2lsvgst_c8_kw[116], job->of1); } break; } /* Font style */ if(ff & DK3_FONT_OBLIQUE) { fputs(f2lsvgst_c8_kw[121], job->of1); } else { if(ff & DK3_FONT_ITALIC) { fputs(f2lsvgst_c8_kw[120], job->of1); } else { #if 0 /* 2013-01-27: This is the default. */ fputs(f2lsvgst_c8_kw[119], job->of1); #endif } } /* Font weight */ ff = dk3font_get_svg_font_weight(pst->tf); fprintf(job->of1, f2lsvgst_c8_kw[122], ff); } else { /* Font family, style, weight */ switch(pst->tf) { case 5: { /* Typewriter */ fputs(f2lsvgst_c8_kw[125], job->of1); #if 0 /* 2013-01-27: This is the default. */ fputs(f2lsvgst_c8_kw[126], job->of1); fputs(f2lsvgst_c8_kw[128], job->of1); #endif } break; case 4: { /* Sans-serif */ fputs(f2lsvgst_c8_kw[124], job->of1); #if 0 /* 2013-01-27: This is the default. */ fputs(f2lsvgst_c8_kw[126], job->of1); fputs(f2lsvgst_c8_kw[128], job->of1); #endif } break; case 3: { /* Italic serif */ fputs(f2lsvgst_c8_kw[123], job->of1); fputs(f2lsvgst_c8_kw[127], job->of1); #if 0 /* 2013-01-27: This is the default. */ fputs(f2lsvgst_c8_kw[128], job->of1); #endif } break; case 2: { /* Bold serif */ fputs(f2lsvgst_c8_kw[123], job->of1); #if 0 /* 2013-01-27: This is the default. */ fputs(f2lsvgst_c8_kw[126], job->of1); #endif fputs(f2lsvgst_c8_kw[129], job->of1); } break; default: { /* Default font (serif) */ fputs(f2lsvgst_c8_kw[123], job->of1); #if 0 /* 2013-01-27: This is the default. */ fputs(f2lsvgst_c8_kw[126], job->of1); fputs(f2lsvgst_c8_kw[128], job->of1); #endif } break; } } /* Font size */ ts = pst->ts; if(0.0 < job->nts) { ts = ts * job->nts; } fprintf(job->of1, f2lsvgst_c8_kw[130], ts); } /* Text align */ if((pst->flags) & DK3_SVG_FLAGS_TEXT_ALIGN) { switch(pst->al) { case 2: { fputs(f2lsvgst_c8_kw[133], job->of1); } break; case 1: { fputs(f2lsvgst_c8_kw[132], job->of1); } break; default: { #if 0 /* 2013-01-27: This is the default. */ fputs(f2lsvgst_c8_kw[131], job->of1); #endif } break; } } /* Fill pattern or color fill */ if(pst->fp) { fputs(f2lsvgst_c8_kw[134], job->of1); f2lsvgst_write_pattern_id(job, drw, psvg, pst->fp); fputs(f2lsvgst_c8_kw[135], job->of1); } else { if((pst->flags) & DK3_SVG_FLAGS_COLOR_FILL) { if((pst->flags) & DK3_SVG_FLAGS_FONT) { fprintf(job->of1, f2lsvgst_c8_kw[183], pst->fr, pst->fg, pst->fb); } else { fprintf(job->of1, f2lsvgst_c8_kw[136], pst->fr, pst->fg, pst->fb); } } else { /* No fill */ fputs(f2lsvgst_c8_kw[137], job->of1); } } /* Stroke color stroke */ if((pst->flags) & DK3_SVG_FLAGS_COLOR_STROKE) { fprintf(job->of1, f2lsvgst_c8_kw[138], pst->sr, pst->sg, pst->sb); } /* Stroke linewidth stroke-width */ if((pst->flags) & DK3_SVG_FLAGS_LINEWIDTH) { fprintf(job->of1, f2lsvgst_c8_kw[139], pst->lw); } /* Stroke linestyle stroke-dasharray */ if((pst->flags) & DK3_SVG_FLAGS_LINESTYLE) { if((pst->flags) & DK3_SVG_FLAGS_LINEWIDTH) { if(0 != pst->ls) { gw = f2lto_find_gap_length(job, pst->lw, pst->lsv); fputs(f2lsvgst_c8_kw[146], job->of1); switch(pst->ls) { case DK3_FIG_LS_DASH_TRIPLE_DOTTED: { fprintf( job->of1, f2lsvgst_c8_kw[152], pst->lsv, gw, pst->lw, gw, pst->lw, gw, pst->lw, gw ); } break; case DK3_FIG_LS_DASH_DOUBLE_DOTTED: { fprintf( job->of1, f2lsvgst_c8_kw[151], pst->lsv, gw, pst->lw, gw, pst->lw, gw ); } break; case DK3_FIG_LS_DASH_DOTTED: { fprintf( job->of1, f2lsvgst_c8_kw[150], pst->lsv, gw, pst->lw, gw ); } break; case DK3_FIG_LS_DOTTED: { fprintf( job->of1, f2lsvgst_c8_kw[149], pst->lw, gw ); } break; case DK3_FIG_LS_DASHED: { fprintf( job->of1, f2lsvgst_c8_kw[149], pst->lsv, gw ); } break; default: { fputs(f2lsvgst_c8_kw[148], job->of1); } break; } fputs(f2lsvgst_c8_kw[147], job->of1); } } } /* Linecap stroke-linecap */ if((pst->flags) & DK3_SVG_FLAGS_LINE_CAP) { if(DK3_FIG_LC_BUTT != pst->lc) { switch(pst->lc) { case DK3_FIG_LC_PROJECTING: { fputs(f2lsvgst_c8_kw[140], job->of1); } break; case DK3_FIG_LC_ROUND: { fputs(f2lsvgst_c8_kw[141], job->of1); } break; default: { #if 0 /* 2013-01-27: This is the default. */ fputs(f2lsvgst_c8_kw[142], job->of1); #endif } break; } } } /* Linejoin stroke-linejoin */ if((pst->flags) & DK3_SVG_FLAGS_LINE_JOIN) { switch(pst->lj) { case DK3_FIG_LJ_BEVEL: { fputs(f2lsvgst_c8_kw[143], job->of1); } break; case DK3_FIG_LJ_ROUND: { fputs(f2lsvgst_c8_kw[144], job->of1); } break; default: { #if 0 /* 2013-01-27: This is the default. */ fputs(f2lsvgst_c8_kw[145], job->of1); #endif if(job->miterlim) { fputs(f2lsvgst_c8_kw[185], job->of1); } } break; } } /* End */ fputs(f2lsvgst_c8_kw[114], job->of1); } /** Write attributes for one style to SVG output file. @param job Job structure. @param drw Drawing structure. @param psvg SVG style collection. @param pst Style definition to write. */ static void f2lsvgst_write_attributes_for_one_style( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, f2l_svg_style_t *pst ) { char const * const *rffn; /* Replacement font family names. */ int ff; /* Font family and flags. */ double ts; /* Font size. */ double gw; /* Gap width in line styles. */ if((pst->flags) & DK3_SVG_FLAGS_FONT) { ff = dk3font_get_svg_features(pst->tf); ts = pst->ts; if(0.0 < job->nts) { ts = ts * job->nts; } /* Font family, font style, font weight, text size. */ if((pst->flags) & DK3_SVG_FLAGS_PS_FONT) { fputs(f2lsvgst_c8_kw[153], job->of1); fputs(dk3font_get_svg_family(pst->tf), job->of1); if(job->otherfonts) { /* PS family name. */ fputs(f2lsvgst_c8_kw[188], job->of1); fputs(dk3font_get_ps_family(pst->tf), job->of1); /* Replacement family names. */ rffn = dk3font_get_replacement_families(pst->tf); while(*rffn) { fputs(f2lsvgst_c8_kw[188], job->of1); fputs(*rffn, job->of1); rffn++; } } switch(ff & DK3_FONT_FAMILY) { case DK3_FONT_TYPEWRITER: { fputs(f2lsvgst_c8_kw[156], job->of1); } break; case DK3_FONT_SANS_SERIF: { fputs(f2lsvgst_c8_kw[155], job->of1); } break; default: { fputs(f2lsvgst_c8_kw[154], job->of1); } break; } if(ff & DK3_FONT_OBLIQUE) { fputs(f2lsvgst_c8_kw[157], job->of1); } else { if(ff & DK3_FONT_ITALIC) { fputs(f2lsvgst_c8_kw[158], job->of1); } } fprintf( job->of1, f2lsvgst_c8_kw[159], dk3font_get_svg_font_weight(pst->tf) ); } else { switch(pst->tf) { case 5: { /* typewriter */ fputs(f2lsvgst_c8_kw[163], job->of1); } break; case 4: { /* sans-serif */ fputs(f2lsvgst_c8_kw[162], job->of1); } break; case 3: { /* serif italic */ fputs(f2lsvgst_c8_kw[161], job->of1); fputs(f2lsvgst_c8_kw[158], job->of1); } break; case 2: { /* serif bold */ fputs(f2lsvgst_c8_kw[161], job->of1); fputs(f2lsvgst_c8_kw[164], job->of1); } break; default: { /* serif */ fputs(f2lsvgst_c8_kw[161], job->of1); } break; } } fprintf(job->of1, f2lsvgst_c8_kw[160], ts); /* Text align. */ if((pst->flags) & DK3_SVG_FLAGS_TEXT_ALIGN) { switch(pst->al) { case 2: { fputs(f2lsvgst_c8_kw[166], job->of1); } break; case 1: { fputs(f2lsvgst_c8_kw[165], job->of1); } break; } } } /* Fill pattern or color. */ if(pst->fp) { fputs(f2lsvgst_c8_kw[167], job->of1); f2lsvgst_write_pattern_id(job, drw, psvg, pst->fp); fputs(f2lsvgst_c8_kw[168], job->of1); } else { if((pst->flags) & DK3_SVG_FLAGS_COLOR_FILL) { if((pst->flags) & DK3_SVG_FLAGS_FONT) { fprintf(job->of1, f2lsvgst_c8_kw[169], pst->fr, pst->fg, pst->fb); } else { fprintf(job->of1, f2lsvgst_c8_kw[184], pst->fr, pst->fg, pst->fb); } } else { fputs(f2lsvgst_c8_kw[170], job->of1); } } /* Stroke color */ if((pst->flags) & DK3_SVG_FLAGS_COLOR_STROKE) { fprintf(job->of1, f2lsvgst_c8_kw[171], pst->sr, pst->sg, pst->sb); } /* Stroke linewidth. */ if((pst->flags) & DK3_SVG_FLAGS_LINEWIDTH) { fprintf(job->of1, f2lsvgst_c8_kw[172], pst->lw); } /* Stroke linestyle. */ if((pst->flags) & DK3_SVG_FLAGS_LINESTYLE) { if((pst->flags) & DK3_SVG_FLAGS_LINEWIDTH) { gw = f2lto_find_gap_length(job, pst->lw, pst->lsv); switch(pst->ls) { case DK3_FIG_LS_DASH_TRIPLE_DOTTED: { fprintf( job->of1, f2lsvgst_c8_kw[176], pst->lsv, gw, pst->lw, gw, pst->lw, gw, pst->lw, gw ); } break; case DK3_FIG_LS_DASH_DOUBLE_DOTTED: { fprintf( job->of1, f2lsvgst_c8_kw[175], pst->lsv, gw, pst->lw, gw, pst->lw, gw ); } break; case DK3_FIG_LS_DASH_DOTTED: { fprintf( job->of1, f2lsvgst_c8_kw[174], pst->lsv, gw, pst->lw, gw ); } break; case DK3_FIG_LS_DOTTED: { fprintf( job->of1, f2lsvgst_c8_kw[173], pst->lw, gw ); } break; case DK3_FIG_LS_DASHED: { fprintf( job->of1, f2lsvgst_c8_kw[173], pst->lsv, gw ); } break; } } } /* Linecap. */ if((pst->flags) & DK3_SVG_FLAGS_LINE_CAP) { switch(pst->lc) { case DK3_FIG_LC_PROJECTING: { fputs(f2lsvgst_c8_kw[178], job->of1); } break; case DK3_FIG_LC_ROUND: { fputs(f2lsvgst_c8_kw[177], job->of1); } break; } } /* Linejoin. */ if((pst->flags) & DK3_SVG_FLAGS_LINE_JOIN) { switch(pst->lj) { case DK3_FIG_LJ_BEVEL: { fputs(f2lsvgst_c8_kw[180], job->of1); } break; case DK3_FIG_LJ_ROUND: { fputs(f2lsvgst_c8_kw[179], job->of1); } break; default: { if(job->miterlim) { fputs(f2lsvgst_c8_kw[186], job->of1); } } break; } } } void f2lsvgst_write_style_for_object( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg, dk3_fig_obj_t *pobj ) { f2l_svg_style_t *pst; $? "+ f2lsvgst_write_style_for_object" if((job) && (drw) && (psvg) && (pobj)) { pst = (f2l_svg_style_t *)(pobj->dsd); if(pst) { $? ". style" if(job->css) { $? ". css" fputs(f2lsvgst_c8_kw[181], job->of1); f2lsvgst_write_style_id(job, drw, psvg, pst); fputs(f2lsvgst_c8_kw[182], job->of1); } else { $? ". simple attributes" f2lsvgst_write_attributes_for_one_style(job, drw, psvg, pst); } } else { $? "! style" } } else { $? "! args" } $? "- f2lsvgst_write_style_for_object" } void f2lsvgst_write_styles( f2l_job_t *job, dk3_fig_drawing_t *drw, f2l_svg_t *psvg ) { f2l_svg_style_t *pst; if((psvg->sStyles) && (psvg->iStyles)) { dk3sto_it_reset(psvg->iStyles); do { pst = (f2l_svg_style_t *)dk3sto_it_next(psvg->iStyles); if(pst) { f2lsvgst_write_one_style(job, drw, psvg, pst); } } while(pst); } }