From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- support/dktools/dk3figah.c | 7098 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 7098 insertions(+) create mode 100644 support/dktools/dk3figah.c (limited to 'support/dktools/dk3figah.c') diff --git a/support/dktools/dk3figah.c b/support/dktools/dk3figah.c new file mode 100644 index 0000000000..8690ba7aca --- /dev/null +++ b/support/dktools/dk3figah.c @@ -0,0 +1,7098 @@ +/* + 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: dk3figah.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 dk3figah.c The dk3figah module. +*/ + + +#line 40 "dk3figah.ctr" + +#include "dk3all.h" +#include "dk3fig.h" +#include "dk3figto.h" +#include "dk3figpr.h" +#include "dk3figbb.h" +#include "dk3figah.h" +#include "dk3xsp.h" + + + + +#line 51 "dk3figah.ctr" + + + +/** Calculate c_min (minimum length to cut). + @param drw Drawing. + @param obj Object to calculate arrowheads for. + @param ah Arrowhead data. + @param ec Pointer to error code variable, may be NULL. + @return The c_min value. +*/ +static +double +dk3figah_cmin( + dk3_fig_drawing_t *drw, + dk3_fig_obj_t *obj, + dk3_fig_ah_t *ah, + int *ec +) +{ + double back; + double h; + double w; + double lw; /* Line width. */ + + +#line 75 "dk3figah.ctr" + lw = dk3fig_tool_get_lw(drw, obj, ec); + h = ah->he; + w = ah->wi; + switch(ah->as) { + case DK3_FIG_AS_INDENTED: + case DK3_FIG_AS_INDENTED_FILLED_HALF: + { + h = dk3ma_d_mul_ok(1.25, h, ec); + } break; + case DK3_FIG_AS_POINTED: { + h = 0.75 * h; + } break; + case DK3_FIG_AS_RHOMBUS: { + h = 0.5 * h; + } break; + } + back = dk3ma_d_div_ok(dk3ma_d_mul_ok(lw, h, ec), w, ec); + + +#line 93 "dk3figah.ctr" + return back; +} + + + +/** Calculate s value for arrowhead. + @param drw Drawing. + @param obj Object to calculate arrowheads for. + @param ah Arrowhead data. + @param ec Pointer to error code variable, may be NULL. + @return The s value. +*/ +static +double +dk3figah_s( + dk3_fig_drawing_t *drw, + dk3_fig_obj_t *obj, + dk3_fig_ah_t *ah, + int *ec +) +{ + double back; + double lw; /* Line width. */ + double h; /* Arrow height (length). */ + double w; /* Arrow width. */ + + +#line 119 "dk3figah.ctr" + lw = dk3fig_tool_get_lw(drw, obj, ec); + h = ah->he; + w = ah->wi; + switch(ah->as) { + case DK3_FIG_AS_INDENTED: + case DK3_FIG_AS_INDENTED_FILLED_HALF: + { + h = dk3ma_d_mul_ok(1.25, h, ec); + +#line 127 "dk3figah.ctr" + } break; + case DK3_FIG_AS_POINTED: { + h = 0.75 * h; + +#line 130 "dk3figah.ctr" + } break; + case DK3_FIG_AS_RHOMBUS: { + h = 0.5 * h; + +#line 133 "dk3figah.ctr" + } break; + } + back = dk3ma_d_mul_ok( + dk3ma_d_div_ok(lw, w, ec), + sqrt( + dk3ma_d_add_ok( + dk3ma_d_square_ok(h, ec), + dk3ma_d_div_ok( + dk3ma_d_square_ok(w, ec), + 4.0, + ec + ), + ec + ) + ), + ec + ); + +#line 150 "dk3figah.ctr" + return back; +} + + + +/** Calculate s value for half arrowhead. + @param drw Drawing. + @param obj Object to calculate arrowheads for. + @param ah Arrowhead data. + @param ec Pointer to error code variable, may be NULL. + @return The s value. +*/ +static +double +dk3figah_half_arrow_s( + dk3_fig_drawing_t *drw, + dk3_fig_obj_t *obj, + dk3_fig_ah_t *ah, + int *ec +) +{ + double back; + double lw; /* Line width. */ + double h; /* Arrow height (length). */ + double w; /* Arrow width. */ + + +#line 176 "dk3figah.ctr" + lw = dk3fig_tool_get_lw(drw, obj, ec); + h = ah->he; + w = ah->wi; + switch(ah->as) { + case DK3_FIG_AS_INDENTED_HALF: + { + h = dk3ma_d_mul_ok(1.25, h, ec); + +#line 183 "dk3figah.ctr" + } break; + case DK3_FIG_AS_BUTTED_HALF: { + h = 0.75 * h; + +#line 186 "dk3figah.ctr" + } break; + } + back = dk3ma_d_div_ok( + dk3ma_d_mul_ok(2.0, dk3ma_d_mul_ok(h, lw, ec), ec), w, ec + ); + + +#line 192 "dk3figah.ctr" + return back; +} + + + +#if 0 +/** Calculate c_max value for arrowhead. + @param drw Drawing. + @param obj Object to calculate arrowheads for. + @param ah Arrowhead data. + @param ec Pointer to error code variable, may be NULL. + @return The c_max value. +*/ +static +double +dk3figah_cmax( + dk3_fig_drawing_t *drw, + dk3_fig_obj_t *obj, + dk3_fig_ah_t *ah, + int *ec +) +{ + double back; + + +#line 216 "dk3figah.ctr" + back = dk3ma_d_mul_ok( + 2.0, + dk3figah_s(drw, obj, ah, ec), + ec + ); + +#line 221 "dk3figah.ctr" + return back; +} +#endif + + + +/** Calculate length correction for normal arrows. + @param drw Drawing structure. + @param obj Object to modify. + @param ah Arrowhead to calculate length correction for. + @param ec Pointer to error code variable, may be NULL. + @return Length correction value. +*/ +static +double +dk3figah_normal_arrow_length_correction( + dk3_fig_drawing_t *drw, + dk3_fig_obj_t *obj, + dk3_fig_ah_t *ah, + int *ec +) +{ + double back = 0.0; + double cmin; + double s; + + +#line 247 "dk3figah.ctr" + cmin = dk3figah_cmin(drw, obj, ah, ec); + s = dk3figah_s(drw, obj, ah, ec); + switch(obj->cs) { + case DK3_FIG_LC_PROJECTING: + case DK3_FIG_LC_ROUND: { + back = dk3ma_d_add_ok( + dk3ma_d_mul_ok(1.5, s, ec), + (0.5 * cmin), + ec + ); + } break; + default: { + back = dk3ma_d_add_ok(s, (0.5 * cmin), ec); + } break; + } + +#line 262 "dk3figah.ctr" + return back; +} + + + + +/** Calculate length correction tolerance for normal arrows. + @param drw Drawing structure. + @param obj Object to modify. + @param ah Arrowhead to calculate length correction for. + @param ec Pointer to error code variable, may be NULL. + @return Length correction value. +*/ +static +double +dk3figah_normal_arrow_length_correction_tolerance( + dk3_fig_drawing_t *drw, + dk3_fig_obj_t *obj, + dk3_fig_ah_t *ah, + int *ec +) +{ + double back; + double cmin; + double s; + + +#line 288 "dk3figah.ctr" + cmin = dk3figah_cmin(drw, obj, ah, ec); + s = dk3figah_s(drw, obj, ah, ec); + switch(obj->cs) { + case DK3_FIG_LC_PROJECTING: + case DK3_FIG_LC_ROUND: { + back = 0.25 * dk3ma_d_sub_ok(s, cmin, ec); + } break; + default: { + back = dk3ma_d_sub_ok((0.5 * s), (0.25 * cmin), ec); + } break; + } + +#line 299 "dk3figah.ctr" + return back; +} + + + +/** Calculate length correction for blocking line arrowhead. + @param drw Drawing structure. + @param obj Object to modify. + @param ah Arrowhead to calculate length correction for. + @param ec Pointer to error code variable, may be NULL. + @return Length correction value. +*/ +static +double +dk3figah_block_line_length_correction( + dk3_fig_drawing_t *drw, + dk3_fig_obj_t *obj, + dk3_fig_ah_t *ah, + int *ec +) +{ + double back = 0.0; + + +#line 322 "dk3figah.ctr" + switch(obj->cs) { + case DK3_FIG_LC_PROJECTING: + case DK3_FIG_LC_ROUND: { + back = 0.75 * dk3fig_tool_get_lw(drw, obj, ec); + } break; + default: { + back = 0.5 * dk3fig_tool_get_lw(drw, obj, ec); + } break; + } + +#line 331 "dk3figah.ctr" + return back; +} + + + +/** Calculate length correction tolerance for blocking line arrowhead. + @param drw Drawing structure. + @param obj Object to modify. + @param ah Arrowhead to calculate length correction for. + @param ec Pointer to error code variable, may be NULL. + @return Length correction value. +*/ +static +double +dk3figah_block_line_length_correction_tolerance( + dk3_fig_drawing_t *drw, + dk3_fig_obj_t *obj, + dk3_fig_ah_t *ah, + int *ec +) +{ + double back = 0.0; + + +#line 354 "dk3figah.ctr" + switch(obj->cs) { + case DK3_FIG_LC_PROJECTING: + case DK3_FIG_LC_ROUND: { + back = 0.125 * dk3fig_tool_get_lw(drw, obj, ec); + } break; + default: { + back = 0.25 * dk3fig_tool_get_lw(drw, obj, ec); + } break; + } + +#line 363 "dk3figah.ctr" + return back; +} + + + +/** Length correction for inverted open arrow. + @param drw Drawing structure. + @param obj Object to modify. + @param ah Arrowhead to calculate length correction for. + @param ec Pointer to error code variable, may be NULL. + @return Length correction value. +*/ +static +double +dk3figah_anti_arrow_length_correction( + dk3_fig_drawing_t *drw, + dk3_fig_obj_t *obj, + dk3_fig_ah_t *ah, + int *ec +) +{ + double back; + double sqv; + double lw; + double cmin; + double cmax; + + +#line 390 "dk3figah.ctr" + lw = dk3fig_tool_get_lw(drw, obj, ec); + sqv = sqrt( + dk3ma_d_add_ok( + dk3ma_d_square_ok(ah->wi, ec), + dk3ma_d_mul_ok( + 4.0, + dk3ma_d_square_ok(ah->he, ec), + ec + ), + ec + ) + ); + sqv = dk3ma_d_div_ok( + dk3ma_d_mul_ok(lw, sqv, ec), + dk3ma_d_mul_ok(2.0, ah->wi, ec), + ec + ); + cmin = dk3ma_d_sub_ok(ah->he, sqv, ec); + cmax = dk3ma_d_sub_ok( + dk3ma_d_add_ok(ah->he, sqv, ec), + dk3ma_d_div_ok( + dk3ma_d_mul_ok(lw, ah->he, ec), + ah->wi, + ec + ), + ec + ); + switch(obj->cs) { + case DK3_FIG_LC_PROJECTING: case DK3_FIG_LC_ROUND: { + sqv = dk3ma_d_sub_ok( + dk3ma_d_sub_ok(cmax, cmin, ec), + (0.5 * lw), + ec + ); + back = dk3ma_d_sub_ok( + cmax, + (0.5 * sqv), + ec + ); + } break; + default: { + back = 0.5 * dk3ma_d_add_ok(cmin, cmax, ec); + } break; + } + +#line 434 "dk3figah.ctr" + return back; +} + + + +/** Length correction tolerance for inverted open arrow. + @param drw Drawing structure. + @param obj Object to modify. + @param ah Arrowhead to calculate length correction for. + @param ec Pointer to error code variable, may be NULL. + @return Length correction value. +*/ +static +double +dk3figah_anti_arrow_length_correction_tolerance( + dk3_fig_drawing_t *drw, + dk3_fig_obj_t *obj, + dk3_fig_ah_t *ah, + int *ec +) +{ + double back; + double sqv; + double lw; + double cmin; + double cmax; + + +#line 461 "dk3figah.ctr" + lw = dk3fig_tool_get_lw(drw, obj, ec); + sqv = sqrt( + dk3ma_d_add_ok( + dk3ma_d_square_ok(ah->wi, ec), + dk3ma_d_mul_ok( + 4.0, + dk3ma_d_square_ok(ah->he, ec), + ec + ), + ec + ) + ); + sqv = dk3ma_d_div_ok( + dk3ma_d_mul_ok(lw, sqv, ec), + dk3ma_d_mul_ok(2.0, ah->wi, ec), + ec + ); + cmin = dk3ma_d_sub_ok(ah->he, sqv, ec); + cmax = dk3ma_d_sub_ok( + dk3ma_d_add_ok(ah->he, sqv, ec), + dk3ma_d_div_ok( + dk3ma_d_mul_ok(lw, ah->he, ec), + ah->wi, + ec + ), + ec + ); + switch(obj->cs) { + case DK3_FIG_LC_PROJECTING: case DK3_FIG_LC_ROUND: { + back = 0.25 * dk3ma_d_sub_ok( + dk3ma_d_sub_ok(cmax, cmin, ec), + (0.5 * lw), + ec + ); + } break; + default: { + back = 0.25 * dk3ma_d_sub_ok(cmax, cmin, ec); + } break; + } + +#line 500 "dk3figah.ctr" + return back; +} + + + +/** Length correction for full circle arrowhead. + @param drw Drawing structure. + @param obj Object to modify. + @param ah Arrowhead to calculate length correction for. + @param ec Pointer to error code variable, may be NULL. + @return Length correction value. +*/ +static +double +dk3figah_full_circle_length_correction( + dk3_fig_drawing_t *drw, + dk3_fig_obj_t *obj, + dk3_fig_ah_t *ah, + int *ec +) +{ + double back; + double lw; + double cmin; + double cmax; + + +#line 526 "dk3figah.ctr" + lw = dk3fig_tool_get_lw(drw, obj, ec); + cmin = 0.5 * dk3ma_d_mul_ok( + dk3ma_d_add_ok(ah->he, lw, ec), + dk3ma_d_sub_ok( + 1.0, + sqrt( + dk3ma_d_sub_ok( + 1.0, + dk3ma_d_square_ok( + dk3ma_d_div_ok( + lw, + dk3ma_d_add_ok(lw, ah->he, ec), + ec + ), + ec + ), + ec + ) + ), + ec + ), + ec + ); + cmax = lw; + switch(obj->cs) { + case DK3_FIG_LC_PROJECTING: case DK3_FIG_LC_ROUND: { + back = dk3ma_d_sub_ok( + cmax, + (0.5 * dk3ma_d_sub_ok(dk3ma_d_sub_ok(cmax, cmin, ec), (0.5 * lw), ec)), + ec + ); + } break; + default: { + back = 0.5 * dk3ma_d_add_ok(cmax, cmin, ec); + } break; + } + +#line 562 "dk3figah.ctr" + return back; +} + + + +/** Length correction tolerance for full circle arrowhead. + @param drw Drawing structure. + @param obj Object to modify. + @param ah Arrowhead to calculate length correction for. + @param ec Pointer to error code variable, may be NULL. + @return Length correction value. +*/ +static +double +dk3figah_full_circle_length_correction_tolerance( + dk3_fig_drawing_t *drw, + dk3_fig_obj_t *obj, + dk3_fig_ah_t *ah, + int *ec +) +{ + double back; + double lw; + double cmin; + double cmax; + + +#line 588 "dk3figah.ctr" + lw = dk3fig_tool_get_lw(drw, obj, ec); + cmin = 0.5 * dk3ma_d_mul_ok( + dk3ma_d_add_ok(ah->he, lw, ec), + dk3ma_d_sub_ok( + 1.0, + sqrt( + dk3ma_d_sub_ok( + 1.0, + dk3ma_d_square_ok( + dk3ma_d_div_ok( + lw, + dk3ma_d_add_ok(lw, ah->he, ec), + ec + ), + ec + ), + ec + ) + ), + ec + ), + ec + ); + cmax = lw; + switch(obj->cs) { + case DK3_FIG_LC_PROJECTING: case DK3_FIG_LC_ROUND: { + back = 0.25 * dk3ma_d_sub_ok( + dk3ma_d_sub_ok(cmax, cmin, ec), + (0.5 * lw), + ec + ); + } break; + default: { + back = 0.25 * dk3ma_d_sub_ok(cmax, cmin, ec); + } break; + } + +#line 624 "dk3figah.ctr" + return back; +} + + + +/** Length correction for half circle arrowhead. + @param drw Drawing structure. + @param obj Object to modify. + @param ah Arrowhead to calculate length correction for. + @param ec Pointer to error code variable, may be NULL. + @return Length correction value. +*/ +static +double +dk3figah_half_circle_length_correction( + dk3_fig_drawing_t *drw, + dk3_fig_obj_t *obj, + dk3_fig_ah_t *ah, + int *ec +) +{ + double back; + double lw; +#if VERSION_BEFORE_20150821 + double cmin; + double cmax; +#endif + + +#line 652 "dk3figah.ctr" + lw = dk3fig_tool_get_lw(drw, obj, ec); +#if VERSION_BEFORE_20150821 + cmin = dk3ma_d_sub_ok( + (0.5 * ah->he), + (0.5 * lw), + ec + ); + cmax = dk3ma_d_add_ok( + (0.5 * ah->he), + (0.5 * lw), + ec + ); +#endif + switch(obj->cs) { + case DK3_FIG_LC_PROJECTING: case DK3_FIG_LC_ROUND: { + back = dk3ma_d_add_ok( + (0.5 * ah->he), + (0.25 * lw), + ec + ); + } break; + default: { + back = 0.5 * ah->he; + } break; + } + +#line 677 "dk3figah.ctr" + return back; +} + + + + +#if VERSION_BEFORE_20121215 +/** Length correction for half-arrow arrowhead. + @param drw Drawing structure. + @param obj Object to modify. + @param ah Arrowhead to calculate length correction for. + @param ec Pointer to error code variable, may be NULL. + @param incr Flag: Increase (1=increase, 0=no op, -1=decrease). + @return Length correction value. +*/ +static +double +dk3figah_half_arrow_length_correction( + dk3_fig_drawing_t *drw, + dk3_fig_obj_t *obj, + dk3_fig_ah_t *ah, + int *ec, + int incr +) +{ + double back; + double lw; + double cmin; + double d; + double cmax; + + +#line 708 "dk3figah.ctr" + lw = dk3fig_tool_get_lw(drw, obj, ec); + cmin = dk3ma_d_div_ok( + dk3ma_d_mul_ok( + dk3ma_d_mul_ok(lw, ah->he, ec), + 2.0, + ec + ), + ah->wi, + ec + ); + d = dk3ma_d_div_ok( + lw, + dk3ma_d_mul_ok( + 2.0, + tan( + 0.5 * atan( + dk3ma_d_div_ok( + ah->wi, + dk3ma_d_mul_ok(2.0, ah->he, ec), + ec + ) + ) + ), + ec + ), + ec + ); + cmax = dk3ma_d_add_ok(d, (0.5 * lw), ec); + cmax = dk3ma_d_add_ok( + cmax, + dk3ma_d_mul_ok( + ((incr > 0) ? 1.25 : ((incr < 0) ? 0.75 : 1.0)), + ah->he, + ec + ), + ec + ); + if(cmax > dk3ma_d_add_ok(cmin, lw, ec)) { + cmax = dk3ma_d_add_ok(cmin, lw, ec); + } + switch(obj->cs) { + case DK3_FIG_LC_PROJECTING: case DK3_FIG_LC_ROUND: { + back = dk3ma_d_sub_ok( + cmax, + (0.5 * dk3ma_d_sub_ok(dk3ma_d_sub_ok(cmax, cmin, ec), (0.5*lw), ec)), + ec + ); + } break; + default: { + back = 0.5 * dk3ma_d_add_ok(cmax, cmin, ec); + } break; + } + +#line 760 "dk3figah.ctr" + return back; +} +#else +/** Length correction for half-arrow arrowhead. + @param drw Drawing structure. + @param obj Object to modify. + @param ah Arrowhead to calculate length correction for. + @param ec Pointer to error code variable, may be NULL. + @param incr Flag: Increase (1=increase, 0=no op, -1=decrease). + @return Length correction value. +*/ +static +double +dk3figah_half_arrow_length_correction( + dk3_fig_drawing_t *drw, + dk3_fig_obj_t *obj, + dk3_fig_ah_t *ah, + int *ec, + int incr +) +{ + double back; + double lw; /* Line width. */ + double cmin; /* Minimum correction. */ + double cmax; /* Maximum correction. */ + double d; /* Shift value. */ + double w; /* Arrowhead width. */ + double h; /* Arrowhead height. */ + + + +#line 790 "dk3figah.ctr" + w = ah->wi; + h = ah->he; + switch(incr) { + case -1: { /* indented */ + h = dk3ma_d_mul_ok(1.25, h, ec); + } break; + case 1: { /* butted */ + h = 0.75 * h; + } break; + } + lw = dk3fig_tool_get_lw(drw, obj, ec); + + +#line 802 "dk3figah.ctr" + cmin = dk3ma_d_div_ok( + dk3ma_d_mul_ok(2.0, dk3ma_d_mul_ok(h, lw, ec), ec), w, ec + ); + d = dk3ma_d_div_ok( + lw, + dk3ma_d_mul_ok( + 2.0,tan(0.5 * atan(dk3ma_d_div_ok(w, dk3ma_d_mul_ok(2.0, h, ec), ec))),ec + ), + ec + ); + cmax = dk3ma_d_mul_ok(2.0, d, ec); + + +#line 814 "dk3figah.ctr" + switch(obj->cs) { + case DK3_FIG_LC_PROJECTING: case DK3_FIG_LC_ROUND: { + back = dk3ma_d_sub_ok( + (0.5 * lw), + (0.5 * dk3ma_d_sub_ok(dk3ma_d_sub_ok(cmax, cmin, ec), (0.5*lw), ec)), + ec + ); + } break; + default: { + back = 0.5 * dk3ma_d_add_ok(cmax, cmin, ec); + } break; + } + +#line 826 "dk3figah.ctr" + return back; +} +#endif + + +#if VERSION_BEFORE_20121215 +/** Length correction tolerance for half-arrow arrowhead. + @param drw Drawing structure. + @param obj Object to modify. + @param ah Arrowhead to calculate length correction for. + @param ec Pointer to error code variable, may be NULL. + @param incr Flag: Increase (1=increase, 0=no op, -1=decrease). + @return Length correction tolerance value. +*/ +static +double +dk3figah_half_arrow_length_correction_tolerance( + dk3_fig_drawing_t *drw, + dk3_fig_obj_t *obj, + dk3_fig_ah_t *ah, + int *ec, + int incr +) +{ + double back; + double lw; + double cmin; + double d; + double cmax; + + +#line 856 "dk3figah.ctr" + lw = dk3fig_tool_get_lw(drw, obj, ec); + cmin = dk3ma_d_div_ok( + dk3ma_d_mul_ok( + dk3ma_d_mul_ok(lw, ah->he, ec), + 2.0, + ec + ), + ah->wi, + ec + ); + d = dk3ma_d_div_ok( + lw, + dk3ma_d_mul_ok( + 2.0, + tan( + 0.5 * atan( + dk3ma_d_div_ok( + ah->wi, + dk3ma_d_mul_ok(2.0, ah->he, ec), + ec + ) + ) + ), + ec + ), + ec + ); + cmax = dk3ma_d_add_ok(d, (0.5 * lw), ec); + cmax = dk3ma_d_add_ok( + cmax, + dk3ma_d_mul_ok( + ((incr > 0) ? 1.25 : ((incr < 0) ? 0.75 : 1.0)), + ah->he, + ec + ), + ec + ); + if(cmax > dk3ma_d_add_ok(cmin, lw, ec)) { + cmax = dk3ma_d_add_ok(cmin, lw, ec); + } + switch(obj->cs) { + case DK3_FIG_LC_PROJECTING: case DK3_FIG_LC_ROUND: { + back = 0.25 * dk3ma_d_sub_ok(dk3ma_d_sub_ok(cmax,cmin,ec),(0.5 * lw),ec); + } break; + default: { + back = 0.25 * dk3ma_d_sub_ok(cmax, cmin, ec); + } break; + } + +#line 904 "dk3figah.ctr" + return back; +} +#else + +/** Length correction tolerance for half-arrow arrowhead. + @param drw Drawing structure. + @param obj Object to modify. + @param ah Arrowhead to calculate length correction for. + @param ec Pointer to error code variable, may be NULL. + @param incr Flag: Increase (1=increase, 0=no op, -1=decrease). + @return Length correction tolerance value. +*/ +static +double +dk3figah_half_arrow_length_correction_tolerance( + dk3_fig_drawing_t *drw, + dk3_fig_obj_t *obj, + dk3_fig_ah_t *ah, + int *ec, + int incr +) +{ + double back; + double lw; /* Line width. */ + double cmin; /* Minimum correction. */ + double cmax; /* Maximum correction. */ + double d; /* Shift value. */ + double w; /* Arrowhead width. */ + double h; /* Arrowhead height. */ + + + +#line 935 "dk3figah.ctr" + w = ah->wi; + h = ah->he; + switch(incr) { + case -1: { /* indented */ + h = dk3ma_d_mul_ok(1.25, h, ec); + } break; + case 1: { /* butted */ + h = 0.75 * h; + } break; + } + lw = dk3fig_tool_get_lw(drw, obj, ec); + + +#line 947 "dk3figah.ctr" + cmin = dk3ma_d_div_ok( + dk3ma_d_mul_ok(2.0, dk3ma_d_mul_ok(h, lw, ec), ec), w, ec + ); + d = dk3ma_d_div_ok( + lw, + dk3ma_d_mul_ok( + 2.0,tan(0.5 * atan(dk3ma_d_div_ok(w, dk3ma_d_mul_ok(2.0, h, ec), ec))),ec + ), + ec + ); + cmax = dk3ma_d_mul_ok(2.0, d, ec); + + +#line 959 "dk3figah.ctr" + back = 0.25 * fabs(dk3ma_d_sub_ok(cmax, cmin, ec)); + + +#line 961 "dk3figah.ctr" + return back; +} +#endif + + + +/** Calculate length correction for arrowhead. + Amount to cut the original line. + @param drw Drawing. + @param obj Object to calculate arrowheads for. + @param ah Arrowhead data. + @param ec Pointer to error code variable, may be NULL. + @return Length to cut from line. +*/ +static +double +dk3figah_length_correction( + dk3_fig_drawing_t *drw, + dk3_fig_obj_t *obj, + dk3_fig_ah_t *ah, + int *ec +) +{ + double back = 0.0; + + +#line 986 "dk3figah.ctr" + switch(ah->as) { + case DK3_FIG_AS_RHOMBUS: { /* 4 */ + if((1 == ah->af) && (DK3_FIG_SRCTYPE_JFIG == drw->srctype)) { + back = 0.0; + } else { + back = dk3figah_normal_arrow_length_correction(drw, obj, ah, ec); + } + } break; + case DK3_FIG_AS_FULL_CIRCLE_END: { /* 5 */ + back = dk3figah_full_circle_length_correction(drw, obj, ah, ec); + } break; + case DK3_FIG_AS_RECTANGLE: /* 7 */ + case DK3_FIG_AS_INVERSE: /* 8 */ + { + back = dk3figah_block_line_length_correction(drw, obj, ah, ec); + } break; + case DK3_FIG_AS_HALF_CIRCLE_END: { /* 6 */ + if(1 == ah->af) { + back = dk3figah_block_line_length_correction(drw, obj, ah, ec); + } else { + back = dk3figah_half_circle_length_correction(drw, obj, ah, ec); + } + } break; + case DK3_FIG_AS_CLOSED_HALF: { /* 10 */ + back = dk3figah_half_arrow_length_correction(drw, obj, ah, ec, 0); + } break; + case DK3_FIG_AS_INDENTED_HALF: { /* 11 */ + back = dk3figah_half_arrow_length_correction(drw, obj, ah, ec, -1); + } break; + case DK3_FIG_AS_BUTTED_HALF: { /* 12 */ + back = dk3figah_half_arrow_length_correction(drw, obj, ah, ec, 1); + } break; + case DK3_FIG_AS_TRIANGLE_FORK: { /* 13 */ + if(1 == ah->af) { + back = dk3figah_block_line_length_correction(drw, obj, ah, ec); + } else { + back = dk3figah_anti_arrow_length_correction(drw, obj, ah, ec); + } + } break; + case DK3_FIG_AS_RECTANGLE_FORK: { /* 14 */ + if(1 == ah->af) { + back = dk3figah_block_line_length_correction(drw, obj, ah, ec); + } else { +#if 0 + back = dk3figah_block_line_length_correction(drw, obj, ah, ec); +#endif + back = dk3ma_d_add_ok(back, ah->he, ec); + +#line 1033 "dk3figah.ctr" + } + } break; + default: { + back = dk3figah_normal_arrow_length_correction(drw, obj, ah, ec); + } break; + } + +#line 1039 "dk3figah.ctr" + return back; +} + + + +/** Calculate length correction tolerance for arrowhead. + @param drw Drawing. + @param obj Object to calculate arrowheads for. + @param ah Arrowhead data. + @param ec Pointer to error code variable, may be NULL. + @return Tolerance for length to cut from line. +*/ +static +double +dk3figah_length_correction_tolerance( + dk3_fig_drawing_t *drw, + dk3_fig_obj_t *obj, + dk3_fig_ah_t *ah, + int *ec +) +{ + double back; + + +#line 1062 "dk3figah.ctr" + switch(ah->as) { + case DK3_FIG_AS_RHOMBUS: { /* 4 */ + if((1 == ah->af) && (DK3_FIG_SRCTYPE_JFIG == drw->srctype)) { + back = 0.0; + } else { + back = dk3figah_normal_arrow_length_correction_tolerance(drw,obj,ah,ec); + } + } break; + case DK3_FIG_AS_FULL_CIRCLE_END: { /* 5 */ + back = dk3figah_full_circle_length_correction_tolerance(drw,obj,ah,ec); + } break; + case DK3_FIG_AS_RECTANGLE: /* 7 */ + case DK3_FIG_AS_INVERSE: /* 8 */ + { + back = dk3figah_block_line_length_correction_tolerance(drw,obj,ah,ec); + } break; + case DK3_FIG_AS_HALF_CIRCLE_END: { /* 6 */ + back = dk3figah_block_line_length_correction_tolerance(drw,obj,ah,ec); + } break; + case DK3_FIG_AS_CLOSED_HALF: { /* 10 */ + back = dk3figah_half_arrow_length_correction_tolerance(drw,obj,ah,ec,0); + } break; + case DK3_FIG_AS_INDENTED_HALF: { /* 11 */ + back = dk3figah_half_arrow_length_correction_tolerance(drw,obj,ah,ec,-1); + } break; + case DK3_FIG_AS_BUTTED_HALF: { /* 12 */ + back = dk3figah_half_arrow_length_correction_tolerance(drw,obj,ah,ec,1); + } break; + case DK3_FIG_AS_TRIANGLE_FORK: { /* 13 */ + if(1 == ah->af) { + back = dk3figah_block_line_length_correction_tolerance(drw,obj,ah,ec); + } else { + back = dk3figah_anti_arrow_length_correction_tolerance(drw,obj,ah,ec); + } + } break; + case DK3_FIG_AS_RECTANGLE_FORK: { /* 14 */ + back = dk3figah_block_line_length_correction_tolerance(drw,obj,ah,ec); + } break; + default: { + back = dk3figah_normal_arrow_length_correction_tolerance(drw,obj,ah,ec); + } break; + } + +#line 1104 "dk3figah.ctr" + return back; +} + + + +int +dk3figah_candidate(dk3_fig_obj_t *obj) +{ + int back = 0; + + +#line 1114 "dk3figah.ctr" + if(obj) { + switch(obj->ot) { + case DK3_FIG_OBJ_POLYLINE: { + switch(obj->st) { + case 1: { back = 1; } break; + } + } break; + case DK3_FIG_OBJ_SPLINE: { + switch(obj->st) { + case 0: case 2: case 4: { back = 1; } break; + } + } break; + case DK3_FIG_OBJ_ARC: { + switch(obj->st) { + case 1: { back = 1; } break; + } + } break; + } + if(back) { + if(!((obj->af) || (obj->ab))) { + back = 0; + } + } + } + +#line 1138 "dk3figah.ctr" + return back; +} + + + +/** Find distance to shift arrowhead polygon point from end point. + @param drw Drawing structure. + @param obj Object containing the arrowhead. + @param ah Arrowhead. + @param ec Pointer to error code variable. + @return Non-negative distance on success, negative value on error. +*/ +static +double +dk3figah_find_shift_length( + dk3_fig_drawing_t *drw, + dk3_fig_obj_t *obj, + dk3_fig_ah_t *ah, + int *ec +) +{ + double back = 0.0; + + +#line 1161 "dk3figah.ctr" + switch(ah->as) { + case DK3_FIG_AS_TRIANGLE_FORK: { + if(ah->af) { + back = 0.5 * dk3fig_tool_get_lw(drw, obj, ec); + } else { + } + } break; + case DK3_FIG_AS_RECTANGLE_FORK: { + if(ah->af) { + back = 0.5 * dk3fig_tool_get_lw(drw, obj, ec); + } + } break; + case DK3_FIG_AS_FULL_CIRCLE_END: + case DK3_FIG_AS_HALF_CIRCLE_END: + case DK3_FIG_AS_RECTANGLE: + case DK3_FIG_AS_INVERSE: + { + back = 0.5 * dk3fig_tool_get_lw(drw, obj, ec); + } break; + case DK3_FIG_AS_INDENTED_FILLED_HALF: + case DK3_FIG_AS_STICK: + case DK3_FIG_AS_CLOSED: + case DK3_FIG_AS_INDENTED: + case DK3_FIG_AS_POINTED: + case DK3_FIG_AS_RHOMBUS: + { + back = dk3figah_s(drw, obj, ah, ec); + } break; + case DK3_FIG_AS_CLOSED_HALF: + case DK3_FIG_AS_INDENTED_HALF: + case DK3_FIG_AS_BUTTED_HALF: { + back = dk3figah_half_arrow_s(drw, obj, ah, ec); + } break; + } + +#line 1195 "dk3figah.ctr" + return back; +} + + + +/** Arrowhead for polylines or compatible arrowheads. + @param drw Drawing structure. + @param obj Fig object. + @param ah Arrowhead to modify. + @param ep Endpoint of the arrowhead. + @param rotation Arrowhead direction in radians. + @param ec Pointer to error code variable. + @return 1 on success, 0 on error. +*/ +static +int +dk3figah_straight_arrowhead( + dk3_fig_drawing_t *drw, + dk3_fig_obj_t *obj, + dk3_fig_ah_t *ah, + dk3_fig_poly_point_t *ep, + double rotation, + int *ec +) +{ + dk3_fig_poly_point_t aep; + dk3_fig_poly_point_t po[8]; + double s; /* Shifting the first point */ + size_t i; + int back = 0; + + +#line 1226 "dk3figah.ctr" + dk3mem_cpy((void *)(&aep), (void *)ep, sizeof(dk3_fig_poly_point_t)); + switch(ah->as) { + case DK3_FIG_AS_STICK: { + if(!(drw->coah)) { + s = dk3figah_s(drw, obj, ah, ec); + aep.x = dk3ma_d_sub_ok(aep.x, (s * cos(rotation)), ec); + aep.y = dk3ma_d_sub_ok(aep.y, (s * sin(rotation)), ec); + } + po[0].x = -1.0 * ah->he; + po[0].y = 0.5 * ah->wi; + po[1].x = 0.0; + po[1].y = 0.0; + po[2].x = po[0].x; + po[2].y = -0.5 * ah->wi; + for(i = 0; i < 3; i++) { + dk3fig_tool_rotate_point(&(po[i]), rotation, ec); + dk3fig_tool_shift_point(&(po[i]), aep.x, aep.y, ec); + } + ah->o1 = dk3fig_obj_new( + obj->li, obj->la, /* Line number, layer */ + DK3_FIG_OBJ_POLYLINE, 1, /* Object type, subtype */ + obj->lw, obj->pc, obj->pc, -1, /* line width, pen, fill, style */ + DK3_FIG_LC_BUTT, /* line cap */ + DK3_FIG_LJ_MITER, /* line join */ + DK3_FIG_LS_SOLID, /* line style */ + 1.0, /* style value, unused */ + 0, 0, /* arrowheads flags */ + 3, /* Number of points */ + NULL, /* Text */ + drw->app /* Application */ + ); + if(ah->o1) { + if((((dk3_fig_obj_t *)(ah->o1))->dt).pol.po) { + dk3mem_cpy( + (void *)((((dk3_fig_obj_t *)(ah->o1))->dt).pol.po), + (void *)po, + (3 * sizeof(dk3_fig_poly_point_t)) + ); + back = 1; + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } break; + case DK3_FIG_AS_CLOSED: { + if(!(drw->coah)) { + s = dk3figah_s(drw, obj, ah, ec); + aep.x = dk3ma_d_sub_ok(aep.x, (s * cos(rotation)), ec); + aep.y = dk3ma_d_sub_ok(aep.y, (s * sin(rotation)), ec); + } + po[0].x = -1.0 * ah->he; + po[0].y = 0.5 * ah->wi; + po[1].x = 0.0; + po[1].y = 0.0; + po[2].x = po[0].x; + po[2].y = -0.5 * ah->wi; + for(i = 0; i < 3; i++) { + dk3fig_tool_rotate_point(&(po[i]), rotation, ec); + dk3fig_tool_shift_point(&(po[i]), aep.x, aep.y, ec); + } + if(ah->af) { + ah->o1 = dk3fig_obj_new( + obj->li, obj->la, /* Line number, layer */ + DK3_FIG_OBJ_POLYLINE, 3, /* Object type, subtype */ + obj->lw, obj->pc, obj->pc, 20, /* line width, pen, fill, style */ + DK3_FIG_LC_BUTT, /* line cap */ + DK3_FIG_LJ_MITER, /* line join */ + DK3_FIG_LS_SOLID, /* line style */ + 1.0, /* style value, unused */ + 0, 0, /* arrowheads flags */ + 3, /* Number of points */ + NULL, /* Text */ + drw->app /* Application */ + ); + } else { + ah->o1 = dk3fig_obj_new( + obj->li, obj->la, /* Line number, layer */ + DK3_FIG_OBJ_POLYLINE, 3, /* Object type, subtype */ + obj->lw, obj->pc, 7, 20, /* line width, pen, fill, style */ + DK3_FIG_LC_BUTT, /* line cap */ + DK3_FIG_LJ_MITER, /* line join */ + DK3_FIG_LS_SOLID, /* line style */ + 1.0, /* style value, unused */ + 0, 0, /* arrowheads flags */ + 3, /* Number of points */ + NULL, /* Text */ + drw->app /* Application */ + ); + } + if(ah->o1) { + if((((dk3_fig_obj_t *)(ah->o1))->dt).pol.po) { + dk3mem_cpy( + (void *)((((dk3_fig_obj_t *)(ah->o1))->dt).pol.po), + (void *)po, + (3 * sizeof(dk3_fig_poly_point_t)) + ); + back = 1; + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } break; + case DK3_FIG_AS_INDENTED: { + if(!(drw->coah)) { + s = dk3figah_s(drw, obj, ah, ec); + aep.x = dk3ma_d_sub_ok(aep.x, (s * cos(rotation)), ec); + aep.y = dk3ma_d_sub_ok(aep.y, (s * sin(rotation)), ec); + } + po[0].x = dk3ma_d_mul_ok(-1.25, ah->he, ec); + po[0].y = 0.5 * ah->wi; + po[1].x = 0.0; + po[1].y = 0.0; + po[2].x = po[0].x; + po[2].y = -0.5 * ah->wi; + po[3].x = -1.0 * ah->he; + po[3].y = 0.0; + for(i = 0; i < 4; i++) { + dk3fig_tool_rotate_point(&(po[i]), rotation, ec); + dk3fig_tool_shift_point(&(po[i]), aep.x, aep.y, ec); + } + if(ah->af) { + ah->o1 = dk3fig_obj_new( + obj->li, obj->la, /* Line number, layer */ + DK3_FIG_OBJ_POLYLINE, 3, /* Object type, subtype */ + obj->lw, obj->pc, obj->pc, 20, /* line width, pen, fill, style */ + DK3_FIG_LC_BUTT, /* line cap */ + DK3_FIG_LJ_MITER, /* line join */ + DK3_FIG_LS_SOLID, /* line style */ + 1.0, /* style value, unused */ + 0, 0, /* arrowheads flags */ + 4, /* Number of points */ + NULL, /* Text */ + drw->app /* Application */ + ); + } else { + ah->o1 = dk3fig_obj_new( + obj->li, obj->la, /* Line number, layer */ + DK3_FIG_OBJ_POLYLINE, 3, /* Object type, subtype */ + obj->lw, obj->pc, 7, 20, /* line width, pen, fill, style */ + DK3_FIG_LC_BUTT, /* line cap */ + DK3_FIG_LJ_MITER, /* line join */ + DK3_FIG_LS_SOLID, /* line style */ + 1.0, /* style value, unused */ + 0, 0, /* arrowheads flags */ + 4, /* Number of points */ + NULL, /* Text */ + drw->app /* Application */ + ); + } + if(ah->o1) { + if((((dk3_fig_obj_t *)(ah->o1))->dt).pol.po) { + dk3mem_cpy( + (void *)((((dk3_fig_obj_t *)(ah->o1))->dt).pol.po), + (void *)po, + (4 * sizeof(dk3_fig_poly_point_t)) + ); + back = 1; + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } break; + case DK3_FIG_AS_POINTED: { + if(!(drw->coah)) { + s = dk3figah_s(drw, obj, ah, ec); + aep.x = dk3ma_d_sub_ok(aep.x, (s * cos(rotation)), ec); + aep.y = dk3ma_d_sub_ok(aep.y, (s * sin(rotation)), ec); + } + po[0].x = -0.75 * ah->he; + po[0].y = 0.5 * ah->wi; + po[1].x = 0.0; + po[1].y = 0.0; + po[2].x = po[0].x; + po[2].y = -0.5 * ah->wi; + po[3].x = -1.0 * ah->he; + po[3].y = 0.0; + for(i = 0; i < 4; i++) { + dk3fig_tool_rotate_point(&(po[i]), rotation, ec); + dk3fig_tool_shift_point(&(po[i]), aep.x, aep.y, ec); + } + if(ah->af) { + ah->o1 = dk3fig_obj_new( + obj->li, obj->la, /* Line number, layer */ + DK3_FIG_OBJ_POLYLINE, 3, /* Object type, subtype */ + obj->lw, obj->pc, obj->pc, 20, /* line width, pen, fill, style */ + DK3_FIG_LC_BUTT, /* line cap */ + DK3_FIG_LJ_MITER, /* line join */ + DK3_FIG_LS_SOLID, /* line style */ + 1.0, /* style value, unused */ + 0, 0, /* arrowheads flags */ + 4, /* Number of points */ + NULL, /* Text */ + drw->app /* Application */ + ); + } else { + ah->o1 = dk3fig_obj_new( + obj->li, obj->la, /* Line number, layer */ + DK3_FIG_OBJ_POLYLINE, 3, /* Object type, subtype */ + obj->lw, obj->pc, 7, 20, /* line width, pen, fill, style */ + DK3_FIG_LC_BUTT, /* line cap */ + DK3_FIG_LJ_MITER, /* line join */ + DK3_FIG_LS_SOLID, /* line style */ + 1.0, /* style value, unused */ + 0, 0, /* arrowheads flags */ + 4, /* Number of points */ + NULL, /* Text */ + drw->app /* Application */ + ); + } + if(ah->o1) { + if((((dk3_fig_obj_t *)(ah->o1))->dt).pol.po) { + dk3mem_cpy( + (void *)((((dk3_fig_obj_t *)(ah->o1))->dt).pol.po), + (void *)po, + (4 * sizeof(dk3_fig_poly_point_t)) + ); + back = 1; + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } break; + case DK3_FIG_AS_RHOMBUS: { + if((DK3_FIG_SRCTYPE_JFIG == drw->srctype) && (ah->af)) { + ah->o1 = dk3fig_obj_new( + obj->li, obj->la, /* Line number, layer */ + DK3_FIG_OBJ_ELLIPSE, 3, /* Object type, subtype */ + obj->lw, obj->pc, obj->pc, 20, /* line width, pen, fill, style */ + DK3_FIG_LC_BUTT, /* line cap */ + DK3_FIG_LJ_MITER, /* line join */ + DK3_FIG_LS_SOLID, /* line style */ + 1.0, /* style value, unused */ + 0, 0, /* arrowheads flags */ + 0, /* Number of points */ + NULL, /* Text */ + drw->app /* Application */ + ); + if(ah->o1) { + (((dk3_fig_obj_t *)(ah->o1))->dt).ell.an = 0.0; + (((dk3_fig_obj_t *)(ah->o1))->dt).ell.cx = aep.x; + (((dk3_fig_obj_t *)(ah->o1))->dt).ell.cy = aep.y; + (((dk3_fig_obj_t *)(ah->o1))->dt).ell.rx = ah->he; + (((dk3_fig_obj_t *)(ah->o1))->dt).ell.ry = ah->he; + back = 1; + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } else { + if(!(drw->coah)) { + s = dk3figah_s(drw, obj, ah, ec); + aep.x = dk3ma_d_sub_ok(aep.x, (s * cos(rotation)), ec); + aep.y = dk3ma_d_sub_ok(aep.y, (s * sin(rotation)), ec); + } + po[0].x = -1.0 * ah->he; + po[0].y = 0.0; + po[1].x = -0.5 * ah->he; + po[1].y = 0.5 * ah->wi; + po[2].x = 0.0; + po[2].y = 0.0; + po[3].x = -0.5 * ah->he; + po[3].y = -0.5 * ah->wi; + for(i = 0; i < 4; i++) { + dk3fig_tool_rotate_point(&(po[i]), rotation, ec); + dk3fig_tool_shift_point(&(po[i]), aep.x, aep.y, ec); + } + if(ah->af) { + ah->o1 = dk3fig_obj_new( + obj->li, obj->la, /* Line number, layer */ + DK3_FIG_OBJ_POLYLINE, 3, /* Object type, subtype */ + obj->lw, obj->pc, obj->pc, 20, /* line width, pen, fill, style */ + DK3_FIG_LC_BUTT, /* line cap */ + DK3_FIG_LJ_MITER, /* line join */ + DK3_FIG_LS_SOLID, /* line style */ + 1.0, /* style value, unused */ + 0, 0, /* arrowheads flags */ + 4, /* Number of points */ + NULL, /* Text */ + drw->app /* Application */ + ); + } else { + ah->o1 = dk3fig_obj_new( + obj->li, obj->la, /* Line number, layer */ + DK3_FIG_OBJ_POLYLINE, 3, /* Object type, subtype */ + obj->lw, obj->pc, 7, 20, /* line width, pen, fill, style */ + DK3_FIG_LC_BUTT, /* line cap */ + DK3_FIG_LJ_MITER, /* line join */ + DK3_FIG_LS_SOLID, /* line style */ + 1.0, /* style value, unused */ + 0, 0, /* arrowheads flags */ + 4, /* Number of points */ + NULL, /* Text */ + drw->app /* Application */ + ); + } + if(ah->o1) { + if((((dk3_fig_obj_t *)(ah->o1))->dt).pol.po) { + dk3mem_cpy( + (void *)((((dk3_fig_obj_t *)(ah->o1))->dt).pol.po), + (void *)po, + (4 * sizeof(dk3_fig_poly_point_t)) + ); + back = 1; + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } + } break; + case DK3_FIG_AS_FULL_CIRCLE_END: { + s = 0.5 * dk3fig_tool_get_lw(drw, obj, ec); + aep.x = dk3ma_d_sub_ok(aep.x, (0.5 * ah->he * cos(rotation)), ec); + aep.y = dk3ma_d_sub_ok(aep.y, (0.5 * ah->he * sin(rotation)), ec); + if(!(drw->coah)) { + aep.x = dk3ma_d_sub_ok(aep.x, (s * cos(rotation)), ec); + aep.y = dk3ma_d_sub_ok(aep.y, (s * sin(rotation)), ec); + } + if(ah->af) { + ah->o1 = dk3fig_obj_new( + obj->li, obj->la, /* Line number, layer */ + DK3_FIG_OBJ_ELLIPSE, 3, /* Object type, subtype */ + obj->lw, obj->pc, obj->pc, 20, /* line width, pen, fill, style */ + DK3_FIG_LC_BUTT, /* line cap */ + DK3_FIG_LJ_MITER, /* line join */ + DK3_FIG_LS_SOLID, /* line style */ + 1.0, /* style value, unused */ + 0, 0, /* arrowheads flags */ + 0, /* Number of points */ + NULL, /* Text */ + drw->app /* Application */ + ); + } else { + ah->o1 = dk3fig_obj_new( + obj->li, obj->la, /* Line number, layer */ + DK3_FIG_OBJ_ELLIPSE, 3, /* Object type, subtype */ + obj->lw, obj->pc, 7, 20, /* line width, pen, fill, style */ + DK3_FIG_LC_BUTT, /* line cap */ + DK3_FIG_LJ_MITER, /* line join */ + DK3_FIG_LS_SOLID, /* line style */ + 1.0, /* style value, unused */ + 0, 0, /* arrowheads flags */ + 0, /* Number of points */ + NULL, /* Text */ + drw->app /* Application */ + ); + } + if(ah->o1) { + (((dk3_fig_obj_t *)(ah->o1))->dt).ell.an = 0.0; + (((dk3_fig_obj_t *)(ah->o1))->dt).ell.cx = aep.x; + (((dk3_fig_obj_t *)(ah->o1))->dt).ell.cy = aep.y; + (((dk3_fig_obj_t *)(ah->o1))->dt).ell.rx = 0.5 * ah->he; + (((dk3_fig_obj_t *)(ah->o1))->dt).ell.ry = 0.5 * ah->he; + back = 1; + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } break; + case DK3_FIG_AS_HALF_CIRCLE_END: { + if(ah->af) { + if(!(drw->coah)) { + s = 0.5 * dk3fig_tool_get_lw(drw, obj, ec); + aep.x = dk3ma_d_sub_ok(aep.x, (s * cos(rotation)), ec); + aep.y = dk3ma_d_sub_ok(aep.y, (s * sin(rotation)), ec); + } + } + if(ah->af) { + ah->o1 = dk3fig_obj_new( + obj->li, obj->la, /* Line number, layer */ + DK3_FIG_OBJ_PSEUDO_HALF_CIRCLE, 1, /* Object type, subtype */ + obj->lw, obj->pc, obj->pc, 20, /* line width, pen, fill, style */ + DK3_FIG_LC_BUTT, /* line cap */ + DK3_FIG_LJ_MITER, /* line join */ + DK3_FIG_LS_SOLID, /* line style */ + 1.0, /* style value, unused */ + 0, 0, /* arrowheads flags */ + 0, /* Number of points */ + NULL, /* Text */ + drw->app /* Application */ + ); + } else { + ah->o1 = dk3fig_obj_new( + obj->li, obj->la, /* Line number, layer */ + DK3_FIG_OBJ_PSEUDO_HALF_CIRCLE, 0, /* Object type, subtype */ + obj->lw, obj->pc, 7, -1, /* line width, pen, fill, style */ + DK3_FIG_LC_BUTT, /* line cap */ + DK3_FIG_LJ_MITER, /* line join */ + DK3_FIG_LS_SOLID, /* line style */ + 1.0, /* style value, unused */ + 0, 0, /* arrowheads flags */ + 0, /* Number of points */ + NULL, /* Text */ + drw->app /* Application */ + ); + } + if(ah->o1) { + +#line 1620 "dk3figah.ctr" + (((dk3_fig_obj_t *)(ah->o1))->dt).hci.cx = aep.x; + (((dk3_fig_obj_t *)(ah->o1))->dt).hci.cy = aep.y; + (((dk3_fig_obj_t *)(ah->o1))->dt).hci.ra = 0.5 * ah->he; + (((dk3_fig_obj_t *)(ah->o1))->dt).hci.an = rotation; + back = 1; + } else { + +#line 1626 "dk3figah.ctr" + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } break; + case DK3_FIG_AS_RECTANGLE: { + if(!(drw->coah)) { + s = 0.5 * dk3fig_tool_get_lw(drw, obj, ec); + aep.x = dk3ma_d_sub_ok(aep.x, (s * cos(rotation)), ec); + aep.y = dk3ma_d_sub_ok(aep.y, (s * sin(rotation)), ec); + } + po[0].x = -1.0 * ah->he; + po[0].y = 0.5 * ah->wi; + po[1].x = 0.0; + po[1].y = po[0].y; + po[2].x = 0.0; + po[2].y = -0.5 * ah->wi; + po[3].x = po[0].x; + po[3].y = po[2].y; + for(i = 0; i < 4; i++) { + dk3fig_tool_rotate_point(&(po[i]), rotation, ec); + dk3fig_tool_shift_point(&(po[i]), aep.x, aep.y, ec); + } + if(ah->af) { + ah->o1 = dk3fig_obj_new( + obj->li, obj->la, /* Line number, layer */ + DK3_FIG_OBJ_POLYLINE, 3, /* Object type, subtype */ + obj->lw, obj->pc, obj->pc, 20, /* line width, pen, fill, style */ + DK3_FIG_LC_BUTT, /* line cap */ + DK3_FIG_LJ_MITER, /* line join */ + DK3_FIG_LS_SOLID, /* line style */ + 1.0, /* style value, unused */ + 0, 0, /* arrowheads flags */ + 4, /* Number of points */ + NULL, /* Text */ + drw->app /* Application */ + ); + } else { + ah->o1 = dk3fig_obj_new( + obj->li, obj->la, /* Line number, layer */ + DK3_FIG_OBJ_POLYLINE, 3, /* Object type, subtype */ + obj->lw, obj->pc, 7, 20, /* line width, pen, fill, style */ + DK3_FIG_LC_BUTT, /* line cap */ + DK3_FIG_LJ_MITER, /* line join */ + DK3_FIG_LS_SOLID, /* line style */ + 1.0, /* style value, unused */ + 0, 0, /* arrowheads flags */ + 4, /* Number of points */ + NULL, /* Text */ + drw->app /* Application */ + ); + } + if(ah->o1) { + if((((dk3_fig_obj_t *)(ah->o1))->dt).pol.po) { + dk3mem_cpy( + (void *)((((dk3_fig_obj_t *)(ah->o1))->dt).pol.po), + po, + (4 * sizeof(dk3_fig_poly_point_t)) + ); + (((dk3_fig_obj_t *)(ah->o1))->dt).pol.np = 4; + back = 1; + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } break; + case DK3_FIG_AS_INVERSE: { + if(!(drw->coah)) { + s = 0.5 * dk3fig_tool_get_lw(drw, obj, ec); + aep.x = dk3ma_d_sub_ok(aep.x, (s * cos(rotation)), ec); + aep.y = dk3ma_d_sub_ok(aep.y, (s * sin(rotation)), ec); + } + po[0].x = -1.0 * ah->he; + po[0].y = 0.0; + po[1].x = 0.0; + po[1].y = 0.5 * ah->wi; + po[2].x = 0.0; + po[2].y = -0.5 * ah->wi; + for(i = 0; i < 3; i++) { + dk3fig_tool_rotate_point(&(po[i]), rotation, ec); + dk3fig_tool_shift_point(&(po[i]), aep.x, aep.y, ec); + } + if(ah->af) { + ah->o1 = dk3fig_obj_new( + obj->li, obj->la, /* Line number, layer */ + DK3_FIG_OBJ_POLYLINE, 3, /* Object type, subtype */ + obj->lw, obj->pc, obj->pc, 20, /* line width, pen, fill, style */ + DK3_FIG_LC_BUTT, /* line cap */ + DK3_FIG_LJ_MITER, /* line join */ + DK3_FIG_LS_SOLID, /* line style */ + 1.0, /* style value, unused */ + 0, 0, /* arrowheads flags */ + 3, /* Number of points */ + NULL, /* Text */ + drw->app /* Application */ + ); + } else { + ah->o1 = dk3fig_obj_new( + obj->li, obj->la, /* Line number, layer */ + DK3_FIG_OBJ_POLYLINE, 3, /* Object type, subtype */ + obj->lw, obj->pc, 7, 20, /* line width, pen, fill, style */ + DK3_FIG_LC_BUTT, /* line cap */ + DK3_FIG_LJ_MITER, /* line join */ + DK3_FIG_LS_SOLID, /* line style */ + 1.0, /* style value, unused */ + 0, 0, /* arrowheads flags */ + 3, /* Number of points */ + NULL, /* Text */ + drw->app /* Application */ + ); + } + if(ah->o1) { + if((((dk3_fig_obj_t *)(ah->o1))->dt).pol.po) { + dk3mem_cpy( + (void *)((((dk3_fig_obj_t *)(ah->o1))->dt).pol.po), + po, + (3 * sizeof(dk3_fig_poly_point_t)) + ); + (((dk3_fig_obj_t *)(ah->o1))->dt).pol.np = 3; + back = 1; + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } break; + case DK3_FIG_AS_INDENTED_FILLED_HALF: { +#if 0 + s = 0.0; + if(!(drw->coah)) { + s = dk3figah_s(drw, obj, ah, ec); + aep.x = dk3ma_d_sub_ok(aep.x, (s * cos(rotation)), ec); + aep.y = dk3ma_d_sub_ok(aep.y, (s * sin(rotation)), ec); + } + po[0].x = -1.0 * ah->he; + po[0].y = 0.0; + po[1].x = -1.25 * ah->he; + if(ah->af) { + po[1].y = 0.5 * ah->wi; + } else { + po[1].y = -0.5 * ah->wi; + } + po[2].x = 0.0; + po[2].y = 0.0; + po[3].x = po[1].x; + if(ah->af) { + po[3].y = -0.5 * ah->wi; + } else { + po[3].y = 0.5 * ah->wi; + } + for(i = 0; i < 4; i++) { + dk3fig_tool_rotate_point(&(po[i]), rotation, ec); + dk3fig_tool_shift_point(&(po[i]), aep.x, aep.y, ec); + } + ah->o1 = dk3fig_obj_new( + obj->li, obj->la, /* Line number, layer */ + DK3_FIG_OBJ_POLYLINE, 3, /* Object type, subtype */ + obj->lw, obj->pc, 7, 20, /* line width, pen, fill, style */ + DK3_FIG_LC_BUTT, /* line cap */ + DK3_FIG_LJ_MITER, /* line join */ + DK3_FIG_LS_SOLID, /* line style */ + 1.0, /* style value, unused */ + 0, 0, /* arrowheads flags */ + 4, /* Number of points */ + NULL, /* Text */ + drw->app /* Application */ + ); + if(ah->o1) { + if((((dk3_fig_obj_t *)(ah->o1))->dt).pol.po) { + dk3mem_cpy( + (void *)((((dk3_fig_obj_t *)(ah->o1))->dt).pol.po), + po, + (4 * sizeof(dk3_fig_poly_point_t)) + ); + (((dk3_fig_obj_t *)(ah->o1))->dt).pol.np = 4; + ah->o2 = dk3fig_obj_new( + obj->li, obj->la, /* Line number, layer */ + DK3_FIG_OBJ_POLYLINE, 3, /* Object type, subtype */ + obj->lw, obj->pc, obj->pc, 20, /* line width, pen, fill, style */ + DK3_FIG_LC_BUTT, /* line cap */ + DK3_FIG_LJ_MITER, /* line join */ + DK3_FIG_LS_SOLID, /* line style */ + 1.0, /* style value, unused */ + 0, 0, /* arrowheads flags */ + 3, /* Number of points */ + NULL, /* Text */ + drw->app /* Application */ + ); + if(ah->o2) { + if((((dk3_fig_obj_t *)(ah->o2))->dt).pol.po) { + dk3mem_cpy( + (void *)((((dk3_fig_obj_t *)(ah->o2))->dt).pol.po), + po, + (3 * sizeof(dk3_fig_poly_point_t)) + ); + (((dk3_fig_obj_t *)(ah->o2))->dt).pol.np = 3; + back = 1; + } + } + } + } +#else + if(!(drw->coah)) { + s = dk3figah_s(drw, obj, ah, ec); + aep.x = dk3ma_d_sub_ok(aep.x, (s * cos(rotation)), ec); + aep.y = dk3ma_d_sub_ok(aep.y, (s * sin(rotation)), ec); + } + po[0].x = -1.0 * ah->he; + po[0].y = 0.0; + po[1].x = dk3ma_d_mul_ok(-1.25, ah->he, ec); + if(ah->af) { + po[1].y = 0.5 * ah->wi; + } else { + po[1].y = -0.5 * ah->wi; + } + po[2].x = 0.0; + po[2].y = 0.0; + po[3].x = dk3ma_d_mul_ok(-1.25, ah->he, ec); + if(ah->af) { + po[3].y = -0.5 * ah->wi; + } else { + po[3].y = 0.5 * ah->wi; + } + for(i = 0; i < 4; i++) { + dk3fig_tool_rotate_point(&(po[i]), rotation, ec); + dk3fig_tool_shift_point(&(po[i]), aep.x, aep.y, ec); + } + ah->o1 = dk3fig_obj_new( + obj->li, obj->la, /* Line number, layer */ + DK3_FIG_OBJ_POLYLINE, 3, /* Object type, subtype */ + obj->lw, obj->pc, 7, 20, /* line width, pen, fill, style */ + DK3_FIG_LC_BUTT, /* line cap */ + DK3_FIG_LJ_MITER, /* line join */ + DK3_FIG_LS_SOLID, /* line style */ + 1.0, /* style value, unused */ + 0, 0, /* arrowheads flags */ + 4, /* Number of points */ + NULL, /* Text */ + drw->app /* Application */ + ); + if(ah->o1) { + if((((dk3_fig_obj_t *)(ah->o1))->dt).pol.po) { + dk3mem_cpy( + (void *)((((dk3_fig_obj_t *)(ah->o1))->dt).pol.po), + (void *)po, + (4 * sizeof(dk3_fig_poly_point_t)) + ); + (((dk3_fig_obj_t *)(ah->o1))->dt).pol.np = 4; + ah->o2 = dk3fig_obj_new( + obj->li, obj->la, /* Line number, layer */ + DK3_FIG_OBJ_POLYLINE, 3, /* Object type, subtype */ + 0, obj->pc, obj->pc, 20, /* line width, pen, fill, style */ + DK3_FIG_LC_BUTT, /* line cap */ + DK3_FIG_LJ_MITER, /* line join */ + DK3_FIG_LS_SOLID, /* line style */ + 1.0, /* style value, unused */ + 0, 0, /* arrowheads flags */ + 3, /* Number of points */ + NULL, /* Text */ + drw->app /* Application */ + ); + if(ah->o2) { + if((((dk3_fig_obj_t *)(ah->o2))->dt).pol.po) { + dk3mem_cpy( + (void *)((((dk3_fig_obj_t *)(ah->o2))->dt).pol.po), + (void *)po, + (3 * sizeof(dk3_fig_poly_point_t)) + ); + (((dk3_fig_obj_t *)(ah->o2))->dt).pol.np = 3; + back = 1; + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } +#endif + } break; + case DK3_FIG_AS_CLOSED_HALF: { + if(!(drw->coah)) { + s = dk3figah_s(drw, obj, ah, ec); + aep.x = dk3ma_d_sub_ok(aep.x, (s * cos(rotation)), ec); + aep.y = dk3ma_d_sub_ok(aep.y, (s * sin(rotation)), ec); + } + po[0].x = -1.0 * ah->he; + po[0].y = 0.0; + po[1].x = -1.0 * ah->he; + po[1].y = 0.5 * ah->wi; + po[2].x = 0.0; + po[2].y = 0.0; + for(i = 0; i < 3; i++) { + dk3fig_tool_rotate_point(&(po[i]), rotation, ec); + dk3fig_tool_shift_point(&(po[i]), aep.x, aep.y, ec); + } + if(ah->af) { + ah->o1 = dk3fig_obj_new( + obj->li, obj->la, /* Line number, layer */ + DK3_FIG_OBJ_POLYLINE, 3, /* Object type, subtype */ + obj->lw, obj->pc, obj->pc, 20, /* line width, pen, fill, style */ + DK3_FIG_LC_BUTT, /* line cap */ + DK3_FIG_LJ_MITER, /* line join */ + DK3_FIG_LS_SOLID, /* line style */ + 1.0, /* style value, unused */ + 0, 0, /* arrowheads flags */ + 3, /* Number of points */ + NULL, /* Text */ + drw->app /* Application */ + ); + } else { + ah->o1 = dk3fig_obj_new( + obj->li, obj->la, /* Line number, layer */ + DK3_FIG_OBJ_POLYLINE, 3, /* Object type, subtype */ + obj->lw, obj->pc, 7, 20, /* line width, pen, fill, style */ + DK3_FIG_LC_BUTT, /* line cap */ + DK3_FIG_LJ_MITER, /* line join */ + DK3_FIG_LS_SOLID, /* line style */ + 1.0, /* style value, unused */ + 0, 0, /* arrowheads flags */ + 3, /* Number of points */ + NULL, /* Text */ + drw->app /* Application */ + ); + } + if(ah->o1) { + if((((dk3_fig_obj_t *)(ah->o1))->dt).pol.po) { + dk3mem_cpy( + (void *)((((dk3_fig_obj_t *)(ah->o1))->dt).pol.po), + po, + (3 * sizeof(dk3_fig_poly_point_t)) + ); + (((dk3_fig_obj_t *)(ah->o1))->dt).pol.np = 3; + back = 1; + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } break; + case DK3_FIG_AS_INDENTED_HALF: { + if(!(drw->coah)) { + s = dk3figah_s(drw, obj, ah, ec); + aep.x = dk3ma_d_sub_ok(aep.x, (s * cos(rotation)), ec); + aep.y = dk3ma_d_sub_ok(aep.y, (s * sin(rotation)), ec); + } + po[0].x = -1.0 * ah->he; + po[0].y = 0.0; + po[1].x = -1.25 * ah->he; + po[1].y = 0.5 * ah->wi; + po[2].x = 0.0; + po[2].y = 0.0; + for(i = 0; i < 3; i++) { + dk3fig_tool_rotate_point(&(po[i]), rotation, ec); + dk3fig_tool_shift_point(&(po[i]), aep.x, aep.y, ec); + } + if(ah->af) { + ah->o1 = dk3fig_obj_new( + obj->li, obj->la, /* Line number, layer */ + DK3_FIG_OBJ_POLYLINE, 3, /* Object type, subtype */ + obj->lw, obj->pc, obj->pc, 20, /* line width, pen, fill, style */ + DK3_FIG_LC_BUTT, /* line cap */ + DK3_FIG_LJ_MITER, /* line join */ + DK3_FIG_LS_SOLID, /* line style */ + 1.0, /* style value, unused */ + 0, 0, /* arrowheads flags */ + 3, /* Number of points */ + NULL, /* Text */ + drw->app /* Application */ + ); + } else { + ah->o1 = dk3fig_obj_new( + obj->li, obj->la, /* Line number, layer */ + DK3_FIG_OBJ_POLYLINE, 3, /* Object type, subtype */ + obj->lw, obj->pc, 7, 20, /* line width, pen, fill, style */ + DK3_FIG_LC_BUTT, /* line cap */ + DK3_FIG_LJ_MITER, /* line join */ + DK3_FIG_LS_SOLID, /* line style */ + 1.0, /* style value, unused */ + 0, 0, /* arrowheads flags */ + 3, /* Number of points */ + NULL, /* Text */ + drw->app /* Application */ + ); + } + if(ah->o1) { + if((((dk3_fig_obj_t *)(ah->o1))->dt).pol.po) { + dk3mem_cpy( + (void *)((((dk3_fig_obj_t *)(ah->o1))->dt).pol.po), + po, + (3 * sizeof(dk3_fig_poly_point_t)) + ); + (((dk3_fig_obj_t *)(ah->o1))->dt).pol.np = 3; + back = 1; + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } break; + case DK3_FIG_AS_BUTTED_HALF: { + if(!(drw->coah)) { + s = dk3figah_s(drw, obj, ah, ec); + aep.x = dk3ma_d_sub_ok(aep.x, (s * cos(rotation)), ec); + aep.y = dk3ma_d_sub_ok(aep.y, (s * sin(rotation)), ec); + } + po[0].x = -1.0 * ah->he; + po[0].y = 0.0; + po[1].x = -0.75 * ah->he; + po[1].y = 0.5 * ah->wi; + po[2].x = 0.0; + po[2].y = 0.0; + for(i = 0; i < 3; i++) { + dk3fig_tool_rotate_point(&(po[i]), rotation, ec); + dk3fig_tool_shift_point(&(po[i]), aep.x, aep.y, ec); + } + if(ah->af) { + ah->o1 = dk3fig_obj_new( + obj->li, obj->la, /* Line number, layer */ + DK3_FIG_OBJ_POLYLINE, 3, /* Object type, subtype */ + obj->lw, obj->pc, obj->pc, 20, /* line width, pen, fill, style */ + DK3_FIG_LC_BUTT, /* line cap */ + DK3_FIG_LJ_MITER, /* line join */ + DK3_FIG_LS_SOLID, /* line style */ + 1.0, /* style value, unused */ + 0, 0, /* arrowheads flags */ + 3, /* Number of points */ + NULL, /* Text */ + drw->app /* Application */ + ); + } else { + ah->o1 = dk3fig_obj_new( + obj->li, obj->la, /* Line number, layer */ + DK3_FIG_OBJ_POLYLINE, 3, /* Object type, subtype */ + obj->lw, obj->pc, 7, 20, /* line width, pen, fill, style */ + DK3_FIG_LC_BUTT, /* line cap */ + DK3_FIG_LJ_MITER, /* line join */ + DK3_FIG_LS_SOLID, /* line style */ + 1.0, /* style value, unused */ + 0, 0, /* arrowheads flags */ + 3, /* Number of points */ + NULL, /* Text */ + drw->app /* Application */ + ); + } + if(ah->o1) { + if((((dk3_fig_obj_t *)(ah->o1))->dt).pol.po) { + dk3mem_cpy( + (void *)((((dk3_fig_obj_t *)(ah->o1))->dt).pol.po), + po, + (3 * sizeof(dk3_fig_poly_point_t)) + ); + (((dk3_fig_obj_t *)(ah->o1))->dt).pol.np = 3; + back = 1; + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } break; + case DK3_FIG_AS_TRIANGLE_FORK: { + if(ah->af) { + if(!(drw->coah)) { + s = 0.5 * dk3fig_tool_get_lw(drw, obj, ec); + aep.x = dk3ma_d_sub_ok(aep.x, (s * cos(rotation)), ec); + aep.y = dk3ma_d_sub_ok(aep.y, (s * sin(rotation)), ec); + } + po[0].x = 0.0; + po[0].y = 0.5 * ah->wi; + po[1].x = 0.0; + po[1].y = -0.5 * ah->wi; + for(i = 0; i < 2; i++) { + dk3fig_tool_rotate_point(&(po[i]), rotation, ec); + dk3fig_tool_shift_point(&(po[i]), aep.x, aep.y, ec); + } + ah->o1 = dk3fig_obj_new( + obj->li, obj->la, /* Line number, layer */ + DK3_FIG_OBJ_POLYLINE, 1, /* Object type, subtype */ + obj->lw, obj->pc, obj->pc, -1, /* line width, pen, fill, style */ + DK3_FIG_LC_BUTT, /* line cap */ + DK3_FIG_LJ_MITER, /* line join */ + DK3_FIG_LS_SOLID, /* line style */ + 1.0, /* style value, unused */ + 0, 0, /* arrowheads flags */ + 2, /* Number of points */ + NULL, /* Text */ + drw->app /* Application */ + ); + if(ah->o1) { + if((((dk3_fig_obj_t *)(ah->o1))->dt).pol.po) { + dk3mem_cpy( + (void *)((((dk3_fig_obj_t *)(ah->o1))->dt).pol.po), + po, + (2 * sizeof(dk3_fig_poly_point_t)) + ); + (((dk3_fig_obj_t *)(ah->o1))->dt).pol.np = 2; + back = 1; + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } else { + po[0].x = 0.0; + po[0].y = 0.5 * ah->wi; + po[1].x = -1.0 * ah->he; + po[1].y = 0.0; + po[2].x = 0.0; + po[2].y = -0.5 * ah->wi; + for(i = 0; i < 3; i++) { + dk3fig_tool_rotate_point(&(po[i]), rotation, ec); + dk3fig_tool_shift_point(&(po[i]), aep.x, aep.y, ec); + } + ah->o1 = dk3fig_obj_new( + obj->li, obj->la, /* Line number, layer */ + DK3_FIG_OBJ_POLYLINE, 1, /* Object type, subtype */ + obj->lw, obj->pc, obj->pc, -1, /* line width, pen, fill, style */ + DK3_FIG_LC_BUTT, /* line cap */ + DK3_FIG_LJ_MITER, /* line join */ + DK3_FIG_LS_SOLID, /* line style */ + 1.0, /* style value, unused */ + 0, 0, /* arrowheads flags */ + 3, /* Number of points */ + NULL, /* Text */ + drw->app /* Application */ + ); + if(ah->o1) { + if((((dk3_fig_obj_t *)(ah->o1))->dt).pol.po) { + dk3mem_cpy( + (void *)((((dk3_fig_obj_t *)(ah->o1))->dt).pol.po), + po, + (3 * sizeof(dk3_fig_poly_point_t)) + ); + (((dk3_fig_obj_t *)(ah->o1))->dt).pol.np = 3; + back = 1; + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } + } break; + case DK3_FIG_AS_RECTANGLE_FORK: { + if(ah->af) { + if(!(drw->coah)) { + s = 0.5 * dk3fig_tool_get_lw(drw, obj, ec); + aep.x = dk3ma_d_sub_ok(aep.x, (s * cos(rotation)), ec); + aep.y = dk3ma_d_sub_ok(aep.y, (s * sin(rotation)), ec); + } + po[0].x = -1.0 * ah->he; + po[0].y = 0.5 * ah->wi; + po[1].x = 0.0; + po[1].y = 0.5 * ah->wi; + po[2].x = 0.0; + po[2].y = -0.5 * ah->wi; + po[3].x = -1.0 * ah->he; + po[3].y = -0.5 * ah->wi; + } else { + po[0].x = 0.0; + po[0].y = 0.5 * ah->wi; + po[1].x = -1.0 * ah->he; + po[1].y = 0.5 * ah->wi; + po[2].x = -1.0 * ah->he; + po[2].y = -0.5 * ah->wi; + po[3].x = 0.0; + po[3].y = -0.5 * ah->wi; + } + for(i = 0; i < 4; i++) { + dk3fig_tool_rotate_point(&(po[i]), rotation, ec); + dk3fig_tool_shift_point(&(po[i]), aep.x, aep.y, ec); + } + ah->o1 = dk3fig_obj_new( + obj->li, obj->la, /* Line number, layer */ + DK3_FIG_OBJ_POLYLINE, 1, /* Object type, subtype */ + obj->lw, obj->pc, obj->pc, -1, /* line width, pen, fill, style */ + DK3_FIG_LC_BUTT, /* line cap */ + DK3_FIG_LJ_MITER, /* line join */ + DK3_FIG_LS_SOLID, /* line style */ + 1.0, /* style value, unused */ + 0, 0, /* arrowheads flags */ + 4, /* Number of points */ + NULL, /* Text */ + drw->app /* Application */ + ); + if(ah->o1) { + if((((dk3_fig_obj_t *)(ah->o1))->dt).pol.po) { + dk3mem_cpy( + (void *)((((dk3_fig_obj_t *)(ah->o1))->dt).pol.po), + po, + (4 * sizeof(dk3_fig_poly_point_t)) + ); + (((dk3_fig_obj_t *)(ah->o1))->dt).pol.np = 4; + back = 1; + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } break; + } + + +#line 2218 "dk3figah.ctr" + return back; +} + + + +/** Calculate arrowheads for polyline. + @param drw Drawing to modify. + @param obj Object to modify. + @param objno Object number. + @return 1 on success, 0 on error. +*/ +static +int +dk3figah_calculate_polyline( + dk3_fig_drawing_t *drw, + dk3_fig_obj_t *obj, + unsigned long objno +) +{ + dk3_fig_poly_point_t *po; /* Points of the polyline. */ + double cuts = -1.0; /* Cut at start. */ + double cute = -1.0; /* Cut at end. */ + double alphaf = 0.0; /* Direction of forward arrowhead. */ + double alphab = 0.0; /* Direction of backward arrowhead. */ + size_t np; /* Number of points in polyline. */ + int mec = 0; /* Math error code. */ + int res = 0; /* Arrowhead creation result. */ + int back = 1; + + +#line 2247 "dk3figah.ctr" + np = (obj->dt).pol.np; + po = (obj->dt).pol.po; + if((1 < np) && (po)) { + /* + Calculate line cuttings for arrowhead. + */ + if(obj->af) { + cute = dk3figah_length_correction(drw, obj, obj->af, &mec); + } + if(obj->ab) { + cuts = dk3figah_length_correction(drw, obj, obj->ab, &mec); + } + +#line 2259 "dk3figah.ctr" + /* + Create arrowhead objects. + */ + if(obj->af) { + alphaf = dk3ma_d_atan2( + dk3ma_d_sub_ok(po[np - 1].y, po[np - 2].y, &mec), + dk3ma_d_sub_ok(po[np - 1].x, po[np - 2].x, &mec) + ); + } + if(obj->ab) { + alphab = dk3ma_d_atan2( + dk3ma_d_sub_ok(po[0].y, po[1].y, &mec), + dk3ma_d_sub_ok(po[0].x, po[1].x, &mec) + ); + } + if(obj->af) { + res = dk3figah_straight_arrowhead( + drw, obj, obj->af, &(po[np - 1]), alphaf, &mec + ); + if(!(res)) { back = 0; } + } + if(obj->ab) { + res = dk3figah_straight_arrowhead( + drw, obj, obj->ab, &(po[0]), alphab, &mec + ); + if(!(res)) { back = 0; } + } + /* + Cut first and last segment if necessary when not using compatible + arrowheads. + */ + if(!(drw->coah)) { + if(0.0 < cuts) { + if(0 == dk3fig_tool_cut_segment(&(po[0]), &(po[1]), cuts, &mec)) { + np = (obj->dt).pol.np = np - 1; + dk3fig_tool_poly_point_move_left(&(po[0]), &(po[1]), np); + } + } + if((0.0 < cute) && (1 < np)) { + if(0 == dk3fig_tool_cut_segment(&(po[np - 1]),&(po[np - 2]),cute,&mec)) + { + (obj->dt).pol.np = np - 1; + } + } + } + } + if(mec) { + back = 0; + /* ERROR: Math error in object! */ + dk3app_log_i1(drw->app, DK3_LL_ERROR, 260); + dk3fig_set_ec(drw, DK3_ERROR_MATH_OVERFLOW); + } + + +#line 2312 "dk3figah.ctr" + return back; +} + + + +/** Calculate values for a given t. + @param drw Drawing object. + @param obj Fig object. + @param ah Arrowhead to modify. + @param xpos Pointer to x position variable. + @param ypos Pointer to y position variable. + @param phi Pointer to direction variable. + @param ab Flag: Is backward arrowhead (0=forward, 1=backward). + @param t The t value. + @param ec Pointer to error code variable. + @return 1 on success, 0 on error. +*/ +static +int +dk3figah_spline_values( + dk3_fig_drawing_t *drw, + dk3_fig_obj_t *obj, + dk3_fig_ah_t *ah, + double *xpos, + double *ypos, + double *phi, + int ab, + double t, + int *ec +) +{ + double p; + int back = 0; + int mec = 0; + p = dk3xsp_direction_and_position( + xpos, ypos, (obj->dt).spl.po, (obj->dt).spl.np, t, drw->cosp, &mec + ); + if(0.0 <= p) { + back = 1; + if(ab) { + p = p + M_PI; + while((2.0 * M_PI) < p) { p = p - (2.0 * M_PI);} + } + *phi = p; + if(mec) { + back = 0; + if(ec) { *ec = mec; } + } + } + return back; +} + + + +#if TRACE_DEBUG +/** Report spline points to debug file. + @param sp Spline points to report. + @param np Number of points to report. +*/ +static +void +dk3figah_report_spline_points( + dk3_fig_spline_point_t *sp, + size_t np +) +{ + FILE *fipo; + size_t i; + if((sp) && (np)) { + fipo = dktrace_file(); + if(fipo) { + fputs("Spline points report:\n", fipo); + for(i = 0; i < np; i++) { + fprintf( + fipo, + "Point %5u:\tx = %lg \ty = %lg \ts = %lg\n", + (unsigned)i, sp[i].x, sp[i].y, sp[i].s + ); + } + } + } +} +#endif + + + +/** Create arrowhead object on end of open spline. + @param drw Drawing object. + @param obj Fig object. + @param ah Arrowhead to modify. + @param ab Flag: Is backward arrowhead (0=forward, 1=backward). + @param ec Pointer to error code variable. + @return 1 on success, 0 on error. +*/ +static +int +dk3figah_one_spline_arrowhead( + dk3_fig_drawing_t *drw, + dk3_fig_obj_t *obj, + dk3_fig_ah_t *ah, + int ab, + int *ec +) +{ + dk3_xspline_segment_t seg; /* Segment for calculations. */ + dk3_fig_poly_point_t pp[2]; /* For calculation. */ + dk3_fig_poly_point_t *po; /* New polyline points. */ + dk3_fig_obj_t *ao1 = NULL; /* Arrowhead object 1. */ + dk3_fig_obj_t *ao2 = NULL; /* Arrowhead object 2. */ + dk3_fig_spline_point_t *osp = NULL; /* Original spline points. */ + dk3_fig_spline_point_t *sp = NULL; /* New spline points. */ + dk3_fig_spline_point_t *sp2 = NULL; /* Spline points obj 2. */ + double t0 = 0.0; /* Front point t. */ + double t1 = 0.0; /* Current t. */ + double t2 = 0.0; /* Arrow end point t. */ + double t; /* Current t. */ + double s = 0.0; /* Shift for front point. */ + double l1 = 0.0; /* Segment 1 length. */ + double l2 = 0.0; /* Segment 2 length. */ + double xpos = 0.0; /* X position. */ + double ypos = 0.0; /* Y position. */ + double phi = 0.0; /* Angle at position. */ + double lw = 0.0; /* Line width. */ + double dist = 0.0; /* Distance to end point. */ + size_t onp = 0; /* Object number of points. */ + size_t n1 = 0; /* Number of sub-segments 1. */ + size_t n2 = 0; /* Number of sub-segments 2. */ + size_t n3 = 0; /* Number of sub-segments 3. */ + size_t np = 0; /* Number of points. */ + size_t nq = 0; /* Number of points obj 2. */ + size_t i; + size_t j; + int res = 0; /* Operation result. */ + int mec = 0; /* Mathematical error code. */ + int back = 0; + + +#line 2448 "dk3figah.ctr" + osp = (obj->dt).spl.po; + onp = (obj->dt).spl.np; + t0 = ((ab) ? 0.0 : (double)(onp - 1)); + lw = dk3fig_tool_get_lw(drw, obj, &mec); + s = dk3figah_find_shift_length(drw, obj, ah, &mec); + switch(ah->as) { + case DK3_FIG_AS_STICK: + case DK3_FIG_AS_CLOSED: { + +#line 2456 "dk3figah.ctr" + t0 = dk3xsp_get_t_for_distance( + osp, onp, s, drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + if(0.0 <= t0) { + t1 = dk3xsp_get_t_for_distance( + osp, onp, dk3ma_d_add_ok(s, ah->he, &mec), + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + if(0.0 <= t1) { + +#line 2465 "dk3figah.ctr" + n1 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(fabs(t1 - t0), drw->splspp, &mec)), &mec + ); + if(n1 < drw->minspp) { n1 = drw->minspp; } + np = dk3mem_add_size_t(dk3mem_mul_size_t(2, n1, &mec), 1, &mec); + if(0 == mec) { + ao1 = dk3fig_obj_new( + obj->li, obj->la, + DK3_FIG_OBJ_SPLINE, + ((DK3_FIG_AS_CLOSED == ah->as) ? 5 : 4), + obj->lw, obj->pc, ((ah->af) ? obj->pc : 7), + ((DK3_FIG_AS_CLOSED == ah->as) ? 20 : -1), + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, np, NULL, drw->app + ); + if(ao1) { + ah->o1 = (void *)ao1; + sp = (ao1->dt).spl.po; + if(sp) { + back = 1; + res = dk3xsp_calculate_position( + &seg, osp, onp, t0, drw->cosp, 0, &mec + ); + if(res) { + +#line 2489 "dk3figah.ctr" + sp[n1].x = dk3xsp_get_x(&seg); + sp[n1].y = dk3xsp_get_y(&seg); + sp[n1].s = 0.0; + +#line 2492 "dk3figah.ctr" + for(i = 0; i < n1; i++) { + j = i + 1; + +#line 2494 "dk3figah.ctr" + if(j == n1) { + t = t1; + } else { + dist = dk3ma_d_add_ok( + s, (((double)j / (double)n1) * ah->he), &mec + ); + +#line 2500 "dk3figah.ctr" + t = dk3xsp_get_t_for_distance( + osp, onp, dist, + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + +#line 2504 "dk3figah.ctr" + + +#line 2505 "dk3figah.ctr" + } + if(0.0 <= t) { + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t, &mec + ); + +#line 2510 "dk3figah.ctr" + if(res) { + pp[0].x = pp[1].x = 0.0; + if(j == n1) { + pp[0].y = 0.5 * ah->wi; + } else { + pp[0].y = 0.5 * ah->wi * ((double)j / (double)n1); + } + pp[1].y = -1.0 * pp[0].y; + dk3fig_tool_rotate_point(&pp[0], phi, &mec); + dk3fig_tool_rotate_point(&pp[1], phi, &mec); + dk3fig_tool_shift_point(&pp[0], xpos, ypos, &mec); + dk3fig_tool_shift_point(&pp[1], xpos, ypos, &mec); + sp[n1 - j].x = pp[0].x; + +#line 2523 "dk3figah.ctr" + sp[n1 - j].y = pp[0].y; + +#line 2524 "dk3figah.ctr" + sp[n1 + j].x = pp[1].x; + sp[n1 + j].y = pp[1].y; + sp[n1 - j].s = sp[n1 + j].s = + ((j == n1) ? 0.0 : (-1.0)); + } else { + back = 0; i = n1; + +#line 2530 "dk3figah.ctr" + /* ##### ERROR: Spline calculation failed! */ + } + } else { + +#line 2533 "dk3figah.ctr" + back = 0; i = n1; + /* ##### ERROR: Spline calculation failed! */ + } + } + } else { + +#line 2538 "dk3figah.ctr" + back = 0; + /* ##### ERROR: Spline calculation failed! */ + } + +#line 2541 "dk3figah.ctr" + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } + } + } + } break; + case DK3_FIG_AS_INDENTED: { + +#line 2550 "dk3figah.ctr" + l1 = dk3ma_d_mul_ok(1.25, ah->he, &mec); + l2 = 0.25 * ah->he; + t0 = dk3xsp_get_t_for_distance( + osp, onp, s, drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + t1 = dk3xsp_get_t_for_distance( + osp, onp, dk3ma_d_add_ok(s, l1, &mec), + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + t2 = dk3xsp_get_t_for_distance( + osp, onp, dk3ma_d_add_ok(s, ah->he, &mec), + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + if((0.0 <= t0) && (0.0 <= t1) && (0.0 <= t2)) { + +#line 2564 "dk3figah.ctr" + n1 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(drw->splspp, fabs(t1 - t0), &mec)), &mec + ); + +#line 2567 "dk3figah.ctr" + n2 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(drw->splspp, fabs(t1 - t2), &mec)), &mec + ); + if(n1 < drw->minspp) { n1 = drw->minspp; } + if(n2 < drw->minspp) { n2 = drw->minspp; } + np = dk3mem_mul_size_t(2, dk3mem_add_size_t(n1, n2, &mec), &mec); + if(0 == mec) { + +#line 2574 "dk3figah.ctr" + ao1 = dk3fig_obj_new( + obj->li, obj->la, DK3_FIG_OBJ_SPLINE, 5, + obj->lw, obj->pc, ((ah->af) ? obj->pc : 7), 20, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, np, NULL, drw->app + ); + if(ao1) { + ah->o1 = (void *)ao1; + sp = (ao1->dt).spl.po; + if(sp) { + back = 1; + res = dk3xsp_calculate_position( + &seg, osp, onp, t0, drw->cosp, 0, &mec + ); + if(res) { + +#line 2589 "dk3figah.ctr" + sp[n1 + n2 - 1].x = dk3xsp_get_x(&seg); + sp[n1 + n2 - 1].y = dk3xsp_get_y(&seg); + sp[n1 + n2 - 1].s = 0.0; + +#line 2592 "dk3figah.ctr" + for(i = 0; i < n1; i++) { + j = i + 1; + if(j == n1) { + t = t1; + } else { + dist = dk3ma_d_add_ok( + s, (((double)j / (double)n1) * l1), &mec + ); + t = dk3xsp_get_t_for_distance( + osp, onp, dist, + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + } + if(0.0 <= t) { + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t, &mec + ); + if(res) { + pp[0].x = pp[1].x = 0.0; + if(j == n1) { + pp[0].y = 0.5 * ah->wi; + } else { + pp[0].y = 0.5 * ah->wi * ((double)j / (double)n1); + } + pp[1].y = -1.0 * pp[0].y; + dk3fig_tool_rotate_point(&pp[0], phi, &mec); + dk3fig_tool_rotate_point(&pp[1], phi, &mec); + dk3fig_tool_shift_point(&pp[0], xpos, ypos, &mec); + dk3fig_tool_shift_point(&pp[1], xpos, ypos, &mec); + sp[n1 + n2 - 1 - j].x = pp[0].x; + sp[n1 + n2 - 1 - j].y = pp[0].y; + + +#line 2624 "dk3figah.ctr" + sp[n1 + n2 - 1 + j].x = pp[1].x; + sp[n1 + n2 - 1 + j].y = pp[1].y; + + +#line 2627 "dk3figah.ctr" + sp[n1 + n2 - 1 - j].s = sp[n1 + n2 - 1 + j].s = + ((j == n1) ? 0.0 : (-1.0)); + } else { + back = 0; i = n1; + /* ##### ERROR: Spline calculation failed! */ + } + } else { + back = 0; i = n1; + /* ##### ERROR: Spline calculation failed! */ + } + } + if(back) { + for(i = 0; i < (n2 - 1); i++) { + j = i + 1; + dist = dk3ma_d_sub_ok( + dk3ma_d_add_ok(s, l1, &mec), + (l2 * ((double)j / (double)n2)), + &mec + ); + t = dk3xsp_get_t_for_distance( + osp, onp, dist, + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + if(0.0 <= t) { + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t, &mec + ); + if(res) { + pp[0].x = pp[1].x = 0.0; + pp[0].y = 0.5 * ah->wi * (1.0 - ((double)j/(double)n2)); + pp[1].y = -1.0 * pp[0].y; + dk3fig_tool_rotate_point(&pp[0], phi, &mec); + dk3fig_tool_rotate_point(&pp[1], phi, &mec); + dk3fig_tool_shift_point(&pp[0], xpos, ypos, &mec); + dk3fig_tool_shift_point(&pp[1], xpos, ypos, &mec); + sp[n2 - 1 - j].x = pp[0].x; + sp[n2 - 1 - j].y = pp[0].y; + + +#line 2665 "dk3figah.ctr" + sp[2 * n1 + n2 - 1 + j].x = pp[1].x; + sp[2 * n1 + n2 - 1 + j].y = pp[1].y; + + +#line 2668 "dk3figah.ctr" + sp[n2 - 1 - j].s = sp[2 * n1 + n2 - 1 + j].s = + ((j == n1) ? 0.0 : (-1.0)); + } else { + back = 0; i = n2; + /* ##### ERROR: Spline calculation failed! */ + } + } else { + back = 0; i = n2; + /* ##### ERROR: Spline calculation failed! */ + } + } + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t2, &mec + ); + if(res) { + sp[np - 1].x = xpos; + sp[np - 1].y = ypos; + sp[np - 1].s = 0.0; + +#line 2686 "dk3figah.ctr" + } else { + back = 0; + /* ##### ERROR: Spline calculation failed! */ + } + } + } else { + back = 0; + /* ##### ERROR: Spline calculation failed! */ + } + +#line 2695 "dk3figah.ctr" + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } else { + /* ##### ERROR: Spline calculation failed! */ + } + } else { + /* ##### ERROR: Spline calculation failed! */ + } + } break; + case DK3_FIG_AS_POINTED: { + +#line 2707 "dk3figah.ctr" + l1 = 0.75 * ah->he; + l2 = 0.25 * ah->he; + t0 = dk3xsp_get_t_for_distance( + osp, onp, s, drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + t1 = dk3xsp_get_t_for_distance( + osp, onp, dk3ma_d_add_ok(s, l1, &mec), + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + t2 = dk3xsp_get_t_for_distance( + osp, onp, dk3ma_d_add_ok(s, ah->he, &mec), + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + if((0.0 <= t0) && (0.0 <= t1) && (0.0 <= t2)) { + +#line 2721 "dk3figah.ctr" + n1 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(drw->splspp, fabs(t1 - t0), &mec)), &mec + ); + +#line 2724 "dk3figah.ctr" + n2 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(drw->splspp, fabs(t1 - t2), &mec)), &mec + ); + if(n1 < drw->minspp) { n1 = drw->minspp; } + if(n2 < drw->minspp) { n2 = drw->minspp; } + np = dk3mem_mul_size_t(2, dk3mem_add_size_t(n1, n2, &mec), &mec); + if(0 == mec) { + +#line 2731 "dk3figah.ctr" + ao1 = dk3fig_obj_new( + obj->li, obj->la, DK3_FIG_OBJ_SPLINE, 5, + obj->lw, obj->pc, ((ah->af) ? obj->pc : 7), 20, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, np, NULL, drw->app + ); + if(ao1) { + ah->o1 = (void *)ao1; + sp = (ao1->dt).spl.po; + if(sp) { + back = 1; + res = dk3xsp_calculate_position( + &seg, osp, onp, t0, drw->cosp, 0, &mec + ); + if(res) { + +#line 2746 "dk3figah.ctr" + sp[n1 + n2 - 1].x = dk3xsp_get_x(&seg); + sp[n1 + n2 - 1].y = dk3xsp_get_y(&seg); + sp[n1 + n2 - 1].s = 0.0; + +#line 2749 "dk3figah.ctr" + for(i = 0; i < n1; i++) { + j = i + 1; + if(j == n1) { + t = t1; + } else { + dist = dk3ma_d_add_ok( + s, (((double)j / (double)n1) * l1), &mec + ); + t = dk3xsp_get_t_for_distance( + osp, onp, dist, + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + } + if(0.0 <= t) { + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t, &mec + ); + if(res) { + pp[0].x = pp[1].x = 0.0; + if(j == n1) { + pp[0].y = 0.5 * ah->wi; + } else { + pp[0].y = 0.5 * ah->wi * ((double)j / (double)n1); + } + pp[1].y = -1.0 * pp[0].y; + dk3fig_tool_rotate_point(&pp[0], phi, &mec); + dk3fig_tool_rotate_point(&pp[1], phi, &mec); + dk3fig_tool_shift_point(&pp[0], xpos, ypos, &mec); + dk3fig_tool_shift_point(&pp[1], xpos, ypos, &mec); + sp[n1 + n2 - 1 - j].x = pp[0].x; + sp[n1 + n2 - 1 - j].y = pp[0].y; + + +#line 2781 "dk3figah.ctr" + sp[n1 + n2 - 1 + j].x = pp[1].x; + sp[n1 + n2 - 1 + j].y = pp[1].y; + + +#line 2784 "dk3figah.ctr" + sp[n1 + n2 - 1 - j].s = sp[n1 + n2 - 1 + j].s = + ((j == n1) ? 0.0 : (-1.0)); + } else { + back = 0; i = n1; + /* ##### ERROR: Spline calculation failed! */ + } + } else { + back = 0; i = n1; + /* ##### ERROR: Spline calculation failed! */ + } + } + if(back) { + for(i = 0; i < (n2 - 1); i++) { + j = i + 1; + dist = dk3ma_d_add_ok( + dk3ma_d_add_ok(s, l1, &mec), + (l2 * ((double)j / (double)n2)), + &mec + ); + t = dk3xsp_get_t_for_distance( + osp, onp, dist, + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + if(0.0 <= t) { + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t, &mec + ); + if(res) { + pp[0].x = pp[1].x = 0.0; + pp[0].y = 0.5 * ah->wi * (1.0 - ((double)j/(double)n2)); + pp[1].y = -1.0 * pp[0].y; + dk3fig_tool_rotate_point(&pp[0], phi, &mec); + dk3fig_tool_rotate_point(&pp[1], phi, &mec); + dk3fig_tool_shift_point(&pp[0], xpos, ypos, &mec); + dk3fig_tool_shift_point(&pp[1], xpos, ypos, &mec); + sp[n2 - 1 - j].x = pp[0].x; + sp[n2 - 1 - j].y = pp[0].y; + + +#line 2822 "dk3figah.ctr" + sp[2 * n1 + n2 - 1 + j].x = pp[1].x; + sp[2 * n1 + n2 - 1 + j].y = pp[1].y; + + +#line 2825 "dk3figah.ctr" + sp[n2 - 1 - j].s = sp[2 * n1 + n2 - 1 + j].s = + ((j == n1) ? 0.0 : (-1.0)); + } else { + back = 0; i = n2; + /* ##### ERROR: Spline calculation failed! */ + } + } else { + back = 0; i = n2; + /* ##### ERROR: Spline calculation failed! */ + } + } + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t2, &mec + ); + if(res) { + sp[np - 1].x = xpos; + sp[np - 1].y = ypos; + sp[np - 1].s = 0.0; + +#line 2843 "dk3figah.ctr" + } else { + back = 0; + /* ##### ERROR: Spline calculation failed! */ + } + } + } else { + back = 0; + /* ##### ERROR: Spline calculation failed! */ + } + +#line 2852 "dk3figah.ctr" + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } else { + /* ##### ERROR: Spline calculation failed! */ + } + } else { + /* ##### ERROR: Spline calculation failed! */ + } + } break; + case DK3_FIG_AS_RHOMBUS: { + if((1 == ah->af) && (DK3_FIG_SRCTYPE_JFIG == drw->srctype)) { + +#line 2865 "dk3figah.ctr" + if(dk3xsp_calculate_position(&seg, osp, onp, t0, drw->cosp, 0, &mec)) { + ao1 = dk3fig_obj_new( + obj->li, obj->la, DK3_FIG_OBJ_ELLIPSE, 3, + obj->lw, obj->pc, obj->pc, 20, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, 0, NULL, drw->app + ); + if(ao1) { + back = 1; + ah->o1 = (void *)ao1; + (ao1->dt).ell.an = 0.0; + (ao1->dt).ell.cx = dk3xsp_get_x(&seg); + (ao1->dt).ell.cy = dk3xsp_get_y(&seg); + (ao1->dt).ell.rx = dk3ma_d_mul_ok(2.0, ah->wi, &mec); + (ao1->dt).ell.ry = (ao1->dt).ell.rx; + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } else { + +#line 2884 "dk3figah.ctr" + /* ##### ERROR: Spline calculation failed! */ + } + } else { + +#line 2887 "dk3figah.ctr" + l1 = 0.5 * ah->he; + l2 = l1; + t0 = dk3xsp_get_t_for_distance( + osp, onp, s, drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + t1 = dk3xsp_get_t_for_distance( + osp, onp, dk3ma_d_add_ok(s, l1, &mec), + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + t2 = dk3xsp_get_t_for_distance( + osp, onp, dk3ma_d_add_ok(s, ah->he, &mec), + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + if((0.0 <= t0) && (0.0 <= t1) && (0.0 <= t2)) { + +#line 2901 "dk3figah.ctr" + n1 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(drw->splspp, fabs(t1 - t0), &mec)), &mec + ); + +#line 2904 "dk3figah.ctr" + n2 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(drw->splspp, fabs(t1 - t2), &mec)), &mec + ); + if(n1 < drw->minspp) { n1 = drw->minspp; } + if(n2 < drw->minspp) { n2 = drw->minspp; } + np = dk3mem_mul_size_t(2, dk3mem_add_size_t(n1, n2, &mec), &mec); + if(0 == mec) { + +#line 2911 "dk3figah.ctr" + ao1 = dk3fig_obj_new( + obj->li, obj->la, DK3_FIG_OBJ_SPLINE, 5, + obj->lw, obj->pc, ((ah->af) ? obj->pc : 7), 20, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, np, NULL, drw->app + ); + if(ao1) { + ah->o1 = (void *)ao1; + sp = (ao1->dt).spl.po; + if(sp) { + back = 1; + res = dk3xsp_calculate_position( + &seg, osp, onp, t0, drw->cosp, 0, &mec + ); + if(res) { + +#line 2926 "dk3figah.ctr" + sp[n1 + n2 - 1].x = dk3xsp_get_x(&seg); + sp[n1 + n2 - 1].y = dk3xsp_get_y(&seg); + sp[n1 + n2 - 1].s = 0.0; + +#line 2929 "dk3figah.ctr" + for(i = 0; i < n1; i++) { + j = i + 1; + if(j == n1) { + t = t1; + } else { + dist = dk3ma_d_add_ok( + s, (((double)j / (double)n1) * l1), &mec + ); + t = dk3xsp_get_t_for_distance( + osp, onp, dist, + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + } + if(0.0 <= t) { + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t, &mec + ); + if(res) { + pp[0].x = pp[1].x = 0.0; + if(j == n1) { + pp[0].y = 0.5 * ah->wi; + } else { + pp[0].y = 0.5 * ah->wi * ((double)j / (double)n1); + } + pp[1].y = -1.0 * pp[0].y; + dk3fig_tool_rotate_point(&pp[0], phi, &mec); + dk3fig_tool_rotate_point(&pp[1], phi, &mec); + dk3fig_tool_shift_point(&pp[0], xpos, ypos, &mec); + dk3fig_tool_shift_point(&pp[1], xpos, ypos, &mec); + sp[n1 + n2 - 1 - j].x = pp[0].x; + sp[n1 + n2 - 1 - j].y = pp[0].y; + + +#line 2961 "dk3figah.ctr" + sp[n1 + n2 - 1 + j].x = pp[1].x; + sp[n1 + n2 - 1 + j].y = pp[1].y; + + +#line 2964 "dk3figah.ctr" + sp[n1 + n2 - 1 - j].s = sp[n1 + n2 - 1 + j].s = + ((j == n1) ? 0.0 : (-1.0)); + } else { + back = 0; i = n1; + /* ##### ERROR: Spline calculation failed! */ + } + } else { + back = 0; i = n1; + /* ##### ERROR: Spline calculation failed! */ + } + } + if(back) { + for(i = 0; i < (n2 - 1); i++) { + j = i + 1; + dist = dk3ma_d_add_ok( + dk3ma_d_add_ok(s, l1, &mec), + (l2 * ((double)j / (double)n2)), + &mec + ); + t = dk3xsp_get_t_for_distance( + osp, onp, dist, + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + if(0.0 <= t) { + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t, &mec + ); + if(res) { + pp[0].x = pp[1].x = 0.0; + pp[0].y = 0.5 * ah->wi * (1.0 - ((double)j/(double)n2)); + pp[1].y = -1.0 * pp[0].y; + dk3fig_tool_rotate_point(&pp[0], phi, &mec); + dk3fig_tool_rotate_point(&pp[1], phi, &mec); + dk3fig_tool_shift_point(&pp[0], xpos, ypos, &mec); + dk3fig_tool_shift_point(&pp[1], xpos, ypos, &mec); + sp[n2 - 1 - j].x = pp[0].x; + sp[n2 - 1 - j].y = pp[0].y; + + +#line 3002 "dk3figah.ctr" + sp[2 * n1 + n2 - 1 + j].x = pp[1].x; + sp[2 * n1 + n2 - 1 + j].y = pp[1].y; + + +#line 3005 "dk3figah.ctr" + sp[n2 - 1 - j].s = sp[2 * n1 + n2 - 1 + j].s = + ((j == n1) ? 0.0 : (-1.0)); + } else { + back = 0; i = n2; + /* ##### ERROR: Spline calculation failed! */ + } + } else { + back = 0; i = n2; + /* ##### ERROR: Spline calculation failed! */ + } + } + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t2, &mec + ); + if(res) { + sp[np - 1].x = xpos; + sp[np - 1].y = ypos; + sp[np - 1].s = 0.0; + +#line 3023 "dk3figah.ctr" + } else { + back = 0; + /* ##### ERROR: Spline calculation failed! */ + } + } + } else { + back = 0; + /* ##### ERROR: Spline calculation failed! */ + } + +#line 3032 "dk3figah.ctr" + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } else { + /* ##### ERROR: Spline calculation failed! */ + } + } else { + /* ##### ERROR: Spline calculation failed! */ + } + } + } break; + case DK3_FIG_AS_FULL_CIRCLE_END: { + +#line 3045 "dk3figah.ctr" + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t0, &mec + ); + if(res) { +#if VERSION_BEFORE_20121220 + xpos = dk3ma_d_sub_ok( + xpos, + (0.5 * cos(phi) * dk3ma_d_add_ok((0.5 * ah->he), (0.5 * lw), &mec)), + &mec + ); + ypos = dk3ma_d_sub_ok( + ypos, + (0.5 * sin(phi) * dk3ma_d_add_ok((0.5 * ah->he), (0.5 * lw), &mec)), + &mec + ); +#else + xpos = dk3ma_d_sub_ok( + xpos, + (cos(phi) * dk3ma_d_add_ok((0.5 * ah->he), (0.5 * lw), &mec)), + &mec + ); + ypos = dk3ma_d_sub_ok( + ypos, + (sin(phi) * dk3ma_d_add_ok((0.5 * ah->he), (0.5 * lw), &mec)), + &mec + ); +#endif + if(0 == mec) { + ao1 = dk3fig_obj_new( + obj->li, obj->la, DK3_FIG_OBJ_ELLIPSE, 3, + obj->lw, obj->pc, ((ah->af) ? obj->pc : 7), 20, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, 0, NULL, drw->app + ); + if(ao1) { + back = 1; + ah->o1 = (void *)ao1; + (ao1->dt).ell.an = 0.0; + (ao1->dt).ell.cx = xpos; + (ao1->dt).ell.cy = ypos; + (ao1->dt).ell.rx = 0.5 * ah->he; + (ao1->dt).ell.ry = (ao1->dt).ell.rx; + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } + } + } break; + case DK3_FIG_AS_HALF_CIRCLE_END: { + +#line 3094 "dk3figah.ctr" + if(ah->af) { + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t0, &mec + ); + if(res) { + xpos = dk3ma_d_sub_ok(xpos, (0.5 * lw * cos(phi)), &mec); + ypos = dk3ma_d_sub_ok(ypos, (0.5 * lw * sin(phi)), &mec); + if(0 == mec) { + ao1 = dk3fig_obj_new( + obj->li, obj->la, DK3_FIG_OBJ_PSEUDO_HALF_CIRCLE, 1, + obj->lw, obj->pc, obj->pc, 20, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, 0, NULL, drw->app + ); + if(ao1) { + back = 1; + ah->o1 = (void *)ao1; + (ao1->dt).hci.cx = xpos; + (ao1->dt).hci.cy = ypos; + (ao1->dt).hci.ra = 0.5 * ah->he; + (ao1->dt).hci.an = phi; + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } + } + } else { + t1 = dk3xsp_get_t_for_distance( + osp, onp, (0.5 * ah->he), + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + if(0.0 <= t1) { + dist = fabs(dk3ma_d_sub_ok(t1, t0, &mec)); + +#line 3127 "dk3figah.ctr" + n1 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(dist, drw->splspp, &mec)), + &mec + ); + +#line 3131 "dk3figah.ctr" + /* 2013-11-23 + If we want to correct n1, we have to use ceil() in + the comparison too. + */ + if(n1 < dk3ma_d_to_sz_ok(ceil(drw->arcspp), &mec)) { + +#line 3136 "dk3figah.ctr" + n1 = dk3ma_d_to_sz_ok(ceil(drw->arcspp), &mec); + } + +#line 3138 "dk3figah.ctr" + if(n1 < drw->minspp) { + n1 = drw->minspp; + } + +#line 3141 "dk3figah.ctr" + np = dk3mem_add_size_t(dk3mem_mul_size_t(2, n1, &mec), 1, &mec); + if(0 == mec) { + ao1 = dk3fig_obj_new( + obj->li, obj->la, DK3_FIG_OBJ_SPLINE, 4, + obj->lw, obj->pc, 7, -1, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, np, NULL, drw->app + ); + if(ao1) { + ah->o1 = ao1; + sp = (ao1->dt).spl.po; + if(sp) { + back = 1; + res = dk3xsp_calculate_position( + &seg, osp, onp, t1, drw->cosp, 0, &mec + ); + if(res) { + +#line 3158 "dk3figah.ctr" + sp[n1].x = dk3xsp_get_x(&seg); + sp[n1].y = dk3xsp_get_y(&seg); + sp[n1].s = -1.0; + +#line 3161 "dk3figah.ctr" + for(i = 0; i < n1; i++) { + j = i + 1; + t1 = dk3xsp_get_t_for_distance( + osp, onp, + (0.5 * ah->he * cos(M_PI_2 * ((double)j / (double)n1))), + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + if(0.0 <= t1) { + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t1, &mec + ); + if(res) { + pp[0].x = 0.0; + pp[1].x = 0.0; + pp[0].y = 0.5 * ah->he + * sin(M_PI_2 * ((double)j / (double)n1)); + pp[1].y = -1.0 * pp[0].y; + dk3fig_tool_rotate_point(&pp[0], phi, &mec); + dk3fig_tool_rotate_point(&pp[1], phi, &mec); + dk3fig_tool_shift_point(&pp[0], xpos, ypos, &mec); + dk3fig_tool_shift_point(&pp[1], xpos, ypos, &mec); + sp[n1 - j].x = pp[0].x; + sp[n1 - j].y = pp[0].y; + +#line 3184 "dk3figah.ctr" + sp[n1 + j].x = pp[1].x; + +#line 3185 "dk3figah.ctr" + sp[n1 + j].y = pp[1].y; + sp[n1 - j].s = sp[n1 + j].s = + ((j == n1) ? 0.0 : (-1.0)); + } else { + back = 0; i = n1; + /* ##### ERROR: Spline calculation failed! */ + } + } else { + back = 0; + i = n1; + /* ##### ERROR: Spline calculation failed! */ + } + } + } else { + back = 0; + /* ##### ERROR: Calculation failed! */ + } + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } + } + } + } break; + case DK3_FIG_AS_RECTANGLE: { + +#line 3211 "dk3figah.ctr" + t0 = dk3xsp_get_t_for_distance( + osp, onp, s, drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + t1 = dk3xsp_get_t_for_distance( + osp, onp, dk3ma_d_add_ok(s, ah->he, &mec), + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + if((0.0 <= t0) && (0.0 <= t1)) { + +#line 3219 "dk3figah.ctr" + n1 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(fabs(t1 - t0), drw->splspp, &mec)), &mec + ); + if(n1 < drw->minspp) { n1 = drw->minspp; } + np = dk3mem_mul_size_t(2, dk3mem_add_size_t(n1, 1, &mec), &mec); + if(0 == mec) { + ao1 = dk3fig_obj_new( + obj->li, obj->la, DK3_FIG_OBJ_SPLINE, 5, + obj->lw, obj->pc, ((ah->af) ? obj->pc : 7), 20, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, np, NULL, drw->app + ); + if(ao1) { + ah->o1 = (void *)ao1; + sp = (ao1->dt).spl.po; + if(sp) { + back = 1; + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t0, &mec + ); + if(res) { + +#line 3240 "dk3figah.ctr" + pp[0].x = pp[1].x = 0; + pp[0].y = 0.5 * ah->wi; + pp[1].y = -0.5 * ah->wi; + dk3fig_tool_rotate_point(&pp[0], phi, &mec); + dk3fig_tool_rotate_point(&pp[1], phi, &mec); + dk3fig_tool_shift_point(&pp[0], xpos, ypos, &mec); + dk3fig_tool_shift_point(&pp[1], xpos, ypos, &mec); + sp[n1].x = pp[0].x; + +#line 3248 "dk3figah.ctr" + sp[n1].y = pp[0].y; + +#line 3249 "dk3figah.ctr" + sp[n1 + 1].x = pp[1].x; + sp[n1 + 1].y = pp[1].y; + sp[n1].s = sp[n1 + 1].s = 0.0; + for(i = 0; i < n1; i++) { + j = i + 1; + if(j == n1) { + t = t1; + } else { + dist = dk3ma_d_add_ok( + s, (ah->he * ((double)j / (double)n1)), &mec + ); + t = dk3xsp_get_t_for_distance( + osp, onp, dist, + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + } + if(0.0 <= t) { + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t, &mec + ); + if(res) { + pp[0].x = pp[1].x = 0.0; + pp[0].y = 0.5 * ah->wi; + pp[1].y = -0.5 * ah->wi; + dk3fig_tool_rotate_point(&pp[0], phi, &mec); + dk3fig_tool_rotate_point(&pp[1], phi, &mec); + dk3fig_tool_shift_point(&pp[0], xpos, ypos, &mec); + dk3fig_tool_shift_point(&pp[1], xpos, ypos, &mec); + sp[n1 - j].x = pp[0].x; + sp[n1 - j].y = pp[0].y; + + +#line 3280 "dk3figah.ctr" + sp[n1 + 1 + j].x = pp[1].x; + sp[n1 + 1 + j].y = pp[1].y; + + +#line 3283 "dk3figah.ctr" + sp[n1 - j].s = sp[n1 + 1 + j].s = + ((j == n1) ? 0.0 : (-1.0)); + + } else { + back = 0; i = n1; + } + } else { + back = 0; i = n1; + } + } + } else { + back = 0; + } + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } + } else { + /* ##### ERROR: Spline calculation failed! */ + } + } break; + case DK3_FIG_AS_INVERSE: { + +#line 3306 "dk3figah.ctr" + t0 = dk3xsp_get_t_for_distance( + osp, onp, s, drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + t1 = dk3xsp_get_t_for_distance( + osp, onp, dk3ma_d_add_ok(s, ah->he, &mec), + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + if((0.0 <= t0) && (0.0 <= t1)) { + +#line 3314 "dk3figah.ctr" + n1 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(fabs(t1 - t0), drw->splspp, &mec)), &mec + ); + if(n1 < drw->minspp) { n1 = drw->minspp; } + np = dk3mem_add_size_t(dk3mem_mul_size_t(2, n1, &mec), 1, &mec); + if(0 == mec) { + ao1 = dk3fig_obj_new( + obj->li, obj->la, DK3_FIG_OBJ_SPLINE, 5, + obj->lw, obj->pc, ((ah->af) ? obj->pc : 7), 20, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, np, NULL, drw->app + ); + if(ao1) { + ah->o1 = (void *)ao1; + sp = (ao1->dt).spl.po; + if(sp) { + back = 1; + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t1, &mec + ); + if(res) { + +#line 3335 "dk3figah.ctr" + sp[n1].x = xpos; + sp[n1].y = ypos; + sp[n1].s = 0.0; + +#line 3338 "dk3figah.ctr" + for(i = 0; i < n1; i++) { + j = i + 1; + if(j == n1) { + t = t0; + } else { + dist = dk3ma_d_add_ok( + s, ((1.0 - ((double)j / (double)n1)) * ah->he), &mec + ); + t = dk3xsp_get_t_for_distance( + osp, onp, dist, + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + } + if(0.0 <= t) { + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t, &mec + ); + if(res) { + pp[0].x = pp[1].x = 0.0; + pp[0].y = 0.5 * ((double)j / (double)n1) * ah->wi; + pp[1].y = -1.0 * pp[0].y; + dk3fig_tool_rotate_point(&pp[0], phi, &mec); + dk3fig_tool_rotate_point(&pp[1], phi, &mec); + dk3fig_tool_shift_point(&pp[0], xpos, ypos, &mec); + dk3fig_tool_shift_point(&pp[1], xpos, ypos, &mec); + sp[n1 - j].x = pp[0].x; sp[n1 - j].y = pp[0].y; + sp[n1 + j].x = pp[1].x; sp[n1 + j].y = pp[1].y; + + +#line 3366 "dk3figah.ctr" + + +#line 3367 "dk3figah.ctr" + sp[n1 - j].s = sp[n1 + j].s = ((j == n1) ? 0.0 : (-1.0)); + } else { + } + } else { + back = 0; i = n1; + } + } + } else { + back = 0; + } + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } + } + } break; + case DK3_FIG_AS_INDENTED_FILLED_HALF: { + +#line 3385 "dk3figah.ctr" + l1 = dk3ma_d_mul_ok(1.25, ah->he, &mec); + l2 = 0.25 * ah->he; + t0 = dk3xsp_get_t_for_distance( + osp, onp, s, drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + t1 = dk3xsp_get_t_for_distance( + osp, onp, dk3ma_d_add_ok(s, l1, &mec), + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + t2 = dk3xsp_get_t_for_distance( + osp, onp, dk3ma_d_add_ok(s, ah->he, &mec), + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + if((0.0 <= t0) && (0.0 <= t1) && (0.0 <= t2)) { + +#line 3399 "dk3figah.ctr" + n1 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(drw->splspp, fabs(t1 - t0), &mec)), &mec + ); + +#line 3402 "dk3figah.ctr" + n2 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(drw->splspp, fabs(t1 - t2), &mec)), &mec + ); + +#line 3405 "dk3figah.ctr" + n3 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(drw->splspp, fabs(t2 - t0), &mec)), &mec + ); + if(n1 < drw->minspp) { n1 = drw->minspp; } + if(n2 < drw->minspp) { n2 = drw->minspp; } + if(n3 < drw->minspp) { n3 = drw->minspp; } + np = dk3mem_mul_size_t(2, dk3mem_add_size_t(n1, n2, &mec), &mec); + nq = dk3mem_add_size_t(dk3mem_add_size_t(n1, n2, &mec), n3, &mec); + if(0 == mec) { + +#line 3414 "dk3figah.ctr" + ao1 = dk3fig_obj_new( + obj->li, obj->la, DK3_FIG_OBJ_SPLINE, 5, + obj->lw, obj->pc, 7, 20, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, np, NULL, drw->app + ); + if(ao1) { + ah->o1 = (void *)ao1; + sp = (ao1->dt).spl.po; + ao2 = dk3fig_obj_new( + obj->li, obj->la, DK3_FIG_OBJ_SPLINE, 5, + 0, obj->pc, obj->pc, 20, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, nq, NULL, drw->app + ); + if(ao2) { + ah->o2 = (void *)ao2; + sp2 = (ao2->dt).spl.po; + if((sp) && (sp2)) { + back = 1; + res = dk3xsp_calculate_position( + &seg, osp, onp, t0, drw->cosp, 0, &mec + ); + if(res) { + +#line 3438 "dk3figah.ctr" + sp[n1 + n2 - 1].x = dk3xsp_get_x(&seg); + sp[n1 + n2 - 1].y = dk3xsp_get_y(&seg); + sp[n1 + n2 - 1].s = 0.0; + +#line 3441 "dk3figah.ctr" + sp2[0].x = dk3xsp_get_x(&seg); + sp2[0].y = dk3xsp_get_y(&seg); + sp2[0].s = 0.0; + +#line 3444 "dk3figah.ctr" + for(i = 0; i < n1; i++) { + j = i + 1; + if(j == n1) { + t = t1; + } else { + dist = dk3ma_d_add_ok( + s, (((double)j / (double)n1) * l1), &mec + ); + t = dk3xsp_get_t_for_distance( + osp, onp, dist, + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + } + if(0.0 <= t) { + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t, &mec + ); + if(res) { + pp[0].x = pp[1].x = 0.0; + if(j == n1) { + if(ah->af) { + pp[0].y = 0.5 * ah->wi; + } else { + pp[0].y = -0.5 * ah->wi; + } + } else { + if(ah->af) { + pp[0].y = 0.5 * ah->wi * ((double)j / (double)n1); + } else { + pp[0].y = -0.5 * ah->wi * ((double)j / (double)n1); + } + } + pp[1].y = -1.0 * pp[0].y; + dk3fig_tool_rotate_point(&pp[0], phi, &mec); + dk3fig_tool_rotate_point(&pp[1], phi, &mec); + dk3fig_tool_shift_point(&pp[0], xpos, ypos, &mec); + dk3fig_tool_shift_point(&pp[1], xpos, ypos, &mec); + sp[n1 + n2 - 1 - j].x = pp[0].x; + sp[n1 + n2 - 1 - j].y = pp[0].y; + + +#line 3484 "dk3figah.ctr" + sp[n1 + n2 - 1 + j].x = pp[1].x; + sp[n1 + n2 - 1 + j].y = pp[1].y; + + +#line 3487 "dk3figah.ctr" + sp[n1 + n2 - 1 - j].s = sp[n1 + n2 - 1 + j].s = + ((j == n1) ? 0.0 : (-1.0)); + sp2[j].x = pp[0].x; + sp2[j].y = pp[0].y; + sp2[j].s = ((j == n1) ? 0.0 : (-1.0)); + + +#line 3493 "dk3figah.ctr" + } else { + back = 0; i = n1; + /* ##### ERROR: Spline calculation failed! */ + } + } else { + back = 0; i = n1; + /* ##### ERROR: Spline calculation failed! */ + } + } + if(back) { + for(i = 0; i < (n2 - 1); i++) { + j = i + 1; + dist = dk3ma_d_sub_ok( + dk3ma_d_add_ok(s, l1, &mec), + (l2 * ((double)j / (double)n2)), + &mec + ); + t = dk3xsp_get_t_for_distance( + osp, onp, dist, + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + if(0.0 <= t) { + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t, &mec + ); + if(res) { + pp[0].x = pp[1].x = 0.0; + if(ah->af) { + pp[0].y = 0.5 * ah->wi + * (1.0 - ((double)j/(double)n2)); + } else { + pp[0].y = -0.5 * ah->wi + * (1.0 - ((double)j/(double)n2)); + } + pp[1].y = -1.0 * pp[0].y; + dk3fig_tool_rotate_point(&pp[0], phi, &mec); + dk3fig_tool_rotate_point(&pp[1], phi, &mec); + dk3fig_tool_shift_point(&pp[0], xpos, ypos, &mec); + dk3fig_tool_shift_point(&pp[1], xpos, ypos, &mec); + sp[n2 - 1 - j].x = pp[0].x; + sp[n2 - 1 - j].y = pp[0].y; + + +#line 3535 "dk3figah.ctr" + sp[2 * n1 + n2 - 1 + j].x = pp[1].x; + sp[2 * n1 + n2 - 1 + j].y = pp[1].y; + + +#line 3538 "dk3figah.ctr" + sp[n2 - 1 - j].s = sp[2 * n1 + n2 - 1 + j].s = + ((j == n1) ? 0.0 : (-1.0)); + sp2[n1 + j].x = pp[0].x; + sp2[n1 + j].y = pp[0].y; + sp2[n1 + j].s = ((j == n1) ? 0.0 : (-1.0)); + + +#line 3544 "dk3figah.ctr" + } else { + back = 0; i = n2; + /* ##### ERROR: Spline calculation failed! */ + } + } else { + back = 0; i = n2; + /* ##### ERROR: Spline calculation failed! */ + } + } + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t2, &mec + ); + if(res) { + sp[np - 1].x = xpos; + sp[np - 1].y = ypos; + sp[np - 1].s = 0.0; + +#line 3560 "dk3figah.ctr" + sp2[n1 + n2].x = xpos; + sp2[n1 + n2].y = ypos; + sp2[n1 + n2].s = 0.0; + +#line 3563 "dk3figah.ctr" + } else { + back = 0; + /* ##### ERROR: Spline calculation failed! */ + } + for(i = 0; i < (n3 - 1); i++) { + j = i + 1; + dist = dk3ma_d_add_ok( + s, + ((1.0 - ((double)j / (double)n3)) * ah->he), + &mec + ); + t = dk3xsp_get_t_for_distance( + osp, onp, dist, + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + if(0.0 <= t) { + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t, &mec + ); + if(res) { + sp2[n1 + n2 + j].x = xpos; + sp2[n1 + n2 + j].y = ypos; + sp2[n1 + n2 + j].s = -1.0; + + +#line 3587 "dk3figah.ctr" + } else { + back = 0; i = n3; + } + } else { + back = 0; i = n3; + } + } + } + } else { + back = 0; + /* ##### ERROR: Spline calculation failed! */ + } + +#line 3599 "dk3figah.ctr" + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } else { + /* ##### ERROR: Spline calculation failed! */ + } + } else { + /* ##### ERROR: Spline calculation failed! */ + } + } break; + case DK3_FIG_AS_CLOSED_HALF: { + +#line 3614 "dk3figah.ctr" + t0 = dk3xsp_get_t_for_distance( + osp, onp, s, drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + if(0.0 <= t0) { + t1 = dk3xsp_get_t_for_distance( + osp, onp, dk3ma_d_add_ok(s, ah->he, &mec), + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + if(0.0 <= t1) { + +#line 3623 "dk3figah.ctr" + n1 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(fabs(t1 - t0), drw->splspp, &mec)), &mec + ); + if(n1 < drw->minspp) { n1 = drw->minspp; } + np = dk3mem_add_size_t(dk3mem_mul_size_t(2, n1, &mec), 1, &mec); + if(0 == mec) { + ao1 = dk3fig_obj_new( + obj->li, obj->la, + DK3_FIG_OBJ_SPLINE, 5, + obj->lw, obj->pc, ((ah->af) ? obj->pc : 7), 20, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, np, NULL, drw->app + ); + if(ao1) { + ah->o1 = (void *)ao1; + sp = (ao1->dt).spl.po; + if(sp) { + back = 1; + res = dk3xsp_calculate_position( + &seg, osp, onp, t0, drw->cosp, 0, &mec + ); + if(res) { + +#line 3645 "dk3figah.ctr" + sp[n1].x = dk3xsp_get_x(&seg); + sp[n1].y = dk3xsp_get_y(&seg); + sp[n1].s = 0.0; + +#line 3648 "dk3figah.ctr" + for(i = 0; i < n1; i++) { + j = i + 1; + +#line 3650 "dk3figah.ctr" + if(j == n1) { + t = t1; + } else { + dist = dk3ma_d_add_ok( + s, (((double)j / (double)n1) * ah->he), &mec + ); + +#line 3656 "dk3figah.ctr" + t = dk3xsp_get_t_for_distance( + osp, onp, dist, + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + +#line 3660 "dk3figah.ctr" + + +#line 3661 "dk3figah.ctr" + } + if(0.0 <= t) { + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t, &mec + ); + +#line 3666 "dk3figah.ctr" + if(res) { + pp[0].x = pp[1].x = 0.0; + if(j == n1) { + pp[0].y = 0.5 * ah->wi; + } else { + pp[0].y = 0.5 * ah->wi * ((double)j / (double)n1); + } + pp[1].y = 0.0; + dk3fig_tool_rotate_point(&pp[0], phi, &mec); + dk3fig_tool_rotate_point(&pp[1], phi, &mec); + dk3fig_tool_shift_point(&pp[0], xpos, ypos, &mec); + dk3fig_tool_shift_point(&pp[1], xpos, ypos, &mec); + sp[n1 - j].x = pp[0].x; + +#line 3679 "dk3figah.ctr" + sp[n1 - j].y = pp[0].y; + +#line 3680 "dk3figah.ctr" + sp[n1 + j].x = pp[1].x; + sp[n1 + j].y = pp[1].y; + sp[n1 - j].s = sp[n1 + j].s = + ((j == n1) ? 0.0 : (-1.0)); + } else { + back = 0; i = n1; + +#line 3686 "dk3figah.ctr" + /* ##### ERROR: Spline calculation failed! */ + } + } else { + +#line 3689 "dk3figah.ctr" + back = 0; i = n1; + /* ##### ERROR: Spline calculation failed! */ + } + } + } else { + +#line 3694 "dk3figah.ctr" + back = 0; + /* ##### ERROR: Spline calculation failed! */ + } + +#line 3697 "dk3figah.ctr" + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } + } + } + } break; + case DK3_FIG_AS_INDENTED_HALF: { + +#line 3706 "dk3figah.ctr" + l1 = dk3ma_d_mul_ok(1.25, ah->he, &mec); + l2 = 0.25 * ah->he; + t0 = dk3xsp_get_t_for_distance( + osp, onp, s, drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + t1 = dk3xsp_get_t_for_distance( + osp, onp, dk3ma_d_add_ok(s, l1, &mec), + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + t2 = dk3xsp_get_t_for_distance( + osp, onp, dk3ma_d_add_ok(s, ah->he, &mec), + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + if((0.0 <= t0) && (0.0 <= t1) && (0.0 <= t2)) { + +#line 3720 "dk3figah.ctr" + n1 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(drw->splspp, fabs(t1 - t0), &mec)), &mec + ); + +#line 3723 "dk3figah.ctr" + n2 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(drw->splspp, fabs(t1 - t2), &mec)), &mec + ); + +#line 3726 "dk3figah.ctr" + n3 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(drw->splspp, fabs(t2 - t0), &mec)), &mec + ); + if(n1 < drw->minspp) { n1 = drw->minspp; } + if(n2 < drw->minspp) { n2 = drw->minspp; } + if(n3 < drw->minspp) { n3 = drw->minspp; } + np = dk3mem_add_size_t(dk3mem_add_size_t(n1, n2, &mec), n3, &mec); + if(0 == mec) { + ao1 = dk3fig_obj_new( + obj->li, obj->la, DK3_FIG_OBJ_SPLINE, 5, + obj->lw, obj->pc, ((ah->af) ? obj->pc : 7), 20, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, np, NULL, drw->app + ); + if(ao1) { + ah->o1 = (void *)ao1; + sp = (ao1->dt).spl.po; + if(sp) { + back = 1; + +#line 3745 "dk3figah.ctr" + for(i = 0; i < n1; i++) { + if(0 == i) { + t = t0; + } else { + dist = dk3ma_d_add_ok( + s, (l1 * ((double)i / (double)(n1))), &mec + ); + t = dk3xsp_get_t_for_distance( + osp, onp, dist, + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + } + if(0.0 <= t) { + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t, &mec + ); + if(res) { + pp[0].x = 0.0; + pp[0].y = 0.5 * ah->wi * ((double)i / (double)n1); + dk3fig_tool_rotate_point(&pp[0], phi, &mec); + dk3fig_tool_shift_point(&pp[0], xpos, ypos, &mec); + sp[i].x = pp[0].x; + +#line 3767 "dk3figah.ctr" + sp[i].y = pp[0].y; + sp[i].s = ((i == 0) ? 0.0 : (-1.0)); + } else { + back = 0; i = n1; + } + } else { + back = 0; i = n1; + } + } + if(back) { + for(i = 0; i < n2; i++) { + if(0 == i) { + t = t1; + } else { +#if 0 + dist = dk3ma_d_sub_ok( + l1, (l2 * ((double)i / (double)n2)), &mec + ); +#endif + dist = dk3ma_d_add_ok( + s, + dk3ma_d_sub_ok( + l1, (l2 * ((double)i / (double)n2)), &mec + ), + &mec + ); + t = dk3xsp_get_t_for_distance( + osp, onp, dist, + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + } + if(0.0 <= t) { + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t, &mec + ); + if(res) { + pp[0].x = 0.0; + pp[0].y = 0.5 * ah->wi * (1.0 - ((double)i / (double)n2)); + dk3fig_tool_rotate_point(&pp[0], phi, &mec); + dk3fig_tool_shift_point(&pp[0], xpos, ypos, &mec); + sp[n1 + i].x = pp[0].x; + +#line 3808 "dk3figah.ctr" + sp[n1 + i].y = pp[0].y; + sp[n1 + i].s = ((0 == i) ? 0.0 : (-1.0)); + } else { + back = 0; i = n2; + } + } else { + back = 0; i = n2; + } + } + } + if(back) { + for(i = 0; i < n3; i++) { + if(0 == i) { + t = t2; + } else { + dist = dk3ma_d_add_ok( + s, (ah->he * (1.0 - ((double)i / (double)n3))), &mec + ); + t = dk3xsp_get_t_for_distance( + osp, onp, dist, + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + } + if(0.0 <= t) { + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t, &mec + ); + if(res) { + sp[n1 + n2 + i].x = xpos; + sp[n1 + n2 + i].y = ypos; + sp[n1 + n2 + i].s = ((0 == i) ? 0.0 : (-1.0)); + + +#line 3840 "dk3figah.ctr" + } else { + back = 0; i = n3; + } + } else { + back = 0; i = n3; + } + } + } + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } + } + } break; + case DK3_FIG_AS_BUTTED_HALF: { + +#line 3856 "dk3figah.ctr" + l1 = 0.75 * ah->he; + l2 = 0.25 * ah->he; + t0 = dk3xsp_get_t_for_distance( + osp, onp, s, drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + t1 = dk3xsp_get_t_for_distance( + osp, onp, dk3ma_d_add_ok(s, l1, &mec), + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + t2 = dk3xsp_get_t_for_distance( + osp, onp, dk3ma_d_add_ok(s, ah->he, &mec), + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + if((0.0 <= t0) && (0.0 <= t1) && (0.0 <= t2)) { + +#line 3870 "dk3figah.ctr" + n1 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(drw->splspp, fabs(t1 - t0), &mec)), &mec + ); + +#line 3873 "dk3figah.ctr" + n2 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(drw->splspp, fabs(t1 - t2), &mec)), &mec + ); + +#line 3876 "dk3figah.ctr" + n3 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(drw->splspp, fabs(t2 - t0), &mec)), &mec + ); + if(n1 < drw->minspp) { n1 = drw->minspp; } + if(n2 < drw->minspp) { n2 = drw->minspp; } + if(n3 < drw->minspp) { n3 = drw->minspp; } + np = dk3mem_add_size_t(dk3mem_add_size_t(n1, n2, &mec), n3, &mec); + if(0 == mec) { + ao1 = dk3fig_obj_new( + obj->li, obj->la, DK3_FIG_OBJ_SPLINE, 5, + obj->lw, obj->pc, ((ah->af) ? obj->pc : 7), 20, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, np, NULL, drw->app + ); + if(ao1) { + ah->o1 = (void *)ao1; + sp = (ao1->dt).spl.po; + if(sp) { + back = 1; + +#line 3895 "dk3figah.ctr" + for(i = 0; i < n1; i++) { + if(0 == i) { + t = t0; + } else { + dist = dk3ma_d_add_ok( + s, (l1 * ((double)i / (double)(n1))), &mec + ); + t = dk3xsp_get_t_for_distance( + osp, onp, dist, + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + } + if(0.0 <= t) { + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t, &mec + ); + if(res) { + pp[0].x = 0.0; + pp[0].y = 0.5 * ah->wi * ((double)i / (double)n1); + dk3fig_tool_rotate_point(&pp[0], phi, &mec); + dk3fig_tool_shift_point(&pp[0], xpos, ypos, &mec); + sp[i].x = pp[0].x; + +#line 3917 "dk3figah.ctr" + sp[i].y = pp[0].y; + sp[i].s = ((i == 0) ? 0.0 : (-1.0)); + } else { + back = 0; i = n1; + } + } else { + back = 0; i = n1; + } + } + if(back) { + for(i = 0; i < n2; i++) { + if(0 == i) { + t = t1; + } else { +#if 0 + dist = dk3ma_d_add_ok( + l1, (l2 * ((double)i / (double)n2)), &mec + ); +#endif + dist = dk3ma_d_add_ok( + s, + dk3ma_d_add_ok( + l1, (l2 * ((double)i / (double)n2)), &mec + ), + &mec + ); + t = dk3xsp_get_t_for_distance( + osp, onp, dist, + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + } + if(0.0 <= t) { + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t, &mec + ); + if(res) { + pp[0].x = 0.0; + pp[0].y = 0.5 * ah->wi * (1.0 - ((double)i / (double)n2)); + dk3fig_tool_rotate_point(&pp[0], phi, &mec); + dk3fig_tool_shift_point(&pp[0], xpos, ypos, &mec); + sp[n1 + i].x = pp[0].x; + +#line 3958 "dk3figah.ctr" + sp[n1 + i].y = pp[0].y; + sp[n1 + i].s = ((0 == i) ? 0.0 : (-1.0)); + } else { + back = 0; i = n2; + } + } else { + back = 0; i = n2; + } + } + } + if(back) { + for(i = 0; i < n3; i++) { + if(0 == i) { + t = t2; + } else { + dist = dk3ma_d_add_ok( + s, (ah->he * (1.0 - ((double)i / (double)n3))), &mec + ); + t = dk3xsp_get_t_for_distance( + osp, onp, dist, + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + } + if(0.0 <= t) { + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t, &mec + ); + if(res) { + sp[n1 + n2 + i].x = xpos; + sp[n1 + n2 + i].y = ypos; + sp[n1 + n2 + i].s = ((0 == i) ? 0.0 : (-1.0)); + + +#line 3990 "dk3figah.ctr" + } else { + back = 0; i = n3; + } + } else { + back = 0; i = n3; + } + } + } + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } + } + } break; + case DK3_FIG_AS_TRIANGLE_FORK: { + +#line 4006 "dk3figah.ctr" + if(ah->af) { + t0 = dk3xsp_get_t_for_distance( + osp, onp, s, drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + if(0.0 <= t0) { + ao1 = dk3fig_obj_new( + obj->li, obj->la, DK3_FIG_OBJ_POLYLINE, 1, + obj->lw, obj->pc, obj->pc, -1, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, 2, NULL, drw->app + ); + if(ao1) { + ah->o1 = (void *)ao1; + po = (ao1->dt).pol.po; + if(po) { + back = 1; + pp[0].x = pp[1].x = 0.0; + pp[0].y = 0.5 * ah->wi; + pp[1].y = -0.5 * ah->wi; + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t0, &mec + ); + if(res) { + dk3fig_tool_rotate_point(&pp[0], phi, &mec); + dk3fig_tool_rotate_point(&pp[1], phi, &mec); + dk3fig_tool_shift_point(&pp[0], xpos, ypos, &mec); + dk3fig_tool_shift_point(&pp[1], xpos, ypos, &mec); + po[0].x = pp[0].x; po[0].y = pp[0].y; + po[1].x = pp[1].x; po[1].y = pp[1].y; + } else { + back = 0; + } + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } + } else { + t0 = dk3xsp_get_t_for_distance( + osp, onp, s, drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + t1 = dk3xsp_get_t_for_distance( + osp, onp, dk3ma_d_add_ok(s, ah->he, &mec), + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + if((0.0 <= t0) && (0.0 <= t1)) { + +#line 4052 "dk3figah.ctr" + n1 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(fabs(t1 - t0), drw->splspp, &mec)), &mec + ); + if(n1 < drw->minspp) { n1 = drw->minspp; } + np = dk3mem_add_size_t(dk3mem_mul_size_t(2, n1, &mec), 1, &mec); + if(0 == mec) { + ao1 = dk3fig_obj_new( + obj->li, obj->la, DK3_FIG_OBJ_SPLINE, 4, + obj->lw, obj->pc, ((ah->af) ? obj->pc : 7), -1, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, np, NULL, drw->app + ); + if(ao1) { + ah->o1 = (void *)ao1; + sp = (ao1->dt).spl.po; + if(sp) { + back = 1; + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t1, &mec + ); + if(res) { + +#line 4073 "dk3figah.ctr" + sp[n1].x = xpos; + sp[n1].y = ypos; + sp[n1].s = 0.0; + +#line 4076 "dk3figah.ctr" + for(i = 0; i < n1; i++) { + j = i + 1; + if(j == n1) { + t = t0; + } else { + dist = dk3ma_d_add_ok( + s, ((1.0 - ((double)j / (double)n1)) * ah->he), &mec + ); + t = dk3xsp_get_t_for_distance( + osp, onp, dist, + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + } + if(0.0 <= t) { + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t, &mec + ); + if(res) { + pp[0].x = pp[1].x = 0.0; + pp[0].y = 0.5 * ((double)j / (double)n1) * ah->wi; + pp[1].y = -1.0 * pp[0].y; + dk3fig_tool_rotate_point(&pp[0], phi, &mec); + dk3fig_tool_rotate_point(&pp[1], phi, &mec); + dk3fig_tool_shift_point(&pp[0], xpos, ypos, &mec); + dk3fig_tool_shift_point(&pp[1], xpos, ypos, &mec); + sp[n1 - j].x = pp[0].x; sp[n1 - j].y = pp[0].y; + sp[n1 + j].x = pp[1].x; sp[n1 + j].y = pp[1].y; + + +#line 4104 "dk3figah.ctr" + + +#line 4105 "dk3figah.ctr" + sp[n1 - j].s = sp[n1 + j].s = + ((j == n1) ? 0.0 : (-1.0)); + } else { + } + } else { + back = 0; i = n1; + } + } + } else { + back = 0; + } + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } + } + } + } break; + case DK3_FIG_AS_RECTANGLE_FORK: { + +#line 4125 "dk3figah.ctr" + if(ah->af) { + t0 = dk3xsp_get_t_for_distance( + osp, onp, s, drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + l1 = dk3ma_d_add_ok(s, ah->he, &mec); + t1 = dk3xsp_get_t_for_distance( + osp, onp, l1, drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + if((0.0 <= t0) && (0.0 <= t1)) { + +#line 4134 "dk3figah.ctr" + n1 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(drw->splspp, fabs(t1 - t0), &mec)), &mec + ); + if(n1 < drw->minspp) { n1 = drw->minspp; } + np = dk3mem_mul_size_t(2, dk3mem_add_size_t(n1, 1, &mec), &mec); + if(0 == mec) { + ao1 = dk3fig_obj_new( + obj->li, obj->la, DK3_FIG_OBJ_SPLINE, 4, + obj->lw, obj->pc, obj->pc, -1, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, np, NULL, drw->app + ); + if(ao1) { + ah->o1 = (void *)ao1; + sp = (ao1->dt).spl.po; + if(sp) { + back = 1; + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t0, &mec + ); + if(res) { + +#line 4155 "dk3figah.ctr" + pp[0].x = 0.0; pp[1].x = 0.0; + pp[0].y = 0.5 * ah->wi; + pp[1].y = -0.5 * ah->wi; + dk3fig_tool_rotate_point(&pp[0], phi, &mec); + dk3fig_tool_rotate_point(&pp[1], phi, &mec); + dk3fig_tool_shift_point(&pp[0], xpos, ypos, &mec); + dk3fig_tool_shift_point(&pp[1], xpos, ypos, &mec); + sp[n1].x = pp[0].x; + sp[n1].y = pp[0].y; + + +#line 4165 "dk3figah.ctr" + sp[n1 + 1].x = pp[1].x; + sp[n1 + 1].y = pp[1].y; + + +#line 4168 "dk3figah.ctr" + sp[n1].s = sp[n1 + 1].s = 0.0; + for(i = 0; i < n1; i++) { + j = i + 1; + if(j == n1) { + t = t1; + } else { + dist = dk3ma_d_add_ok( + s, (((double)j / (double)n1) * ah->he), &mec + ); + +#line 4177 "dk3figah.ctr" + t = dk3xsp_get_t_for_distance( + osp, onp, dist, + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + +#line 4181 "dk3figah.ctr" + } + if(0.0 <= t) { + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t, &mec + ); + +#line 4186 "dk3figah.ctr" + if(res) { + pp[0].x = 0.0; pp[1].x = 0.0; + pp[0].y = 0.5 * ah->wi; + pp[1].y = -0.5 * ah->wi; + dk3fig_tool_rotate_point(&pp[0], phi, &mec); + + +#line 4192 "dk3figah.ctr" + dk3fig_tool_rotate_point(&pp[1], phi, &mec); + + +#line 4194 "dk3figah.ctr" + dk3fig_tool_shift_point(&pp[0], xpos, ypos, &mec); + + +#line 4196 "dk3figah.ctr" + dk3fig_tool_shift_point(&pp[1], xpos, ypos, &mec); + + +#line 4198 "dk3figah.ctr" + sp[n1 - j].x = pp[0].x; + sp[n1 - j].y = pp[0].y; + + +#line 4201 "dk3figah.ctr" + sp[n1 + 1 + j].x = pp[1].x; + sp[n1 + 1 + j].y = pp[1].y; + + +#line 4204 "dk3figah.ctr" + sp[n1 - j].s = sp[n1 + 1 + j].s = + ((j == n1) ? 0.0 : (-1.0)); + } else { + back = 0; i = n1; + } + } else { + back = 0; i = n1; + } + } + } else { + back = 0; + } + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } + } + } else { + +#line 4223 "dk3figah.ctr" + t0 = ((ab) ? 0.0 : ((obj->dt).spl.np - 1)); + t1 = dk3xsp_get_t_for_distance( + osp, onp, ah->he, drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + +#line 4227 "dk3figah.ctr" + if((0.0 <= t0) && (0.0 <= t1)) { + +#line 4228 "dk3figah.ctr" + n1 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(drw->splspp, fabs(t1 - t0), &mec)), &mec + ); + +#line 4231 "dk3figah.ctr" + if(n1 < drw->minspp) { n1 = drw->minspp; } + np = dk3mem_mul_size_t(2, dk3mem_add_size_t(n1, 1, &mec), &mec); + + +#line 4234 "dk3figah.ctr" + ao1 = dk3fig_obj_new( + obj->li, obj->la, DK3_FIG_OBJ_SPLINE, 4, + obj->lw, obj->pc, obj->pc, -1, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, np, NULL, drw->app + ); + if(ao1) { + +#line 4241 "dk3figah.ctr" + ah->o1 = (void *)ao1; + sp = (ao1->dt).spl.po; + if(sp) { + +#line 4244 "dk3figah.ctr" + back = 1; + +#line 4245 "dk3figah.ctr" + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t1, &mec + ); + +#line 4248 "dk3figah.ctr" + if(res) { + +#line 4249 "dk3figah.ctr" + pp[0].x = 0.0; pp[1].x = 0.0; + pp[0].y = 0.5 * ah->wi; + pp[1].y = -0.5 * ah->wi; + dk3fig_tool_rotate_point(&pp[0], phi, &mec); + + +#line 4254 "dk3figah.ctr" + dk3fig_tool_rotate_point(&pp[1], phi, &mec); + + +#line 4256 "dk3figah.ctr" + dk3fig_tool_shift_point(&pp[0], xpos, ypos, &mec); + + +#line 4258 "dk3figah.ctr" + dk3fig_tool_shift_point(&pp[1], xpos, ypos, &mec); + + +#line 4260 "dk3figah.ctr" + sp[n1].x = pp[0].x; + sp[n1].y = pp[0].y; + + +#line 4263 "dk3figah.ctr" + sp[n1 + 1].x = pp[1].x; + sp[n1 + 1].y = pp[1].y; + + +#line 4266 "dk3figah.ctr" + sp[n1].s = sp[n1 + 1].s = 0.0; + for(i = 0; i < n1; i++) { + j = i + 1; + if(j == n1) { + t = t0; + } else { + dist = (1.0 - ((double)j / (double)n1)) * ah->he; + t = dk3xsp_get_t_for_distance( + osp, onp, dist, + drw->xsprec, (obj->dt).spl.fslc, ab, drw->cosp, &mec + ); + +#line 4277 "dk3figah.ctr" + } + if(0.0 <= t) { + res = dk3figah_spline_values( + drw, obj, ah, &xpos, &ypos, &phi, ab, t, &mec + ); + +#line 4282 "dk3figah.ctr" + if(res) { + pp[0].x = 0.0; pp[1].x = 0.0; + pp[0].y = 0.5 * ah->wi; + pp[1].y = -0.5 * ah->wi; + dk3fig_tool_rotate_point(&pp[0], phi, &mec); + + +#line 4288 "dk3figah.ctr" + dk3fig_tool_rotate_point(&pp[1], phi, &mec); + + +#line 4290 "dk3figah.ctr" + dk3fig_tool_shift_point(&pp[0], xpos, ypos, &mec); + + +#line 4292 "dk3figah.ctr" + dk3fig_tool_shift_point(&pp[1], xpos, ypos, &mec); + + +#line 4294 "dk3figah.ctr" + sp[n1 - j].x = pp[0].x; + sp[n1 - j].y = pp[0].y; + + +#line 4297 "dk3figah.ctr" + sp[n1 + 1 + j].x = pp[1].x; + sp[n1 + 1 + j].y = pp[1].y; + + +#line 4300 "dk3figah.ctr" + sp[n1 - j].s = sp[n1 + 1 + j].s = + ((j == n1) ? 0.0 : (-1.0)); + } else { + back = 0; i = n1; + } + } else { + back = 0; i = n1; + } + } + } else { + +#line 4310 "dk3figah.ctr" + back = 0; + } + } else { + +#line 4313 "dk3figah.ctr" + } + } else { + +#line 4315 "dk3figah.ctr" + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } else { + +#line 4318 "dk3figah.ctr" + } + } + } break; + } + if(mec) { + +#line 4323 "dk3figah.ctr" + back = 0; + if(ec) { *ec = mec; } + /* ##### ERROR: Mathematical error occured! */ + } else { + if(!(back)) { + /* ##### ERROR: Error in spline arrowhead calculation! */ + } + } + +#line 4331 "dk3figah.ctr" + return back; +} + + + +/** Calculate arrowheads for spline. + @param drw Drawing to modify. + @param obj Object to modify. + @param objno Object number. + @return 1 on success, 0 on error. +*/ +static +int +dk3figah_calculate_spline( + dk3_fig_drawing_t *drw, + dk3_fig_obj_t *obj, + unsigned long objno +) +{ + dk3_xspline_segment_t seg; + dk3_fig_poly_point_t sp; + double cuts = -1.0; + double cute = -1.0; + double alphaf = 0.0; + double alphab = 0.0; + double t; + int back = 1; + int mec = 0; + int res = 0; + + +#line 4361 "dk3figah.ctr" + if((1 < (obj->dt).spl.np) && ((obj->dt).spl.po)) { + /* + Defaults for start and end. + */ + (obj->dt).spl.ts = 0.0; + (obj->dt).spl.te = (double)((obj->dt).spl.np - 1); + /* + Calculate line cuts. + */ + if(!(drw->coah)) { + +#line 4371 "dk3figah.ctr" + if(obj->af) { + +#line 4372 "dk3figah.ctr" + cute = dk3figah_length_correction(drw, obj, obj->af, &mec); + } + if(obj->ab) { + +#line 4375 "dk3figah.ctr" + cuts = dk3figah_length_correction(drw, obj, obj->ab, &mec); + } + +#line 4377 "dk3figah.ctr" + } + /* + Construct arrowhead objects. + */ + if(drw->coah) { + back = 1; + if(obj->af) { + t = (double)((obj->dt).spl.np - 1); + res = dk3xsp_calculate_position( + &seg, (obj->dt).spl.po, (obj->dt).spl.np, t, drw->cosp, 0, &mec + ); + if((res) && (0 == mec)) { + alphaf = dk3xsp_direction( + (obj->dt).spl.po, (obj->dt).spl.np, t, drw->cosp, &mec + ); + +#line 4392 "dk3figah.ctr" + if((alphaf >= 0.0) && (0 == mec)) { + sp.x = dk3xsp_get_x(&seg); + sp.y = dk3xsp_get_y(&seg); + res = dk3figah_straight_arrowhead( + drw, obj, obj->af, &sp, alphaf, &mec + ); + +#line 4398 "dk3figah.ctr" + if(!(res)) { back = 0; } + } else { + /* ##### ERROR: Arrowhead calculation failed! */ + back = 0; + } + } else { + /* ##### ERROR: Arrowhead calculation failed! */ + back = 0; + } + } + if(obj->ab) { + res = dk3xsp_calculate_position( + &seg, (obj->dt).spl.po, (obj->dt).spl.np, 0.0, drw->cosp, 0, &mec + ); + +#line 4412 "dk3figah.ctr" + if((res) && (0 == mec)) { + alphab = dk3xsp_direction( + (obj->dt).spl.po, (obj->dt).spl.np, 0.0, drw->cosp, &mec + ); + +#line 4416 "dk3figah.ctr" + if((alphab >= 0.0) && (0 == mec)) { + alphab += M_PI; + sp.x = dk3xsp_get_x(&seg); + sp.y = dk3xsp_get_y(&seg); + res = dk3figah_straight_arrowhead( + drw, obj, obj->ab, &sp, alphab, &mec + ); + +#line 4423 "dk3figah.ctr" + if(!(res)) { back = 0; } + } else { + /* ##### ERROR: Arrowhead calculation failed! */ + back = 0; + } + } else { + /* ##### ERROR: Arrowhead calculation failed! */ + back = 0; + } + } + } else { + if(obj->af) { + if(!dk3figah_one_spline_arrowhead(drw, obj, obj->af, 0, &mec)) { + back = 0; + } + +#line 4438 "dk3figah.ctr" + } + if(obj->ab) { + if(!dk3figah_one_spline_arrowhead(drw, obj, obj->ab, 1, &mec)) { + back = 0; + } + +#line 4443 "dk3figah.ctr" + } + } + /* + Cut spline if necessary when not using compatible arrowheads. + */ +#if VERSION_BEFORE_20150821 + /* 2015-08-21 Static code analysis complains: + The following instruction discards all previous check results! + */ + back = 1; +#endif + if(!(drw->coah)) { + +#line 4455 "dk3figah.ctr" + if((0.0 < cuts) && (NULL != obj->ab)) { + +#line 4456 "dk3figah.ctr" + (obj->dt).spl.ts = dk3xsp_get_t_for_distance( + (obj->dt).spl.po, + (obj->dt).spl.np, + cuts, + dk3figah_length_correction_tolerance(drw, obj, obj->ab, &mec), + (obj->dt).spl.fslc, + 1, + drw->cosp, + &mec + ); + +#line 4466 "dk3figah.ctr" + if(0.0 > (obj->dt).spl.ts) { + +#line 4467 "dk3figah.ctr" + back = 0; + } + } else { + +#line 4470 "dk3figah.ctr" + } + if((0.0 < cute) && (NULL != obj->af)) { + +#line 4472 "dk3figah.ctr" + (obj->dt).spl.te = dk3xsp_get_t_for_distance( + (obj->dt).spl.po, + (obj->dt).spl.np, + cute, + dk3figah_length_correction_tolerance(drw, obj, obj->af, &mec), + (obj->dt).spl.fslc, + 0, + drw->cosp, + &mec + ); + +#line 4482 "dk3figah.ctr" + if(0.0 > (obj->dt).spl.te) { + +#line 4483 "dk3figah.ctr" + back = 0; + } + } else { + +#line 4486 "dk3figah.ctr" + } + } + if(mec) { + +#line 4489 "dk3figah.ctr" + back = 0; + /* ERROR: Math error */ + dk3app_log_i1(drw->app, DK3_LL_ERROR, 260); + } + } + + +#line 4495 "dk3figah.ctr" + return back; +} + + + +/** For corrections on arcs check whether we have to + use the full correction formula. + @param ah Arrowhead to calculate correction for. + @return 1 for correct formula, 0 for c/r. +*/ +static +int +dk3figah_must_use_arc_correction(dk3_fig_ah_t *ah) +{ + int back = 0; + if(ah) { + if(!(ah->af)) { + switch(ah->as) { + case DK3_FIG_AS_HALF_CIRCLE_END: { + back = 1; + } break; + } + } + } + return back; +} + + + +/** Calculate correction angle for arrowhead length correction on arcs. + @param r Arc radius. + @param c Correction length. + @param ec Pointer to error code variable. + @return Non-negative number on success, -1.0 on error. +*/ +static +double +dk3figah_arc_correction(double r, double c, int *ec) +{ + double back = -1.0; + double val; + val = dk3ma_d_sub_ok( + 1.0, + dk3ma_d_div_ok( + dk3ma_d_square_ok(c, ec), + dk3ma_d_mul_ok(2.0, dk3ma_d_square_ok(r, ec), ec), + ec + ), + ec + ); + if((-1.0 <= val) && (1.0 >= val)) { + back = acos(val); + } else { + if(ec) { *ec = DK3_ERROR_MATH_OUT_OF_RANGE; } + } + return back; +} + + + +/** Calculate one arrowhead on arc. + @param drw Drawing structure. + @param obj Arc object containing the arrowhead. + @param ah Arrowhead structure. + @param ab Flag: Backward arrow (0=forward, 1=backward). + @param ec Pointer to error code variable. + @return 1 on success, 0 on error. +*/ +static +int +dk3figah_one_arc_arrowhead( + dk3_fig_drawing_t *drw, + dk3_fig_obj_t *obj, + dk3_fig_ah_t *ah, + int ab, + int *ec +) +{ + dk3_fig_spline_point_t *sp = NULL; + dk3_fig_poly_point_t *po; + dk3_fig_poly_point_t pp; + dk3_fig_obj_t *ao1; /* Arrowhead object 1. */ + dk3_fig_obj_t *ao2; /* Arrowhead object 2. */ + double s; /* Shift length. */ + double a0; /* Alpha at arrow front pt. */ + double a1; /* Alpha at real front. */ + double phi; /* Direction at front. */ + double b1; /* Beta: Angle for arrowhead. */ + double b2; /* Beta: Angle for part. */ + double b3; /* Beta: Angle for inner. */ + double f = -1.0; /* Factor. */ + double ga; /* Current point angle. */ + double r1; + double r2; + size_t nsegs = 0; /* Number of segments. */ + size_t ns2 = 0; /* Number of segments 2. */ + size_t ns3 = 0; /* Number of segments 3. */ + size_t np = 0; /* Number of spline points. */ + size_t i; + size_t j; + int mec = 0; + int back = 0; + int mustadd = 0; + + +#line 4599 "dk3figah.ctr" + if(ab) { + a0 = (obj->dt).arc.as; + if((obj->dt).arc.ae > (obj->dt).arc.as) { + f = 1.0; + } else { + f = -1.0; + } + } else { + a0 = (obj->dt).arc.ae; + if((obj->dt).arc.ae > (obj->dt).arc.as) { + f = -1.0; + } else { + f = 1.0; + } + } + + +#line 4615 "dk3figah.ctr" + + +#line 4616 "dk3figah.ctr" + a1 = a0; + +#line 4617 "dk3figah.ctr" + phi = a1 - f * M_PI_2; + +#line 4618 "dk3figah.ctr" + s = dk3figah_find_shift_length(drw, obj, ah, &mec); + a0 = dk3ma_d_add_ok( + a0, + (f * dk3ma_d_div_ok(s, (obj->dt).arc.ra, &mec)), + &mec + ); + +#line 4624 "dk3figah.ctr" + + +#line 4625 "dk3figah.ctr" + switch(ah->as) { + case DK3_FIG_AS_STICK: + case DK3_FIG_AS_CLOSED: { + +#line 4628 "dk3figah.ctr" + b1 = dk3ma_d_div_ok(ah->he, (obj->dt).arc.ra, &mec); + if(b1 < (2.0 * M_PI)) { + +#line 4630 "dk3figah.ctr" + nsegs = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(b1, drw->arcspp, &mec) / M_PI_2), + &mec + ); + +#line 4634 "dk3figah.ctr" + if(drw->minspp > nsegs) { nsegs = drw->minspp; } +#if TRACE_DEBUG + np = 2 * nsegs + 1; + +#line 4637 "dk3figah.ctr" +#endif + np = dk3mem_add_size_t(dk3mem_mul_size_t(2, nsegs, &mec), 1, &mec); + if(0 == mec) { + ao1 = dk3fig_obj_new( + obj->li, obj->la, + DK3_FIG_OBJ_SPLINE, 4, + obj->lw, obj->pc, -1, -1, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, np, NULL, drw->app + ); + if(ao1) { + ah->o1 = (void *)ao1; + if(ao1) { + sp = (ao1->dt).spl.po; + if(sp) { + +#line 4652 "dk3figah.ctr" + back = 1; + sp[nsegs].x = (obj->dt).arc.ra * cos(a0); + sp[nsegs].y = (obj->dt).arc.ra * sin(a0); + sp[nsegs].s = 0.0; + for(i = 0; i < nsegs; i++) { + +#line 4657 "dk3figah.ctr" + j = i + 1; + if(j == nsegs) { + ga = a0 + f * b1; + + +#line 4661 "dk3figah.ctr" + r1 = dk3ma_d_sub_ok( + (obj->dt).arc.ra, (0.5 * ah->wi), &mec + ); + +#line 4664 "dk3figah.ctr" + r2 = dk3ma_d_add_ok( + (obj->dt).arc.ra, (0.5 * ah->wi), &mec + ); + +#line 4667 "dk3figah.ctr" + sp[nsegs - j].s = 0.0; + sp[nsegs + j].s = 0.0; + } else { + ga = a0 + f * b1 * ((double)j / (double)nsegs); + + +#line 4672 "dk3figah.ctr" + r1 = dk3ma_d_sub_ok( + (obj->dt).arc.ra, + (0.5 * ah->wi * ((double)j / (double)nsegs)), + &mec + ); + +#line 4677 "dk3figah.ctr" + r2 = dk3ma_d_add_ok( + (obj->dt).arc.ra, + (0.5 * ah->wi * ((double)j / (double)nsegs)), + &mec + ); + +#line 4682 "dk3figah.ctr" + sp[nsegs - j].s = -1.0; + sp[nsegs + j].s = -1.0; + } + sp[nsegs - j].x = r1 * cos(ga); + sp[nsegs - j].y = r1 * sin(ga); + sp[nsegs + j].x = r2 * cos(ga); + sp[nsegs + j].y = r2 * sin(ga); + } + for(i = 0; i < np; i++) { + dk3fig_tool_shift_spoint( + &(sp[i]), (obj->dt).arc.xc, (obj->dt).arc.yc, &mec + ); + +#line 4694 "dk3figah.ctr" + } + if(DK3_FIG_AS_CLOSED == ah->as) { + ao1->st = 5; + if(ah->af) { + ao1->fc = obj->pc; + } else { + ao1->fc = 7; + } + ao1->fi = 20; + ao1->cl = 1; + } + +#line 4705 "dk3figah.ctr" + } + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } + } else { + /* ##### ERROR: Arrowhead too long! */ + } + } break; + case DK3_FIG_AS_INDENTED: { + b1 = dk3ma_d_div_ok( + dk3ma_d_mul_ok(1.25, ah->he, &mec), + (obj->dt).arc.ra, &mec + ); + b2 = dk3ma_d_div_ok((0.25 * ah->he), (obj->dt).arc.ra, &mec); + if((b1 < (2.0 * M_PI)) && (b2 < (2.0 * M_PI))) { + +#line 4722 "dk3figah.ctr" + nsegs = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(b1, drw->arcspp, &mec) / M_PI_2), + &mec + ); + +#line 4726 "dk3figah.ctr" + ns2 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(b2, drw->arcspp, &mec) / M_PI_2), + &mec + ); + +#line 4730 "dk3figah.ctr" + if(drw->minspp > nsegs) { nsegs = drw->minspp; } + if(drw->minspp > ns2) { ns2 = drw->minspp; } +#if TRACE_DEBUG + np = 2 * (nsegs + ns2); + +#line 4734 "dk3figah.ctr" +#endif + np = dk3mem_mul_size_t(2, dk3mem_add_size_t(nsegs, ns2, &mec), &mec); + if(0 == mec) { + ao1 = dk3fig_obj_new( + obj->li, obj->la, DK3_FIG_OBJ_SPLINE, 5, + obj->lw, obj->pc, 7, 20, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, np, NULL, drw->app + ); + if(ao1) { + ah->o1 = (void *)ao1; + sp = (ao1->dt).spl.po; + if(sp) { + back = 1; + /* Arrowhead front point */ + sp[nsegs + ns2 - 1].x = (obj->dt).arc.ra * cos(a0); + sp[nsegs + ns2 - 1].y = (obj->dt).arc.ra * sin(a0); + sp[nsegs + ns2 - 1].s = 0.0; + + +#line 4753 "dk3figah.ctr" + /* Outer edges of arrowhead */ + for(i = 0; i < nsegs; i++) { + j = i + 1; + if(j == nsegs) { + ga = a0 + f * b1; + r1 = dk3ma_d_sub_ok( + (obj->dt).arc.ra, (0.5 * ah->wi), &mec + ); + r2 = dk3ma_d_add_ok( + (obj->dt).arc.ra, (0.5 * ah->wi), &mec + ); + sp[nsegs + ns2 - 1 - j].s = 0.0; + sp[nsegs + ns2 - 1 + j].s = 0.0; + } else { + ga = a0 + f * b1 * ((double)j / (double)nsegs); + r1 = dk3ma_d_sub_ok( + (obj->dt).arc.ra, + (0.5 * ah->wi * ((double)j / (double)nsegs)), + &mec + ); + r2 = dk3ma_d_add_ok( + (obj->dt).arc.ra, + (0.5 * ah->wi * ((double)j / (double)nsegs)), + &mec + ); + sp[nsegs + ns2 - 1 - j].s = -1.0; + sp[nsegs + ns2 - 1 + j].s = -1.0; + } + sp[nsegs + ns2 - 1 - j].x = r1 * cos(ga); + sp[nsegs + ns2 - 1 - j].y = r1 * sin(ga); + sp[nsegs + ns2 - 1 + j].x = r2 * cos(ga); + sp[nsegs + ns2 - 1 + j].y = r2 * sin(ga); + + +#line 4786 "dk3figah.ctr" + + +#line 4787 "dk3figah.ctr" + } + /* Inner edges of arrowhead */ + for(i = 0; i < (ns2 - 1); i++) { + j = i + 1; + ga = a0 + f * (b1 - b2 * ((double)j / (double)ns2)); + r1 = dk3ma_d_sub_ok( + (obj->dt).arc.ra, + (0.5 * ah->wi * (1.0 - ((double)j / (double)ns2))), + &mec + ); + r2 = dk3ma_d_add_ok( + (obj->dt).arc.ra, + (0.5 * ah->wi * (1.0 - ((double)j / (double)ns2))), + &mec + ); + sp[ns2 - 1 - j].x = r1 * cos(ga); + sp[ns2 - 1 - j].y = r1 * sin(ga); + sp[ns2 - 1 - j].s = -1.0; + sp[2 * nsegs + ns2 - 1 + j].x = r2 * cos(ga); + sp[2 * nsegs + ns2 - 1 + j].y = r2 * sin(ga); + sp[2 * nsegs + ns2 - 1 + j].s = -1.0; + + +#line 4809 "dk3figah.ctr" + + +#line 4810 "dk3figah.ctr" + } + /* Inner arrowhead front point */ + ga = a0 + f * (b1 - b2); + r1 = (obj->dt).arc.ra; + sp[2 * (nsegs + ns2) - 1].x = r1 * cos(ga); + sp[2 * (nsegs + ns2) - 1].y = r1 * sin(ga); + sp[2 * (nsegs + ns2) - 1].s = 0.0; + + +#line 4818 "dk3figah.ctr" + /* Shift all points */ + for(i = 0; i < np; i++) { + dk3fig_tool_shift_spoint( + &(sp[i]), (obj->dt).arc.xc, (obj->dt).arc.yc, &mec + ); + } + if(ah->af) { + ao1->fc = obj->pc; + } + +#line 4827 "dk3figah.ctr" + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } + } else { + /* ##### ERROR: Arrowhead too long! */ + } + } break; + case DK3_FIG_AS_POINTED: { + b1 = dk3ma_d_div_ok( + dk3ma_d_mul_ok(0.75, ah->he, &mec), + (obj->dt).arc.ra, &mec + ); + b2 = dk3ma_d_div_ok((0.25 * ah->he), (obj->dt).arc.ra, &mec); + if((b1 < (2.0 * M_PI)) && (b2 < (2.0 * M_PI))) { + +#line 4843 "dk3figah.ctr" + nsegs = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(b1, drw->arcspp, &mec) / M_PI_2), + &mec + ); + +#line 4847 "dk3figah.ctr" + ns2 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(b2, drw->arcspp, &mec) / M_PI_2), + &mec + ); + +#line 4851 "dk3figah.ctr" + if(drw->minspp > nsegs) { nsegs = drw->minspp; } + if(drw->minspp > ns2) { ns2 = drw->minspp; } +#if TRACE_DEBUG + np = 2 * (nsegs + ns2); + +#line 4855 "dk3figah.ctr" +#endif + np = dk3mem_mul_size_t(2, dk3mem_add_size_t(nsegs, ns2, &mec), &mec); + if(0 == mec) { + ao1 = dk3fig_obj_new( + obj->li, obj->la, + DK3_FIG_OBJ_SPLINE, 5, + obj->lw, obj->pc, 7, 20, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, np, NULL, drw->app + ); + if(ao1) { + ah->o1 = (void *)ao1; + sp = (ao1->dt).spl.po; + if(sp) { + back = 1; + /* Arrowhead front point */ + sp[nsegs + ns2 - 1].x = (obj->dt).arc.ra * cos(a0); + sp[nsegs + ns2 - 1].y = (obj->dt).arc.ra * sin(a0); + sp[nsegs + ns2 - 1].s = 0.0; + + +#line 4875 "dk3figah.ctr" + /* Outer edges of arrowhead */ + for(i = 0; i < nsegs; i++) { + j = i + 1; + if(j == nsegs) { + ga = a0 + f * b1; + r1 = dk3ma_d_sub_ok( + (obj->dt).arc.ra, (0.5 * ah->wi), &mec + ); + r2 = dk3ma_d_add_ok( + (obj->dt).arc.ra, (0.5 * ah->wi), &mec + ); + sp[nsegs + ns2 - 1 - j].s = 0.0; + sp[nsegs + ns2 - 1 + j].s = 0.0; + } else { + ga = a0 + f * b1 * ((double)j / (double)nsegs); + r1 = dk3ma_d_sub_ok( + (obj->dt).arc.ra, + (0.5 * ah->wi * ((double)j / (double)nsegs)), + &mec + ); + r2 = dk3ma_d_add_ok( + (obj->dt).arc.ra, + (0.5 * ah->wi * ((double)j / (double)nsegs)), + &mec + ); + sp[nsegs + ns2 - 1 - j].s = -1.0; + sp[nsegs + ns2 - 1 + j].s = -1.0; + } + sp[nsegs + ns2 - 1 - j].x = r1 * cos(ga); + sp[nsegs + ns2 - 1 - j].y = r1 * sin(ga); + sp[nsegs + ns2 - 1 + j].x = r2 * cos(ga); + sp[nsegs + ns2 - 1 + j].y = r2 * sin(ga); + + +#line 4908 "dk3figah.ctr" + + +#line 4909 "dk3figah.ctr" + } + /* Inner edges of arrowhead */ + for(i = 0; i < (ns2 - 1); i++) { + j = i + 1; + ga = a0 + f * (b1 + b2 * ((double)j / (double)ns2)); + r1 = dk3ma_d_sub_ok( + (obj->dt).arc.ra, + (0.5 * ah->wi * (1.0 - ((double)j / (double)ns2))), + &mec + ); + r2 = dk3ma_d_add_ok( + (obj->dt).arc.ra, + (0.5 * ah->wi * (1.0 - ((double)j / (double)ns2))), + &mec + ); + sp[ns2 - 1 - j].x = r1 * cos(ga); + sp[ns2 - 1 - j].y = r1 * sin(ga); + sp[ns2 - 1 - j].s = -1.0; + sp[2 * nsegs + ns2 - 1 + j].x = r2 * cos(ga); + sp[2 * nsegs + ns2 - 1 + j].y = r2 * sin(ga); + sp[2 * nsegs + ns2 - 1 + j].s = -1.0; + + +#line 4931 "dk3figah.ctr" + + +#line 4932 "dk3figah.ctr" + } + /* Inner arrowhead front point */ + ga = a0 + f * (b1 + b2); + r1 = (obj->dt).arc.ra; + sp[2 * (nsegs + ns2) - 1].x = r1 * cos(ga); + sp[2 * (nsegs + ns2) - 1].y = r1 * sin(ga); + sp[2 * (nsegs + ns2) - 1].s = 0.0; + + +#line 4940 "dk3figah.ctr" + /* Shift all points */ + for(i = 0; i < np; i++) { + dk3fig_tool_shift_spoint( + &(sp[i]), (obj->dt).arc.xc, (obj->dt).arc.yc, &mec + ); + } + if(ah->af) { + ao1->fc = obj->pc; + } + +#line 4949 "dk3figah.ctr" + } + } + } + } else { + /* ##### ERROR: Arrowhead too long! */ + } + } break; + case DK3_FIG_AS_RHOMBUS: { + if((1 == ah->af) && (DK3_FIG_SRCTYPE_JFIG == drw->srctype)) { + ao1 = dk3fig_obj_new( + obj->li, obj->la, + DK3_FIG_OBJ_ELLIPSE, 3, + obj->lw, obj->pc, obj->pc, 20, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, 0, NULL, drw->app + ); + if(ao1) { + back = 1; + ah->o1 = (void *)ao1; + (ao1->dt).ell.an = 0.0; + (ao1->dt).ell.cx = dk3ma_d_add_ok( + (obj->dt).arc.xc, + ((obj->dt).arc.ra * cos(a0)), + &mec + ); + (ao1->dt).ell.cy = dk3ma_d_add_ok( + (obj->dt).arc.yc, + ((obj->dt).arc.ra * sin(a0)), + &mec + ); + (ao1->dt).ell.rx = dk3ma_d_mul_ok(2.0, ah->wi, &mec); + (ao1->dt).ell.ry = (ao1->dt).ell.rx; + } + } else { + b1 = dk3ma_d_div_ok( + dk3ma_d_mul_ok(0.5, ah->he, &mec), + (obj->dt).arc.ra, &mec + ); + b2 = b1; + if((b1 < (2.0 * M_PI)) && (b2 < (2.0 * M_PI))) { + +#line 4989 "dk3figah.ctr" + nsegs = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(b1, drw->arcspp, &mec) / M_PI_2), + &mec + ); + +#line 4993 "dk3figah.ctr" + ns2 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(b2, drw->arcspp, &mec) / M_PI_2), + &mec + ); + +#line 4997 "dk3figah.ctr" + if(drw->minspp > nsegs) { nsegs = drw->minspp; } + if(drw->minspp > ns2) { ns2 = drw->minspp; } +#if TRACE_DEBUG + np = 2 * (nsegs + ns2); + +#line 5001 "dk3figah.ctr" +#endif + np = dk3mem_mul_size_t(2, dk3mem_add_size_t(nsegs, ns2, &mec), &mec); + if(0 == mec) { + ao1 = dk3fig_obj_new( + obj->li, obj->la, + DK3_FIG_OBJ_SPLINE, 5, + obj->lw, obj->pc, 7, 20, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, np, NULL, drw->app + ); + if(ao1) { + ah->o1 = (void *)ao1; + sp = (ao1->dt).spl.po; + if(sp) { + back = 1; + /* Arrowhead front point */ + sp[nsegs + ns2 - 1].x = (obj->dt).arc.ra * cos(a0); + sp[nsegs + ns2 - 1].y = (obj->dt).arc.ra * sin(a0); + sp[nsegs + ns2 - 1].s = 0.0; + + +#line 5021 "dk3figah.ctr" + /* Outer edges of arrowhead */ + for(i = 0; i < nsegs; i++) { + j = i + 1; + if(j == nsegs) { + ga = a0 + f * b1; + r1 = dk3ma_d_sub_ok( + (obj->dt).arc.ra, (0.5 * ah->wi), &mec + ); + r2 = dk3ma_d_add_ok( + (obj->dt).arc.ra, (0.5 * ah->wi), &mec + ); + sp[nsegs + ns2 - 1 - j].s = 0.0; + sp[nsegs + ns2 - 1 + j].s = 0.0; + } else { + ga = a0 + f * b1 * ((double)j / (double)nsegs); + r1 = dk3ma_d_sub_ok( + (obj->dt).arc.ra, + (0.5 * ah->wi * ((double)j / (double)nsegs)), + &mec + ); + r2 = dk3ma_d_add_ok( + (obj->dt).arc.ra, + (0.5 * ah->wi * ((double)j / (double)nsegs)), + &mec + ); + sp[nsegs + ns2 - 1 - j].s = -1.0; + sp[nsegs + ns2 - 1 + j].s = -1.0; + } + sp[nsegs + ns2 - 1 - j].x = r1 * cos(ga); + sp[nsegs + ns2 - 1 - j].y = r1 * sin(ga); + sp[nsegs + ns2 - 1 + j].x = r2 * cos(ga); + sp[nsegs + ns2 - 1 + j].y = r2 * sin(ga); + + +#line 5054 "dk3figah.ctr" + + +#line 5055 "dk3figah.ctr" + } + /* Inner edges of arrowhead */ + for(i = 0; i < (ns2 - 1); i++) { + j = i + 1; + ga = a0 + f * (b1 + b2 * ((double)j / (double)ns2)); + r1 = dk3ma_d_sub_ok( + (obj->dt).arc.ra, + (0.5 * ah->wi * (1.0 - ((double)j / (double)ns2))), + &mec + ); + r2 = dk3ma_d_add_ok( + (obj->dt).arc.ra, + (0.5 * ah->wi * (1.0 - ((double)j / (double)ns2))), + &mec + ); + sp[ns2 - 1 - j].x = r1 * cos(ga); + sp[ns2 - 1 - j].y = r1 * sin(ga); + sp[ns2 - 1 - j].s = -1.0; + sp[2 * nsegs + ns2 - 1 + j].x = r2 * cos(ga); + sp[2 * nsegs + ns2 - 1 + j].y = r2 * sin(ga); + sp[2 * nsegs + ns2 - 1 + j].s = -1.0; + + +#line 5077 "dk3figah.ctr" + + +#line 5078 "dk3figah.ctr" + } + /* Inner arrowhead front point */ + ga = a0 + f * (b1 + b2); + r1 = (obj->dt).arc.ra; + sp[2 * (nsegs + ns2) - 1].x = r1 * cos(ga); + sp[2 * (nsegs + ns2) - 1].y = r1 * sin(ga); + sp[2 * (nsegs + ns2) - 1].s = 0.0; + + +#line 5086 "dk3figah.ctr" + /* Shift all points */ + for(i = 0; i < np; i++) { + dk3fig_tool_shift_spoint( + &(sp[i]), (obj->dt).arc.xc, (obj->dt).arc.yc, &mec + ); + } + if(ah->af) { + ao1->fc = obj->pc; + } + +#line 5095 "dk3figah.ctr" + } + } + } + } else { + /* ##### ERROR: Arrowhead too long! */ + } + } + } break; + case DK3_FIG_AS_FULL_CIRCLE_END: { + b1 = dk3figah_arc_correction( + (obj->dt).arc.ra, + dk3ma_d_add_ok( + (0.5 * ah->he), + (0.5 * dk3fig_tool_get_lw(drw, obj, &mec)), + &mec + ), + &mec + ); + if(0.0 <= b1) { +#if 0 + b1 = a0 + f * b1; +#else + b1 = a1 + f * b1; +#endif + ao1 = dk3fig_obj_new( + obj->li, obj->la, + DK3_FIG_OBJ_ELLIPSE, 3, + obj->lw, obj->pc, 7, 20, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, 0, NULL, drw->app + ); + if(ao1) { + back = 1; + ah->o1 = (void *)ao1; + (ao1->dt).ell.an = 0.0; + (ao1->dt).ell.cx = dk3ma_d_add_ok( + (obj->dt).arc.xc, + ((obj->dt).arc.ra * cos(b1)), + &mec + ); + (ao1->dt).ell.cy = dk3ma_d_add_ok( + (obj->dt).arc.yc, + ((obj->dt).arc.ra * sin(b1)), + &mec + ); + (ao1->dt).ell.rx = 0.5 * ah->he; + (ao1->dt).ell.ry = 0.5 * ah->he; + if(ah->af) { + ao1->fc = obj->pc; + } + } + } else { + mec = DK3_ERROR_MATH_OUT_OF_RANGE; + } + } break; + case DK3_FIG_AS_HALF_CIRCLE_END: { + pp.x = (obj->dt).arc.ra * cos(a1); + pp.y = (obj->dt).arc.ra * sin(a1); + pp.x = dk3ma_d_add_ok(pp.x, (obj->dt).arc.xc, &mec); + pp.y = dk3ma_d_add_ok(pp.y, (obj->dt).arc.yc, &mec); + if(ah->af) { + s = 0.5 * dk3fig_tool_get_lw(drw, obj, ec); + pp.x = dk3ma_d_sub_ok( + pp.x, + (s * cos(phi)), + &mec + ); + pp.y = dk3ma_d_sub_ok( + pp.y, + (s * sin(phi)), + &mec + ); + } + ao1 = dk3fig_obj_new( + obj->li, obj->la, + DK3_FIG_OBJ_PSEUDO_HALF_CIRCLE, ((ah->af) ? 1 : 0), + obj->lw, obj->pc, ((ah->af) ? obj->pc : 7), 20, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, 0, NULL, drw->app + ); + if(ao1) { + ah->o1 = (void *)ao1; + back = 1; + (ao1->dt).hci.cx = pp.x; + (ao1->dt).hci.cy = pp.y; + (ao1->dt).hci.ra = 0.5 * ah->he; + (ao1->dt).hci.an = phi; + } + } break; + case DK3_FIG_AS_RECTANGLE: { + b1 = dk3ma_d_div_ok(ah->he, (obj->dt).arc.ra, &mec); + if(b1 < (2.0 * M_PI)) { + +#line 5187 "dk3figah.ctr" + nsegs = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(b1, drw->arcspp, &mec) / M_PI_2), + &mec + ); + if(drw->minspp > nsegs) { + nsegs = drw->minspp; + } + +#line 5194 "dk3figah.ctr" +#if TRACE_DEBUG + np = 2 * nsegs + 2; + +#line 5196 "dk3figah.ctr" +#endif + np = dk3mem_add_size_t(dk3mem_mul_size_t(2, nsegs, &mec), 2, &mec); + if(0 == mec) { + ao1 = dk3fig_obj_new( + obj->li, obj->la, + DK3_FIG_OBJ_SPLINE, 5, + obj->lw, obj->pc, ((ah->af) ? obj->pc : 7), 20, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, np, NULL, drw->app + ); + if(ao1) { + ah->o1 = (void *)ao1; + sp = (ao1->dt).spl.po; + if(sp) { + r1 = dk3ma_d_add_ok((obj->dt).arc.ra, (0.5 * ah->wi), &mec); + r2 = dk3ma_d_sub_ok((obj->dt).arc.ra, (0.5 * ah->wi), &mec); + back = 1; + for(i = 0; i < nsegs; i++) { + if(0 == i) { + ga = a0; + sp[i].s = 0.0; + sp[np - 1 - i].s = 0.0; + } else { + ga = a0 + f * b1 * ((double)i / (double)nsegs); + sp[i].s = -1.0; + sp[np - 1 - i].s = -1.0; + } + sp[i].x = dk3ma_d_add_ok( + (obj->dt).arc.xc, (r1 * cos(ga)), &mec + ); + sp[i].y = dk3ma_d_add_ok( + (obj->dt).arc.yc, (r1 * sin(ga)), &mec + ); + sp[np - 1 - i].x = dk3ma_d_add_ok( + (obj->dt).arc.xc, (r2 * cos(ga)), &mec + ); + sp[np - 1 - i].y = dk3ma_d_add_ok( + (obj->dt).arc.yc, (r2 * sin(ga)), &mec + ); + + +#line 5236 "dk3figah.ctr" + + +#line 5237 "dk3figah.ctr" + } + ga = a0 + f * b1; + sp[nsegs].x = dk3ma_d_add_ok( + (obj->dt).arc.xc, (r1 * cos(ga)), &mec + ); + sp[nsegs].y = dk3ma_d_add_ok( + (obj->dt).arc.yc, (r1 * sin(ga)), &mec + ); + sp[nsegs].s = 0.0; + sp[nsegs + 1].x = dk3ma_d_add_ok( + (obj->dt).arc.xc, (r2 * cos(ga)), &mec + ); + sp[nsegs + 1].y = dk3ma_d_add_ok( + (obj->dt).arc.yc, (r2 * sin(ga)), &mec + ); + sp[nsegs + 1].s = 0.0; + + +#line 5254 "dk3figah.ctr" + + +#line 5255 "dk3figah.ctr" + + +#line 5256 "dk3figah.ctr" + } + } + } + } else { + /* ##### ERROR: Arrowhead too long! */ + } + } break; + case DK3_FIG_AS_INVERSE: { + b1 = dk3ma_d_div_ok(ah->he, (obj->dt).arc.ra, &mec); + if(b1 < (2.0 * M_PI)) { + +#line 5266 "dk3figah.ctr" + nsegs = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(b1, drw->arcspp, &mec) / M_PI_2), + &mec + ); + +#line 5270 "dk3figah.ctr" + if(drw->minspp > nsegs) { nsegs = drw->minspp; } + np = dk3mem_add_size_t(dk3mem_mul_size_t(2, nsegs, &mec), 1, &mec); + if(0 == mec) { + ao1 = dk3fig_obj_new( + obj->li, obj->la, DK3_FIG_OBJ_SPLINE, 5, + obj->lw, obj->pc, ((ah->af) ? obj->pc : 7), 20, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, np, NULL, drw->app + ); + if(ao1) { + ah->o1 = (void *)ao1; + sp = (ao1->dt).spl.po; + if(sp) { + back = 1; + sp[0].x = dk3ma_d_add_ok( + (obj->dt).arc.xc, ((obj->dt).arc.ra * cos(a0 + f * b1)), &mec + ); + sp[0].y = dk3ma_d_add_ok( + (obj->dt).arc.yc, ((obj->dt).arc.ra * sin(a0 + f * b1)), &mec + ); + sp[0].s = 0.0; + +#line 5291 "dk3figah.ctr" + for(i = 0; i < nsegs; i++) { + j = i + 1; + r1 = dk3ma_d_add_ok( + (obj->dt).arc.ra, + (0.5 * ah->wi * ((double)j / (double)nsegs)), + &mec + ); + r2 = dk3ma_d_sub_ok( + (obj->dt).arc.ra, + (0.5 * ah->wi * ((double)j / (double)nsegs)), + &mec + ); + ga = ( + (j == nsegs) + ? (a0) + : (a0 + f * b1 * (1.0 - ((double)j / (double)nsegs))) + ); + sp[j].x = dk3ma_d_add_ok( + (obj->dt).arc.xc, (r1 * cos(ga)), &mec + ); + sp[j].y = dk3ma_d_add_ok( + (obj->dt).arc.yc, (r1 * sin(ga)), &mec + ); + +#line 5314 "dk3figah.ctr" + sp[j].s = ((j == nsegs) ? 0.0 : (-1.0)); + sp[np - 1 - i].x = dk3ma_d_add_ok( + (obj->dt).arc.xc, (r2 * cos(ga)), &mec + ); + sp[np - 1 - i].y = dk3ma_d_add_ok( + (obj->dt).arc.yc, (r2 * sin(ga)), &mec + ); + +#line 5321 "dk3figah.ctr" + sp[np - 1 - i].s = ((j == nsegs) ? 0.0 : (-1.0)); + } + +#line 5323 "dk3figah.ctr" + } + } + } + } else { + /* ##### ERROR: Arrowhead too long! */ + } + } break; + case DK3_FIG_AS_INDENTED_FILLED_HALF: { + if(ah->af) { + if(ab) { mustadd = 1; } + } else { + if(!(ab)) { mustadd = 1; } + } + b1 = dk3ma_d_div_ok( + dk3ma_d_mul_ok(1.25, ah->he, &mec), + (obj->dt).arc.ra, &mec + ); + b2 = dk3ma_d_div_ok((0.25 * ah->he), (obj->dt).arc.ra, &mec); + b3 = dk3ma_d_div_ok(ah->he, (obj->dt).arc.ra, &mec); + if((b1 < (2.0 * M_PI)) && (b2 < (2.0 * M_PI)) && (b3 < (2.0 * M_PI))) { + + +#line 5344 "dk3figah.ctr" + nsegs = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(b1, drw->arcspp, &mec) / M_PI_2), + &mec + ); + +#line 5348 "dk3figah.ctr" + ns2 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(b2, drw->arcspp, &mec) / M_PI_2), + &mec + ); + +#line 5352 "dk3figah.ctr" + ns3 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(b3, drw->arcspp, &mec) / M_PI_2), + &mec + ); + if(drw->minspp > nsegs) { nsegs = drw->minspp; } + if(drw->minspp > ns2) { ns2 = drw->minspp; } + if(drw->minspp > ns3) { ns3 = drw->minspp; } + np = dk3mem_mul_size_t(2, dk3mem_add_size_t(nsegs, ns2, &mec), &mec); + if(0 == mec) { + ao1 = dk3fig_obj_new( + obj->li, obj->la, + DK3_FIG_OBJ_SPLINE, 5, + obj->lw, obj->pc, 7, 20, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, np, NULL, drw->app + ); + if(ao1) { + ah->o1 = (void *)ao1; + sp = (ao1->dt).spl.po; + if(sp) { + /* Arrowhead front point */ + sp[nsegs + ns2 - 1].x = (obj->dt).arc.ra * cos(a0); + sp[nsegs + ns2 - 1].y = (obj->dt).arc.ra * sin(a0); + sp[nsegs + ns2 - 1].s = 0.0; + + +#line 5377 "dk3figah.ctr" + /* Outer edges of arrowhead */ + for(i = 0; i < nsegs; i++) { + j = i + 1; + if(j == nsegs) { + ga = a0 + f * b1; + r1 = dk3ma_d_sub_ok( + (obj->dt).arc.ra, (0.5 * ah->wi), &mec + ); + r2 = dk3ma_d_add_ok( + (obj->dt).arc.ra, (0.5 * ah->wi), &mec + ); + sp[nsegs + ns2 - 1 - j].s = 0.0; + sp[nsegs + ns2 - 1 + j].s = 0.0; + } else { + ga = a0 + f * b1 * ((double)j / (double)nsegs); + r1 = dk3ma_d_sub_ok( + (obj->dt).arc.ra, + (0.5 * ah->wi * ((double)j / (double)nsegs)), + &mec + ); + r2 = dk3ma_d_add_ok( + (obj->dt).arc.ra, + (0.5 * ah->wi * ((double)j / (double)nsegs)), + &mec + ); + sp[nsegs + ns2 - 1 - j].s = -1.0; + sp[nsegs + ns2 - 1 + j].s = -1.0; + } + sp[nsegs + ns2 - 1 - j].x = r1 * cos(ga); + sp[nsegs + ns2 - 1 - j].y = r1 * sin(ga); + sp[nsegs + ns2 - 1 + j].x = r2 * cos(ga); + sp[nsegs + ns2 - 1 + j].y = r2 * sin(ga); + + +#line 5410 "dk3figah.ctr" + + +#line 5411 "dk3figah.ctr" + } + /* Inner edges of arrowhead */ + for(i = 0; i < (ns2 - 1); i++) { + j = i + 1; + ga = a0 + f * (b1 - b2 * ((double)j / (double)ns2)); + r1 = dk3ma_d_sub_ok( + (obj->dt).arc.ra, + (0.5 * ah->wi * (1.0 - ((double)j / (double)ns2))), + &mec + ); + r2 = dk3ma_d_add_ok( + (obj->dt).arc.ra, + (0.5 * ah->wi * (1.0 - ((double)j / (double)ns2))), + &mec + ); + sp[ns2 - 1 - j].x = r1 * cos(ga); + sp[ns2 - 1 - j].y = r1 * sin(ga); + sp[ns2 - 1 - j].s = -1.0; + sp[2 * nsegs + ns2 - 1 + j].x = r2 * cos(ga); + sp[2 * nsegs + ns2 - 1 + j].y = r2 * sin(ga); + sp[2 * nsegs + ns2 - 1 + j].s = -1.0; + + +#line 5433 "dk3figah.ctr" + + +#line 5434 "dk3figah.ctr" + } + /* Inner arrowhead front point */ + ga = a0 + f * (b1 - b2); + r1 = (obj->dt).arc.ra; + sp[2 * (nsegs + ns2) - 1].x = r1 * cos(ga); + sp[2 * (nsegs + ns2) - 1].y = r1 * sin(ga); + sp[2 * (nsegs + ns2) - 1].s = 0.0; + + +#line 5442 "dk3figah.ctr" + /* Shift all points */ + for(i = 0; i < np; i++) { + dk3fig_tool_shift_spoint( + &(sp[i]), (obj->dt).arc.xc, (obj->dt).arc.yc, &mec + ); + } + +#line 5448 "dk3figah.ctr" + np = dk3mem_add_size_t(nsegs, dk3mem_add_size_t(ns2, ns3, &mec), &mec); + if(0 == mec) { + ao2 = dk3fig_obj_new( + obj->li, obj->la, DK3_FIG_OBJ_SPLINE, 5, + 0, obj->pc, obj->pc, 20, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, np, NULL, drw->app + ); + if(ao2) { + +#line 5457 "dk3figah.ctr" + ah->o2 = (void *)ao2; + sp = (ao2->dt).spl.po; + if(sp) { + back = 1; + sp[0].x = dk3ma_d_add_ok( + (obj->dt).arc.xc, ((obj->dt).arc.ra * cos(a0)), &mec + ); + sp[0].y = dk3ma_d_add_ok( + (obj->dt).arc.yc, ((obj->dt).arc.ra * sin(a0)), &mec + ); + sp[0].s = 0.0; + +#line 5468 "dk3figah.ctr" + /* Outer edge */ + for(i = 0; i < nsegs; i++) { + j = i + 1; + if(j == nsegs) { + if(mustadd) { + r1 = dk3ma_d_add_ok( + (obj->dt).arc.ra, (0.5 * ah->wi), &mec + ); + } else { + r1 = dk3ma_d_sub_ok( + (obj->dt).arc.ra, (0.5 * ah->wi), &mec + ); + } + ga = a0 + f * b1; + } else { + if(mustadd) { + r1 = dk3ma_d_add_ok( + (obj->dt).arc.ra, + (0.5 * ((double)j / (double)nsegs) * ah->wi), + &mec + ); + } else { + r1 = dk3ma_d_sub_ok( + (obj->dt).arc.ra, + (0.5 * ((double)j / (double)nsegs) * ah->wi), + &mec + ); + } + ga = a0 + f * b1 * ((double)j / (double)nsegs); + } + sp[j].x = dk3ma_d_add_ok( + (obj->dt).arc.xc, (r1 * cos(ga)), &mec + ); + sp[j].y = dk3ma_d_add_ok( + (obj->dt).arc.yc, (r1 * sin(ga)), &mec + ); + +#line 5504 "dk3figah.ctr" + sp[j].s = ((j == nsegs) ? 0.0 : (-1.0)); + } + /* Indention edge */ + for(i = 0; i < ns2; i++) { + j = i + 1; + if(j == ns2) { + r1 = (obj->dt).arc.ra; + ga = a0 + f * (b1 - b2); + } else { + if(mustadd) { + r1 = dk3ma_d_add_ok( + (obj->dt).arc.ra, + (0.5 * ah->wi * (1.0 - ((double)j / (double)nsegs))), + &mec + ); + } else { + r1 = dk3ma_d_sub_ok( + (obj->dt).arc.ra, + (0.5 * ah->wi * (1.0 - ((double)j / (double)nsegs))), + &mec + ); + } + ga = a0 + f * (b1 - ((double)j / (double)nsegs) * b2); + } + sp[nsegs + j].x = dk3ma_d_add_ok( + (obj->dt).arc.xc, (r1 * cos(ga)), &mec + ); + sp[nsegs + j].y = dk3ma_d_add_ok( + (obj->dt).arc.yc, (r1 * sin(ga)), &mec + ); + +#line 5534 "dk3figah.ctr" + sp[nsegs + j].s = ((j == ns2) ? 0.0 : (-1.0)); + } + /* Inner edge */ + for(i = 0; i < (ns3 - 1); i++) { + j = i + 1; + ga = a0 + f *(b1 - b2 - b3 * ((double)j / (double)nsegs)); + sp[nsegs + ns2 + j].x = dk3ma_d_add_ok( + (obj->dt).arc.xc, ((obj->dt).arc.ra * cos(ga)), &mec + ); + sp[nsegs + ns2 + j].y = dk3ma_d_add_ok( + (obj->dt).arc.yc, ((obj->dt).arc.ra * sin(ga)), &mec + ); + +#line 5546 "dk3figah.ctr" + sp[nsegs + ns2 + j].s = -1.0; + } + +#line 5548 "dk3figah.ctr" + } + } + } + } + } + } + } else { + /* ##### ERROR: Arrowhead too long! */ + } + } break; + case DK3_FIG_AS_CLOSED_HALF: { + b1 = dk3ma_d_div_ok(ah->he, (obj->dt).arc.ra, &mec); + if(b1 < (2.0 * M_PI)) { + +#line 5561 "dk3figah.ctr" + nsegs = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(b1, drw->arcspp, &mec) / M_PI_2), + &mec + ); + if(drw->minspp > nsegs) { nsegs = drw->minspp; } + np = dk3mem_add_size_t(dk3mem_mul_size_t(2, nsegs, &mec), 1, &mec); + if(0 == mec) { + ao1 = dk3fig_obj_new( + obj->li, obj->la, DK3_FIG_OBJ_SPLINE, 5, + obj->lw, obj->pc, ((ah->af) ? obj->pc : 7), 20, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, np, NULL, drw->app + ); + if(ao1) { + ah->o1 = (void *)ao1; + sp = (ao1->dt).spl.po; + if(sp) { + back = 1; + sp[0].x = dk3ma_d_add_ok( + (obj->dt).arc.xc, ((obj->dt).arc.ra * cos(a0)), &mec + ); + sp[0].y = dk3ma_d_add_ok( + (obj->dt).arc.yc, ((obj->dt).arc.ra * sin(a0)), &mec + ); + sp[0].s = 0.0; + for(i = 0; i < nsegs; i++) { + j = i + 1; + if(j == nsegs) { + ga = a0 + f * b1; + if(ab) { + r1 = dk3ma_d_add_ok((obj->dt).arc.ra, (0.5 * ah->wi), &mec); + } else { + r1 = dk3ma_d_sub_ok((obj->dt).arc.ra, (0.5 * ah->wi), &mec); + } + } else { + if(ab) { + r1 = dk3ma_d_add_ok( + (obj->dt).arc.ra, + (0.5 * ((double)j / (double)nsegs) * ah->wi), + &mec + ); + } else { + r1 = dk3ma_d_sub_ok( + (obj->dt).arc.ra, + (0.5 * ((double)j / (double)nsegs) * ah->wi), + &mec + ); + } + ga = a0 + f * b1 * ((double)j / (double)nsegs); + } + sp[j].x = dk3ma_d_add_ok( + (obj->dt).arc.xc, (r1 * cos(ga)), &mec + ); + sp[j].y = dk3ma_d_add_ok( + (obj->dt).arc.yc, (r1 * sin(ga)), &mec + ); + sp[j].s = ((j == nsegs) ? 0.0 : (-1.0)); + sp[np - 1 - i].x = dk3ma_d_add_ok( + (obj->dt).arc.xc, ((obj->dt).arc.ra * cos(ga)), &mec + ); + sp[np - 1 - i].y = dk3ma_d_add_ok( + (obj->dt).arc.yc, ((obj->dt).arc.ra * sin(ga)), &mec + ); + sp[np - 1 - i].s = ((j == nsegs) ? 0.0 : (-1.0)); + } + +#line 5626 "dk3figah.ctr" + } + } + } + } else { + /* ##### ERROR: Arrowhead too long! */ + } + } break; + case DK3_FIG_AS_INDENTED_HALF: { + b1 = dk3ma_d_div_ok( + dk3ma_d_mul_ok(1.25, ah->he, &mec), (obj->dt).arc.ra, &mec + ); + b2 = dk3ma_d_div_ok((0.25 * ah->he), (obj->dt).arc.ra, &mec); + b3 = dk3ma_d_div_ok(ah->he, (obj->dt).arc.ra, &mec); + if((b1 < (2.0 * M_PI)) && (b2 < (2.0 * M_PI)) && (b3 < (2.0 * M_PI))) { + + +#line 5641 "dk3figah.ctr" + nsegs = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(b1, drw->arcspp, &mec) / M_PI_2), + &mec + ); + +#line 5645 "dk3figah.ctr" + ns2 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(b2, drw->arcspp, &mec) / M_PI_2), + &mec + ); + +#line 5649 "dk3figah.ctr" + ns3 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(b3, drw->arcspp, &mec) / M_PI_2), + &mec + ); + if(drw->minspp > nsegs) { nsegs = drw->minspp; } + if(drw->minspp > ns2) { ns2 = drw->minspp; } + if(drw->minspp > ns3) { ns3 = drw->minspp; } + np = dk3mem_add_size_t(dk3mem_add_size_t(nsegs, ns2, &mec), ns3, &mec); + if(0 == mec) { + ao1 = dk3fig_obj_new( + obj->li, obj->la, DK3_FIG_OBJ_SPLINE, 5, + obj->lw, obj->pc, ((ah->af) ? obj->pc : 7), 20, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, np, NULL, drw->app + ); + if(ao1) { + ah->o1 = (void *)ao1; + sp = (ao1->dt).spl.po; + if(sp) { + +#line 5668 "dk3figah.ctr" + back = 1; + /* front point */ + sp[0].x = dk3ma_d_add_ok( + (obj->dt).arc.xc, ((obj->dt).arc.ra * cos(a0)), &mec + ); + sp[0].y = dk3ma_d_add_ok( + (obj->dt).arc.yc, ((obj->dt).arc.ra * sin(a0)), &mec + ); + +#line 5676 "dk3figah.ctr" + sp[0].s = 0.0; + /* outer edge */ + for(i = 0; i < nsegs; i++) { + j = i + 1; + if(ab) { + r1 = dk3ma_d_add_ok( + (obj->dt).arc.ra, + (0.5 * ((double)j / (double)nsegs) * ah->wi), + &mec + ); + } else { + r1 = dk3ma_d_sub_ok( + (obj->dt).arc.ra, + (0.5 * ((double)j / (double)nsegs) * ah->wi), + &mec + ); + } + ga = a0 + f * b1 * ((double)j / (double)nsegs); + if(j == nsegs) { + if(ab) { + r1 = dk3ma_d_add_ok((obj->dt).arc.ra, (0.5 * ah->wi), &mec); + } else { + r1 = dk3ma_d_sub_ok((obj->dt).arc.ra, (0.5 * ah->wi), &mec); + } + ga = a0 + f * b1; + } + sp[j].x = dk3ma_d_add_ok( + (obj->dt).arc.xc, (r1 * cos(ga)), &mec + ); + sp[j].y = dk3ma_d_add_ok( + (obj->dt).arc.yc, (r1 * sin(ga)), &mec + ); + +#line 5708 "dk3figah.ctr" + sp[j].s = ((j == nsegs) ? 0.0 : (-1.0)); + } + /* indention edge */ + for(i = 0; i < ns2; i++) { + j = i + 1; + if(ab) { + r1 = dk3ma_d_add_ok( + (obj->dt).arc.ra, + (0.5 * (1.0 - ((double)j / (double)ns2)) * ah->wi), + &mec + ); + } else { + r1 = dk3ma_d_sub_ok( + (obj->dt).arc.ra, + (0.5 * (1.0 - ((double)j / (double)ns2)) * ah->wi), + &mec + ); + } + ga = a0 + f * (b1 - b2 * ((double)j / (double)ns2)); + if(j == ns2) { + r1 = (obj->dt).arc.ra; + ga = a0 + f * (b1 - b2); + } + sp[nsegs + j].x = dk3ma_d_add_ok( + (obj->dt).arc.xc, (r1 * cos(ga)), &mec + ); + sp[nsegs + j].y = dk3ma_d_add_ok( + (obj->dt).arc.yc, (r1 * sin(ga)), &mec + ); + +#line 5737 "dk3figah.ctr" + sp[nsegs + j].s = ((j == ns2) ? 0.0 : (-1.0)); + } + /* inner edge */ + for(i = 0; i < (ns3 - 1); i++) { + j = i + 1; + ga = a0 + f * (b1 - b2 - b3 * ((double)j / (double)ns3)); + sp[nsegs + ns2 + j].x = dk3ma_d_add_ok( + (obj->dt).arc.xc, ((obj->dt).arc.ra * cos(ga)), &mec + ); + sp[nsegs + ns2 + j].y = dk3ma_d_add_ok( + (obj->dt).arc.yc, ((obj->dt).arc.ra * sin(ga)), &mec + ); + +#line 5749 "dk3figah.ctr" + sp[nsegs + ns2 + j].s = -1.0; + } + +#line 5751 "dk3figah.ctr" + } + } + } + } else { + /* ##### ERROR: Arrow too long */ + } + } break; + case DK3_FIG_AS_BUTTED_HALF: { + b1 = dk3ma_d_div_ok( + (0.75 * ah->he), (obj->dt).arc.ra, &mec + ); + b2 = dk3ma_d_div_ok((0.25 * ah->he), (obj->dt).arc.ra, &mec); + b3 = dk3ma_d_div_ok(ah->he, (obj->dt).arc.ra, &mec); + if((b1 < (2.0 * M_PI)) && (b2 < (2.0 * M_PI)) && (b3 < (2.0 * M_PI))) { + + +#line 5766 "dk3figah.ctr" + nsegs = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(b1, drw->arcspp, &mec) / M_PI_2), + &mec + ); + +#line 5770 "dk3figah.ctr" + ns2 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(b2, drw->arcspp, &mec) / M_PI_2), + &mec + ); + +#line 5774 "dk3figah.ctr" + ns3 = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(b3, drw->arcspp, &mec) / M_PI_2), + &mec + ); + if(drw->minspp > nsegs) { nsegs = drw->minspp; } + if(drw->minspp > ns2) { ns2 = drw->minspp; } + if(drw->minspp > ns3) { ns3 = drw->minspp; } + np = dk3mem_add_size_t(dk3mem_add_size_t(nsegs, ns2, &mec), ns3, &mec); + if(0 == mec) { + ao1 = dk3fig_obj_new( + obj->li, obj->la, DK3_FIG_OBJ_SPLINE, 5, + obj->lw, obj->pc, ((ah->af) ? obj->pc : 7), 20, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, np, NULL, drw->app + ); + if(ao1) { + ah->o1 = (void *)ao1; + sp = (ao1->dt).spl.po; + if(sp) { + +#line 5793 "dk3figah.ctr" + back = 1; + /* front point */ + sp[0].x = dk3ma_d_add_ok( + (obj->dt).arc.xc, ((obj->dt).arc.ra * cos(a0)), &mec + ); + sp[0].y = dk3ma_d_add_ok( + (obj->dt).arc.yc, ((obj->dt).arc.ra * sin(a0)), &mec + ); + +#line 5801 "dk3figah.ctr" + sp[0].s = 0.0; + /* outer edge */ + for(i = 0; i < nsegs; i++) { + j = i + 1; + if(ab) { + r1 = dk3ma_d_add_ok( + (obj->dt).arc.ra, + (0.5 * ((double)j / (double)nsegs) * ah->wi), + &mec + ); + } else { + r1 = dk3ma_d_sub_ok( + (obj->dt).arc.ra, + (0.5 * ((double)j / (double)nsegs) * ah->wi), + &mec + ); + } + ga = a0 + f * b1 * ((double)j / (double)nsegs); + if(j == nsegs) { + if(ab) { + r1 = dk3ma_d_add_ok((obj->dt).arc.ra, (0.5 * ah->wi), &mec); + } else { + r1 = dk3ma_d_sub_ok((obj->dt).arc.ra, (0.5 * ah->wi), &mec); + } + ga = a0 + f * b1; + } + sp[j].x = dk3ma_d_add_ok( + (obj->dt).arc.xc, (r1 * cos(ga)), &mec + ); + sp[j].y = dk3ma_d_add_ok( + (obj->dt).arc.yc, (r1 * sin(ga)), &mec + ); + +#line 5833 "dk3figah.ctr" + sp[j].s = ((j == nsegs) ? 0.0 : (-1.0)); + } + /* indention edge */ + for(i = 0; i < ns2; i++) { + j = i + 1; + if(ab) { + r1 = dk3ma_d_add_ok( + (obj->dt).arc.ra, + (0.5 * (1.0 - ((double)j / (double)ns2)) * ah->wi), + &mec + ); + } else { + r1 = dk3ma_d_sub_ok( + (obj->dt).arc.ra, + (0.5 * (1.0 - ((double)j / (double)ns2)) * ah->wi), + &mec + ); + } + ga = a0 + f * (b1 + b2 * ((double)j / (double)ns2)); + if(j == ns2) { + r1 = (obj->dt).arc.ra; + ga = a0 + f * (b1 + b2); + } + sp[nsegs + j].x = dk3ma_d_add_ok( + (obj->dt).arc.xc, (r1 * cos(ga)), &mec + ); + sp[nsegs + j].y = dk3ma_d_add_ok( + (obj->dt).arc.yc, (r1 * sin(ga)), &mec + ); + +#line 5862 "dk3figah.ctr" + sp[nsegs + j].s = ((j == ns2) ? 0.0 : (-1.0)); + } + /* inner edge */ + for(i = 0; i < (ns3 - 1); i++) { + j = i + 1; + ga = a0 + f * (b1 + b2 - b3 * ((double)j / (double)ns3)); + sp[nsegs + ns2 + j].x = dk3ma_d_add_ok( + (obj->dt).arc.xc, ((obj->dt).arc.ra * cos(ga)), &mec + ); + sp[nsegs + ns2 + j].y = dk3ma_d_add_ok( + (obj->dt).arc.yc, ((obj->dt).arc.ra * sin(ga)), &mec + ); + +#line 5874 "dk3figah.ctr" + sp[nsegs + ns2 + j].s = -1.0; + } + +#line 5876 "dk3figah.ctr" + } + } + } + } else { + /* ##### ERROR: Arrow too long */ + } + } break; + case DK3_FIG_AS_TRIANGLE_FORK: { + if(ah->af) { + +#line 5885 "dk3figah.ctr" + ao1 = dk3fig_obj_new( + obj->li, obj->la, DK3_FIG_OBJ_POLYLINE, 1, + obj->lw, obj->pc, obj->pc, -1, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, 2, NULL, drw->app + ); + if(ao1) { + +#line 5892 "dk3figah.ctr" + ah->o1 = (void *)ao1; + po = (ao1->dt).pol.po; + if(po) { + +#line 5895 "dk3figah.ctr" + back = 1; + r1 = dk3ma_d_add_ok((obj->dt).arc.ra, (0.5 * ah->wi), &mec); + r2 = dk3ma_d_sub_ok((obj->dt).arc.ra, (0.5 * ah->wi), &mec); + po[0].x = dk3ma_d_add_ok((obj->dt).arc.xc, (r1 * cos(a0)), &mec); + po[0].y = dk3ma_d_add_ok((obj->dt).arc.yc, (r1 * sin(a0)), &mec); + po[1].x = dk3ma_d_add_ok((obj->dt).arc.xc, (r2 * cos(a0)), &mec); + po[1].y = dk3ma_d_add_ok((obj->dt).arc.yc, (r2 * sin(a0)), &mec); + + +#line 5903 "dk3figah.ctr" + + +#line 5904 "dk3figah.ctr" + } + } + } else { + b1 = dk3ma_d_div_ok(ah->he, (obj->dt).arc.ra, &mec); + if(b1 < (2.0 * M_PI)) { + +#line 5909 "dk3figah.ctr" + nsegs = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(b1, drw->arcspp, &mec) / M_PI_2), + &mec + ); + if(drw->minspp > nsegs) { nsegs = drw->minspp; } + np = dk3mem_add_size_t(dk3mem_mul_size_t(2, nsegs, &mec), 1, &mec); + if(0 == mec) { + ao1 = dk3fig_obj_new( + obj->li, obj->la, DK3_FIG_OBJ_SPLINE, 4, + obj->lw, obj->pc, -1, -1, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, np, NULL, drw->app + ); + if(ao1) { + ah->o1 = (void *)ao1; + sp = (ao1->dt).spl.po; + if(sp) { + back = 1; + ga = a0 + f * b1; + sp[nsegs].x = dk3ma_d_add_ok( + (obj->dt).arc.xc, + ((obj->dt).arc.ra * cos(ga)), + &mec + ); + sp[nsegs].y = dk3ma_d_add_ok( + (obj->dt).arc.yc, + ((obj->dt).arc.ra * sin(ga)), + &mec + ); + sp[nsegs].s = 0.0; + for(i = 0; i < nsegs; i++) { + j = i + 1; + r1 = dk3ma_d_add_ok( + (obj->dt).arc.ra, + (0.5 * ((double)j / (double)nsegs) * ah->wi), + &mec + ); + r2 = dk3ma_d_sub_ok( + (obj->dt).arc.ra, + (0.5 * ((double)j / (double)nsegs) * ah->wi), + &mec + ); + ga = a0 + f * b1 * (1.0 - ((double)j / (double)nsegs)); + if(j == nsegs) { + r1 = dk3ma_d_add_ok((obj->dt).arc.ra, (0.5 * ah->wi), &mec); + r2 = dk3ma_d_sub_ok((obj->dt).arc.ra, (0.5 * ah->wi), &mec); + ga = a0; + } + sp[nsegs + j].x = dk3ma_d_add_ok( + (obj->dt).arc.xc, (r1 * cos(ga)), &mec + ); + sp[nsegs + j].y = dk3ma_d_add_ok( + (obj->dt).arc.yc, (r1 * sin(ga)), &mec + ); + sp[nsegs + j].s = ((j == nsegs) ? 0.0 : (-1.0)); + sp[nsegs - j].x = dk3ma_d_add_ok( + (obj->dt).arc.xc, (r2 * cos(ga)), &mec + ); + sp[nsegs - j].y = dk3ma_d_add_ok( + (obj->dt).arc.yc, (r2 * sin(ga)), &mec + ); + sp[nsegs - j].s = ((j == nsegs) ? 0.0 : (-1.0)); + } + } + } + } + } else { + /* ##### ERROR: Arrow too long! */ + } + } + } break; + case DK3_FIG_AS_RECTANGLE_FORK: { + b1 = dk3ma_d_div_ok(ah->he, (obj->dt).arc.ra, &mec); + if(b1 < (2.0 * M_PI)) { + +#line 5983 "dk3figah.ctr" + nsegs = dk3ma_d_to_sz_ok( + ceil(dk3ma_d_mul_ok(b1, drw->arcspp, &mec) / M_PI_2), + &mec + ); + +#line 5987 "dk3figah.ctr" + if(drw->minspp > nsegs) { nsegs = drw->minspp; } + np = dk3mem_mul_size_t(2, dk3mem_add_size_t(nsegs, 1, &mec), &mec); + if(0 == mec) { + +#line 5990 "dk3figah.ctr" + ao1 = dk3fig_obj_new( + obj->li, obj->la, DK3_FIG_OBJ_SPLINE, 4, + obj->lw, obj->pc, obj->pc, -1, + DK3_FIG_LC_BUTT, DK3_FIG_LJ_MITER, DK3_FIG_LS_SOLID, + 1.0, 0, 0, np, NULL, drw->app + ); + if(ao1) { + ah->o1 = (void *)ao1; + sp = (ao1->dt).spl.po; + if(sp) { + back = 1; + r1 = dk3ma_d_add_ok((obj->dt).arc.ra, (0.5 * ah->wi), &mec); + r2 = dk3ma_d_sub_ok((obj->dt).arc.ra, (0.5 * ah->wi), &mec); + if(ah->af) { + +#line 6004 "dk3figah.ctr" + ga = a0; + } else { + +#line 6006 "dk3figah.ctr" + ga = a0 + f * b1; + } + sp[nsegs].x = dk3ma_d_add_ok( + (obj->dt).arc.xc, (r1 * cos(ga)), &mec + ); + sp[nsegs].y = dk3ma_d_add_ok( + (obj->dt).arc.yc, (r1 * sin(ga)), &mec + ); + +#line 6014 "dk3figah.ctr" + sp[nsegs].s = 0.0; + sp[nsegs + 1].x = dk3ma_d_add_ok( + (obj->dt).arc.xc, (r2 * cos(ga)), &mec + ); + sp[nsegs + 1].y = dk3ma_d_add_ok( + (obj->dt).arc.yc, (r2 * sin(ga)), &mec + ); + +#line 6021 "dk3figah.ctr" + sp[nsegs + 1].s = 0.0; + for(i = 0; i < nsegs; i++) { + j = i + 1; + if(ah->af) { + ga = a0 + f * b1 * ((double)j / (double)nsegs); + } else { + ga = a0 + f * b1 * (1.0 - ((double)j / (double)nsegs)); + } + sp[nsegs - j].x = dk3ma_d_add_ok( + (obj->dt).arc.xc, (r1 * cos(ga)), &mec + ); + sp[nsegs - j].y = dk3ma_d_add_ok( + (obj->dt).arc.yc, (r1 * sin(ga)), &mec + ); + +#line 6035 "dk3figah.ctr" + sp[nsegs - j].s = 0.0; + sp[nsegs + 1 + j].x = dk3ma_d_add_ok( + (obj->dt).arc.xc, (r2 * cos(ga)), &mec + ); + sp[nsegs + 1 + j].y = dk3ma_d_add_ok( + (obj->dt).arc.yc, (r2 * sin(ga)), &mec + ); + +#line 6042 "dk3figah.ctr" + sp[nsegs + 1 + j].s = 0.0; + } + } + } else { + dk3fig_set_ec(drw, DK3_ERROR_MEMORY); + } + } + } else { + /* ##### ERROR: Arrowhead too long! */ + } + } break; + } + if(mec) { + +#line 6055 "dk3figah.ctr" + back = 0; + if(ec) { *ec = mec; } + } + + +#line 6059 "dk3figah.ctr" + return back; +} + + + +/** Calculate arrowheads for arc. + @param drw Drawing to modify. + @param obj Object to modify. + @param objno Object number. + @return 1 on success, 0 on error. +*/ +static +int +dk3figah_calculate_arc( + dk3_fig_drawing_t *drw, + dk3_fig_obj_t *obj, + unsigned long objno +) +{ + dk3_fig_poly_point_t sp; + double cuts = -1.0; + double cute = -1.0; + double das = 0.0; + double dae = 0.0; + double newas = 0.0; + double newae = 0.0; + double alphaf = 0.0; + double alphab = 0.0; + int back = 1; + int mec = 0; + int res = 0; + + +#line 6091 "dk3figah.ctr" + /* + Construct arrowhead objects. + */ + if(obj->af) { + cute = dk3figah_length_correction(drw, obj, obj->af, &mec); + } + if(obj->ab) { + cuts = dk3figah_length_correction(drw, obj, obj->ab, &mec); + } + +#line 6100 "dk3figah.ctr" + /* + Create arrowhead objects. + */ + if((obj->dt).arc.ae >= (obj->dt).arc.as) { + if(obj->af) { + alphaf = (obj->dt).arc.ae + M_PI_2; + } + if(obj->ab) { + alphab = (obj->dt).arc.as - M_PI_2; + } + } else { + if(obj->af) { + alphaf = (obj->dt).arc.ae - M_PI_2; + } + if(obj->ab) { + alphab = (obj->dt).arc.as + M_PI_2; + } + } + if(drw->coah) { + if(obj->af) { + sp.x = dk3ma_d_add_ok( + (obj->dt).arc.xc, + ((obj->dt).arc.ra * cos((obj->dt).arc.ae)), + &mec + ); + sp.y = dk3ma_d_add_ok( + (obj->dt).arc.yc, + ((obj->dt).arc.ra * sin((obj->dt).arc.ae)), + &mec + ); + +#line 6130 "dk3figah.ctr" + res = dk3figah_straight_arrowhead( + drw, obj, obj->af, &sp, alphaf, &mec + ); + if(!(res)) { back = 0; } + } + if(obj->ab) { + sp.x = dk3ma_d_add_ok( + (obj->dt).arc.xc, + ((obj->dt).arc.ra * cos((obj->dt).arc.as)), + &mec + ); + sp.y = dk3ma_d_add_ok( + (obj->dt).arc.yc, + ((obj->dt).arc.ra * sin((obj->dt).arc.as)), + &mec + ); + +#line 6146 "dk3figah.ctr" + res = dk3figah_straight_arrowhead( + drw, obj, obj->ab, &sp, alphab, &mec + ); + if(!(res)) { back = 0; } + } + if(mec) { back = 0; } + } else { + if(obj->af) { + if(!dk3figah_one_arc_arrowhead(drw, obj, obj->af, 0, &mec)) { + back = 0; + } + } + if(obj->ab) { + if(!dk3figah_one_arc_arrowhead(drw, obj, obj->ab, 1, &mec)) { + back = 0; + } + } + } + /* + Cut arc if necessary when not using compatible arrowheads. + */ + if(!(drw->coah)) { + newas = (obj->dt).arc.as; + newae = (obj->dt).arc.ae; + if(0.0 < cuts) { + +#line 6171 "dk3figah.ctr" + if(dk3figah_must_use_arc_correction(obj->ab)) { + das = dk3figah_arc_correction((obj->dt).arc.ra, cuts, &mec); + if(0.0 <= das) { + if((obj->dt).arc.di) { + +#line 6175 "dk3figah.ctr" + newas = dk3ma_d_add_ok(newas, das, &mec); + } else { + +#line 6177 "dk3figah.ctr" + newas = dk3ma_d_sub_ok(newas, das, &mec); + } + } else { + mec = DK3_ERROR_MATH_OUT_OF_RANGE; + } + } else { + das = dk3ma_d_div_ok(cuts, (obj->dt).arc.ra, &mec); + + +#line 6185 "dk3figah.ctr" + if((obj->dt).arc.di) { + +#line 6186 "dk3figah.ctr" + newas = dk3ma_d_add_ok(newas, das, &mec); + } else { + +#line 6188 "dk3figah.ctr" + newas = dk3ma_d_sub_ok(newas, das, &mec); + } + } + } + if(0.0 < cute) { + +#line 6193 "dk3figah.ctr" + if(dk3figah_must_use_arc_correction(obj->af)) { + dae = dk3figah_arc_correction((obj->dt).arc.ra, cute, &mec); + if(0.0 <= dae) { + if((obj->dt).arc.di) { + +#line 6197 "dk3figah.ctr" + newae = dk3ma_d_sub_ok(newae, dae, &mec); + } else { + +#line 6199 "dk3figah.ctr" + newae = dk3ma_d_add_ok(newae, dae, &mec); + } + } else { + mec = DK3_ERROR_MATH_OUT_OF_RANGE; + } + } else { + dae = dk3ma_d_div_ok(cute, (obj->dt).arc.ra, &mec); + + +#line 6207 "dk3figah.ctr" + if((obj->dt).arc.di) { + +#line 6208 "dk3figah.ctr" + newae = dk3ma_d_sub_ok(newae, dae, &mec); + } else { + +#line 6210 "dk3figah.ctr" + newae = dk3ma_d_add_ok(newae, dae, &mec); + } + } + } + if(0 == mec) { + + +#line 6216 "dk3figah.ctr" + + +#line 6217 "dk3figah.ctr" + + +#line 6218 "dk3figah.ctr" + + +#line 6219 "dk3figah.ctr" + + +#line 6220 "dk3figah.ctr" + + +#line 6221 "dk3figah.ctr" + + +#line 6222 "dk3figah.ctr" + + +#line 6223 "dk3figah.ctr" + (obj->dt).arc.as = newas; (obj->dt).arc.ae = newae; + } else { + /* ##### ERROR: Math error */ + back = 0; + } + } else { + if(0 != mec) { + back = 0; + dk3app_log_i1(drw->app, DK3_LL_ERROR, 260); + } + } + + +#line 6235 "dk3figah.ctr" + return back; +} + + + +int +dk3figah_calculate_arrowheads( + dk3_fig_drawing_t *drw, + dk3_fig_obj_t *obj, + unsigned long objno +) +{ + int back = 0; + int failed = 0; + + +#line 6250 "dk3figah.ctr" + if((drw) && (obj)) { + back = 1; + if(dk3figah_candidate(obj)) { + /* + Use butted line when arrowheads on both ends. + */ + if((obj->af) && (obj->ab)) { obj->cs = DK3_FIG_LC_BUTT; } + switch(obj->ot) { + case DK3_FIG_OBJ_POLYLINE: { + back = dk3figah_calculate_polyline(drw, obj, objno); + if(!(back)) { failed = 1; } + } break; + case DK3_FIG_OBJ_SPLINE: { + back = dk3figah_calculate_spline(drw, obj, objno); + if(!(back)) { failed = 1; } + } break; + case DK3_FIG_OBJ_ARC: { + back = dk3figah_calculate_arc(drw, obj, objno); + if(!(back)) { failed = 1; } + } break; + } + if(failed) { + /* ##### ERROR: Arrowhead calculation failed! */ + } + } + } + if((!(back)) && (NULL != drw)) { + dk3app_log_1(drw->app, DK3_LL_ERROR, drw->msg, 5); + } + +#line 6279 "dk3figah.ctr" + return back; +} + -- cgit v1.2.3