/* 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; }