summaryrefslogtreecommitdiff
path: root/support/dktools/f2lud.c
diff options
context:
space:
mode:
Diffstat (limited to 'support/dktools/f2lud.c')
-rw-r--r--support/dktools/f2lud.c4012
1 files changed, 4012 insertions, 0 deletions
diff --git a/support/dktools/f2lud.c b/support/dktools/f2lud.c
new file mode 100644
index 0000000000..c01721f5fd
--- /dev/null
+++ b/support/dktools/f2lud.c
@@ -0,0 +1,4012 @@
+/*
+ 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: f2lud.ctr
+*/
+
+/*
+Copyright (C) 2012-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 f2lud.c The f2lud module.
+*/
+
+
+#line 203 "f2lud.ctr"
+
+#include "dk3all.h"
+#include "dk3bezcu.h"
+#include "fig2lat.h"
+#include "dk3xsp.h"
+#include "f2lud.h"
+#include "f2lsvg.h"
+#include "f2lpgf.h"
+#include "f2lpdf.h"
+#include "f2leps.h"
+#include "dk3figto.h"
+#if 0
+#include "dkt-version.h"
+#endif
+#include "dk4vers.h"
+#include "f2ludpat.h"
+#include "f2lpara.h"
+
+
+
+
+
+#line 224 "f2lud.ctr"
+
+
+
+/** Keywords used by the module.
+*/
+static char const * const f2lud_c8_kw[] = {
+/* 0 */
+"fig object begin %lu, line %lu, type %ld %ld, layer %d",
+
+/* 1 */
+"fig object end %lu",
+
+/* 2 */
+"arrowhead forward begin, type=%d, fill=%d, length=%lg, width=%lg",
+
+/* 3 */
+"arrowhead forward end",
+
+/* 4 */
+"arrowhead backward begin, type=%d, fill=%d, length=%lg, width=%lg",
+
+/* 5 */
+"arrowhead backward end",
+
+/* 6 */
+"path object begin, type %ld %ld",
+
+/* 7 */
+"path object end",
+
+NULL
+
+
+#line 264 "f2lud.ctr"
+};
+
+
+
+/** Write debug line to output file.
+ @param job Job structure.
+ @param msg Text line without newline at end.
+*/
+static
+void
+f2lud_debug(
+ f2l_job_t *job,
+ char const *msg
+)
+{
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_EPS_STANDALONE: {
+ f2leps_eps_pure_debug(job, msg);
+ } break;
+ case FIG2LAT_DRIVER_TEX_FULL_PGF: {
+ f2lpgf_tex_debug(job, msg);
+ } break;
+ case FIG2LAT_DRIVER_TEX_FULL_PDF: {
+ f2lpdf_tex_with_pdf_debug(job, msg);
+ } break;
+ case FIG2LAT_DRIVER_PDF_WITH_TEX: {
+ f2lpdf_pdf_with_tex_debug(job, msg);
+ } break;
+ case FIG2LAT_DRIVER_EPS_WITH_TEX: {
+ f2leps_eps_with_tex_debug(job, msg);
+ } break;
+ /* @DRIVER@ universal */
+ default: { /* PGF */
+ f2lpgf_pgf_debug(job, msg);
+ } break;
+ }
+}
+
+
+
+/** Calculate factors for coordinates transformations.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @return 1 on success, 0 on error.
+*/
+static
+int
+f2lud_coordinates_transformation(f2l_job_t *job, dk3_fig_drawing_t *drw)
+{
+ double xmin; /* Minimum x in output space. */
+ double xmax; /* Maximum x in output space. */
+ double ymin; /* Minimum y in output space. */
+ double ymax; /* Maximum y in output space. */
+ double xdelta; /* Used width in output space. */
+ double ydelta; /* Used height in output space. */
+ double width; /* Bounding box width in output space. */
+ double height; /* Bounding box height in output space. */
+ int mec = 0; /* Mathematical error code. */
+ int back = 1;
+
+
+#line 324 "f2lud.ctr"
+ (job->ct2d).mx = dk3ma_d_div_ok( 72.0, drw->res, &mec);
+ (job->ct2d).my = dk3ma_d_div_ok(-72.0, drw->res, &mec);
+ xmin = dk3ma_d_mul_ok((job->ct2d).mx, (drw->bb).xmin, &mec);
+ xmax = dk3ma_d_mul_ok((job->ct2d).mx, (drw->bb).xmax, &mec);
+ ymax = dk3ma_d_mul_ok((job->ct2d).my, (drw->bb).ymin, &mec);
+ ymin = dk3ma_d_mul_ok((job->ct2d).my, (drw->bb).ymax, &mec);
+ xdelta = dk3ma_d_sub_ok(xmax, xmin, &mec);
+ ydelta = dk3ma_d_sub_ok(ymax, ymin, &mec);
+ job->width = width = ceil(xdelta);
+ job->height = height = ceil(ydelta);
+ job->lwidth = dk3ma_d_to_l_ok(width, &mec);
+ job->lheight = dk3ma_d_to_l_ok(height, &mec);
+ (job->ct2d).nx = 0.5 * dk3ma_d_sub_ok(width, xdelta, &mec);
+ (job->ct2d).ny = 0.5 * dk3ma_d_sub_ok(height, ydelta, &mec);
+ (job->ct2d).nx = dk3ma_d_sub_ok((job->ct2d).nx, xmin, &mec);
+ (job->ct2d).ny = dk3ma_d_sub_ok((job->ct2d).ny, ymin, &mec);
+
+
+#line 341 "f2lud.ctr"
+
+
+#line 342 "f2lud.ctr"
+ if(mec) {
+ back = 0;
+ /* ERROR: Math problem */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 35);
+ f2l_tool_set_exit_status(job, FIG2LAT_EXIT_ERROR_MATH);
+
+#line 347 "f2lud.ctr"
+ }
+
+#line 348 "f2lud.ctr"
+ return back;
+}
+
+
+
+/** Driver-specific initialization.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @return 1 on success, 0 on error.
+*/
+static
+int
+f2lud_driver_initialize(f2l_job_t *job, dk3_fig_drawing_t *drw)
+{
+ int back;
+
+
+#line 364 "f2lud.ctr"
+ back = f2lud_coordinates_transformation(job, drw);
+ if(back) {
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_TEX_FULL_PGF: {
+ back = f2lpgf_tex_initialize(job, drw);
+ } break;
+ case FIG2LAT_DRIVER_TEX_FULL_PDF: {
+ back = f2lpdf_tex_with_pdf_initialize(job, drw);
+ } break;
+ case FIG2LAT_DRIVER_PDF_WITH_TEX: {
+ back = f2lpdf_pdf_with_tex_initialize(job, drw);
+ } break;
+ case FIG2LAT_DRIVER_EPS_WITH_TEX: {
+ back = f2leps_eps_with_tex_initialize(job, drw);
+ } break;
+ case FIG2LAT_DRIVER_EPS_STANDALONE: {
+ back = f2leps_eps_pure_initialize(job, drw);
+ } break;
+ /* @DRIVER@ universal */
+ default: { /* PGF */
+ back = f2lpgf_pgf_initialize(job, drw);
+ } break;
+ }
+ }
+
+#line 388 "f2lud.ctr"
+ return back;
+}
+
+
+
+/** Release resources allocated by f2lud_driver_initialize().
+ @param job Job structure.
+ @param drw Drawing structure.
+*/
+static
+void
+f2lud_driver_end(f2l_job_t *job, dk3_fig_drawing_t *drw)
+{
+
+
+#line 402 "f2lud.ctr"
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_TEX_FULL_PGF: {
+ f2lpgf_tex_end(job, drw);
+ } break;
+ case FIG2LAT_DRIVER_TEX_FULL_PDF: {
+ f2lpdf_tex_with_pdf_end(job, drw);
+ } break;
+ case FIG2LAT_DRIVER_PDF_WITH_TEX: {
+ f2lpdf_pdf_with_tex_end(job, drw);
+ } break;
+ case FIG2LAT_DRIVER_EPS_WITH_TEX: {
+ f2leps_eps_with_tex_end(job, drw);
+ } break;
+ case FIG2LAT_DRIVER_EPS_STANDALONE: {
+ f2leps_eps_pure_end(job, drw);
+ } break;
+ /* @DRIVER@ universal */
+ default: { /* PGF */
+ f2lpgf_pgf_end(job, drw);
+ } break;
+ }
+
+
+#line 424 "f2lud.ctr"
+}
+
+
+
+/** Open output files.
+ @param job Job structure.
+ @return 1 on success, 0 on error.
+*/
+static
+int
+f2lud_open_output_files(f2l_job_t *job)
+{
+ int back = 0;
+
+
+#line 438 "f2lud.ctr"
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_TEX_FULL_PGF: {
+ back = f2lpgf_tex_open_output_files(job);
+ } break;
+ case FIG2LAT_DRIVER_TEX_FULL_PDF: {
+ back = f2lpdf_tex_with_pdf_open_output_files(job);
+ } break;
+ case FIG2LAT_DRIVER_PDF_WITH_TEX: {
+ back = f2lpdf_pdf_with_tex_open_output_files(job);
+ } break;
+ case FIG2LAT_DRIVER_EPS_WITH_TEX: {
+ back = f2leps_eps_with_tex_open_output_files(job);
+ } break;
+ case FIG2LAT_DRIVER_EPS_STANDALONE: {
+ back = f2leps_eps_pure_open_output_files(job);
+ } break;
+ /* @DRIVER@ universal */
+ default: { /* PGF */
+ back = f2lpgf_pgf_open_output_files(job);
+ } break;
+ }
+
+#line 459 "f2lud.ctr"
+ return back;
+}
+
+
+
+/** Close output files.
+ @param job Job structure.
+*/
+static
+void
+f2lud_close_output_files(f2l_job_t *job)
+{
+
+
+#line 472 "f2lud.ctr"
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_TEX_FULL_PGF: {
+ f2lpgf_tex_close_output_files(job);
+ } break;
+ case FIG2LAT_DRIVER_TEX_FULL_PDF: {
+ f2lpdf_tex_with_pdf_close_output_files(job);
+ } break;
+ case FIG2LAT_DRIVER_PDF_WITH_TEX: {
+ f2lpdf_pdf_with_tex_close_output_files(job);
+ } break;
+ case FIG2LAT_DRIVER_EPS_WITH_TEX: {
+ f2leps_eps_with_tex_close_output_files(job);
+ } break;
+ case FIG2LAT_DRIVER_EPS_STANDALONE: {
+ f2leps_eps_pure_close_output_files(job);
+ } break;
+ /* @DRIVER@ universal */
+ default: { /* PGF */
+ f2lpgf_pgf_close_output_files(job);
+ } break;
+ }
+
+#line 493 "f2lud.ctr"
+}
+
+
+
+/** Write start of output.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @return 1 on success, 0 on error.
+*/
+static
+int
+f2lud_start_processing(f2l_job_t *job, dk3_fig_drawing_t *drw)
+{
+ int back = 0;
+
+
+#line 508 "f2lud.ctr"
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_TEX_FULL_PGF: {
+ back = f2lpgf_tex_start_processing(job, drw);
+ } break;
+ case FIG2LAT_DRIVER_TEX_FULL_PDF: {
+ back = f2lpdf_tex_with_pdf_start_processing(job, drw);
+ } break;
+ case FIG2LAT_DRIVER_PDF_WITH_TEX: {
+ back = f2lpdf_pdf_with_tex_start_processing(job, drw);
+ } break;
+ case FIG2LAT_DRIVER_EPS_WITH_TEX: {
+ back = f2leps_eps_with_tex_start_processing(job, drw);
+ } break;
+ case FIG2LAT_DRIVER_EPS_STANDALONE: {
+ back = f2leps_eps_pure_start_processing(job, drw);
+ } break;
+ /* @DRIVER@ universal */
+ default: { /* PGF */
+ back = f2lpgf_pgf_start_processing(job, drw);
+ } break;
+ }
+
+#line 529 "f2lud.ctr"
+ return back;
+}
+
+
+
+/** Write end of output.
+ @param job Job structure.
+ @param drw Drawing structure.
+*/
+static
+void
+f2lud_end_processing(f2l_job_t *job, dk3_fig_drawing_t *drw)
+{
+
+
+#line 543 "f2lud.ctr"
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_TEX_FULL_PGF: {
+ f2lpgf_tex_end_processing(job, drw);
+ } break;
+ case FIG2LAT_DRIVER_TEX_FULL_PDF: {
+ f2lpdf_tex_with_pdf_end_processing(job, drw);
+ } break;
+ case FIG2LAT_DRIVER_PDF_WITH_TEX: {
+ f2lpdf_pdf_with_tex_end_processing(job, drw);
+ } break;
+ case FIG2LAT_DRIVER_EPS_WITH_TEX: {
+ f2leps_eps_with_tex_end_processing(job, drw);
+ } break;
+ case FIG2LAT_DRIVER_EPS_STANDALONE: {
+ f2leps_eps_pure_end_processing(job, drw);
+ } break;
+ /* @DRIVER@ universal */
+ default: { /* PGF */
+ f2lpgf_pgf_end_processing(job, drw);
+ } break;
+ }
+
+#line 564 "f2lud.ctr"
+}
+
+
+
+/** Process one text object.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+*/
+static
+void
+f2lud_text_object(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj
+)
+{
+ double x; /* X position of text object. */
+ double y; /* Y position of text object. */
+ int ec = 0; /* Mathematical error code. */
+
+
+#line 585 "f2lud.ctr"
+ if(!(DK3_FIG_FONT_FLAG_HIDDEN & ((obj->dt).txt.ff))) {
+ x = dk3ct_2d_x(&(job->ct2d), (obj->dt).txt.x, &ec);
+ y = dk3ct_2d_y(&(job->ct2d), (obj->dt).txt.y, &ec);
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_TEX_FULL_PGF: {
+ f2lpgf_tex_text_object(job, drw, obj, x, y);
+ } break;
+ case FIG2LAT_DRIVER_TEX_FULL_PDF: {
+ f2lpdf_tex_with_pdf_text_object(job, drw, obj, x, y);
+ } break;
+ case FIG2LAT_DRIVER_PDF_WITH_TEX: {
+ f2lpdf_pdf_with_tex_text_object(job, drw, obj, x, y);
+ } break;
+ case FIG2LAT_DRIVER_EPS_WITH_TEX: {
+ f2leps_eps_with_tex_text_object(job, drw, obj, x, y);
+ } break;
+ case FIG2LAT_DRIVER_EPS_STANDALONE: {
+ f2leps_eps_pure_text_object(job, drw, obj, x, y);
+ } break;
+ /* @DRIVER@ universal */
+ default: { /* PGF */
+ f2lpgf_pgf_text_object(job, drw, obj, x, y);
+ } break;
+ }
+ }
+ if(ec) {
+ /* ERROR: Math problem! */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 35);
+ f2l_tool_set_exit_status(job, FIG2LAT_EXIT_ERROR_MATH);
+
+#line 614 "f2lud.ctr"
+ }
+
+
+#line 616 "f2lud.ctr"
+}
+
+
+
+/** Find bounding box for output coordinates.
+ @param bb Bounding box to set up.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Polygon/polyline object.
+ @param ec Pointer to error code variable.
+*/
+static
+void
+f2lud_find_bounding_box(
+ dk3_bb_t *bb,
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ int *ec
+)
+{
+ dk3_fig_poly_point_t *po; /* Current point. */
+ size_t np; /* Number of points. */
+ size_t i; /* Index of current point. */
+
+
+#line 641 "f2lud.ctr"
+ po = (obj->dt).pol.po;
+ np = (obj->dt).pol.np;
+ dk3bb_reset(bb);
+ for(i = 0; i < np; i++) {
+ dk3bb_add_x(bb, dk3ct_2d_x(&(job->ct2d), po->x, ec));
+ dk3bb_add_y(bb, dk3ct_2d_y(&(job->ct2d), po->y, ec));
+ po++;
+ }
+
+#line 649 "f2lud.ctr"
+}
+
+
+
+/** Process one image object.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+*/
+static
+void
+f2lud_image_object(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj
+)
+{
+ dk3_bb_t outbb; /* Image bounding box in output space. */
+ int ec = 0; /* Error code variable. */
+ int drawdir = 0; /* Drawing direction for embedded image. */
+
+
+#line 670 "f2lud.ctr"
+ dk3bb_reset(&outbb);
+ f2lud_find_bounding_box(&outbb, job, drw, obj, &ec);
+ drawdir = f2lto_find_draw_direction(job, drw, obj, &ec);
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_TEX_FULL_PGF: {
+ f2lpgf_tex_image_object(job, drw, obj, &outbb, drawdir, &ec);
+ } break;
+ case FIG2LAT_DRIVER_TEX_FULL_PDF: {
+ f2lpdf_tex_with_pdf_image_object(job, drw, obj, &outbb, drawdir, &ec);
+ } break;
+ case FIG2LAT_DRIVER_PDF_WITH_TEX: {
+ f2lpdf_pdf_with_tex_image_object(job, drw, obj, &outbb, drawdir, &ec);
+ } break;
+ case FIG2LAT_DRIVER_EPS_WITH_TEX: {
+ f2leps_eps_with_tex_image_object(job, drw, obj, &outbb, drawdir, &ec);
+ } break;
+ case FIG2LAT_DRIVER_EPS_STANDALONE: {
+ f2leps_eps_pure_image_object(job, drw, obj, &outbb, drawdir, &ec);
+ } break;
+ /* @DRIVER@ universal */
+ default: { /* PGF */
+ f2lpgf_pgf_image_object(job, drw, obj, &outbb, drawdir, &ec);
+ } break;
+ }
+ if(ec) {
+ /* ERROR: Math error! */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 35);
+ f2l_tool_set_exit_status(job, FIG2LAT_EXIT_ERROR_MATH);
+
+#line 698 "f2lud.ctr"
+ }
+
+#line 699 "f2lud.ctr"
+}
+
+
+
+void
+f2lud_newpath(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj
+)
+{
+
+
+#line 711 "f2lud.ctr"
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_TEX_FULL_PGF: {
+ f2lpgf_tex_newpath(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_TEX_FULL_PDF: {
+ f2lpdf_tex_with_pdf_newpath(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_PDF_WITH_TEX: {
+ f2lpdf_pdf_with_tex_newpath(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_EPS_WITH_TEX: {
+ f2leps_eps_with_tex_newpath(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_EPS_STANDALONE: {
+ f2leps_eps_pure_newpath(job, drw, obj);
+ } break;
+ /* @DRIVER@ universal */
+ default: { /* PGF */
+ f2lpgf_pgf_newpath(job, drw, obj);
+ } break;
+ }
+
+#line 732 "f2lud.ctr"
+}
+
+
+
+void
+f2lud_moveto(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ double x,
+ double y
+)
+{
+
+
+#line 746 "f2lud.ctr"
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_TEX_FULL_PGF: {
+ f2lpgf_tex_moveto(job, drw, obj, x, y);
+ } break;
+ case FIG2LAT_DRIVER_TEX_FULL_PDF: {
+ f2lpdf_tex_with_pdf_moveto(job, drw, obj, x, y);
+ } break;
+ case FIG2LAT_DRIVER_PDF_WITH_TEX: {
+ f2lpdf_pdf_with_tex_moveto(job, drw, obj, x, y);
+ } break;
+ case FIG2LAT_DRIVER_EPS_WITH_TEX: {
+ f2leps_eps_with_tex_moveto(job, drw, obj, x, y);
+ } break;
+ case FIG2LAT_DRIVER_EPS_STANDALONE: {
+ f2leps_eps_pure_moveto(job, drw, obj, x, y);
+ } break;
+ /* @DRIVER@ universal */
+ default: { /* PGF */
+ f2lpgf_pgf_moveto(job, drw, obj, x, y);
+ } break;
+ }
+
+#line 767 "f2lud.ctr"
+}
+
+
+
+void
+f2lud_lineto(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ double x,
+ double y
+)
+{
+
+
+#line 781 "f2lud.ctr"
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_TEX_FULL_PGF: {
+ f2lpgf_tex_lineto(job, drw, obj, x, y);
+ } break;
+ case FIG2LAT_DRIVER_TEX_FULL_PDF: {
+ f2lpdf_tex_with_pdf_lineto(job, drw, obj, x, y);
+ } break;
+ case FIG2LAT_DRIVER_PDF_WITH_TEX: {
+ f2lpdf_pdf_with_tex_lineto(job, drw, obj, x, y);
+ } break;
+ case FIG2LAT_DRIVER_EPS_WITH_TEX: {
+ f2leps_eps_with_tex_lineto(job, drw, obj, x, y);
+ } break;
+ case FIG2LAT_DRIVER_EPS_STANDALONE: {
+ f2leps_eps_pure_lineto(job, drw, obj, x, y);
+ } break;
+ /* @DRIVER@ universal */
+ default: { /* PGF */
+ f2lpgf_pgf_lineto(job, drw, obj, x, y);
+ } break;
+ }
+
+#line 802 "f2lud.ctr"
+}
+
+
+
+void
+f2lud_curveto(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ double xcs,
+ double ycs,
+ double xce,
+ double yce,
+ double xe,
+ double ye
+)
+{
+
+
+#line 820 "f2lud.ctr"
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_TEX_FULL_PGF: {
+ f2lpgf_tex_curveto(job, drw, obj, xcs, ycs, xce, yce, xe, ye);
+ } break;
+ case FIG2LAT_DRIVER_TEX_FULL_PDF: {
+ f2lpdf_tex_with_pdf_curveto(job, drw, obj, xcs, ycs, xce, yce, xe, ye);
+ } break;
+ case FIG2LAT_DRIVER_PDF_WITH_TEX: {
+ f2lpdf_pdf_with_tex_curveto(job, drw, obj, xcs, ycs, xce, yce, xe, ye);
+ } break;
+ case FIG2LAT_DRIVER_EPS_WITH_TEX: {
+ f2leps_eps_with_tex_curveto(job, drw, obj, xcs, ycs, xce, yce, xe, ye);
+ } break;
+ case FIG2LAT_DRIVER_EPS_STANDALONE: {
+ f2leps_eps_pure_curveto(job, drw, obj, xcs, ycs, xce, yce, xe, ye);
+ } break;
+ /* @DRIVER@ universal */
+ default: { /* PGF */
+ f2lpgf_pgf_curveto(job, drw, obj, xcs, ycs, xce, yce, xe, ye);
+ } break;
+ }
+
+#line 841 "f2lud.ctr"
+}
+
+
+
+void
+f2lud_fig_moveto(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ double x,
+ double y,
+ int *ec
+)
+{
+ double nx; /* Destination x in output space. */
+ double ny; /* Destination y in output space. */
+
+
+#line 858 "f2lud.ctr"
+ nx = dk3ct_2d_x(&(job->ct2d), x, ec);
+ ny = dk3ct_2d_y(&(job->ct2d), y, ec);
+ f2lud_moveto(job, drw, obj, nx, ny);
+
+
+#line 862 "f2lud.ctr"
+}
+
+
+
+void
+f2lud_fig_lineto(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ double x,
+ double y,
+ int *ec
+)
+{
+ double nx; /* Destination x in output space. */
+ double ny; /* Destination y in output space. */
+
+
+#line 879 "f2lud.ctr"
+ nx = dk3ct_2d_x(&(job->ct2d), x, ec);
+ ny = dk3ct_2d_y(&(job->ct2d), y, ec);
+ f2lud_lineto(job, drw, obj, nx, ny);
+
+
+#line 883 "f2lud.ctr"
+}
+
+
+
+void
+f2lud_fig_curveto(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ double xcs,
+ double ycs,
+ double xce,
+ double yce,
+ double xe,
+ double ye,
+ int *ec
+)
+{
+ double nxcs; /* First control point x in output space. */
+ double nycs; /* First control point y in output space. */
+ double nxce; /* Second control point x in output space. */
+ double nyce; /* Second control point y in output space. */
+ double nxe; /* End point x in output space. */
+ double nye; /* End point y in output space. */
+
+
+#line 908 "f2lud.ctr"
+ nxcs = dk3ct_2d_x(&(job->ct2d), xcs, ec);
+ nycs = dk3ct_2d_y(&(job->ct2d), ycs, ec);
+ nxce = dk3ct_2d_x(&(job->ct2d), xce, ec);
+ nyce = dk3ct_2d_y(&(job->ct2d), yce, ec);
+ nxe = dk3ct_2d_x(&(job->ct2d), xe, ec);
+ nye = dk3ct_2d_y(&(job->ct2d), ye, ec);
+ f2lud_curveto(job, drw, obj, nxcs, nycs, nxce, nyce, nxe, nye);
+
+
+#line 916 "f2lud.ctr"
+}
+
+
+
+void
+f2lud_closepath(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj
+)
+{
+
+
+#line 928 "f2lud.ctr"
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_TEX_FULL_PGF: {
+ f2lpgf_tex_closepath(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_TEX_FULL_PDF: {
+ f2lpdf_tex_with_pdf_closepath(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_PDF_WITH_TEX: {
+ f2lpdf_pdf_with_tex_closepath(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_EPS_WITH_TEX: {
+ f2leps_eps_with_tex_closepath(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_EPS_STANDALONE: {
+ f2leps_eps_pure_closepath(job, drw, obj);
+ } break;
+ /* @DRIVER@ universal */
+ default: { /* PGF */
+ f2lpgf_pgf_closepath(job, drw, obj);
+ } break;
+ }
+
+#line 949 "f2lud.ctr"
+}
+
+
+
+/** Issue "fill" command.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+*/
+void
+f2lud_fill(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj
+)
+{
+
+
+#line 966 "f2lud.ctr"
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_TEX_FULL_PGF: {
+ f2lpgf_tex_fill(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_TEX_FULL_PDF: {
+ f2lpdf_tex_with_pdf_fill(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_PDF_WITH_TEX: {
+ f2lpdf_pdf_with_tex_fill(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_EPS_WITH_TEX: {
+ f2leps_eps_with_tex_fill(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_EPS_STANDALONE: {
+ f2leps_eps_pure_fill(job, drw, obj);
+ } break;
+ /* @DRIVER@ universal */
+ default: { /* PGF */
+ f2lpgf_pgf_fill(job, drw, obj);
+ } break;
+ }
+
+#line 987 "f2lud.ctr"
+}
+
+
+
+/** Issue combined "fill" and "clip" command.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+*/
+static
+void
+f2lud_fill_clip(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj
+)
+{
+
+
+#line 1005 "f2lud.ctr"
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_TEX_FULL_PGF: {
+ f2lpgf_tex_fill_clip(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_PGF: {
+ f2lpgf_pgf_fill_clip(job, drw, obj);
+ } break;
+ /* @DRIVER@ universal */
+ }
+
+#line 1014 "f2lud.ctr"
+}
+
+
+
+/** Issue combined "fill", "stroke", and "clip" command.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+*/
+static
+void
+f2lud_fill_stroke_clip(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj
+)
+{
+
+
+#line 1032 "f2lud.ctr"
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_TEX_FULL_PGF: {
+ f2lpgf_tex_fill_stroke_clip(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_PGF: {
+ f2lpgf_pgf_fill_stroke_clip(job, drw, obj);
+ } break;
+ /* @DRIVER@ universal */
+ }
+
+#line 1041 "f2lud.ctr"
+}
+
+
+
+/** Issue combined "fill" and "stroke" command.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+*/
+static
+void
+f2lud_fill_stroke(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj
+)
+{
+
+
+#line 1059 "f2lud.ctr"
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_TEX_FULL_PGF: {
+ f2lpgf_tex_fill_stroke(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_PGF: {
+ f2lpgf_pgf_fill_stroke(job, drw, obj);
+ } break;
+ /* @DRIVER@ universal */
+ }
+
+#line 1068 "f2lud.ctr"
+}
+
+
+
+void
+f2lud_stroke(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj
+)
+{
+
+
+#line 1080 "f2lud.ctr"
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_TEX_FULL_PGF: {
+ f2lpgf_tex_stroke(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_TEX_FULL_PDF: {
+ f2lpdf_tex_with_pdf_stroke(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_PDF_WITH_TEX: {
+ f2lpdf_pdf_with_tex_stroke(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_EPS_WITH_TEX: {
+ f2leps_eps_with_tex_stroke(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_EPS_STANDALONE: {
+ f2leps_eps_pure_stroke(job, drw, obj);
+ } break;
+ /* @DRIVER@ universal */
+ default: { /* PGF */
+ f2lpgf_pgf_stroke(job, drw, obj);
+ } break;
+ }
+
+#line 1101 "f2lud.ctr"
+}
+
+
+
+/** Issue "clip" command.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+*/
+static
+void
+f2lud_clip(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj
+)
+{
+
+
+#line 1119 "f2lud.ctr"
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_TEX_FULL_PGF: {
+ f2lpgf_tex_clip(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_TEX_FULL_PDF: {
+ f2lpdf_tex_with_pdf_clip(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_PDF_WITH_TEX: {
+ f2lpdf_pdf_with_tex_clip(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_EPS_WITH_TEX: {
+ f2leps_eps_with_tex_clip(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_EPS_STANDALONE: {
+ f2leps_eps_pure_clip(job, drw, obj);
+ } break;
+ /* @DRIVER@ universal */
+ default: { /* PGF */
+ f2lpgf_pgf_clip(job, drw, obj);
+ } break;
+ }
+
+#line 1140 "f2lud.ctr"
+}
+
+
+
+/** Issue "gsave" command.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+*/
+static
+void
+f2lud_gsave(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj
+)
+{
+
+
+#line 1158 "f2lud.ctr"
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_TEX_FULL_PGF: {
+ f2lpgf_tex_gsave(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_TEX_FULL_PDF: {
+ f2lpdf_tex_with_pdf_gsave(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_PDF_WITH_TEX: {
+ f2lpdf_pdf_with_tex_gsave(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_EPS_WITH_TEX: {
+ f2leps_eps_with_tex_gsave(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_EPS_STANDALONE: {
+ f2leps_eps_pure_gsave(job, drw, obj);
+ } break;
+ /* @DRIVER@ universal */
+ default: { /* PGF */
+ f2lpgf_pgf_gsave(job, drw, obj);
+ } break;
+ }
+
+#line 1179 "f2lud.ctr"
+}
+
+
+
+/** Issue "grestore" command.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+*/
+static
+void
+f2lud_grestore(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj
+)
+{
+
+
+#line 1197 "f2lud.ctr"
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_TEX_FULL_PGF: {
+ f2lpgf_tex_grestore(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_TEX_FULL_PDF: {
+ f2lpdf_tex_with_pdf_grestore(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_PDF_WITH_TEX: {
+ f2lpdf_pdf_with_tex_grestore(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_EPS_WITH_TEX: {
+ f2leps_eps_with_tex_grestore(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_EPS_STANDALONE: {
+ f2leps_eps_pure_grestore(job, drw, obj);
+ } break;
+ /* @DRIVER@ universal */
+ default: { /* PGF */
+ f2lpgf_pgf_grestore(job, drw, obj);
+ } break;
+ }
+
+#line 1218 "f2lud.ctr"
+}
+
+
+
+/** Create path for ellipse object.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+ @param ec Pointe to error code variable, may be NULL.
+*/
+static
+void
+f2lud_create_ellipse_path(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ int *ec
+)
+{
+ dk3_fig_poly_point_t po[12]; /* Points in Fig space. */
+ double myan; /* Rotation angle in Fig space. */
+ size_t i; /* Index of current point to modify. */
+
+
+#line 1241 "f2lud.ctr"
+ po[0].x = (obj->dt).ell.rx;
+ po[0].y = 0.0;
+ po[1].x = (obj->dt).ell.rx;
+ po[1].y = FIG2LAT_CIRCLE_QUADRANT_BEZIER * (obj->dt).ell.ry;
+ po[2].x = FIG2LAT_CIRCLE_QUADRANT_BEZIER * (obj->dt).ell.rx;
+ po[2].y = (obj->dt).ell.ry;
+ po[3].x = 0.0;
+ po[3].y = (obj->dt).ell.ry;
+ po[4].x = 0.0 - po[2].x;
+ po[4].y = po[2].y;
+ po[5].x = 0.0 - po[1].x;
+ po[5].y = po[1].y;
+ po[6].x = 0.0 - po[0].x;
+ po[6].y = 0.0;
+ po[7].x = po[6].x;
+ po[7].y = 0.0 - po[5].y;
+ po[8].x = po[4].x;
+ po[8].y = 0.0 - po[2].y;
+ po[9].x = 0.0;
+ po[9].y = 0.0 - po[3].y;
+ po[10].x = po[2].x;
+ po[10].y = po[9].y;
+ po[11].x = po[1].x;
+ po[11].y = po[7].y;
+ switch(obj->st) {
+ case 1: case 2: {
+ if(1.0e-6 < fabs((obj->dt).ell.an)) {
+ if(1.0e-6 < fabs(dk3ma_d_sub_ok((obj->dt).ell.rx,(obj->dt).ell.ry,ec)))
+ {
+ myan = -1.0 * (obj->dt).ell.an;
+ for(i = 0; i < 12; i++) {
+ dk3fig_tool_rotate_point(&(po[i]), myan, ec);
+ }
+ }
+ }
+ } break;
+ }
+ for(i = 0; i < 12; i++) {
+ dk3fig_tool_shift_point(&(po[i]), (obj->dt).ell.cx, (obj->dt).ell.cy, ec);
+ }
+ f2lud_fig_moveto(job, drw, obj, po[0].x, po[0].y, ec);
+ f2lud_fig_curveto(
+ job, drw, obj,
+ po[1].x, po[1].y, po[2].x, po[2].y, po[3].x, po[3].y,
+ ec
+ );
+ f2lud_fig_curveto(
+ job, drw, obj,
+ po[4].x, po[4].y, po[5].x, po[5].y, po[6].x, po[6].y,
+ ec
+ );
+ f2lud_fig_curveto(
+ job, drw, obj,
+ po[7].x, po[7].y, po[8].x, po[8].y, po[9].x, po[9].y,
+ ec
+ );
+ f2lud_fig_curveto(
+ job, drw, obj,
+ po[10].x, po[10].y, po[11].x, po[11].y, po[0].x, po[0].y,
+ ec
+ );
+
+
+#line 1303 "f2lud.ctr"
+}
+
+
+
+/** Create path for polygon object.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+ @param ec Pointe to error code variable, may be NULL.
+*/
+static
+void
+f2lud_create_polygon_path(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ int *ec
+)
+{
+ dk3_fig_poly_point_t *po; /* Current point to process. */
+ size_t np; /* Number of points. */
+ size_t i; /* Index of current point. */
+
+
+#line 1326 "f2lud.ctr"
+ po = (obj->dt).pol.po;
+ np = (obj->dt).pol.np;
+ for(i = 0; i < np; i++) {
+ if(0 == i) {
+ f2lud_fig_moveto(job, drw, obj, po->x, po->y, ec);
+ } else {
+ f2lud_fig_lineto(job, drw, obj, po->x, po->y, ec);
+ }
+ po++;
+ }
+ if(obj->cl) {
+ po = (obj->dt).pol.po;
+ f2lud_fig_lineto(job, drw, obj, po->x, po->y, ec);
+ }
+
+#line 1340 "f2lud.ctr"
+}
+
+
+
+/** Create path for box object.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+ @param ec Pointe to error code variable, may be NULL.
+*/
+static
+void
+f2lud_create_box_path(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ int *ec
+)
+{
+ dk3_bb_t outbb; /* Box coordinates in output space. */
+
+
+#line 1361 "f2lud.ctr"
+ dk3bb_reset(&outbb);
+ f2lud_find_bounding_box(&outbb, job, drw, obj, ec);
+ f2lud_moveto(job, drw, obj, outbb.xmin, outbb.ymin);
+ f2lud_lineto(job, drw, obj, outbb.xmax, outbb.ymin);
+ f2lud_lineto(job, drw, obj, outbb.xmax, outbb.ymax);
+ f2lud_lineto(job, drw, obj, outbb.xmin, outbb.ymax);
+ f2lud_lineto(job, drw, obj, outbb.xmin, outbb.ymin);
+
+
+#line 1369 "f2lud.ctr"
+}
+
+
+
+/** Create path for arc box object.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+ @param ec Pointe to error code variable, may be NULL.
+*/
+static
+void
+f2lud_create_arc_box_path(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ int *ec
+)
+{
+ dk3_fig_poly_point_t po[16]; /* Box points in output space. */
+ dk3_bb_t outbb; /* Box coordinates in output space. */
+ double r; /* Corner radius in output space. */
+ double maxr; /* Maximum value for corner radius. */
+ double corner; /* Factor control to end. */
+ double rc; /* Dist of control to end in output space. */
+
+
+#line 1395 "f2lud.ctr"
+ dk3bb_reset(&outbb);
+ f2lud_find_bounding_box(&outbb, job, drw, obj, ec);
+#if VERSION_BEFORE_20140808
+ r = dk3ct_2d_r(&(job->ct2d), (obj->dt).pol.ra, ec);
+
+#line 1399 "f2lud.ctr"
+#else
+ r = 0.9 * (obj->dt).pol.ra;
+
+#line 1401 "f2lud.ctr"
+#endif
+ maxr = 0.49 * fabs(dk3ma_d_sub_ok(outbb.xmax, outbb.xmin, ec));
+ if(r > maxr) r = maxr;
+ maxr = 0.49 * fabs(dk3ma_d_sub_ok(outbb.ymax, outbb.ymin, ec));
+ if(r > maxr) r = maxr;
+ corner = 1.0 - FIG2LAT_CIRCLE_QUADRANT_BEZIER;
+ rc = r * corner;
+ /* Bottom line */
+ po[0].x = dk3ma_d_add_ok(outbb.xmin, r, ec);
+ po[0].y = outbb.ymin;
+ po[1].x = dk3ma_d_sub_ok(outbb.xmax, r, ec);
+ po[1].y = po[0].y;
+ /* Lower right corner control points */
+ po[2].x = dk3ma_d_sub_ok(outbb.xmax, rc, ec);
+ po[2].y = po[0].y;
+ po[3].x = outbb.xmax;
+ po[3].y = dk3ma_d_add_ok(outbb.ymin, rc, ec);
+ /* Right line */
+ po[4].x = outbb.xmax;
+ po[4].y = dk3ma_d_add_ok(outbb.ymin, r, ec);
+ po[5].x = outbb.xmax;
+ po[5].y = dk3ma_d_sub_ok(outbb.ymax, r, ec);
+ /* Upper right corner control points */
+ po[6].x = outbb.xmax;
+ po[6].y = dk3ma_d_sub_ok(outbb.ymax, rc, ec);
+ po[7].x = dk3ma_d_sub_ok(outbb.xmax, rc, ec);
+ po[7].y = outbb.ymax;
+ /* Top line */
+ po[8].x = dk3ma_d_sub_ok(outbb.xmax, r, ec);
+ po[8].y = outbb.ymax;
+ po[9].x = dk3ma_d_add_ok(outbb.xmin, r, ec);
+ po[9].y = outbb.ymax;
+ /* Upper left corner control points */
+ po[10].x = dk3ma_d_add_ok(outbb.xmin, rc, ec);
+ po[10].y = outbb.ymax;
+ po[11].x = outbb.xmin;
+ po[11].y = dk3ma_d_sub_ok(outbb.ymax, rc, ec);
+ /* Left line */
+ po[12].x = outbb.xmin;
+ po[12].y = dk3ma_d_sub_ok(outbb.ymax, r, ec);
+ po[13].x = outbb.xmin;
+ po[13].y = dk3ma_d_add_ok(outbb.ymin, r, ec);
+ /* Lower left corner control points */
+ po[14].x = outbb.xmin;
+ po[14].y = dk3ma_d_add_ok(outbb.ymin, rc, ec);
+ po[15].x = dk3ma_d_add_ok(outbb.xmin, rc, ec);
+ po[15].y = outbb.ymin;
+ f2lud_moveto(job, drw, obj, po[0].x, po[0].y);
+ f2lud_lineto(job, drw, obj, po[1].x, po[1].y);
+ f2lud_curveto(
+ job, drw, obj,
+ po[2].x, po[2].y, po[3].x, po[3].y, po[4].x, po[4].y
+ );
+ f2lud_lineto(job, drw, obj, po[5].x, po[5].y);
+ f2lud_curveto(
+ job, drw, obj,
+ po[6].x, po[6].y, po[7].x, po[7].y, po[8].x, po[8].y
+ );
+ f2lud_lineto(job, drw, obj, po[9].x, po[9].y);
+ f2lud_curveto(
+ job, drw, obj,
+ po[10].x, po[10].y, po[11].x, po[11].y, po[12].x, po[12].y
+ );
+ f2lud_lineto(job, drw, obj, po[13].x, po[13].y);
+ f2lud_curveto(
+ job, drw, obj,
+ po[14].x, po[14].y, po[15].x, po[15].y, po[0].x, po[0].y
+ );
+
+
+#line 1470 "f2lud.ctr"
+}
+
+
+
+/** Create path for the last partial X-spline segment from closed X-spline.
+ @param job Job structure.
+ @param drw Fig drawing.
+ @param obj Fig object.
+ @param sp Spline points array.
+ @param np Number of spline points.
+ @param i Current segment index.
+ @param te Parameter t for end point.
+ @param isfirst Flag: First segment.
+ @param iscl Flag: Closed spline.
+ @param primary Flag: Primary (1=primary object, 0=arrowhead).
+ @param ec Pointer to error code variable, may be NULL.
+*/
+static
+void
+f2lud_final_spline_segment(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ dk3_fig_spline_point_t *sp,
+ size_t np,
+ size_t i,
+ double te,
+ int isfirst,
+ int iscl,
+ int primary,
+ int *ec
+)
+{
+ dk3_xspline_segment_t seg; /* Segment for caluclation. */
+ dk3_fig_spline_point_t *pa = NULL; /* Left neighbour. */
+ dk3_fig_spline_point_t *pb = NULL; /* Start. */
+ dk3_fig_spline_point_t *pc = NULL; /* End. */
+ dk3_fig_spline_point_t *pd = NULL; /* Right neighbour. */
+ double myte; /* t for end. */
+ double dnumsegs; /* Number of segments. */
+ double factor; /* Scale factor for deriv. */
+ double t; /* Current t. */
+ double x; /* Bezier end x. */
+ double y; /* Bezier end y. */
+ double dxdt; /* Bezier dx/dt at end. */
+ double dydt; /* Bezier dy/dt at end. */
+ double lastx = 0.0; /* Bezier start x. */
+ double lasty = 0.0; /* Bezier start y. */
+ double lastdxdt = 0.0; /* dx/dt at start. */
+ double lastdydt = 0.0; /* dy/dt at end. */
+ size_t nsegs; /* Number of segments. */
+ size_t iseg; /* Current segment. */
+ int res; /* Calculation result. */
+
+
+#line 1524 "f2lud.ctr"
+ myte = dk3ma_d_sub_ok(te, floor(te), ec);
+
+#line 1525 "f2lud.ctr"
+ dnumsegs = myte * dk3fig_tool_xssbs(drw, primary);
+ dnumsegs = ceil(dnumsegs);
+
+#line 1527 "f2lud.ctr"
+ nsegs = dk3ma_d_to_sz_ok(dnumsegs, ec);
+
+#line 1528 "f2lud.ctr"
+ pb = &(sp[i]);
+ pc = &(sp[i + 1]);
+ if(0 < i) {
+ pa = &(sp[i - 1]);
+ }
+ if(i < (np - 2)) {
+ pd = &(sp[i + 2]);
+ }
+ factor = myte / (double)nsegs;
+
+#line 1537 "f2lud.ctr"
+ dk3xsp_reset(&seg);
+ if(job->cosp) { dk3xsp_set_cb(&seg, 1); }
+ dk3xsp_set(&seg, pa, pb, pc, pd);
+ if(dk3xsp_calculate(&seg, 0.0, 1)) {
+ lastx = dk3xsp_get_x(&seg);
+ lasty = dk3xsp_get_y(&seg);
+ lastdxdt = dk3xsp_get_dxdt(&seg);
+ lastdydt = dk3xsp_get_dydt(&seg);
+ lastdxdt = (factor * lastdxdt) / 3.0;
+ lastdydt = (factor * lastdydt) / 3.0;
+ /* Move to start point.
+ */
+ if(isfirst) {
+ f2lud_fig_moveto(job, drw, obj, lastx, lasty, ec);
+ }
+ /* Further curve only if te > 1.0e-6.
+ For smaller te draw straight line.
+ */
+ if(1.0e-6 < myte) {
+
+#line 1556 "f2lud.ctr"
+ for(iseg = 0; iseg < nsegs; iseg++) {
+ if(iseg < (nsegs - 1)) {
+
+#line 1558 "f2lud.ctr"
+ t = (double)(iseg + 1) / (double)nsegs;
+ t = t * myte;
+ } else {
+
+#line 1561 "f2lud.ctr"
+ t = myte;
+ }
+
+#line 1563 "f2lud.ctr"
+ res = dk3xsp_calculate(&seg, t, 1);
+ if(!(res)) {
+ if(ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
+ }
+ x = dk3xsp_get_x(&seg);
+ y = dk3xsp_get_y(&seg);
+ dxdt = dk3xsp_get_dxdt(&seg);
+ dydt = dk3xsp_get_dydt(&seg);
+ dxdt = (factor * dxdt) / 3.0;
+ dydt = (factor * dydt) / 3.0;
+ f2lud_fig_curveto(
+ job, drw, obj,
+ dk3ma_d_add_ok(lastx, lastdxdt, ec),
+ dk3ma_d_add_ok(lasty, lastdydt, ec),
+ dk3ma_d_sub_ok(x, dxdt, ec),
+ dk3ma_d_sub_ok(y, dydt, ec),
+ x, y,
+ ec
+ );
+ lastx = x; lasty = y; lastdxdt = dxdt; lastdydt = dydt;
+ }
+ } else {
+
+#line 1585 "f2lud.ctr"
+ res = dk3xsp_calculate(&seg, myte, 0);
+ if(!(res)) {
+ if(ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
+ /* ERROR: Math */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 36);
+ f2l_tool_set_exit_status(job, FIG2LAT_EXIT_ERROR_MATH);
+
+#line 1591 "f2lud.ctr"
+ }
+ x = dk3xsp_get_x(&seg);
+ y = dk3xsp_get_y(&seg);
+ f2lud_fig_lineto(job, drw, obj, x, y, ec);
+ }
+ } else {
+ if(ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
+ f2l_tool_set_exit_status(job, FIG2LAT_EXIT_ERROR_MATH);
+
+#line 1599 "f2lud.ctr"
+ }
+
+
+#line 1601 "f2lud.ctr"
+}
+
+
+
+/** Create path for the first partial X-spline segment from closed X-spline.
+ @param job Job structure.
+ @param drw Fig drawing.
+ @param obj Fig object.
+ @param sp Spline points array.
+ @param np Number of spline points.
+ @param i Current segment index.
+ @param ts Parameter t for start point.
+ @param isfirst Flag: First segment.
+ @param iscl Flag: Closed spline.
+ @param primary Flag: Primary (1=primary object, 0=arrowhead).
+ @param ec Pointer to error code variable, may be NULL.
+*/
+static
+void
+f2lud_first_spline_segment(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ dk3_fig_spline_point_t *sp,
+ size_t np,
+ size_t i,
+ double ts,
+ int isfirst,
+ int iscl,
+ int primary,
+ int *ec
+)
+{
+ dk3_xspline_segment_t seg; /* Segment for caluclation. */
+ dk3_fig_spline_point_t *pa = NULL; /* Left neighbour. */
+ dk3_fig_spline_point_t *pb = NULL; /* Start. */
+ dk3_fig_spline_point_t *pc = NULL; /* End. */
+ dk3_fig_spline_point_t *pd = NULL; /* Right neighbour. */
+ double myts; /* t for start. */
+ double dnumsegs; /* Number of segments. */
+ double factor; /* Scale factor for deriv. */
+ double t; /* Current t. */
+ double x; /* Bezier end x. */
+ double y; /* Bezier end y. */
+ double dxdt; /* Bezier dx/dt at end. */
+ double dydt; /* Bezier dy/dt at end. */
+ double lastx = 0.0; /* Bezier start x. */
+ double lasty = 0.0; /* Bezier start y. */
+ double lastdxdt = 0.0; /* dx/dt at start. */
+ double lastdydt = 0.0; /* dy/dt at end. */
+ size_t nsegs; /* Number of segments. */
+ size_t iseg; /* Current segment. */
+ int res; /* Calculation result. */
+
+
+#line 1655 "f2lud.ctr"
+ myts = dk3ma_d_sub_ok(ts, floor(ts), ec);
+
+#line 1656 "f2lud.ctr"
+ dnumsegs = (1.0 - myts) * dk3fig_tool_xssbs(drw, primary);
+ dnumsegs = ceil(dnumsegs);
+
+#line 1658 "f2lud.ctr"
+ nsegs = dk3ma_d_to_sz_ok(dnumsegs, ec);
+
+#line 1659 "f2lud.ctr"
+ pb = &(sp[i]);
+ pc = &(sp[i + 1]);
+ if(0 < i) {
+ pa = &(sp[i - 1]);
+ }
+ if(i < (np - 2)) {
+ pd = &(sp[i + 2]);
+ }
+ factor = (1.0 - myts) / (double)nsegs;
+
+#line 1668 "f2lud.ctr"
+ dk3xsp_reset(&seg);
+ if(job->cosp) { dk3xsp_set_cb(&seg, 1); }
+ dk3xsp_set(&seg, pa, pb, pc, pd);
+ if(dk3xsp_calculate(&seg, myts, 1)) {
+ /* If necessary move to the start point.
+ */
+ lastx = dk3xsp_get_x(&seg);
+ lasty = dk3xsp_get_y(&seg);
+ lastdxdt = dk3xsp_get_dxdt(&seg);
+ lastdydt = dk3xsp_get_dydt(&seg);
+ lastdxdt = (factor * lastdxdt) / 3.0;
+ lastdydt = (factor * lastdydt) / 3.0;
+ if(isfirst) {
+ f2lud_fig_moveto(job, drw, obj, lastx, lasty, ec);
+ }
+ if(1.0e-6 < (1.0 - myts)) {
+ for(iseg = 0; iseg < nsegs; iseg++) {
+ if(iseg < (nsegs - 1)) {
+ t = myts + (((1.0 - myts) * ((double)(iseg + 1))) / ((double)nsegs));
+ } else {
+ t = 1.0;
+ }
+ res = dk3xsp_calculate(&seg, t, 1);
+ if(!(res)) {
+ if(ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
+ }
+ x = dk3xsp_get_x(&seg);
+ y = dk3xsp_get_y(&seg);
+ dxdt = dk3xsp_get_dxdt(&seg);
+ dydt = dk3xsp_get_dydt(&seg);
+ dxdt = (factor * dxdt) / 3.0;
+ dydt = (factor * dydt) / 3.0;
+ f2lud_fig_curveto(
+ job, drw, obj,
+ dk3ma_d_add_ok(lastx, lastdxdt, ec),
+ dk3ma_d_add_ok(lasty, lastdydt, ec),
+ dk3ma_d_sub_ok(x, dxdt, ec),
+ dk3ma_d_sub_ok(y, dydt, ec),
+ x, y,
+ ec
+ );
+ lastx = x; lasty = y; lastdxdt = dxdt; lastdydt = dydt;
+ }
+ } else {
+ res = dk3xsp_calculate(&seg, 1.0, 0);
+ if(!(res)) {
+ if(ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
+ /* ERROR: Math */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 36);
+ f2l_tool_set_exit_status(job, FIG2LAT_EXIT_ERROR_MATH);
+
+#line 1718 "f2lud.ctr"
+ }
+ x = dk3xsp_get_x(&seg);
+ y = dk3xsp_get_y(&seg);
+ f2lud_fig_lineto(job, drw, obj, x, y, ec);
+ }
+ } else {
+ if(ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
+ f2l_tool_set_exit_status(job, FIG2LAT_EXIT_ERROR_MATH);
+
+#line 1726 "f2lud.ctr"
+ }
+
+
+#line 1728 "f2lud.ctr"
+}
+
+
+
+
+/** Create path for the single partial X-spline segment cutted on both ends
+ from closed X-spline.
+ @param job Job structure.
+ @param drw Fig drawing.
+ @param obj Fig object.
+ @param sp Spline points array.
+ @param np Number of spline points.
+ @param i Current segment index.
+ @param ts Parameter t for start point.
+ @param te Parameter t for end point.
+ @param isfirst Flag: First segment.
+ @param iscl Flag: Closed spline.
+ @param primary Flag: Primary (1=primary object, 0=arrowhead).
+ @param ec Pointer to error code variable, may be NULL.
+*/
+static
+void
+f2lud_single_spline_segment(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ dk3_fig_spline_point_t *sp,
+ size_t np,
+ size_t i,
+ double ts,
+ double te,
+ int isfirst,
+ int iscl,
+ int primary,
+ int *ec
+)
+{
+ dk3_xspline_segment_t seg; /* Segment for caluclation. */
+ dk3_fig_spline_point_t *pa = NULL; /* Left neighbour. */
+ dk3_fig_spline_point_t *pb = NULL; /* Start. */
+ dk3_fig_spline_point_t *pc = NULL; /* End. */
+ dk3_fig_spline_point_t *pd = NULL; /* Right neighbour. */
+ double myte; /* t for end. */
+ double myts; /* t for start. */
+ double dnumsegs; /* Number of segments. */
+ double factor; /* Scale factor for deriv. */
+ double t; /* Current t. */
+ double x; /* Bezier end x. */
+ double y; /* Bezier end y. */
+ double dxdt; /* Bezier dx/dt at end. */
+ double dydt; /* Bezier dy/dt at end. */
+ double lastx = 0.0; /* Bezier start x. */
+ double lasty = 0.0; /* Bezier start y. */
+ double lastdxdt = 0.0; /* dx/dt at start. */
+ double lastdydt = 0.0; /* dy/dt at end. */
+ size_t nsegs; /* Number of segments. */
+ size_t iseg; /* Current segment. */
+ int res; /* Calculation result. */
+
+
+#line 1787 "f2lud.ctr"
+ myte = dk3ma_d_sub_ok(te, floor(te), ec);
+ myts = dk3ma_d_sub_ok(ts, floor(ts), ec);
+ dnumsegs = (myte - myts) * dk3fig_tool_xssbs(drw, primary);
+ dnumsegs = ceil(dnumsegs);
+
+#line 1791 "f2lud.ctr"
+ nsegs = dk3ma_d_to_sz_ok(dnumsegs, ec);
+ pb = &(sp[i]);
+ pc = &(sp[i + 1]);
+ if(0 < i) {
+ pa = &(sp[i - 1]);
+ }
+ if(i < (np - 2)) {
+ pd = &(sp[i + 2]);
+ }
+ factor = (myte - myts) / ((double)nsegs);
+ dk3xsp_reset(&seg);
+ if(job->cosp) { dk3xsp_set_cb(&seg, 1); }
+ dk3xsp_set(&seg, pa, pb, pc, pd);
+ if(dk3xsp_calculate(&seg, myts, 1)) {
+ lastx = dk3xsp_get_x(&seg);
+ lasty = dk3xsp_get_y(&seg);
+ lastdxdt = dk3xsp_get_dxdt(&seg);
+ lastdydt = dk3xsp_get_dydt(&seg);
+ lastdxdt = (factor * lastdxdt) / 3.0;
+ lastdydt = (factor * lastdydt) / 3.0;
+ if(isfirst) {
+ f2lud_fig_moveto(job, drw, obj, lastx, lasty, ec);
+ }
+ if(1.0e-6 < (myte - myts)) {
+ for(iseg = 0; iseg < nsegs; iseg++) {
+ if(iseg < (nsegs - 1)) {
+ t = myts + (((myte - myts) * ((double)(iseg + 1))) / ((double)nsegs));
+ } else {
+ t = myte;
+ }
+ res = dk3xsp_calculate(&seg, t, 1);
+ if(!(res)) {
+ if(ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
+ }
+ x = dk3xsp_get_x(&seg);
+ y = dk3xsp_get_y(&seg);
+ dxdt = dk3xsp_get_dxdt(&seg);
+ dydt = dk3xsp_get_dydt(&seg);
+ dxdt = (factor * dxdt) / 3.0;
+ dydt = (factor * dydt) / 3.0;
+ f2lud_fig_curveto(
+ job, drw, obj,
+ dk3ma_d_add_ok(lastx, lastdxdt, ec),
+ dk3ma_d_add_ok(lasty, lastdydt, ec),
+ dk3ma_d_sub_ok(x, dxdt, ec),
+ dk3ma_d_sub_ok(y, dydt, ec),
+ x, y,
+ ec
+ );
+ lastx = x; lasty = y; lastdxdt = dxdt; lastdydt = dydt;
+ }
+ } else {
+ res = dk3xsp_calculate(&seg, myte, 0);
+ if(!(res)) {
+ if(ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
+ /* ERROR: Calculation failed! */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 36);
+ f2l_tool_set_exit_status(job, FIG2LAT_EXIT_ERROR_MATH);
+
+#line 1849 "f2lud.ctr"
+ }
+ x = dk3xsp_get_x(&seg);
+ y = dk3xsp_get_y(&seg);
+ f2lud_fig_lineto(job, drw, obj, x, y, ec);
+ }
+ } else {
+ if(ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
+ /* ERROR: Calculation failed! */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 36);
+ f2l_tool_set_exit_status(job, FIG2LAT_EXIT_ERROR_MATH);
+
+#line 1859 "f2lud.ctr"
+ }
+
+
+#line 1861 "f2lud.ctr"
+}
+
+
+
+
+/** Create path for one complete X-spline segment from closed X-spline.
+ @param job Job structure.
+ @param drw Fig drawing.
+ @param obj Fig object.
+ @param sp Spline points array.
+ @param np Number of spline points.
+ @param i Current segment index.
+ @param isfirst Flag: First segment.
+ @param iscl Flag: Closed spline.
+ @param primary Flag: Primary (1=primary object, 0=arrowhead).
+ @param ec Pointer to error code variable, may be NULL.
+*/
+static
+void
+f2lud_full_spline_segment(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ dk3_fig_spline_point_t *sp,
+ size_t np,
+ size_t i,
+ int isfirst,
+ int iscl,
+ int primary,
+ int *ec
+)
+{
+ dk3_xspline_segment_t seg; /* Segment for caluclation. */
+ dk3_fig_spline_point_t *pa = NULL; /* Left neighbour. */
+ dk3_fig_spline_point_t *pb = NULL; /* Start. */
+ dk3_fig_spline_point_t *pc = NULL; /* End. */
+ dk3_fig_spline_point_t *pd = NULL; /* Right neighbour. */
+ double factor; /* Scale factor for deriv. */
+ double t; /* Current t. */
+ double x; /* Bezier end x. */
+ double y; /* Bezier end y. */
+ double dxdt; /* Bezier dx/dt at end. */
+ double dydt; /* Bezier dy/dt at end. */
+ double lastx = 0.0; /* Bezier start x. */
+ double lasty = 0.0; /* Bezier start y. */
+ double lastdxdt = 0.0; /* dx/dt at start. */
+ double lastdydt = 0.0; /* dy/dt at end. */
+ size_t xsss; /* Number of segments. */
+ size_t iseg; /* Current segment. */
+ size_t ic;
+ size_t id;
+ int res; /* Calculation result. */
+
+
+#line 1914 "f2lud.ctr"
+ if(i < ((iscl) ? np : (np - 1))) {
+ pb = &(sp[i]);
+ ic = i + 1; while(ic >= np) { ic = ic - np; }
+ pc = &(sp[ic]);
+ if(i > 0) {
+ pa = &(sp[i - 1]);
+ } else {
+ if(iscl) {
+ pa = &(sp[np - 1]);
+ }
+ }
+ if(i < (np - 2)) {
+ pd = &(sp[i + 2]);
+ } else {
+ if(iscl) {
+ id = i + 2; while(id >= np) { id = id - np; }
+ pd = &(sp[id]);
+ }
+ }
+ xsss = dk3fig_tool_xssbs(drw, primary);
+ factor = 1.0 / (double)xsss;
+ dk3xsp_reset(&seg);
+ if(job->cosp) { dk3xsp_set_cb(&seg, 1); }
+ dk3xsp_set(&seg, pa, pb, pc, pd);
+ if(dk3xsp_calculate(&seg, 0.0, 1)) {
+ lastx = dk3xsp_get_x(&seg);
+ lasty = dk3xsp_get_y(&seg);
+ lastdxdt = dk3xsp_get_dxdt(&seg);
+ lastdydt = dk3xsp_get_dydt(&seg);
+ lastdxdt = (factor * lastdxdt) / 3.0;
+ lastdydt = (factor * lastdydt) / 3.0;
+ if(isfirst) {
+ f2lud_fig_moveto(job, drw, obj, lastx, lasty, ec);
+ }
+ for(iseg = 0; iseg < xsss; iseg++) {
+ if(iseg < (xsss - 1)) {
+ t = (double)(iseg + 1) / (double)xsss;
+ } else {
+ t = 1.0;
+ }
+ res = dk3xsp_calculate(&seg, t, 1);
+ if(!(res)) {
+ if(ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
+ }
+ x = dk3xsp_get_x(&seg);
+ y = dk3xsp_get_y(&seg);
+ dxdt = dk3xsp_get_dxdt(&seg);
+ dydt = dk3xsp_get_dydt(&seg);
+ dxdt = (factor * dxdt) / 3.0;
+ dydt = (factor * dydt) / 3.0;
+ f2lud_fig_curveto(
+ job, drw, obj,
+ dk3ma_d_add_ok(lastx, lastdxdt, ec),
+ dk3ma_d_add_ok(lasty, lastdydt, ec),
+ dk3ma_d_sub_ok(x, dxdt, ec),
+ dk3ma_d_sub_ok(y, dydt, ec),
+ x,
+ y,
+ ec
+ );
+ lastx = x; lasty = y; lastdxdt = dxdt; lastdydt = dydt;
+ }
+ } else {
+ if(ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
+ }
+ } else {
+ /* ERROR: BUG: Wrong i */
+ }
+
+#line 1982 "f2lud.ctr"
+}
+
+
+
+/** Create path for open spline object.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+ @param primary Flag: Primary object (1=object, 0=arrowhead).
+ @param ec Pointe to error code variable, may be NULL.
+*/
+static
+void
+f2lud_create_open_spline_path(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ int primary,
+ int *ec
+)
+{
+ dk3_fig_spline_point_t *sp; /* Spline points. */
+ size_t np; /* Number of points. */
+ size_t i; /* Current segment index. */
+ size_t min; /* Minimum t value. */
+ size_t max; /* Maximum t value. */
+
+
+#line 2009 "f2lud.ctr"
+ sp = (obj->dt).spl.po;
+ np = (obj->dt).spl.np;
+
+ if(job->coah) {
+
+#line 2013 "f2lud.ctr"
+ for(i = 0; i < (np - 1); i++) {
+ f2lud_full_spline_segment(
+ job, drw, obj, sp, np, i, ((0 == i) ? 1 : 0), 0, primary, ec
+ );
+ }
+ } else {
+
+#line 2019 "f2lud.ctr"
+ if(obj->ab) {
+
+#line 2020 "f2lud.ctr"
+ /* 2013-11-23
+ ROUNDING DOWNWARDS INTENDED.
+ We want to find the start segment.
+ */
+ min = dk3ma_d_to_sz_ok(floor((obj->dt).spl.ts), ec);
+ if(obj->af) {
+
+#line 2026 "f2lud.ctr"
+ if((obj->dt).spl.te >= (obj->dt).spl.ts) {
+
+#line 2027 "f2lud.ctr"
+ /* 2013-11-23
+ ROUNDING DOWNWARDS INTENDED.
+ We want to find the last full segment to draw.
+ */
+ max = dk3ma_d_to_sz_ok(floor((obj->dt).spl.te), ec);
+ if(max > min) {
+
+#line 2033 "f2lud.ctr"
+ f2lud_first_spline_segment(
+ job, drw, obj, sp, np, min, (obj->dt).spl.ts, 1, 0, primary, ec
+ );
+ /* 2012-12-04 Bugfix: Only to max.
+ */
+#if VERSION_BEFORE_20121204
+ for(i = (min + 1); i < (np - 1); i++) {
+ f2lud_full_spline_segment(
+ job, drw, obj, sp, np, i, 0, 0, primary, ec
+ );
+ }
+#else
+ for(i = (min + 1); i < max; i++) {
+ f2lud_full_spline_segment(
+ job, drw, obj, sp, np, i, 0, 0, primary, ec
+ );
+ }
+#endif
+ f2lud_final_spline_segment(
+ job, drw, obj, sp, np, max, (obj->dt).spl.te, 0, 0, primary, ec
+ );
+ } else {
+
+#line 2055 "f2lud.ctr"
+ f2lud_single_spline_segment(
+ job, drw, obj, sp, np, min, (obj->dt).spl.ts, (obj->dt).spl.te,
+ 1, 0, primary, ec
+ );
+ }
+ } else {
+
+#line 2061 "f2lud.ctr"
+ /* ERROR: Arrowheads too long for spline! */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 37);
+ f2l_tool_set_exit_status(job, FIG2LAT_EXIT_ERROR_SYNTAX);
+
+#line 2064 "f2lud.ctr"
+ }
+ } else {
+
+#line 2066 "f2lud.ctr"
+ f2lud_first_spline_segment(
+ job, drw, obj, sp, np, min, (obj->dt).spl.ts, 1, 0, primary, ec
+ );
+ for(i = (min + 1); i < (np - 1); i++) {
+ f2lud_full_spline_segment(
+ job, drw, obj, sp, np, i, 0, 0, primary, ec
+ );
+ }
+ }
+ } else {
+
+#line 2076 "f2lud.ctr"
+ if(obj->af) {
+
+#line 2077 "f2lud.ctr"
+ /* 2013-11-23
+ ROUNDING DOWNWARDS INTENDED.
+ We want to find the last full segment.
+ */
+ max = dk3ma_d_to_sz_ok(floor((obj->dt).spl.te), ec);
+ if(max < (np - 1)) {
+
+#line 2083 "f2lud.ctr"
+ if(max > 0) {
+
+#line 2084 "f2lud.ctr"
+ for(i = 0; i < max; i++) {
+ f2lud_full_spline_segment(
+ job, drw, obj, sp, np, i, ((0 == i) ? 1 : 0), 0, primary, ec
+ );
+ }
+ f2lud_final_spline_segment(
+ job, drw, obj, sp, np, max, (obj->dt).spl.te, 0, 0, primary, ec
+ );
+ } else {
+
+#line 2093 "f2lud.ctr"
+ f2lud_final_spline_segment(
+ job, drw, obj, sp, np, max, (obj->dt).spl.te, 1, 0, primary, ec
+ );
+ }
+ } else {
+
+#line 2098 "f2lud.ctr"
+ /* ERROR: Illegal max value! */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 39);
+ f2l_tool_set_exit_status(job, FIG2LAT_EXIT_ERROR_UNKNOWN);
+
+#line 2101 "f2lud.ctr"
+ }
+ } else {
+
+#line 2103 "f2lud.ctr"
+ for(i = 0; i < (np - 1); i++) {
+ f2lud_full_spline_segment(
+ job, drw, obj, sp, np, i, ((0 == i) ? 1 : 0), 0, primary, ec
+ );
+ }
+ }
+ }
+ }
+
+
+#line 2112 "f2lud.ctr"
+}
+
+
+
+/** Create path for open spline object.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+ @param primary Flag: Primary object (1=object, 0=arrowhead).
+ @param ec Pointe to error code variable, may be NULL.
+*/
+static
+void
+f2lud_create_open_fast_spline_path(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ int primary,
+ int *ec
+)
+{
+ dk3_fig_spline_point_t *po;
+ size_t np;
+ size_t ib;
+ size_t ic;
+ double dxdtb;
+ double dydtb;
+ double dxdtc;
+ double dydtc;
+
+
+#line 2142 "f2lud.ctr"
+ po = (obj->dt).spl.po;
+ np = (obj->dt).spl.np;
+ if (np > 1) {
+ for (ib = 0; ib < (np - 1); ib++) {
+ ic = ib + 1;
+ if (0 == ib) {
+ /* MOVETO */
+ f2lud_fig_moveto(job, drw, obj, po[ib].x, po[ib].y, ec);
+ }
+ if ((fabs(po[ib].s) < 1.0e-6) && (fabs(po[ic].s) < 1.0e-6)) {
+ /* LINETO */
+ f2lud_fig_lineto(job, drw, obj, po[ic].x, po[ic].y, ec);
+ } else {
+ dxdtb = dxdtc = dk3ma_d_sub_ok(po[ic].x, po[ib].x, ec);
+ dydtb = dydtc = dk3ma_d_sub_ok(po[ic].y, po[ib].y, ec);
+ if ((0 < ib) && (fabs(1.0 + po[ib].s) < 1.0e-6)) {
+ dxdtb = f2lpara_derived_center(po[ib-1].x, po[ib].x, po[ic].x, ec);
+ dydtb = f2lpara_derived_center(po[ib-1].y, po[ib].y, po[ic].y, ec);
+ } else {
+ if ((ic < (np - 1)) && (fabs(1.0 + po[ic].s) < 1.0e-6)) {
+ dxdtb = f2lpara_derived_left(po[ib].x, po[ic].x, po[ic+1].x, ec);
+ dydtb = f2lpara_derived_left(po[ib].y, po[ic].y, po[ic+1].y, ec);
+ }
+ }
+ if ((ic < (np - 1)) && (1.0 + fabs(po[ic].s) < 1.0e-6)) {
+ dxdtc = f2lpara_derived_center(po[ib].x, po[ic].x, po[ic+1].x, ec);
+ dydtc = f2lpara_derived_center(po[ib].y, po[ic].y, po[ic+1].y, ec);
+ } else {
+ if ((0 < ib) && (fabs(1.0 + po[ib].s) < 1.0e-6)) {
+ dxdtc = f2lpara_derived_right(po[ib-1].x, po[ib].x, po[ic].x, ec);
+ dydtc = f2lpara_derived_right(po[ib-1].y, po[ib].y, po[ic].y, ec);
+ }
+ }
+ /* CURVETO */
+ f2lud_fig_curveto(
+ job, drw, obj,
+ dk3ma_d_add_ok(po[ib].x, (dxdtb / 3.0), ec),
+ dk3ma_d_add_ok(po[ib].y, (dydtb / 3.0), ec),
+ dk3ma_d_sub_ok(po[ic].x, (dxdtc / 3.0), ec),
+ dk3ma_d_sub_ok(po[ic].y, (dydtc / 3.0), ec),
+ po[ic].x,
+ po[ic].y,
+ ec
+ );
+ }
+ }
+ }
+
+#line 2189 "f2lud.ctr"
+}
+
+
+
+/** Create path for closed spline object.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+ @param primary Flag: Primary object (1=object, 0=arrowhead).
+ @param ec Pointe to error code variable, may be NULL.
+*/
+static
+void
+f2lud_create_closed_spline_path(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ int primary,
+ int *ec
+)
+{
+ dk3_fig_spline_point_t *sp; /* Spline points. */
+ size_t np; /* Number of points. */
+ size_t i; /* Current segment index. */
+
+
+#line 2214 "f2lud.ctr"
+ sp = (obj->dt).spl.po;
+ np = (obj->dt).spl.np;
+ for(i = 0; i < np; i++) {
+ f2lud_full_spline_segment(
+ job, drw, obj, sp, np, i, ((0 == i) ? 1 : 0), 1, primary, ec
+ );
+ }
+
+
+#line 2222 "f2lud.ctr"
+}
+
+/** Create path for closed spline object.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+ @param primary Flag: Primary object (1=object, 0=arrowhead).
+ @param ec Pointe to error code variable, may be NULL.
+*/
+static
+void
+f2lud_create_closed_fast_spline_path(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ int primary,
+ int *ec
+)
+{
+ dk3_fig_spline_point_t *po;
+ size_t np;
+ size_t ib;
+ size_t ic;
+ size_t ia;
+ size_t id;
+ double dxdtb;
+ double dydtb;
+ double dxdtc;
+ double dydtc;
+
+
+#line 2252 "f2lud.ctr"
+ po = (obj->dt).spl.po;
+ np = (obj->dt).spl.np;
+ if (2 < np) {
+ for (ib = 0; ib < np; ib++) {
+ ic = ib + 1;
+ id = ib + 2;
+ if (ic >= np) { ic = ic - np; }
+ if (id >= np) { id = id - np; }
+ if (0 < ib) {
+ ia = ib - 1;
+ } else {
+ ia = np - 1;
+ }
+ if (0 == ib) {
+ /* MOVETO */
+ f2lud_fig_moveto(job, drw, obj, po[ib].x, po[ib].y, ec);
+ }
+ if ((fabs(po[ib].s) < 1.0e-6) && (fabs(po[ic].s) < 1.0e-6)) {
+ /* LINETO */
+ f2lud_fig_lineto(job, drw, obj, po[ic].x, po[ic].y, ec);
+ } else {
+ dxdtb = dxdtc = dk3ma_d_sub_ok(po[ic].x, po[ib].x, ec);
+ dydtb = dydtc = dk3ma_d_sub_ok(po[ic].y, po[ib].y, ec);
+ if (fabs(1.0 + po[ib].s) < 1.0e-6) {
+ dxdtb = f2lpara_derived_center(po[ia].x, po[ib].x, po[ic].x, ec);
+ dydtb = f2lpara_derived_center(po[ia].y, po[ib].y, po[ic].y, ec);
+ } else {
+ if (fabs(1.0 + po[ic].s) < 1.0e-6) {
+ dxdtb = f2lpara_derived_left(po[ib].x, po[ic].x, po[id].x, ec);
+ dydtb = f2lpara_derived_left(po[ib].y, po[ic].y, po[id].y, ec);
+ }
+ }
+ if (fabs(1.0 + po[ic].s) < 1.0e-6) {
+ dxdtc = f2lpara_derived_center(po[ib].x, po[ic].x, po[id].x, ec);
+ dydtc = f2lpara_derived_center(po[ib].y, po[ic].y, po[id].y, ec);
+ } else {
+ if (fabs(1.0 + po[ib].s) < 1.0e-6) {
+ dxdtc = f2lpara_derived_right(po[ia].x, po[ib].x, po[ic].x, ec);
+ dydtc = f2lpara_derived_right(po[ia].y, po[ib].y, po[ic].y, ec);
+ }
+ }
+ /* CURVETO */
+ f2lud_fig_curveto(
+ job, drw, obj,
+ dk3ma_d_add_ok(po[ib].x, (dxdtb / 3.0), ec),
+ dk3ma_d_add_ok(po[ib].y, (dydtb / 3.0), ec),
+ dk3ma_d_sub_ok(po[ic].x, (dxdtc / 3.0), ec),
+ dk3ma_d_sub_ok(po[ic].y, (dydtc / 3.0), ec),
+ po[ic].x,
+ po[ic].y,
+ ec
+ );
+ }
+ }
+ }
+
+
+#line 2308 "f2lud.ctr"
+}
+
+
+
+/** Create path for open arc object.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+ @param iscl Flag: Closed arc.
+ @param ec Pointe to error code variable, may be NULL.
+*/
+static
+void
+f2lud_create_arc_path(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ int iscl,
+ int *ec
+)
+{
+ double sx; /* Start x. */
+ double sy; /* Start y. */
+ double cx; /* Center x. */
+ double cy; /* Center y. */
+ double r; /* Radius. */
+ double as; /* Arc start angle in radians. */
+ double ae; /* Arc end angle in radians. */
+ double lastx; /* Segment start x. */
+ double lasty; /* Segment start y. */
+ double lastkdxdt; /* X difference to first control. */
+ double lastkdydt; /* Y difference to first control. */
+ double x; /* Segment end x. */
+ double y; /* Segment end y. */
+ double kdxdt; /* X difference to last control. */
+ double kdydt; /* Y difference to last control. */
+ double dnumsegs; /* Number of segments. */
+ double alpha; /* Arc angle in radians. */
+ double alphaseg; /* Segment angle in radians. */
+ double kappa; /* Factor for derivative. */
+ double alphaend; /* Segment end angle in radians. */
+ size_t nsegs; /* Number of segments. */
+ size_t i; /* Index of current segment. */
+
+
+#line 2352 "f2lud.ctr"
+ cx = (obj->dt).arc.xc;
+ cy = (obj->dt).arc.yc;
+ r = (obj->dt).arc.ra;
+ if((obj->dt).arc.as < (obj->dt).arc.ae) {
+ as = (obj->dt).arc.as;
+ ae = (obj->dt).arc.ae;
+ } else {
+ as = (obj->dt).arc.ae;
+ ae = (obj->dt).arc.as;
+ }
+ alpha = dk3ma_d_sub_ok(ae, as, ec);
+ dnumsegs = ceil(dk3ma_d_mul_ok(4.0, (alpha / M_PI), ec));
+
+
+#line 2365 "f2lud.ctr"
+ nsegs = dk3ma_d_to_sz_ok(dnumsegs, ec);
+ alphaseg = alpha / ((double)nsegs);
+ kappa = dk3fig_tool_arc_kappa(alphaseg, ec);
+ sx = lastx = dk3ma_d_add_ok(cx, (r * cos(as)), ec);
+ sy = lasty = dk3ma_d_add_ok(cy, (r * sin(as)), ec);
+ f2lud_fig_moveto(job, drw, obj, lastx, lasty, ec);
+ lastkdxdt = dk3ma_d_mul_ok(
+ kappa,
+ (-1.0 * dk3ma_d_mul_ok(r, alphaseg, ec) * sin(as)),
+ ec
+ );
+ lastkdydt = dk3ma_d_mul_ok(
+ kappa,
+ (dk3ma_d_mul_ok(r, alphaseg, ec) * cos(as)),
+ ec
+ );
+ for(i = 0; i < nsegs; i++) {
+ if(i < (nsegs - 1)) {
+ alphaend = dk3ma_d_add_ok(
+ as,
+ dk3ma_d_mul_ok(dk3ma_d_add_ok(1.0, (double)i, ec), alphaseg, ec),
+ ec
+ );
+ } else {
+ alphaend = ae;
+ }
+ x = dk3ma_d_add_ok(cx, (r * cos(alphaend)), ec);
+ y = dk3ma_d_add_ok(cy, (r * sin(alphaend)), ec);
+ kdxdt = dk3ma_d_mul_ok(
+ kappa,
+ (-1.0 * dk3ma_d_mul_ok(r, alphaseg, ec) * sin(alphaend)),
+ ec
+ );
+ kdydt = dk3ma_d_mul_ok(
+ kappa,
+ (dk3ma_d_mul_ok(r, alphaseg, ec) * cos(alphaend)),
+ ec
+ );
+ f2lud_fig_curveto(
+ job, drw, obj,
+ dk3ma_d_add_ok(lastx, lastkdxdt, ec),
+ dk3ma_d_add_ok(lasty, lastkdydt, ec),
+ dk3ma_d_sub_ok(x, kdxdt, ec),
+ dk3ma_d_sub_ok(y, kdydt, ec),
+ x, y,
+ ec
+ );
+ lastx = x; lasty = y; lastkdxdt = kdxdt; lastkdydt = kdydt;
+ }
+ /* For closed arc draw the lines.
+ */
+ if(iscl) {
+ f2lud_fig_lineto(job, drw, obj, cx, cy, ec);
+ f2lud_fig_lineto(job, drw, obj, sx, sy, ec);
+ }
+
+
+#line 2421 "f2lud.ctr"
+}
+
+
+
+/** Create path for half circle object.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+ @param ec Pointe to error code variable, may be NULL.
+*/
+static
+void
+f2lud_create_half_circle_path(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ int *ec
+)
+{
+ dk3_fig_poly_point_t po[7]; /* Points to construct path. */
+ size_t i; /* Current point index */
+
+
+#line 2443 "f2lud.ctr"
+ po[0].x = 0.0;
+ po[0].y = (obj->dt).hci.ra;
+ po[1].x = -1.0 * FIG2LAT_CIRCLE_QUADRANT_BEZIER * (obj->dt).hci.ra;
+ po[1].y = (obj->dt).hci.ra;
+ po[2].x = -1.0 * (obj->dt).hci.ra;
+ po[2].y = FIG2LAT_CIRCLE_QUADRANT_BEZIER * (obj->dt).hci.ra;
+ po[3].x = -1.0 * (obj->dt).hci.ra;
+ po[3].y = 0.0;
+ po[4].x = -1.0 * (obj->dt).hci.ra;
+ po[4].y = -1.0 * FIG2LAT_CIRCLE_QUADRANT_BEZIER * (obj->dt).hci.ra;
+ po[5].x = -1.0 * FIG2LAT_CIRCLE_QUADRANT_BEZIER * (obj->dt).hci.ra;
+ po[5].y = -1.0 * (obj->dt).hci.ra;
+ po[6].x = 0.0;
+ po[6].y = -1.0 * (obj->dt).hci.ra;
+ if(1.0e-6 < fabs((obj->dt).hci.an)) {
+ for(i = 0; i < 7; i++) {
+ dk3fig_tool_rotate_point(&(po[i]), (obj->dt).hci.an, ec);
+ }
+ }
+ for(i = 0; i < 7; i++) {
+ dk3fig_tool_shift_point(&(po[i]), (obj->dt).hci.cx, (obj->dt).hci.cy, ec);
+ }
+ f2lud_fig_moveto(job, drw, obj, po[0].x, po[0].y, ec);
+ f2lud_fig_curveto(
+ job, drw, obj, po[1].x, po[1].y, po[2].x, po[2].y, po[3].x, po[3].y, ec
+ );
+ f2lud_fig_curveto(
+ job, drw, obj, po[4].x, po[4].y, po[5].x, po[5].y, po[6].x, po[6].y, ec
+ );
+ if(obj->st) {
+ f2lud_fig_lineto(job, drw, obj, po[0].x, po[0].y, ec);
+ }
+
+
+#line 2476 "f2lud.ctr"
+}
+
+
+
+/** Create path for object.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+ @param ec Pointe to error code variable, may be NULL.
+ @param primary Flag: Primary object (1=object, 0=arrowhead).
+*/
+static
+void
+f2lud_create_path(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ int primary,
+ int *ec
+)
+{
+
+
+#line 2498 "f2lud.ctr"
+ switch(obj->ot) {
+ case DK3_FIG_OBJ_ELLIPSE: {
+ f2lud_create_ellipse_path(job, drw, obj, ec);
+ } break;
+ case DK3_FIG_OBJ_POLYLINE: {
+ switch(obj->st) {
+ case 1: { /* Polyline */
+ f2lud_create_polygon_path(job, drw, obj, ec);
+ } break;
+ case 2: { /* Box */
+ f2lud_create_box_path(job, drw, obj, ec);
+ } break;
+ case 3: { /* Polygon */
+ f2lud_create_polygon_path(job, drw, obj, ec);
+ } break;
+ case 4: { /* Arc-box */
+ f2lud_create_arc_box_path(job, drw, obj, ec);
+ } break;
+ }
+ } break;
+ case DK3_FIG_OBJ_SPLINE: {
+ switch(obj->st) {
+ case 0: case 2: case 4: { /* open spline */
+ f2lud_create_open_spline_path(job, drw, obj, primary, ec);
+ } break;
+ case 1: case 3: case 5: { /* closed spline */
+ f2lud_create_closed_spline_path(job, drw, obj, primary, ec);
+ } break;
+ }
+ } break;
+ case DK3_FIG_OBJ_ARC: {
+ switch(obj->st) {
+ case 1: { /* open arc */
+ f2lud_create_arc_path(job, drw, obj, 0, ec);
+ } break;
+ default: { /* closed arc */
+ f2lud_create_arc_path(job, drw, obj, 1, ec);
+ } break;
+ }
+ } break;
+ case DK3_FIG_OBJ_PSEUDO_HALF_CIRCLE: {
+ f2lud_create_half_circle_path(job, drw, obj, ec);
+ } break;
+ case DK3_FIG_OBJ_PSEUDO_FAST_SPLINE: {
+ switch(obj->st) {
+ case 0: case 2: case 4: { /* open spline */
+ f2lud_create_open_fast_spline_path(job, drw, obj, primary, ec);
+ } break;
+ case 1: case 3: case 5: { /* closed spline */
+ f2lud_create_closed_fast_spline_path(job, drw, obj, primary, ec);
+ } break;
+ }
+ } break;
+ }
+
+#line 2552 "f2lud.ctr"
+}
+
+
+
+/** Set color (stroke color for pdf/pgf).
+ If we already have a color 1 equal to the new color
+ the operation is skipped.
+ @param job Conversion job structure.
+ @param drw Drawing structure.
+ @param colno Color number.
+ @param fillstyle Fill style used in the object.
+ Depending on the fillstyle it might be necessary
+ to create a shade of the color.
+*/
+static
+void
+f2lud_set_color_1(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ int colno,
+ int fillstyle
+)
+{
+ dk3_rgb_color_t rgb; /* Color structure to fill. */
+ int muc = 1; /* Flag: Must configure. */
+#if 0
+ int ec = 0; /* Error code variable. */
+#endif
+
+
+#line 2581 "f2lud.ctr"
+ dk3fig_tool_find_color(&rgb, drw, colno, fillstyle);
+#if 0
+ if((job->gs).hc1) {
+ if(1.0e-6 > fabs(dk3ma_d_sub_ok(rgb.r, (job->gs).c1.r, &ec))) {
+ if(1.0e-6 > fabs(dk3ma_d_sub_ok(rgb.g, (job->gs).c1.g, &ec))) {
+ if(1.0e-6 > fabs(dk3ma_d_sub_ok(rgb.b, (job->gs).c1.b, &ec))) {
+ if(0 == ec) {
+ muc = 0;
+ }
+ }
+ }
+ }
+ }
+#else
+ muc = dk3fig_tool_must_set_color(
+ (job->gs).hc1, (job->gs).c1.r, (job->gs).c1.g, (job->gs).c1.b,
+ rgb.r, rgb.g, rgb.b
+ );
+#endif
+ if(muc) {
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_TEX_FULL_PGF: {
+ f2lpgf_tex_set_color_1(job, drw, &rgb);
+ } break;
+ case FIG2LAT_DRIVER_TEX_FULL_PDF: {
+ f2lpdf_tex_with_pdf_set_color_1(job, drw, &rgb);
+ } break;
+ case FIG2LAT_DRIVER_EPS_WITH_TEX: {
+ f2leps_eps_with_tex_set_color_1(job, drw, &rgb);
+ } break;
+ case FIG2LAT_DRIVER_PDF_WITH_TEX: {
+ f2lpdf_pdf_with_tex_set_color_1(job, drw, &rgb);
+ } break;
+ case FIG2LAT_DRIVER_EPS_STANDALONE: {
+ f2leps_eps_pure_set_color_1(job, drw, &rgb);
+ } break;
+ /* @DRIVER@ universal */
+ default: {
+ f2lpgf_pgf_set_color_1(job, drw, &rgb);
+ } break;
+ }
+ (job->gs).c1.r = rgb.r;
+ (job->gs).c1.g = rgb.g;
+ (job->gs).c1.b = rgb.b;
+ (job->gs).hc1 = 1;
+ }
+
+
+#line 2628 "f2lud.ctr"
+}
+
+
+
+/** Set non-stroking color for pdf/pgf.
+ If we already have a color 2 equal to the new color
+ the operation is skipped.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param colno Color number.
+ @param fillstyle Fill style used in the object.
+ Depending on the fillstyle it might be necessary
+ to create a shade of the color.
+*/
+static
+void
+f2lud_set_color_2(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ int colno,
+ int fillstyle
+)
+{
+ dk3_rgb_color_t rgb; /* Color structure to fill. */
+#if 0
+ int ec = 0; /* Error code variable. */
+#endif
+ int muc = 1; /* Flag: Must configure. */
+
+
+#line 2657 "f2lud.ctr"
+
+ dk3fig_tool_find_color(&rgb, drw, colno, fillstyle);
+#if 0
+ if((job->gs).hc2) {
+ if(1.0e-6 > fabs(dk3ma_d_sub_ok(rgb.r, (job->gs).c2.r, &ec))) {
+ if(1.0e-6 > fabs(dk3ma_d_sub_ok(rgb.g, (job->gs).c2.g, &ec))) {
+ if(1.0e-6 > fabs(dk3ma_d_sub_ok(rgb.b, (job->gs).c2.b, &ec))) {
+ if(0 == ec) {
+ muc = 0;
+ }
+ }
+ }
+ }
+ }
+#else
+ muc = dk3fig_tool_must_set_color(
+ (job->gs).hc2, (job->gs).c2.r, (job->gs).c2.g, (job->gs).c2.b,
+ rgb.r, rgb.g, rgb.b
+ );
+#endif
+ if(muc) {
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_TEX_FULL_PGF: {
+ f2lpgf_tex_set_color_2(job, drw, &rgb);
+ } break;
+ case FIG2LAT_DRIVER_TEX_FULL_PDF: {
+ f2lpdf_tex_with_pdf_set_color_2(job, drw, &rgb);
+ } break;
+ case FIG2LAT_DRIVER_EPS_WITH_TEX: {
+ f2leps_eps_with_tex_set_color_2(job, drw, &rgb);
+ } break;
+ case FIG2LAT_DRIVER_PDF_WITH_TEX: {
+ f2lpdf_pdf_with_tex_set_color_2(job, drw, &rgb);
+ } break;
+ case FIG2LAT_DRIVER_EPS_STANDALONE: {
+ f2leps_eps_pure_set_color_2(job, drw, &rgb);
+ } break;
+ /* @DRIVER@ universal */
+ default: {
+ f2lpgf_pgf_set_color_2(job, drw, &rgb);
+ } break;
+ }
+ (job->gs).c2.r = rgb.r;
+ (job->gs).c2.g = rgb.g;
+ (job->gs).c2.b = rgb.b;
+ (job->gs).hc2 = 1;
+ }
+
+
+#line 2705 "f2lud.ctr"
+}
+
+
+
+/** Internal function to set line width.
+ The line width is not set again if we already
+ have a current line width equal to the new line width.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object.
+ @param lw New line width in output coordinates.
+*/
+static
+void
+f2lud_internal_set_line_width(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ double lw
+)
+{
+ int mc = 1; /* Flag: Must configure. */
+ int ec = 0; /* Error code variable. */
+
+
+#line 2729 "f2lud.ctr"
+ if((job->gs).hlw) {
+ if(1.0e-6 > fabs(dk3ma_d_sub_ok(lw, (job->gs).lw, &ec))) {
+ if(0 == ec) {
+ mc = 0;
+ }
+ }
+ }
+ if(mc) {
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_TEX_FULL_PGF: {
+ f2lpgf_tex_set_line_width(job, drw, obj, lw);
+ } break;
+ case FIG2LAT_DRIVER_TEX_FULL_PDF: {
+ f2lpdf_tex_with_pdf_set_line_width(job, drw, obj, lw);
+ } break;
+ case FIG2LAT_DRIVER_EPS_WITH_TEX: {
+ f2leps_eps_with_tex_set_line_width(job, drw, obj, lw);
+ } break;
+ case FIG2LAT_DRIVER_PDF_WITH_TEX: {
+ f2lpdf_pdf_with_tex_set_line_width(job, drw, obj, lw);
+ } break;
+ case FIG2LAT_DRIVER_EPS_STANDALONE: {
+ f2leps_eps_pure_set_line_width(job, drw, obj, lw);
+ } break;
+ /* @DRIVER@ universal */
+ default: {
+ f2lpgf_pgf_set_line_width(job, drw, obj, lw);
+ } break;
+ }
+ (job->gs).lw = lw;
+ (job->gs).hlw = 1;
+ }
+
+
+#line 2762 "f2lud.ctr"
+}
+
+
+
+/** Set line dash (line style and dash/gap length).
+ The operation is skipped if the current line style and style
+ value is equal to the new one.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Fig object.
+ @param ls Line style.
+ @param sv Style value (dash/gap) length in output units.
+*/
+static
+void
+f2lud_internal_set_line_dash(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ int ls,
+ double sv
+)
+{
+ double mysv; /* Style value converted to output space. */
+ double mylw; /* Line width in Fig and output space. */
+ int mc = 1; /* Flag: Must configure. */
+ int ec = 0; /* Error code variable. */
+
+
+#line 2790 "f2lud.ctr"
+ mysv = 0.9 * sv;
+ mylw = dk3fig_tool_get_lw(drw, obj, &ec);
+ /* Convert line width to output space.
+ */
+ mylw = dk3ct_2d_r(&(job->ct2d), mylw, &ec);
+ if((job->gs).hls) {
+ if((job->gs).ls == ls) {
+ if(DK3_FIG_LS_SOLID == ls) {
+ mc = 0;
+ } else {
+ if(1.0e-6 > fabs(dk3ma_d_sub_ok((job->gs).sv, mysv, &ec))) {
+ if(0 == ec) {
+ if(DK3_FIG_LS_DASHED == ls) {
+ mc = 0;
+ } else {
+ if(1.0e-6 > fabs(dk3ma_d_sub_ok((job->gs).slw, mylw, &ec))) {
+ if(0 == ec) {
+ mc = 0;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ if(mc) {
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_TEX_FULL_PGF: {
+ f2lpgf_tex_set_line_style(job, drw, obj, ls, mysv, mylw);
+ } break;
+ case FIG2LAT_DRIVER_TEX_FULL_PDF: {
+ f2lpdf_tex_with_pdf_set_line_style(job, drw, obj, ls, mysv, mylw);
+ } break;
+ case FIG2LAT_DRIVER_EPS_WITH_TEX: {
+ f2leps_eps_with_tex_set_line_style(job, drw, obj, ls, mysv, mylw);
+ } break;
+ case FIG2LAT_DRIVER_PDF_WITH_TEX: {
+ f2lpdf_pdf_with_tex_set_line_style(job, drw, obj, ls, mysv, mylw);
+ } break;
+ case FIG2LAT_DRIVER_EPS_STANDALONE: {
+ f2leps_eps_pure_set_line_style(job, drw, obj, ls, mysv, mylw);
+ } break;
+ /* @DRIVER@ universal */
+ default: {
+ f2lpgf_pgf_set_line_style(job, drw, obj, ls, mysv, mylw);
+ } break;
+ }
+ (job->gs).ls = ls; (job->gs).sv = mysv; (job->gs).slw = mylw;
+ (job->gs).hls = 1;
+ }
+
+
+#line 2842 "f2lud.ctr"
+}
+
+
+
+/** Set line ends.
+ The operation is skipped if the current line end is equal
+ to the new one.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object.
+ @param le Line end style.
+*/
+static
+void
+f2lud_set_line_end(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ int le
+)
+{
+ int mc = 1; /* Flag: Must configure. */
+
+
+#line 2865 "f2lud.ctr"
+ if((job->gs).hlc) {
+ if((job->gs).lc == le) {
+ mc = 0;
+ }
+ }
+ if(mc) {
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_TEX_FULL_PGF: {
+ f2lpgf_tex_set_line_end(job, drw, obj, le);
+ } break;
+ case FIG2LAT_DRIVER_TEX_FULL_PDF: {
+ f2lpdf_tex_with_pdf_set_line_end(job, drw, obj, le);
+ } break;
+ case FIG2LAT_DRIVER_EPS_WITH_TEX: {
+ f2leps_eps_with_tex_set_line_end(job, drw, obj, le);
+ } break;
+ case FIG2LAT_DRIVER_PDF_WITH_TEX: {
+ f2lpdf_pdf_with_tex_set_line_end(job, drw, obj, le);
+ } break;
+ case FIG2LAT_DRIVER_EPS_STANDALONE: {
+ f2leps_eps_pure_set_line_end(job, drw, obj, le);
+ } break;
+ /* @DRIVER@ universal */
+ default: {
+ f2lpgf_pgf_set_line_end(job, drw, obj, le);
+ } break;
+ }
+ (job->gs).lc = le; (job->gs).hlc = 1;
+ }
+
+
+#line 2895 "f2lud.ctr"
+}
+
+
+
+/** Set line join.
+ The operation is skipped if the current line join is equal
+ to the new one.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object.
+ @param lj Line end style.
+*/
+static
+void
+f2lud_set_line_join(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ int lj
+)
+{
+ int mc = 1; /* Flag: Must configure. */
+
+
+#line 2918 "f2lud.ctr"
+ if((job->gs).hlj) {
+ if((job->gs).lj == lj) {
+ mc = 0;
+ }
+ }
+ if(mc) {
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_TEX_FULL_PGF: {
+ f2lpgf_tex_set_line_join(job, drw, obj, lj);
+ } break;
+ case FIG2LAT_DRIVER_TEX_FULL_PDF: {
+ f2lpdf_tex_with_pdf_set_line_join(job, drw, obj, lj);
+ } break;
+ case FIG2LAT_DRIVER_EPS_WITH_TEX: {
+ f2leps_eps_with_tex_set_line_join(job, drw, obj, lj);
+ } break;
+ case FIG2LAT_DRIVER_PDF_WITH_TEX: {
+ f2lpdf_pdf_with_tex_set_line_join(job, drw, obj, lj);
+ } break;
+ case FIG2LAT_DRIVER_EPS_STANDALONE: {
+ f2leps_eps_pure_set_line_join(job, drw, obj, lj);
+ } break;
+ /* @DRIVER@ universal */
+ default: {
+ f2lpgf_pgf_set_line_join(job, drw, obj, lj);
+ } break;
+ }
+ (job->gs).lj = lj; (job->gs).hlj = 1;
+ }
+
+
+#line 2948 "f2lud.ctr"
+}
+
+
+
+/** Set up line style, line width, line ends and line join for pattern.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+*/
+static
+void
+f2lud_set_pattern_line_style(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj
+)
+{
+
+
+#line 2966 "f2lud.ctr"
+#if VERSION_BEFORE_20140330
+ f2lud_internal_set_line_width(job, drw, obj, ((job->lighten) ? 0.45 : 0.9));
+#else
+ f2lud_internal_set_line_width(job, drw, obj, job->lwbp);
+#endif
+ f2lud_internal_set_line_dash(job, drw, obj, DK3_FIG_LS_SOLID, -1.0);
+ f2lud_set_line_end(job, drw, obj, DK3_FIG_LC_BUTT);
+ f2lud_set_line_join(job, drw, obj, DK3_FIG_LJ_MITER);
+#if 0
+ /* 2012/11/18
+ In fishscale patterns we draw arc by arc, not a sequence
+ of arcs. So we do not need to care about line join
+ of arcs.
+ */
+ switch(obj->fi) {
+ case 56: case 57: {
+ f2lud_set_line_join(job, drw, obj, DK3_FIG_LJ_BEVEL);
+ } break;
+ default: {
+ f2lud_set_line_join(job, drw, obj, DK3_FIG_LJ_MITER);
+ } break;
+ }
+#endif
+
+
+#line 2990 "f2lud.ctr"
+}
+
+
+
+/** Set line width.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+*/
+static
+void
+f2lud_set_line_width(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj
+)
+{
+ double lw; /* Line width in Fig space. */
+ int ec = 0; /* Error code variable. */
+
+
+#line 3010 "f2lud.ctr"
+ lw = dk3fig_tool_get_lw(drw, obj, &ec);
+ lw = dk3ct_2d_r(&(job->ct2d), lw, &ec);
+ if(0 == ec) {
+ f2lud_internal_set_line_width(job, drw, obj, lw);
+ }
+
+#line 3015 "f2lud.ctr"
+}
+
+
+
+/** Set line dash (line style and dash/gap length).
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Fig object.
+*/
+static
+void
+f2lud_set_line_dash(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj
+)
+{
+
+
+#line 3033 "f2lud.ctr"
+ f2lud_internal_set_line_dash(job, drw, obj, obj->ls, (0.9 * obj->sv));
+
+
+#line 3035 "f2lud.ctr"
+}
+
+
+
+/** Draw operations for object: stroke.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+ @param ec Pointe to error code variable, may be NULL.
+ @param primary Flag: primary (1=primary object, 0=arrowhead).
+*/
+static
+void
+f2lud_path_stroke(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ int primary,
+ int *ec
+)
+{
+
+
+#line 3057 "f2lud.ctr"
+ f2lud_set_color_1(job, drw, obj->pc, 20);
+ f2lud_set_line_width(job, drw, obj);
+ f2lud_set_line_dash(job, drw, obj);
+ f2lud_set_line_end(job, drw, obj, obj->cs);
+ f2lud_set_line_join(job, drw, obj, obj->js);
+ f2lud_newpath(job, drw, obj);
+ f2lud_create_path(job, drw, obj, primary, ec);
+ if(obj->cl) {
+ f2lud_closepath(job, drw, obj);
+ }
+ f2lud_stroke(job, drw, obj);
+
+
+#line 3069 "f2lud.ctr"
+}
+
+
+
+/** Draw operations for object: fill.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+ @param ec Pointe to error code variable, may be NULL.
+ @param primary Flag: primary (1=primary object, 0=arrowhead).
+*/
+static
+void
+f2lud_path_fill(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ int primary,
+ int *ec
+)
+{
+
+
+#line 3091 "f2lud.ctr"
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_PGF:
+ case FIG2LAT_DRIVER_TEX_FULL_PGF:
+ case FIG2LAT_DRIVER_TEX_FULL_PDF:
+ case FIG2LAT_DRIVER_PDF_WITH_TEX:
+ {
+ f2lud_set_color_2(job, drw, obj->fc, obj->fi);
+ } break;
+ default: {
+ f2lud_set_color_1(job, drw, obj->fc, obj->fi);
+ } break;
+ }
+ f2lud_newpath(job, drw, obj);
+ f2lud_create_path(job, drw, obj, primary, ec);
+ f2lud_closepath(job, drw, obj);
+ f2lud_fill(job, drw, obj);
+
+
+#line 3108 "f2lud.ctr"
+}
+
+
+
+/** Draw operations for object: fill and stroke.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+ @param ec Pointe to error code variable, may be NULL.
+ @param primary Flag: primary (1=primary object, 0=arrowhead).
+*/
+static
+void
+f2lud_path_fill_stroke(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ int primary,
+ int *ec
+)
+{
+
+
+#line 3130 "f2lud.ctr"
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_PGF:
+ case FIG2LAT_DRIVER_TEX_FULL_PGF:
+ {
+ f2lud_set_color_2(job, drw, obj->fc, obj->fi);
+ f2lud_set_color_1(job, drw, obj->pc, 20);
+ f2lud_set_line_width(job, drw, obj);
+ f2lud_set_line_dash(job, drw, obj);
+ f2lud_set_line_end(job, drw, obj, obj->cs);
+ f2lud_set_line_join(job, drw, obj, obj->js);
+ f2lud_newpath(job, drw, obj);
+ f2lud_create_path(job, drw, obj, primary, ec);
+ f2lud_closepath(job, drw, obj);
+ f2lud_fill_stroke(job, drw, obj);
+ } break;
+ case FIG2LAT_DRIVER_TEX_FULL_PDF:
+ case FIG2LAT_DRIVER_PDF_WITH_TEX:
+ {
+ f2lud_set_color_2(job, drw, obj->fc, obj->fi);
+ f2lud_set_color_1(job, drw, obj->pc, 20);
+ f2lud_set_line_width(job, drw, obj);
+ f2lud_set_line_dash(job, drw, obj);
+ f2lud_set_line_end(job, drw, obj, obj->cs);
+ f2lud_set_line_join(job, drw, obj, obj->js);
+ f2lud_newpath(job, drw, obj);
+ f2lud_create_path(job, drw, obj, primary, ec);
+ f2lud_closepath(job, drw, obj);
+ f2lud_fill(job, drw, obj);
+ f2lud_newpath(job, drw, obj);
+ f2lud_create_path(job, drw, obj, primary, ec);
+ f2lud_closepath(job, drw, obj);
+ f2lud_stroke(job, drw, obj);
+ } break;
+ default: {
+ f2lud_set_line_width(job, drw, obj);
+ f2lud_set_line_dash(job, drw, obj);
+ f2lud_set_line_end(job, drw, obj, obj->cs);
+ f2lud_set_line_join(job, drw, obj, obj->js);
+ f2lud_set_color_1(job, drw, obj->fc, obj->fi);
+ f2lud_newpath(job, drw, obj);
+ f2lud_create_path(job, drw, obj, primary, ec);
+ f2lud_closepath(job, drw, obj);
+ f2lud_fill(job, drw, obj);
+ f2lud_set_color_1(job, drw, obj->pc, obj->fi);
+ f2lud_newpath(job, drw, obj);
+ f2lud_create_path(job, drw, obj, primary, ec);
+ f2lud_closepath(job, drw, obj);
+ f2lud_stroke(job, drw, obj);
+ } break;
+ }
+
+#line 3180 "f2lud.ctr"
+}
+
+
+
+/** Draw operations for object: pattern.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+ @param ec Pointe to error code variable, may be NULL.
+ @param primary Flag: primary (1=primary object, 0=arrowhead).
+*/
+static
+void
+f2lud_path_pattern(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ int primary,
+ int *ec
+)
+{
+
+
+#line 3202 "f2lud.ctr"
+ f2lud_set_pattern_line_style(job, drw, obj);
+ f2lud_set_color_1(job, drw, obj->pc, 20);
+ f2lud_gsave(job, drw, obj);
+ f2lud_newpath(job, drw, obj);
+ f2lud_create_path(job, drw, obj, primary, ec);
+ f2lud_closepath(job, drw, obj);
+ f2lud_clip(job, drw, obj);
+ f2lud_pattern(job, drw, obj, ec);
+ f2lud_grestore(job, drw, obj);
+
+
+#line 3212 "f2lud.ctr"
+}
+
+
+
+/** Draw operations for object: pattern and stroke.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+ @param ec Pointe to error code variable, may be NULL.
+ @param primary Flag: primary (1=primary object, 0=arrowhead).
+*/
+static
+void
+f2lud_path_pattern_stroke(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ int primary,
+ int *ec
+)
+{
+
+
+#line 3234 "f2lud.ctr"
+ f2lud_set_color_1(job, drw, obj->pc, 20);
+ f2lud_set_pattern_line_style(job, drw, obj);
+ f2lud_gsave(job, drw, obj);
+ f2lud_newpath(job, drw, obj);
+ f2lud_create_path(job, drw, obj, primary, ec);
+ f2lud_closepath(job, drw, obj);
+ f2lud_clip(job, drw, obj);
+ f2lud_pattern(job, drw, obj, ec);
+ f2lud_grestore(job, drw, obj);
+ f2lud_set_line_width(job, drw, obj);
+ f2lud_set_line_dash(job, drw, obj);
+ f2lud_set_line_end(job, drw, obj, obj->cs);
+ f2lud_set_line_join(job, drw, obj, obj->js);
+ f2lud_newpath(job, drw, obj);
+ f2lud_create_path(job, drw, obj, primary, ec);
+ f2lud_closepath(job, drw, obj);
+ f2lud_stroke(job, drw, obj);
+
+
+#line 3252 "f2lud.ctr"
+}
+
+
+
+/** Draw operations for object: fill and pattern.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+ @param ec Pointe to error code variable, may be NULL.
+ @param primary Flag: primary (1=primary object, 0=arrowhead).
+*/
+static
+void
+f2lud_path_fill_pattern(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ int primary,
+ int *ec
+)
+{
+
+
+#line 3274 "f2lud.ctr"
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_PGF:
+ case FIG2LAT_DRIVER_TEX_FULL_PGF:
+ {
+ f2lud_set_color_2(job, drw, obj->fc, obj->fi);
+ f2lud_set_color_1(job, drw, obj->pc, 20);
+ f2lud_set_pattern_line_style(job, drw, obj);
+ f2lud_gsave(job, drw, obj);
+ f2lud_newpath(job, drw, obj);
+ f2lud_create_path(job, drw, obj, primary, ec);
+ f2lud_closepath(job, drw, obj);
+ f2lud_fill_clip(job, drw, obj);
+ f2lud_pattern(job, drw, obj, ec);
+ f2lud_grestore(job, drw, obj);
+ } break;
+ default: {
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_TEX_FULL_PDF:
+ case FIG2LAT_DRIVER_PDF_WITH_TEX:
+ {
+ f2lud_set_color_2(job, drw, obj->fc, obj->fi);
+ f2lud_set_color_1(job, drw, obj->pc, 20);
+ f2lud_set_pattern_line_style(job, drw, obj);
+ f2lud_newpath(job, drw, obj);
+ f2lud_create_path(job, drw, obj, primary, ec);
+ f2lud_closepath(job, drw, obj);
+ f2lud_fill(job, drw, obj);
+ f2lud_gsave(job, drw, obj);
+ f2lud_newpath(job, drw, obj);
+ f2lud_create_path(job, drw, obj, primary, ec);
+ f2lud_closepath(job, drw, obj);
+ f2lud_clip(job, drw, obj);
+ f2lud_pattern(job, drw, obj, ec);
+ f2lud_grestore(job, drw, obj);
+ } break;
+ default: {
+ f2lud_set_color_1(job, drw, obj->fc, obj->fi);
+ f2lud_set_pattern_line_style(job, drw, obj);
+ f2lud_newpath(job, drw, obj);
+ f2lud_create_path(job, drw, obj, primary, ec);
+ f2lud_closepath(job, drw, obj);
+ f2lud_fill(job, drw, obj);
+ f2lud_set_color_1(job, drw, obj->pc, 20);
+ f2lud_gsave(job, drw, obj);
+ f2lud_newpath(job, drw, obj);
+ f2lud_create_path(job, drw, obj, primary, ec);
+ f2lud_closepath(job, drw, obj);
+ f2lud_clip(job, drw, obj);
+ f2lud_pattern(job, drw, obj, ec);
+ f2lud_grestore(job, drw, obj);
+ } break;
+ }
+ } break;
+ }
+
+#line 3328 "f2lud.ctr"
+}
+
+
+
+/** Check whether on object line style and line width
+ matches style and width configured in a dk3_graphics_state_t.
+ @param gs dk3_graphics_state_t to test.
+ @param ct2d Coordinates transformation data.
+ @param drw Drawing containing the Fig object.
+ @param obj Fig object.
+ @return 1 for equal line width and style, 0 otherwise.
+*/
+static
+int
+f2lud_style_equal(
+ dk3_graphics_state_t *gs,
+ dk3_ct_2d_t *ct2d,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj
+)
+{
+ double lw; /* Line width in Fig space. */
+ int back = 0;
+ int ec = 0; /* Error code variable. */
+#if 0
+ if((gs->hlw) && (gs->hls) && (gs->hlc) && (gs->hlj)) {
+ if((gs->ls = obj->ls) && (gs->lc == obj->cs) && (gs->lj == obj->js)) {
+ lw = dk3fig_tool_get_lw(drw, obj, &ec);
+ if(1.0e-6 > fabs(dk3ma_d_sub_ok(gs->lw, lw, &ec))) {
+ if(0 == ec) {
+ if(DK3_FIG_LS_SOLID == obj->ls) {
+ back = 1;
+ } else {
+ sv = 0.9 * obj->sv;
+ if(1.0e-6 > fabs(dk3ma_d_sub_ok(gs->sv, sv, &ec))) {
+ if(0 == ec) {
+ back = 1;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+#else
+ /* 2012/11/15 As this operation is applied to closed path objects
+ only, there is no need to check line ends.
+ As fill patterns are drawn as solid lines, we only have
+ to check the object line style, whether it is solid.
+ For solid lines the style value is ignored.
+ */
+ if((gs->hlw) && (gs->hls) && (gs->hlj)) {
+ if(DK3_FIG_LS_SOLID == obj->ls) {
+ if(gs->lj == obj->js) {
+ lw = dk3fig_tool_get_lw(drw, obj, &ec);
+ lw = dk3ct_2d_r(ct2d, lw, &ec);
+ if(1.0e-6 > fabs(dk3ma_d_sub_ok(gs->lw, lw, &ec))) {
+ if(0 == ec) {
+ back = 1;
+ }
+ }
+ }
+ }
+ }
+#endif
+ return back;
+}
+
+
+
+/** Draw operations for object: fill, pattern and stroke.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+ @param ec Pointe to error code variable, may be NULL.
+ @param primary Flag: primary (1=primary object, 0=arrowhead).
+*/
+static
+void
+f2lud_path_fill_pattern_stroke(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ int primary,
+ int *ec
+)
+{
+
+
+#line 3416 "f2lud.ctr"
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_PGF:
+ case FIG2LAT_DRIVER_TEX_FULL_PGF:
+ {
+ f2lud_set_color_2(job, drw, obj->fc, obj->fi);
+ f2lud_set_color_1(job, drw, obj->pc, 20);
+ f2lud_set_pattern_line_style(job, drw, obj);
+ if(f2lud_style_equal(&(job->gs), &(job->ct2d), drw, obj)) {
+ f2lud_gsave(job, drw, obj);
+ f2lud_newpath(job, drw, obj);
+ f2lud_create_path(job, drw, obj, primary, ec);
+ f2lud_closepath(job, drw, obj);
+ f2lud_fill_stroke_clip(job, drw, obj);
+ f2lud_pattern(job, drw, obj, ec);
+ f2lud_grestore(job, drw, obj);
+ } else {
+ f2lud_gsave(job, drw, obj);
+ f2lud_newpath(job, drw, obj);
+ f2lud_create_path(job, drw, obj, primary, ec);
+ f2lud_closepath(job, drw, obj);
+ f2lud_fill_clip(job, drw, obj);
+ f2lud_pattern(job, drw, obj, ec);
+ f2lud_grestore(job, drw, obj);
+ f2lud_set_line_width(job, drw, obj);
+ f2lud_set_line_dash(job, drw, obj);
+ f2lud_set_line_end(job, drw, obj, obj->cs);
+ f2lud_set_line_join(job, drw, obj, obj->js);
+ f2lud_newpath(job, drw, obj);
+ f2lud_create_path(job, drw, obj, primary, ec);
+ f2lud_closepath(job, drw, obj);
+ f2lud_stroke(job, drw, obj);
+ }
+ } break;
+ case FIG2LAT_DRIVER_TEX_FULL_PDF:
+ case FIG2LAT_DRIVER_PDF_WITH_TEX:
+ {
+ f2lud_set_color_2(job, drw, obj->fc, obj->fi);
+ f2lud_set_color_1(job, drw, obj->pc, 20);
+ f2lud_set_pattern_line_style(job, drw, obj);
+ f2lud_newpath(job, drw, obj);
+ f2lud_create_path(job, drw, obj, primary, ec);
+ f2lud_closepath(job, drw, obj);
+ f2lud_fill(job, drw, obj);
+ f2lud_gsave(job, drw, obj);
+ f2lud_newpath(job, drw, obj);
+ f2lud_create_path(job, drw, obj, primary, ec);
+ f2lud_closepath(job, drw, obj);
+ f2lud_clip(job, drw, obj);
+ f2lud_pattern(job, drw, obj, ec);
+ f2lud_grestore(job, drw, obj);
+ f2lud_set_line_width(job, drw, obj);
+ f2lud_set_line_dash(job, drw, obj);
+ f2lud_set_line_end(job, drw, obj, obj->cs);
+ f2lud_set_line_join(job, drw, obj, obj->js);
+ f2lud_newpath(job, drw, obj);
+ f2lud_create_path(job, drw, obj, primary, ec);
+ f2lud_closepath(job, drw, obj);
+ f2lud_stroke(job, drw, obj);
+ } break;
+ default: {
+ f2lud_set_color_1(job, drw, obj->fc, obj->fi);
+ f2lud_set_pattern_line_style(job, drw, obj);
+ f2lud_newpath(job, drw, obj);
+ f2lud_create_path(job, drw, obj, primary, ec);
+ f2lud_closepath(job, drw, obj);
+ f2lud_fill(job, drw, obj);
+ f2lud_set_color_1(job, drw, obj->pc, 20);
+ f2lud_gsave(job, drw, obj);
+ f2lud_newpath(job, drw, obj);
+ f2lud_create_path(job, drw, obj, primary, ec);
+ f2lud_closepath(job, drw, obj);
+ f2lud_clip(job, drw, obj);
+ f2lud_pattern(job, drw, obj, ec);
+ f2lud_grestore(job, drw, obj);
+ f2lud_set_line_width(job, drw, obj);
+ f2lud_set_line_dash(job, drw, obj);
+ f2lud_set_line_end(job, drw, obj, obj->cs);
+ f2lud_set_line_join(job, drw, obj, obj->js);
+ f2lud_newpath(job, drw, obj);
+ f2lud_create_path(job, drw, obj, primary, ec);
+ f2lud_closepath(job, drw, obj);
+ f2lud_stroke(job, drw, obj);
+ } break;
+ }
+
+#line 3500 "f2lud.ctr"
+}
+
+
+
+/** Process path object.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+ @param primary Flag: primary (1=primary object, 0=arrowhead).
+*/
+static
+void
+f2lud_path_object(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ int primary
+)
+{
+ int drawop; /* Operations to perform. */
+ int ec = 0; /* Error code variable. */
+
+
+#line 3522 "f2lud.ctr"
+ drawop = dk3fig_tool_get_operation(drw, obj);
+ if(obj->cl) {
+ switch(drawop) {
+ case DK3_FIG_OP_STROKE: {
+ f2lud_path_stroke(job, drw, obj, primary, &ec);
+ } break;
+ case DK3_FIG_OP_FILL: {
+ f2lud_path_fill(job, drw, obj, primary, &ec);
+ } break;
+ case (DK3_FIG_OP_FILL | DK3_FIG_OP_STROKE): {
+ f2lud_path_fill_stroke(job, drw, obj, primary, &ec);
+ } break;
+ case DK3_FIG_OP_PATTERN: {
+ f2lud_path_pattern(job, drw, obj, primary, &ec);
+ } break;
+ case (DK3_FIG_OP_PATTERN | DK3_FIG_OP_STROKE): {
+ f2lud_path_pattern_stroke(job, drw, obj, primary, &ec);
+ } break;
+ case (DK3_FIG_OP_PATTERN | DK3_FIG_OP_FILL): {
+ f2lud_path_fill_pattern(job, drw, obj, primary, &ec);
+ } break;
+ case (DK3_FIG_OP_PATTERN | DK3_FIG_OP_FILL | DK3_FIG_OP_STROKE): {
+ f2lud_path_fill_pattern_stroke(job, drw, obj, primary, &ec);
+ } break;
+ }
+ } else {
+ if(DK3_FIG_OP_STROKE & drawop) {
+ f2lud_path_stroke(job, drw, obj, primary, &ec);
+ }
+ }
+ if(ec) {
+ /* ERROR: Math error in object! */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 38);
+ f2l_tool_set_exit_status(job, FIG2LAT_EXIT_ERROR_MATH);
+
+#line 3556 "f2lud.ctr"
+ }
+
+#line 3557 "f2lud.ctr"
+}
+
+
+
+/** Process one object.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+ @param primary Flag: primary (1=primary object, 0=arrowhead).
+*/
+static
+void
+f2lud_process_one(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ int primary
+)
+{
+ char debbuf[256]; /* Buffer for debug messages. */
+
+
+#line 3578 "f2lud.ctr"
+ if(job->debug) {
+ sprintf(debbuf, f2lud_c8_kw[6], obj->ot, obj->st);
+ f2lud_debug(job, debbuf);
+ }
+ switch(obj->ot) {
+ case DK3_FIG_OBJ_TEXT: {
+ f2lud_text_object(job, drw, obj);
+ } break;
+ case DK3_FIG_OBJ_ELLIPSE:
+ case DK3_FIG_OBJ_SPLINE:
+ case DK3_FIG_OBJ_ARC:
+ case DK3_FIG_OBJ_PSEUDO_HALF_CIRCLE:
+ case DK3_FIG_OBJ_PSEUDO_FAST_SPLINE:
+ {
+ f2lud_path_object(job, drw, obj, primary);
+ } break;
+ case DK3_FIG_OBJ_POLYLINE: {
+ switch(obj->st) {
+ case 5: {
+ f2lud_image_object(job, drw, obj);
+ } break;
+ default: {
+ f2lud_path_object(job, drw, obj, primary);
+ } break;
+ }
+ } break;
+ }
+ if(job->debug) {
+ f2lud_debug(job, f2lud_c8_kw[7]);
+ }
+
+#line 3608 "f2lud.ctr"
+}
+
+
+
+int
+f2lud_is_interpolated_spline(dk3_fig_obj_t *obj)
+{
+ dk3_fig_spline_point_t *po; /* Points to test */
+ size_t np; /* Number of points */
+ size_t i; /* Traverse all points */
+ int back = 1;
+
+
+#line 3620 "f2lud.ctr"
+ po = (obj->dt).spl.po;
+ np = (obj->dt).spl.np;
+ for (i = 0; ((i < np) && (1 == back)); i++) {
+
+
+#line 3624 "f2lud.ctr"
+ if (fabs(po->s) > 1.0e-6) {
+ if (fabs(1.0 + po->s) > 1.0e-6) {
+ back = 0;
+ }
+ }
+ po++;
+ }
+
+#line 3631 "f2lud.ctr"
+ return back;
+}
+
+
+
+/** Process one arrowhead object.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+*/
+static
+void
+f2lud_process_ah_one(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj
+)
+{
+ switch (obj->ot) {
+ case DK3_FIG_OBJ_SPLINE: {
+ if ((!(job->xsah)) && (f2lud_is_interpolated_spline(obj))) {
+ obj->ot = DK3_FIG_OBJ_PSEUDO_FAST_SPLINE;
+ f2lud_process_one(job, drw, obj, 0);
+ obj->ot = DK3_FIG_OBJ_SPLINE;
+ } else {
+ f2lud_process_one(job, drw, obj, 0);
+ }
+ } break;
+ default: {
+ f2lud_process_one(job, drw, obj, 0);
+ } break;
+ }
+}
+
+
+
+/** Process object and arrowheads.
+ @param job Job structure.
+ @param drw Drawing structure.
+ @param obj Current object to process.
+ @param objno Number of current object.
+*/
+static
+void
+f2lud_process_object(
+ f2l_job_t *job,
+ dk3_fig_drawing_t *drw,
+ dk3_fig_obj_t *obj,
+ unsigned long objno
+)
+{
+ char debbuf[256]; /* Buffer for debug messages. */
+
+
+#line 3684 "f2lud.ctr"
+ /*
+ Process object itself.
+ */
+
+
+#line 3688 "f2lud.ctr"
+ if(job->debug) {
+ sprintf(debbuf, f2lud_c8_kw[0], objno, obj->li, obj->ot, obj->st, obj->la);
+ f2lud_debug(job, debbuf);
+ }
+ f2lud_process_one(job, drw, obj, 1);
+
+
+#line 3694 "f2lud.ctr"
+ /*
+ For primary objects process the arrowheads.
+ */
+ if(obj->af) {
+
+
+#line 3699 "f2lud.ctr"
+ if(job->debug) {
+
+#line 3700 "f2lud.ctr"
+ sprintf(
+ debbuf, f2lud_c8_kw[2],
+ (obj->af)->as,
+ (obj->af)->af,
+ (obj->af)->he,
+ (obj->af)->wi
+ );
+ f2lud_debug(job, debbuf);
+ }
+ if((obj->af)->o1) {
+
+#line 3710 "f2lud.ctr"
+#if VERSION_BEFORE_20140329
+ f2lud_process_one(job,drw,(dk3_fig_obj_t *)((obj->af)->o1),0);
+#else
+ f2lud_process_ah_one(job, drw, (dk3_fig_obj_t *)((obj->af)->o1));
+#endif
+ }
+ if((obj->af)->o2) {
+
+#line 3717 "f2lud.ctr"
+#if VERSION_BEFORE_20140329
+ f2lud_process_one(job,drw,(dk3_fig_obj_t *)((obj->af)->o2),0);
+#else
+ f2lud_process_ah_one(job, drw, (dk3_fig_obj_t *)((obj->af)->o2));
+#endif
+ }
+ if(job->debug) {
+
+#line 3724 "f2lud.ctr"
+ f2lud_debug(job, f2lud_c8_kw[3]);
+ }
+
+
+#line 3727 "f2lud.ctr"
+ }
+ if(obj->ab) {
+
+
+#line 3730 "f2lud.ctr"
+ if(job->debug) {
+
+#line 3731 "f2lud.ctr"
+ sprintf(
+ debbuf, f2lud_c8_kw[4],
+ (obj->ab)->as,
+ (obj->ab)->af,
+ (obj->ab)->he,
+ (obj->ab)->wi
+ );
+ f2lud_debug(job, debbuf);
+ }
+ if((obj->ab)->o1) {
+
+#line 3741 "f2lud.ctr"
+#if VERSION_BEFORE_20140329
+ f2lud_process_one(job,drw,(dk3_fig_obj_t *)((obj->ab)->o1),0);
+#else
+ f2lud_process_ah_one(job, drw, (dk3_fig_obj_t *)((obj->ab)->o1));
+#endif
+ }
+ if((obj->ab)->o2) {
+
+#line 3748 "f2lud.ctr"
+#if VERSION_BEFORE_20140329
+ f2lud_process_one(job,drw,(dk3_fig_obj_t *)((obj->ab)->o2),0);
+#else
+ f2lud_process_ah_one(job, drw, (dk3_fig_obj_t *)((obj->ab)->o2));
+#endif
+ }
+ if(job->debug) {
+
+#line 3755 "f2lud.ctr"
+ f2lud_debug(job, f2lud_c8_kw[5]);
+ }
+
+
+#line 3758 "f2lud.ctr"
+ }
+ if(job->debug) {
+ sprintf(debbuf, f2lud_c8_kw[1], objno);
+ f2lud_debug(job, debbuf);
+ }
+
+
+#line 3764 "f2lud.ctr"
+}
+
+
+
+void
+f2lud_output(f2l_job_t *job)
+{
+ dk3_fig_obj_t *obj; /* Current object to process. */
+ dk3_fig_drawing_t *drw; /* Drawing to process. */
+ unsigned long objno; /* Current object number. */
+
+
+#line 3775 "f2lud.ctr"
+ drw = job->drw;
+ objno = 0UL;
+ if(f2lud_driver_initialize(job, drw)) {
+ if(f2lud_open_output_files(job)) {
+ if(f2lud_start_processing(job, drw)) {
+ dk3sto_it_reset(drw->iobj);
+ while(NULL != (obj = (dk3_fig_obj_t *)dk3sto_it_next(drw->iobj))) {
+ if(!dk3fig_tool_is_bgrect(obj, objno)) {
+ f2lud_process_object(job, drw, obj, objno);
+ }
+ objno++;
+ }
+ } else {
+ f2l_tool_set_exit_status(job, FIG2LAT_EXIT_ERROR_UNKNOWN);
+
+#line 3789 "f2lud.ctr"
+ }
+ f2lud_end_processing(job, drw);
+ } else {
+ f2l_tool_set_exit_status(job, FIG2LAT_EXIT_ERROR_UNKNOWN);
+
+#line 3793 "f2lud.ctr"
+ }
+ f2lud_close_output_files(job);
+ } else {
+ f2l_tool_set_exit_status(job, FIG2LAT_EXIT_ERROR_UNKNOWN);
+
+#line 3797 "f2lud.ctr"
+ }
+ f2lud_driver_end(job, drw);
+
+#line 3799 "f2lud.ctr"
+}
+