/* Copyright (C) 2012-2020, Dirk Krause SPDX-License-Identifier: BSD-3-Clause */ /* WARNING: This file was generated by the dkct program (see http://dktools.sourceforge.net/ for details). 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: dk3figpr.ctr */ /** @file dk3figpr.c The dk3figpr module. */ #line 48 "dk3figpr.ctr" #include "dk3all.h" #include "dk3fig.h" #include "dk3figto.h" #include "dk3figpr.h" #include "dk3figbb.h" #include "dk3figah.h" #include "fig2lat.h" #line 58 "dk3figpr.ctr" /** If the first object is a background rectangle check whether it was created by jFig or XFig. @param drw Drawing. @param obj Object to check. @param objno Object number. */ static void dk3fig_prepare_check_bgrect( dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, unsigned long objno ) { #line 76 "dk3figpr.ctr" if(dk3fig_tool_is_bgrect(obj, objno)) { if(DK3_FIG_SRCTYPE_UNKNOWN == drw->srctype) { switch(obj->pc) { case 7: { #line 80 "dk3figpr.ctr" drw->srctype = DK3_FIG_SRCTYPE_JFIG; } break; default: { #line 83 "dk3figpr.ctr" drw->srctype = DK3_FIG_SRCTYPE_XFIG; } break; } } } #line 88 "dk3figpr.ctr" } #if TRACE_DEBUG /** Calculate distance of 2 points, used to verify the correct radius calculation for args. @param x1 Point 1 x. @param x2 Point 2 x. @param y1 Point 1 y. @param y2 Point 2 y. @return Distance between points. */ static double dk3fig_prepare_point_distance( double x1, double x2, double y1, double y2 ) { double back; back = sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); return back; } #endif /** Initialize arc object (calculate center and radius). @param drw Drawing. @param obj Object. @param objno Object number (0 for first object). @param primobj Flag: Primary object (1=object, 0=arrowhead). @return 1 on success, 0 on error. */ static int dk3fig_prepare_initialize_arc( dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ) { dk3_fig_poly_point_t *points; dk3_fig_det_arc_t *arc; double tm; /* The t parameter of the M point. */ double n; /* Denominator in tm calculation. */ double xa; double ya; double xc; double yc; double r; double eps = DK3_FIG_EPSILON; int back = 1; int ec = 0; int divec = 0; #line 142 "dk3figpr.ctr" arc = &((obj->dt).arc); n = dk3ma_d_sub_ok( dk3ma_d_mul_ok( dk3ma_d_sub_ok(arc->y2, arc->y1, &ec), dk3ma_d_sub_ok(arc->x2, arc->x3, &ec), &ec ), dk3ma_d_mul_ok( dk3ma_d_sub_ok(arc->y3, arc->y2, &ec), dk3ma_d_sub_ok(arc->x1, arc->x2, &ec), &ec ), &ec ); tm = 0.5 * dk3ma_d_div_ok( dk3ma_d_sub_ok( dk3ma_d_mul_ok( dk3ma_d_sub_ok(arc->x2, arc->x3, &ec), dk3ma_d_sub_ok(arc->x3, arc->x1, &ec), &ec ), dk3ma_d_mul_ok( dk3ma_d_sub_ok(arc->y3, arc->y2, &ec), dk3ma_d_sub_ok(arc->y3, arc->y1, &ec), &ec ), &ec ), n, &divec ); if(0 == divec) { arc->xc = dk3ma_d_add_ok( (0.5 * dk3ma_d_add_ok(arc->x1, arc->x2, &ec)), dk3ma_d_mul_ok( tm, dk3ma_d_sub_ok(arc->y2, arc->y1, &ec), &ec ), &ec ); arc->yc = dk3ma_d_add_ok( (0.5 * dk3ma_d_add_ok(arc->y1, arc->y2, &ec)), dk3ma_d_mul_ok( tm, dk3ma_d_sub_ok(arc->x1, arc->x2, &ec), &ec ), &ec ); arc->ra = sqrt( dk3ma_d_add_ok( dk3ma_d_mul_ok( dk3ma_d_sub_ok(arc->xc, arc->x1, &ec), dk3ma_d_sub_ok(arc->xc, arc->x1, &ec), &ec ), dk3ma_d_mul_ok( dk3ma_d_sub_ok(arc->yc, arc->y1, &ec), dk3ma_d_sub_ok(arc->yc, arc->y1, &ec), &ec ), &ec ) ); arc->as = dk3ma_d_atan2( dk3ma_d_sub_ok(arc->y1, arc->yc, &ec), dk3ma_d_sub_ok(arc->x1, arc->xc, &ec) ); arc->ae = dk3ma_d_atan2( dk3ma_d_sub_ok(arc->y3, arc->yc, &ec), dk3ma_d_sub_ok(arc->x3, arc->xc, &ec) ); if(n >= 0.0) { arc->di = 0x01; while(arc->ae < arc->as) { arc->ae = arc->ae + (2.0 * M_PI); } } else { arc->di = 0x00; while(arc->as < arc->ae) { arc->as = arc->as + (2.0 * M_PI); } } #line 227 "dk3figpr.ctr" #line 228 "dk3figpr.ctr" #line 229 "dk3figpr.ctr" #line 230 "dk3figpr.ctr" #line 231 "dk3figpr.ctr" #line 232 "dk3figpr.ctr" #line 233 "dk3figpr.ctr" #line 234 "dk3figpr.ctr" #line 235 "dk3figpr.ctr" #line 236 "dk3figpr.ctr" #line 237 "dk3figpr.ctr" } else { /* line */ back = 0; xa = arc->x1; ya = arc->y1; xc = arc->x3; yc = arc->y3; if(dk3ma_d_equal(xa, xc, eps) && dk3ma_d_equal(ya, yc, eps)) { r = 0.5 * dk3fig_tool_get_lw(drw, obj, &ec); switch(obj->cs) { case DK3_FIG_LC_ROUND: { back = 1; dk3mem_res( (void *)(&((obj->dt))), sizeof(dk3_fig_obj_det_t) ); obj->ot = DK3_FIG_OBJ_ELLIPSE; obj->st = 3; /* Circle defined by radius */ obj->lw = 0; obj->fc = obj->pc; obj->fi = 20; /* Full saturation of color. */ obj->cs = DK3_FIG_LC_BUTT; obj->js = DK3_FIG_LJ_MITER; obj->ls = DK3_FIG_LS_SOLID; obj->cl = 1; (obj->dt).ell.an = 0.0; (obj->dt).ell.cx = xa; (obj->dt).ell.cy = ya; (obj->dt).ell.rx = (obj->dt).ell.ry = r; } break; default: { points = dk3_new_app(dk3_fig_poly_point_t,4,drw->app); if(points) { back = 1; points[0].x = points[3].x = dk3ma_d_sub_ok(xa, r, &ec); points[1].x = points[2].x = dk3ma_d_add_ok(xa, r, &ec); points[0].y = points[1].y = dk3ma_d_sub_ok(ya, r, &ec); points[2].y = points[3].y = dk3ma_d_add_ok(ya, r, &ec); dk3mem_res( (void *)(&((obj->dt))), sizeof(dk3_fig_obj_det_t) ); obj->ot = DK3_FIG_OBJ_POLYLINE; obj->st = 3; /* Polygon */ obj->lw = 0; obj->fc = obj->pc; obj->fi = 20; /* Full saturation of color. */ obj->cs = DK3_FIG_LC_BUTT; obj->js = DK3_FIG_LJ_MITER; obj->ls = DK3_FIG_LS_SOLID; obj->cl = 1; (obj->dt).pol.fn = NULL; (obj->dt).pol.po = points; (obj->dt).pol.ra = 0.0; (obj->dt).pol.xs = 0.0; (obj->dt).pol.ys = 0.0; (obj->dt).pol.xe = 0.0; (obj->dt).pol.ye = 0.0; (obj->dt).pol.np = 4; (obj->dt).pol.flf = 0; } else { back = 0; dk3fig_set_ec(drw, DK3_ERROR_MEMORY); } } break; } } else { points = dk3_new_app(dk3_fig_poly_point_t,2,drw->app); if(points) { back = 1; points[0].x = xa; points[0].y = ya; points[1].x = xc; points[1].y = yc; (obj->dt).pol.fn = NULL; (obj->dt).pol.po = points; (obj->dt).pol.ra = 0.0; (obj->dt).pol.xs = xa; (obj->dt).pol.ys = ya; (obj->dt).pol.xe = xc; (obj->dt).pol.ye = yc; (obj->dt).pol.np = 2; (obj->dt).pol.flf = 0; obj->ot = DK3_FIG_OBJ_POLYLINE; obj->st = 1; } else { dk3fig_set_ec(drw, DK3_ERROR_MEMORY); /* memory allocation failed, reported by back == 0. */ } } } if(ec) { #line 329 "dk3figpr.ctr" back = 0; /* ERROR: Mathematical problem with arc! */ dk3fig_set_ec(drw, DK3_ERROR_MATH_OVERFLOW); dk3app_log_1(drw->app, DK3_LL_ERROR, drw->msg, 3); } #line 335 "dk3figpr.ctr" return back; } /** Convert polyline to circle or squara if necessary. @param drw Drawing. @param obj Object. @return 1 on success, 0 on error. */ static int dk3fig_prepare_initialize_polyline( dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ) { dk3_fig_poly_point_t *newpoints; double cx; double cy; double r; double x1; double x2; double y1; double y2; double eps = DK3_FIG_EPSILON; int back = 1; int mc = 0; int ec = 0; #line 364 "dk3figpr.ctr" if(1 == (obj->dt).pol.np) { mc = 1; } else { if(2 == (obj->dt).pol.np) { if(dk3ma_d_equal(((obj->dt).pol.po)[0].x, ((obj->dt).pol.po)[1].x, eps)) { if(dk3ma_d_equal(((obj->dt).pol.po)[0].y, ((obj->dt).pol.po)[1].y, eps)) { mc = 1; } } } } if(mc) { switch(obj->cs) { case DK3_FIG_LC_ROUND: { #line 378 "dk3figpr.ctr" cx = ((obj->dt).pol.po)[0].x; cy = ((obj->dt).pol.po)[0].y; r = 0.5 * dk3fig_tool_get_lw(drw, obj, &ec); dk3_release((obj->dt).pol.fn); dk3_release((obj->dt).pol.po); dk3mem_res( (void *)(&((obj->dt))), sizeof(dk3_fig_obj_det_t) ); obj->ot = DK3_FIG_OBJ_ELLIPSE; obj->st = 3; /* Circle defined by radius */ obj->lw = 0; obj->fc = obj->pc; obj->fi = 20; /* Full saturation of color. */ obj->cs = DK3_FIG_LC_BUTT; obj->js = DK3_FIG_LJ_MITER; obj->ls = DK3_FIG_LS_SOLID; obj->cl = 1; (obj->dt).ell.an = 0.0; (obj->dt).ell.cx = cx; (obj->dt).ell.cy = cy; (obj->dt).ell.rx = (obj->dt).ell.ry = r; } break; default: { #line 402 "dk3figpr.ctr" cx = ((obj->dt).pol.po)[0].x; cy = ((obj->dt).pol.po)[0].y; r = 0.5 * dk3fig_tool_get_lw(drw, obj, &ec); x1 = dk3ma_d_sub_ok(cx, r, &ec); x2 = dk3ma_d_add_ok(cx, r, &ec); y1 = dk3ma_d_sub_ok(cy, r, &ec); y2 = dk3ma_d_add_ok(cy, r, &ec); newpoints = dk3_new_app(dk3_fig_poly_point_t,4,drw->app); if(newpoints) { newpoints[0].x = x1; newpoints[0].y = y1; newpoints[1].x = x2; newpoints[1].y = y1; newpoints[2].x = x2; newpoints[2].y = y2; newpoints[3].x = x1; newpoints[3].y = y2; dk3_release((obj->dt).pol.fn); dk3_release((obj->dt).pol.po); dk3mem_res( (void *)(&((obj->dt))), sizeof(dk3_fig_obj_det_t) ); obj->ot = DK3_FIG_OBJ_POLYLINE; obj->st = 3; /* Polygon */ obj->lw = 0; obj->fc = obj->pc; obj->fi = 20; /* Full saturation of color. */ obj->cs = DK3_FIG_LC_BUTT; obj->js = DK3_FIG_LJ_MITER; obj->ls = DK3_FIG_LS_SOLID; obj->cl = 1; (obj->dt).pol.fn = NULL; (obj->dt).pol.po = newpoints; (obj->dt).pol.ra = 0.0; (obj->dt).pol.xs = 0.0; (obj->dt).pol.ys = 0.0; (obj->dt).pol.xe = 0.0; (obj->dt).pol.ye = 0.0; (obj->dt).pol.np = 4; (obj->dt).pol.flf = 0; } else { back = 0; dk3fig_set_ec(drw, DK3_ERROR_MEMORY); } } break; } } if(ec) { #line 447 "dk3figpr.ctr" /* ERROR: Math */ dk3fig_set_ec(drw, DK3_ERROR_MATH_OVERFLOW); back = 0; dk3app_log_i1(drw->app, DK3_LL_ERROR, 260); } #line 452 "dk3figpr.ctr" return back; } #if 0 /* Only polylines are allowed to have one point, not splines. */ /** Convert spline to circle or squara if necessary. @param drw Drawing. @param obj Object. @param objno Object number (0 for first object). @param primobj Flag: Primary object (1=object, 0=arrowhead). @return 1 on success, 0 on error. */ static int dk3fig_prepare_initialize_spline( dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, unsigned long objno, int primobj ) { dk3_fig_poly_point_t *newpoints; double cx; double cy; double r; double x1; double x2; double y1; double y2; double eps = DK3_FIG_EPSILON; int back = 1; int mc = 0; int ec = 0; #line 487 "dk3figpr.ctr" if(1 == (obj->dt).spl.np) { mc = 1; } else { if(2 == (obj->dt).spl.np) { if(dk3ma_d_equal(((obj->dt).spl.po)[0].x, ((obj->dt).spl.po)[1].x, eps)) { if(dk3ma_d_equal(((obj->dt).spl.po)[0].y, ((obj->dt).spl.po)[1].y, eps)) { mc = 1; } } } } if(mc) { switch(obj->cs) { case DK3_FIG_LC_ROUND: { #line 501 "dk3figpr.ctr" cx = ((obj->dt).spl.po)[0].x; cy = ((obj->dt).spl.po)[0].y; r = 0.5 * dk3fig_tool_get_lw(drw, obj, &ec); dk3_release((obj->dt).spl.po); dk3mem_res( (void *)(&((obj->dt))), sizeof(dk3_fig_obj_det_t) ); obj->ot = DK3_FIG_OBJ_ELLIPSE; obj->st = 3; /* Circle defined by radius */ obj->lw = 0; obj->fc = obj->pc; obj->fi = 20; /* Full saturation of color. */ obj->cs = DK3_FIG_LC_BUTT; obj->js = DK3_FIG_LJ_MITER; obj->ls = DK3_FIG_LS_SOLID; obj->cl = 1; (obj->dt).ell.an = 0.0; (obj->dt).ell.cx = cx; (obj->dt).ell.cy = cy; (obj->dt).ell.rx = (obj->dt).ell.ry = r; } break; default: { #line 524 "dk3figpr.ctr" cx = ((obj->dt).spl.po)[0].x; cy = ((obj->dt).spl.po)[0].y; r = 0.5 * dk3fig_tool_get_lw(drw, obj, &ec); x1 = dk3ma_d_sub_ok(cx, r, &ec); x2 = dk3ma_d_add_ok(cx, r, &ec); y1 = dk3ma_d_sub_ok(cy, r, &ec); y2 = dk3ma_d_add_ok(cy, r, &ec); newpoints = dk3_new_app(dk3_fig_poly_point_t,4,drw->app); if(newpoints) { newpoints[0].x = x1; newpoints[0].y = y1; newpoints[1].x = x2; newpoints[1].y = y1; newpoints[2].x = x2; newpoints[2].y = y2; newpoints[3].x = x1; newpoints[3].y = y2; dk3_release((obj->dt).spl.po); dk3mem_res( (void *)(&((obj->dt))), sizeof(dk3_fig_obj_det_t) ); obj->ot = DK3_FIG_OBJ_POLYLINE; obj->st = 3; /* Polygon */ obj->lw = 0; obj->fc = obj->pc; obj->fi = 20; /* Full saturation of color. */ obj->cs = DK3_FIG_LC_BUTT; obj->js = DK3_FIG_LJ_MITER; obj->ls = DK3_FIG_LS_SOLID; obj->cl = 1; (obj->dt).pol.fn = NULL; (obj->dt).pol.po = newpoints; (obj->dt).pol.ra = 0.0; (obj->dt).pol.xs = 0.0; (obj->dt).pol.ys = 0.0; (obj->dt).pol.xe = 0.0; (obj->dt).pol.ye = 0.0; (obj->dt).pol.np = 4; (obj->dt).pol.flf = 0; } else { back = 0; } } break; } } if(ec) { #line 567 "dk3figpr.ctr" dk3fig_set_ec(drw, DK3_ERROR_MATH_OVERFLOW); /* ERROR: Math */ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 38); } #line 571 "dk3figpr.ctr" return back; } #endif /** Object type specific initialization. @param drw Drawing. @param obj Object. @return 1 on success, 0 on error. */ static int dk3fig_prepare_initialize_object( dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj ) { int back = 1; #line 591 "dk3figpr.ctr" switch(obj->ot) { case DK3_FIG_OBJ_POLYLINE: { back = dk3fig_prepare_initialize_polyline(drw, obj); } break; #if 0 /* Only polylines are allowed to have one point, not splines. */ case DK3_FIG_OBJ_SPLINE: { back = dk3fig_prepare_initialize_spline(drw, obj, objno, primobj); } break; #endif case DK3_FIG_OBJ_ARC: { back = dk3fig_prepare_initialize_arc(drw, obj); } break; } #line 607 "dk3figpr.ctr" return back; } /** Add object to drawing bounding box. @param drw Drawing to calculate the bounding box for. @param obj Object to add to bounding box. @param primobj Flag: Primary object (1=object, 0=arrowhead). @return 1 on success, 0 on error. */ static int dk3fig_prepare_add_to_bb( dk3_fig_drawing_t *drw, dk3_fig_obj_t const *obj, int primobj ); /** Add objects for one arrowhead to bounding box. @param drw @param ah @return 1 on success, 0 on error. */ static int dk3fig_prepare_arrowhead_object( dk3_fig_drawing_t *drw, dk3_fig_ah_t const *ah ) { int back = 1; #line 642 "dk3figpr.ctr" if(ah) { if(ah->o1) { if(!dk3fig_prepare_add_to_bb(drw, (dk3_fig_obj_t *)(ah->o1), 0)) { back = 0; } } if(ah->o2) { if(!dk3fig_prepare_add_to_bb(drw, (dk3_fig_obj_t *)(ah->o2), 0)) { back = 0; } } if(!(back)) { dk3fig_set_ec(drw, DK3_ERROR_MATH_OVERFLOW); /* ERROR: Math overflow */ } } #line 658 "dk3figpr.ctr" return back; } int dk3fig_prepare_obj_bb( dk3_bb_t *dbb, dk3_fig_drawing_t *drw, dk3_fig_obj_t const *obj, int primobj ) { int back = 0; int notfound = 0; switch(obj->ot) { case DK3_FIG_OBJ_ELLIPSE: { #line 675 "dk3figpr.ctr" back = dk3fig_bb_add_ellipse( dbb, &((obj->dt).ell), (0.5 * dk3fig_tool_get_lw(drw, obj, NULL)) ); } break; case DK3_FIG_OBJ_POLYLINE: { #line 680 "dk3figpr.ctr" back = dk3fig_bb_add_polyline( dbb, &((obj->dt).pol), (0.5 * dk3fig_tool_get_lw(drw, obj, NULL)) ); } break; case DK3_FIG_OBJ_SPLINE: { #line 685 "dk3figpr.ctr" back = dk3fig_bb_add_spline( drw, dbb, &((obj->dt).spl), (0.5 * dk3fig_tool_get_lw(drw, obj, NULL)), primobj, ((obj->cl) ? 1 : 0) ); } break; case DK3_FIG_OBJ_TEXT: { #line 693 "dk3figpr.ctr" back = dk3fig_bb_add_text( dbb, &((obj->dt).txt), drw->res, drw->bbts ); } break; case DK3_FIG_OBJ_ARC: { #line 698 "dk3figpr.ctr" back = dk3fig_bb_add_arc( dbb, &((obj->dt).arc), ((1 != obj->st) ? 1 : 0), (0.5 * dk3fig_tool_get_lw(drw, obj, NULL)) ); } break; default: { #line 705 "dk3figpr.ctr" dk3fig_set_ec(drw, DK3_ERROR_SYNTAX); /* ERROR: Unknown object type! */ dk3app_log_1(drw->app, DK3_LL_ERROR, drw->msg, 8); notfound = 1; } break; } if(!(back)) { if(!(notfound)) { dk3fig_set_ec(drw, DK3_ERROR_MATH_OVERFLOW); /* ERROR: Math overflow */ } } return back; } static int dk3fig_prepare_add_to_bb( dk3_fig_drawing_t *drw, dk3_fig_obj_t const *obj, int primobj ) { #if TEST_SHOW_EACH_BB int back = 0; dk3_bb_t mybb; #line 734 "dk3figpr.ctr" dk3bb_reset(&mybb); switch(obj->ot) { case DK3_FIG_OBJ_ELLIPSE: { #line 737 "dk3figpr.ctr" back = dk3fig_bb_add_ellipse( &mybb, &((obj->dt).ell), (0.5 * dk3fig_tool_get_lw(drw, obj, NULL)) ); } break; case DK3_FIG_OBJ_POLYLINE: { #line 742 "dk3figpr.ctr" back = dk3fig_bb_add_polyline( &mybb, &((obj->dt).pol), (0.5 * dk3fig_tool_get_lw(drw, obj, NULL)) ); } break; case DK3_FIG_OBJ_SPLINE: { #line 747 "dk3figpr.ctr" back = dk3fig_bb_add_spline( drw, &mybb, &((obj->dt).spl), (0.5 * dk3fig_tool_get_lw(drw, obj, NULL)), primobj, ((obj->cl) ? 1 : 0) ); } break; case DK3_FIG_OBJ_TEXT: { #line 755 "dk3figpr.ctr" back = dk3fig_bb_add_text( &mybb, &((obj->dt).txt), drw->res, drw->bbts ); } break; case DK3_FIG_OBJ_ARC: { #line 760 "dk3figpr.ctr" back = dk3fig_bb_add_arc( &mybb, &((obj->dt).arc), ((1 != obj->st) ? 1 : 0), (0.5 * dk3fig_tool_get_lw(drw, obj, NULL)) ); } break; case DK3_FIG_OBJ_PSEUDO_HALF_CIRCLE: { back = dk3fig_bb_add_hci( &mybb, &(obj->dt).hci, (0.5 * dk3fig_tool_get_lw(drw, obj, NULL)) ); } break; default: { #line 772 "dk3figpr.ctr" } break; } #line 774 "dk3figpr.ctr" dk3bb_merge(&(drw->bb), &mybb); if(primobj) { if(!dk3fig_prepare_arrowhead_object(drw, obj->af)) { back = 0; } if(!dk3fig_prepare_arrowhead_object(drw, obj->ab)) { back = 0; } } if(!(back)) { /* ERROR: Math overflow */ dk3fig_set_ec(drw, DK3_ERROR_MATH_OVERFLOW); dk3app_log_i1(drw->app, DK3_LL_ERROR, 260); } #line 785 "dk3figpr.ctr" return back; #else int back = 0; #line 789 "dk3figpr.ctr" switch(obj->ot) { case DK3_FIG_OBJ_ELLIPSE: { #line 791 "dk3figpr.ctr" back = dk3fig_bb_add_ellipse( &(drw->bb), &((obj->dt).ell), (0.5 * dk3fig_tool_get_lw(drw, obj, NULL)) ); } break; case DK3_FIG_OBJ_POLYLINE: { #line 796 "dk3figpr.ctr" back = dk3fig_bb_add_polyline( &(drw->bb), &((obj->dt).pol), (0.5 * dk3fig_tool_get_lw(drw, obj, NULL)) ); } break; case DK3_FIG_OBJ_SPLINE: { #line 801 "dk3figpr.ctr" back = dk3fig_bb_add_spline( drw, &(drw->bb), &((obj->dt).spl), (0.5 * dk3fig_tool_get_lw(drw, obj, NULL)), primobj, ((obj->cl) ? 1 : 0) ); } break; case DK3_FIG_OBJ_TEXT: { #line 809 "dk3figpr.ctr" back = dk3fig_bb_add_text( &(drw->bb), &((obj->dt).txt), drw->res, drw->bbts ); } break; case DK3_FIG_OBJ_ARC: { #line 814 "dk3figpr.ctr" back = dk3fig_bb_add_arc( &(drw->bb), &((obj->dt).arc), ((1 != obj->st) ? 1 : 0), (0.5 * dk3fig_tool_get_lw(drw, obj, NULL)) ); } break; case DK3_FIG_OBJ_PSEUDO_HALF_CIRCLE: { back = dk3fig_bb_add_hci( &(drw->bb), &((obj->dt).hci), (0.5 * dk3fig_tool_get_lw(drw, obj, NULL)) ); } break; default: { #line 826 "dk3figpr.ctr" } break; } if(primobj) { if(!dk3fig_prepare_arrowhead_object(drw, obj->af)) { back = 0; } if(!dk3fig_prepare_arrowhead_object(drw, obj->ab)) { back = 0; } } if(!(back)) { /* ERROR: Math overflow */ dk3fig_set_ec(drw, DK3_ERROR_MATH_OVERFLOW); dk3app_log_i1(drw->app, DK3_LL_ERROR, 260); } #line 838 "dk3figpr.ctr" return back; #endif } #if TRACE_DEBUG /** Report object to trace file. @param obj Object to report. @param primobj Flag: Primary object (1=object, 0=arrowhead). */ static void dk3fig_prepare_report_object(dk3_fig_obj_t *obj, int primobj); /** Report one arrowhead to trace file. @param ah Arrowhead to report. */ static void dk3fig_prepare_report_ah(dk3_fig_ah_t *ah) { if(ah) { #line 862 "dk3figpr.ctr" if(ah->o1) { dk3fig_prepare_report_object((dk3_fig_obj_t *)(ah->o1), 0); } if(ah->o2) { dk3fig_prepare_report_object((dk3_fig_obj_t *)(ah->o2), 0); } #line 869 "dk3figpr.ctr" } } static void dk3fig_prepare_report_object(dk3_fig_obj_t *obj, int primobj) { FILE *fipo; dk3_fig_poly_point_t *pp; dk3_fig_spline_point_t *sp; size_t i; #line 883 "dk3figpr.ctr" fipo = dktrace_file(); if(fipo) { switch(obj->ot) { case DK3_FIG_OBJ_ELLIPSE: { fputs("Ellipse\n", fipo); switch(obj->st) { case 1: { fputs("Ellipse by radii\n", fipo); } break; case 2: { fputs("Ellipse by diameter\n", fipo); } break; case 3: { fputs("Circle by radius\n", fipo); } break; case 4: { fputs("Circle by diameter\n", fipo); } break; default: { fputs("UNKNOWN SUB-TYPE\n", fipo); } break; } } break; case DK3_FIG_OBJ_POLYLINE: { fputs("Polyline\n", fipo); switch(obj->st) { case 1: { fputs("Polyline\n", fipo); } break; case 2: { fputs("Box\n", fipo); } break; case 3: { fputs("Polygon\n", fipo); } break; case 4: { fputs("Arc-box\n", fipo); } break; case 5: { fputs("Imported image\n", fipo); } break; default: { fputs("UNKNOWN SUBTYPE\n", fipo); } break; } } break; case DK3_FIG_OBJ_SPLINE: { fputs("Spline\n", fipo); switch(obj->st) { case 0: { fputs("Open approximated\n", fipo); } break; case 1: { fputs("Closed approximated\n", fipo); } break; case 2: { fputs("Open interpolated\n", fipo); } break; case 3: { fputs("Closed interpolated\n", fipo); } break; case 4: { fputs("Open X-spline\n", fipo); } break; case 5: { fputs("Closed X-spline\n", fipo); } break; default: { fputs("UNKNOWN SUBTYPE\n", fipo); } break; } } break; case DK3_FIG_OBJ_TEXT: { fputs("Text\n", fipo); switch(obj->st) { case 0: { fputs("Left-aligned\n", fipo); } break; case 1: { fputs("Centered\n", fipo); } break; case 2: { fputs("Right-aligned\n", fipo); } break; default: { fputs("UNKNOWN SUB-TYPE\n", fipo); } break; } } break; case DK3_FIG_OBJ_ARC: { fputs("Arc\n", fipo); switch(obj->st) { case 1: { fputs("Open arc\n", fipo); } break; case 2: { fputs("Closed arc\n", fipo); } break; default: { fputs("UNKNOWN SUB-TYPE\n", fipo); } break; } } break; case DK3_FIG_OBJ_PSEUDO_HALF_CIRCLE: { fputs("Half-circle\n", fipo); if(obj->st) { fputs("Closed filled half-circle\n", fipo); } else { fputs("Open half-circle\n", fipo); } } break; default: { fputs("UNKNOWN OBJECT TYPE\n", fipo); } break; } fprintf(fipo, "Layer: %d\n", obj->la); fprintf(fipo, "Line number: %lu\n", obj->li); fprintf(fipo, "Closed: %d\n", obj->cl); fprintf(fipo, "Line width: %d\n", obj->lw); fprintf(fipo, "Pen color: %d\n", obj->pc); fprintf(fipo, "Fill color: %d\n", obj->fc); fprintf(fipo, "Fill type: %d\n", obj->fi); fprintf(fipo, "Line cap: %d\n", obj->cs); fprintf(fipo, "Line join: %d\n", obj->js); fprintf(fipo, "Line style: %d\n", obj->ls); fprintf(fipo, "Style value: %g\n", obj->sv); switch(obj->ot) { case DK3_FIG_OBJ_ELLIPSE: { fprintf(fipo, "Center x: %g\n", (obj->dt).ell.cx); fprintf(fipo, "Center y: %g\n", (obj->dt).ell.cy); fprintf(fipo, "Radius x: %g\n", (obj->dt).ell.rx); fprintf(fipo, "Radius y: %g\n", (obj->dt).ell.ry); fprintf(fipo, "Angle: %g\n", (180.0 * (obj->dt).ell.an / M_PI)); } break; case DK3_FIG_OBJ_POLYLINE: { fprintf(fipo, "Radius: %g\n", (obj->dt).pol.ra); fprintf(fipo, "Start x: %g\n", (obj->dt).pol.xs); fprintf(fipo, "Start y: %g\n", (obj->dt).pol.ys); fprintf(fipo, "End x: %g\n", (obj->dt).pol.xe); fprintf(fipo, "End y: %g\n", (obj->dt).pol.ye); if(5 == obj->st) { fprintf(fipo, "Flip: %d\n", (obj->dt).pol.flf); fprintf(fipo, "Image: \"%s\"", TR_8STR((obj->dt).pol.fn)); } fprintf(fipo, "Points: %lu\n", (unsigned long)((obj->dt).pol.np)); if((obj->dt).pol.po) { pp = (obj->dt).pol.po; i = (obj->dt).pol.np; while(i--) { fprintf(fipo, "%g %g\n", pp->x, pp->y); pp++; } } else { fprintf(fipo, "ERROR: NO POINTS!\n"); } } break; case DK3_FIG_OBJ_SPLINE: { fprintf(fipo, "Start t: %g\n", (obj->dt).spl.ts); fprintf(fipo, "End t: %g\n", (obj->dt).spl.te); fprintf(fipo, "Points: %lu\n", (unsigned long)((obj->dt).spl.np)); if((obj->dt).spl.po) { sp = (obj->dt).spl.po; i = (obj->dt).spl.np; while(i--) { fprintf(fipo, "%g %g %g\n", sp->x, sp->y, sp->s); sp++; } } else { fprintf(fipo, "ERROR: NO POINTS!\n"); } } break; case DK3_FIG_OBJ_TEXT: { fprintf(fipo, "Position x: %g\n", (obj->dt).txt.x); fprintf(fipo, "Position y: %g\n", (obj->dt).txt.y); fprintf(fipo, "Angle: %g\n", (obj->dt).txt.an); fprintf(fipo, "Text: \"%s\"\n", TR_8STR((obj->dt).txt.st)); fprintf(fipo, "Font flags: %d\n", (obj->dt).txt.ff); fprintf(fipo, "Font: %d\n", (obj->dt).txt.fo); fprintf(fipo, "Font size: %g\n", (obj->dt).txt.fs); } break; case DK3_FIG_OBJ_ARC: { fprintf(fipo, "Center x: %g\n", (obj->dt).arc.xc); fprintf(fipo, "Center y: %g\n", (obj->dt).arc.yc); fprintf(fipo, "Radius: %g\n", (obj->dt).arc.ra); fprintf(fipo, "Start: %g\n", (180.0 * (obj->dt).arc.as / M_PI)); fprintf(fipo, "End: %g\n", (180.0 * (obj->dt).arc.ae / M_PI)); fprintf(fipo, "Direction: %d", (int)((obj->dt).arc.di)); fprintf(fipo, "Point 1 x: %g\n", (obj->dt).arc.x1); fprintf(fipo, "Point 1 y: %g\n", (obj->dt).arc.y1); fprintf(fipo, "Point 2 x: %g\n", (obj->dt).arc.x2); fprintf(fipo, "Point 2 y: %g\n", (obj->dt).arc.y2); fprintf(fipo, "Point 3 x: %g\n", (obj->dt).arc.x3); fprintf(fipo, "Point 3 y: %g\n", (obj->dt).arc.y3); } break; } if(primobj) { if(obj->af) { fprintf(fipo, "ARROWHEAD FORWARD\n"); dk3fig_prepare_report_ah(obj->af); } if(obj->ab) { fprintf(fipo, "ARROWHEAD BACKWARD\n"); dk3fig_prepare_report_ah(obj->ab); } } } #line 1087 "dk3figpr.ctr" } #endif /** Check whether the object is an open path and filling is required, change subtype to closed path if necessary. @param drw Drawing containing the object. @param obj Object to check. */ static void dk3fig_prepare_check_fill_open_path(dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj) { switch(obj->ot) { case DK3_FIG_OBJ_POLYLINE: { if((-1 != obj->fi) && (drw->transcol != obj->fc)) { switch(obj->st) { case 1: { if(drw->cofop) { obj->st = 3; obj->cl = 1; if((drw->app) && (drw->msg)) { dk3app_log_1(drw->app, DK3_LL_DEBUG, drw->msg, 10); } } else { if((drw->app) && (drw->msg)) { dk3app_log_1(drw->app, DK3_LL_WARNING, drw->msg, 9); } } } break; } } } break; case DK3_FIG_OBJ_SPLINE: { if((-1 != obj->fi) && (drw->transcol != obj->fc)) { switch(obj->st) { case 0: { if(drw->cofop) { obj->st = 1; obj->cl = 1; if((drw->app) && (drw->msg)) { dk3app_log_1(drw->app, DK3_LL_DEBUG, drw->msg, 10); } } else { if((drw->app) && (drw->msg)) { dk3app_log_1(drw->app, DK3_LL_WARNING, drw->msg, 9); } } } break; case 2: { if(drw->cofop) { obj->st = 3; obj->cl = 1; if((drw->app) && (drw->msg)) { dk3app_log_1(drw->app, DK3_LL_DEBUG, drw->msg, 10); } } else { if((drw->app) && (drw->msg)) { dk3app_log_1(drw->app, DK3_LL_WARNING, drw->msg, 9); } } } break; case 4: { if(drw->cofop) { obj->st = 5; obj->cl = 1; if((drw->app) && (drw->msg)) { dk3app_log_1(drw->app, DK3_LL_DEBUG, drw->msg, 10); } } else { if((drw->app) && (drw->msg)) { dk3app_log_1(drw->app, DK3_LL_WARNING, drw->msg, 9); } } } break; } } } break; } } /** Prepare one object. @param drw Drawing. @param obj Object to prepare. @param objno Object number (starting at 0). @return 1 on success, 0 on error. */ static int dk3fig_prepare_object( dk3_fig_drawing_t *drw, dk3_fig_obj_t *obj, unsigned long objno ) { int back = 1; #line 1185 "dk3figpr.ctr" /* For object 0 check whether it is a background rectangle. Set srctype. */ dk3fig_prepare_check_bgrect(drw, obj, objno); /* Check for open path to fill. */ dk3fig_prepare_check_fill_open_path(drw, obj); /* Object type specific initialization. For arcs calculate center point and radius. */ if(!dk3fig_prepare_initialize_object(drw, obj)) { back = 0; #line 1199 "dk3figpr.ctr" } /* For open objects calculate arrowheads. */ if(back) { if(!dk3figah_calculate_arrowheads(drw, obj)) { back = 0; #line 1207 "dk3figpr.ctr" } } /* Add object to bounding box. For open objects add arrowheads to bounding box too. */ if(back) { #line 1214 "dk3figpr.ctr" if(!dk3fig_prepare_add_to_bb(drw, obj, 1)) { back = 0; #line 1216 "dk3figpr.ctr" dk3app_log_1(drw->app, DK3_LL_ERROR, drw->msg, 4); } } #line 1219 "dk3figpr.ctr" return back; } int dk3fig_prepare(dk3_fig_drawing_t *drw) { dk3_fig_obj_t *obj; unsigned long oldsourceline = 0UL; unsigned long objno = 0UL; int back = 1; #line 1232 "dk3figpr.ctr" /* Reset bounding box. */ dk3bb_reset(&(drw->bb)); /* Prepare all drawing elements. */ oldsourceline = dk3app_get_source_line(drw->app); dk3sto_it_reset(drw->iobj); while(NULL != (obj = (dk3_fig_obj_t *)dk3sto_it_next(drw->iobj))) { dk3app_set_source_line(drw->app, obj->li); if(!dk3fig_prepare_object(drw, obj, objno++)) { back = 0; } } dk3app_set_source_line(drw->app, oldsourceline); #line 1249 "dk3figpr.ctr" #line 1250 "dk3figpr.ctr" return back; }