/* Copyright (C) 2019-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: WxdkdrawObj.cpt */ /** @file WxdkdrawObj.cpp The WxdkdrawObj module. */ #line 1258 "WxdkdrawObj.cpt" #include "wxdkdraw.h" #if DK4_HAVE_MATH_H #ifndef MATH_H_INCLUDED #include #define MATH_H_INCLUDED 1 #endif #endif #ifndef DK4MATH_H_INCLUDED #include #endif #ifndef DK4BIF_H_INCLUDED #include #endif #ifndef DK4MAAU16_H_INCLUDED #include "dk4maau16.h" #endif #ifndef DK4MAAI16_H_INCLUDED #include "dk4maai16.h" #endif #ifndef DK4MAAI32_H_INCLUDED #include "dk4maai32.h" #endif #line 1290 "WxdkdrawObj.cpt" /** Image types handled by wxdkdraw. */ static const Wxd_suffix_and_type_t image_type_suffixes[] = { { wxT(".png") , wxBITMAP_TYPE_PNG } , { wxT(".jpg") , wxBITMAP_TYPE_JPEG } , { wxT(".jpeg") , wxBITMAP_TYPE_JPEG } , { wxT(".pbm") , wxBITMAP_TYPE_PNM } , { wxT(".pgm") , wxBITMAP_TYPE_PNM } , { wxT(".ppm") , wxBITMAP_TYPE_PNM } , { wxT(".pnm") , wxBITMAP_TYPE_PNM } , { wxT(".pam") , wxBITMAP_TYPE_PNM } , { wxT(".tif") , wxBITMAP_TYPE_TIF } , { wxT(".tiff") , wxBITMAP_TYPE_TIFF } , { NULL , wxBITMAP_TYPE_INVALID } }; /** Angles to check when calculating arc bounding box. */ static double arc_angles[] = { (-4.0 * M_PI), (-3.0 * M_PI - M_PI_2), (-3.0 * M_PI), (-2.0 * M_PI - M_PI_2), (-2.0 * M_PI), (-1.0 * M_PI - M_PI_2), (-1.0 * M_PI), (-1.0 * M_PI_2), 0.0, M_PI_2, M_PI, (M_PI + M_PI_2), (2.0 * M_PI), (2.0 * M_PI + M_PI_2), (3.0 * M_PI), (3.0 * M_PI + M_PI_2) }; /** Number of elements in arc_angles array. */ static const size_t sz_arc_angles = sizeof(arc_angles)/sizeof(double); /** Flip coordinate value. @param min Bounding box minimum. @param max Bounding box maximum. @param v Value to flip. @param erp Error report, may be NULL. @return Flip result. */ static int32_t wxdobj_flip_coordinate(int32_t min, int32_t max, int32_t v, dk4_er_t *erp) { dk4_er_t er; int32_t back = (int32_t)0L; dk4error_init(&er); back = dk4ma_int32_t_sub(dk4ma_int32_t_add(min, max, &er), v, &er); if (DK4_E_NONE != er.ec) { dk4error_init(&er); back = dk4ma_int32_t_add(min, dk4ma_int32_t_sub(max, v, &er), &er); if (DK4_E_NONE != er.ec) { dk4error_init(&er); back = dk4ma_int32_t_add(max, dk4ma_int32_t_sub(min, v, &er), &er); if (DK4_E_NONE != er.ec) { dk4error_init(&er); back = dk4ma_int32_from_double( ((double)min + (double)max - (double)v), &er ); if (DK4_E_NONE != er.ec) { dk4error_copy(erp, &er); } } } } return back; } /** Set bounding box x and y value. Use this function to add the first point. @param pbox Bounding box to set. @param x X coordinate. @param y Y coordinate. */ static void wxdobj_bb_set_point( Wxd_bb_t *pbox, int32_t x, int32_t y ) { if (NULL != pbox) { pbox->xl = pbox->xr = x; pbox->yb = pbox->yt = y; } } /** Add bounding box x and y value. Use this function to add further points. @param pbox Bounding box to set. @param x X coordinate. @param y Y coordinate. */ static void wxdobj_bb_add_point( Wxd_bb_t *pbox, int32_t x, int32_t y ) { if (NULL != pbox) { if (x < pbox->xl) { pbox->xl = x; } if (x > pbox->xr) { pbox->xr = x; } if (y < pbox->yb) { pbox->yb = y; } if (y > pbox->yt) { pbox->yt = y; } } } bool wxdobj_bb_add_bb( Wxd_bb_t *pbox, Wxd_bb_t const *psrc ) { bool back = false; if ((NULL != pbox) && (NULL != psrc)) { wxdobj_bb_add_point(pbox, psrc->xl, psrc->yb); wxdobj_bb_add_point(pbox, psrc->xr, psrc->yt); back = true; } return back; } void wxdobj_report_object( #if TRACE_DEBUG Wxd_object_t *pobj #else Wxd_object_t * DK4_ARG_UNUSED(pobj) #endif ) { #if TRACE_DEBUG double s; uint16_t i; int32_t x; int32_t y; #line 1456 "WxdkdrawObj.cpt" if (NULL != pobj) { switch (pobj->ot) { case WXD_OT_GROUP_BEGIN : { #line 1460 "WxdkdrawObj.cpt" } break; case WXD_OT_TEXT : { #line 1463 "WxdkdrawObj.cpt" } break; case WXD_OT_POLYLINE : case WXD_OT_POLYGON : { if (WXD_OT_POLYLINE == pobj->ot) { #line 1467 "WxdkdrawObj.cpt" } else { #line 1470 "WxdkdrawObj.cpt" } #line 1472 "WxdkdrawObj.cpt" if (NULL != (pobj->det).p.p) { for (i = 0; i < (pobj->det).p.n; i++) { x = ((pobj->det).p.p)[i].x; y = ((pobj->det).p.p)[i].y; #line 1477 "WxdkdrawObj.cpt" } } else { #line 1481 "WxdkdrawObj.cpt" } } break; case WXD_OT_O_SPLINE : case WXD_OT_C_SPLINE : { if (WXD_OT_O_SPLINE == pobj->ot) { #line 1486 "WxdkdrawObj.cpt" } else { #line 1489 "WxdkdrawObj.cpt" } #line 1491 "WxdkdrawObj.cpt" if (NULL != (pobj->det).p.p) { for (i = 0; i < (pobj->det).s.n; i++) { x = ((pobj->det).s.p)[i].x; y = ((pobj->det).s.p)[i].y; s = ((pobj->det).s.p)[i].s; #line 1497 "WxdkdrawObj.cpt" } } else { #line 1501 "WxdkdrawObj.cpt" } } break; case WXD_OT_O_ARC : case WXD_OT_C_ARC : { if (WXD_OT_O_ARC == pobj->ot) { #line 1506 "WxdkdrawObj.cpt" } else { #line 1509 "WxdkdrawObj.cpt" } } break; case WXD_OT_CIRCLE : case WXD_OT_ELLIPSE : { if (WXD_OT_CIRCLE == pobj->ot) { #line 1514 "WxdkdrawObj.cpt" } else { #line 1517 "WxdkdrawObj.cpt" } #line 1519 "WxdkdrawObj.cpt" #line 1520 "WxdkdrawObj.cpt" #line 1521 "WxdkdrawObj.cpt" #line 1522 "WxdkdrawObj.cpt" #line 1523 "WxdkdrawObj.cpt" } break; case WXD_OT_BOX : { #line 1526 "WxdkdrawObj.cpt" } break; case WXD_OT_IMAGE : { #line 1529 "WxdkdrawObj.cpt" } break; case WXD_OT_DOT_FILLED : case WXD_OT_DOT_WHITE : { if (WXD_OT_DOT_FILLED == pobj->ot) { #line 1533 "WxdkdrawObj.cpt" } else { #line 1536 "WxdkdrawObj.cpt" } } break; default : { } break; } } else { #line 1543 "WxdkdrawObj.cpt" } #line 1545 "WxdkdrawObj.cpt" #else DK4_UNUSED_ARG(pobj) #endif } bool wxdobj_is_active(Wxd_object_t *pobj) { bool back = false; #line 1557 "WxdkdrawObj.cpt" if (NULL != pobj) { back = true; if (NULL != pobj->play) { if ((uint8_t)0x00 == pobj->play->active) { back = false; } } } #line 1566 "WxdkdrawObj.cpt" return back; } wxBitmapType wxdobj_image_type(wxChar const *fn) { wxChar const *suffix; Wxd_suffix_and_type_t const *tptr; wxBitmapType back = wxBITMAP_TYPE_INVALID; #line 1578 "WxdkdrawObj.cpt" suffix = dk4strx_get_path_suffix(fn, NULL); if (NULL != suffix) { tptr = image_type_suffixes; while ((NULL != tptr->suffix) && (wxBITMAP_TYPE_INVALID == back)) { if (0 == dk4strx_casecmp(tptr->suffix, suffix)) { back = tptr->t; } else { tptr++; } } } #line 1590 "WxdkdrawObj.cpt" return back; } void wxdobj_det_init_bb(Wxd_bb_t *pdst) { #line 1599 "WxdkdrawObj.cpt" if (NULL != pdst) { DK4_MEMRES(pdst,sizeof(Wxd_bb_t)); pdst->xl = (int32_t)0L; pdst->xr = (int32_t)0L; pdst->yb = (int32_t)0L; pdst->yt = (int32_t)0L; } #line 1606 "WxdkdrawObj.cpt" } void wxdobj_det_init_text(Wxd_det_text_t *pdst) { #line 1613 "WxdkdrawObj.cpt" if (NULL != pdst) { DK4_MEMRES(pdst,sizeof(Wxd_det_text_t)); pdst->t = NULL; pdst->tsc = NULL; pdst->font = NULL; pdst->x = (int32_t)0L; pdst->y = (int32_t)0L; pdst->fsz = (uint16_t)12U; pdst->a = (int16_t)0; pdst->find = (uint8_t)0U; pdst->al = WXD_TA_LEFT; pdst->fl = 0x01; pdst->font = NULL; } #line 1627 "WxdkdrawObj.cpt" } void wxdobj_det_init_poly(Wxd_det_pl_t *pdst) { #line 1635 "WxdkdrawObj.cpt" if (NULL != pdst) { DK4_MEMRES(pdst,sizeof(Wxd_det_pl_t)); pdst->p = NULL; pdst->n = (uint16_t)0U; } #line 1640 "WxdkdrawObj.cpt" } void wxdobj_det_init_spline(Wxd_det_xs_t *pdst) { #line 1648 "WxdkdrawObj.cpt" if (NULL != pdst) { DK4_MEMRES(pdst,sizeof(Wxd_det_xs_t)); pdst->p = NULL; pdst->n = (uint16_t)0U; } #line 1653 "WxdkdrawObj.cpt" } void wxdobj_det_init_arc(Wxd_det_arc_t *pdst) { #line 1661 "WxdkdrawObj.cpt" if (NULL != pdst) { DK4_MEMRES(pdst,sizeof(Wxd_det_arc_t)); pdst->a = 0.0; pdst->b = 360.0; pdst->x = 0.0; pdst->y = 0.0; pdst->r = 0.0; pdst->x1 = (int32_t)0L; pdst->y1 = (int32_t)0L; pdst->x2 = (int32_t)0L; pdst->y2 = (int32_t)0L; pdst->x3 = (int32_t)0L; pdst->y3 = (int32_t)0L; pdst->d = (int8_t)0; } #line 1676 "WxdkdrawObj.cpt" } void wxdobj_det_init_ellipse(Wxd_det_ellipse_t *pdst) { #line 1684 "WxdkdrawObj.cpt" if (NULL != pdst) { DK4_MEMRES(pdst,sizeof(Wxd_det_ellipse_t)); pdst->x = (int32_t)0L; pdst->y = (int32_t)0L; pdst->rx = (uint32_t)0UL; pdst->ry = (uint32_t)0UL; pdst->a = (int16_t)0; } #line 1692 "WxdkdrawObj.cpt" } void wxdobj_det_init_box(Wxd_det_box_t *pdst) { #line 1700 "WxdkdrawObj.cpt" if (NULL != pdst) { DK4_MEMRES(pdst,sizeof(Wxd_det_box_t)); wxdobj_det_init_bb(&(pdst->b)); pdst->r = (uint32_t)0UL; } #line 1705 "WxdkdrawObj.cpt" } void wxdobj_det_init_image(Wxd_det_image_t *pdst) { #line 1713 "WxdkdrawObj.cpt" if (NULL != pdst) { DK4_MEMRES(pdst,sizeof(Wxd_det_image_t)); pdst->fn = NULL; pdst->bm = NULL; dk4bb_init(&(pdst->pl)); wxdobj_det_init_bb(&(pdst->br)); pdst->xres = -1.0; pdst->yres = -1.0; pdst->fl = WXD_IMFL_ASPECT | WXD_IMFL_USE_ALPHA | WXD_IMFL_IMG_INT | WXD_IMFL_USE_DCT; pdst->r2g = (int8_t)(-1); pdst->r2c = (int8_t)(-1); pdst->t = wxBITMAP_TYPE_INVALID; } #line 1727 "WxdkdrawObj.cpt" } void wxdobj_det_init_dot(Wxd_det_dot_t *pdst) { #line 1735 "WxdkdrawObj.cpt" if (NULL != pdst) { DK4_MEMRES(pdst,sizeof(Wxd_det_dot_t)); pdst->x = (int32_t)0L; pdst->y = (int32_t)0L; pdst->d = (uint16_t)0U; } #line 1741 "WxdkdrawObj.cpt" } /** Initialize object, use template if specified. @param pdst Object to initialize. @param ot Object type. @param ptpl Template object, may be NULL. */ void wxdobj_obj_init(Wxd_object_t *pdst, int ot, Wxd_object_t const *ptpl) { #line 1754 "WxdkdrawObj.cpt" if (NULL != ptpl) { #line 1755 "WxdkdrawObj.cpt" /* Apply template settings */ DK4_MEMCPY(pdst,ptpl,sizeof(Wxd_object_t)); } else { #line 1761 "WxdkdrawObj.cpt" /* Apply default settings */ DK4_MEMRES(pdst,sizeof(Wxd_object_t)); pdst->lay = 0; pdst->lw = 2; pdst->fc[0] = (uint8_t)255U; pdst->fc[1] = (uint8_t)255U; pdst->fc[2] = (uint8_t)255U; pdst->sc[0] = (uint8_t)0U; pdst->sc[1] = (uint8_t)0U; pdst->sc[2] = (uint8_t)0U; pdst->cs = (uint8_t)(WXD_LC_BUTTED); pdst->fs = (uint8_t)(WXD_FS_NONE); pdst->ls = (uint8_t)(WXD_LS_SOLID); pdst->sl = (uint8_t)4U; pdst->js = (uint8_t)(WXD_LJ_MITERED); pdst->ml = (uint8_t)8U; pdst->aft = (uint8_t)0U; pdst->afl = (uint8_t)16U; pdst->afw = (uint8_t)8U; pdst->abt = (uint8_t)0U; pdst->abl = (uint8_t)16U; pdst->abw = (uint8_t)8U; pdst->mark = (uint8_t)0U; } pdst->pa = NULL; pdst->psti = NULL; pdst->play = NULL; pdst->ot = ot; dk4bb_init(&(pdst->bb)); /* Use default values for details if no template was specified or template object type does not match */ if ((NULL == ptpl) || ((NULL != ptpl) && (ot != ptpl->ot))) { switch (ot) { case WXD_OT_GROUP_BEGIN : { } break; case WXD_OT_TEXT : { wxdobj_det_init_text(&((pdst->det).t)); } break; case WXD_OT_POLYLINE : case WXD_OT_POLYGON : { wxdobj_det_init_poly(&((pdst->det).p)); } break; case WXD_OT_O_SPLINE : case WXD_OT_C_SPLINE : { wxdobj_det_init_spline(&((pdst->det).s)); } break; case WXD_OT_O_ARC : case WXD_OT_C_ARC : { wxdobj_det_init_arc(&((pdst->det).a)); } break; case WXD_OT_CIRCLE : case WXD_OT_ELLIPSE : { wxdobj_det_init_ellipse(&((pdst->det).e)); } break; case WXD_OT_BOX : { wxdobj_det_init_box(&((pdst->det).b)); } break; case WXD_OT_IMAGE : { wxdobj_det_init_image(&((pdst->det).i)); } break; case WXD_OT_DOT_FILLED : case WXD_OT_DOT_WHITE : { wxdobj_det_init_dot(&((pdst->det).d)); } break; } } /* Make sure not to re-use dynamic objects from template. */ switch (ot) { case WXD_OT_GROUP_BEGIN : { (pdst->det).g.s_e = NULL; (pdst->det).g.i_e = NULL; } break; case WXD_OT_TEXT : { (pdst->det).t.t = NULL; (pdst->det).t.tsc = NULL; /* 2020-01-05 Set font to NULL too. */ (pdst->det).t.font = NULL; } break; case WXD_OT_POLYLINE : case WXD_OT_POLYGON : { (pdst->det).p.n = (uint16_t)0U; (pdst->det).p.p = NULL; } break; case WXD_OT_O_SPLINE : case WXD_OT_C_SPLINE : { (pdst->det).s.n = (uint16_t)0U; (pdst->det).s.p = NULL; } break; case WXD_OT_O_ARC : case WXD_OT_C_ARC : { } break; case WXD_OT_CIRCLE : case WXD_OT_ELLIPSE : { } break; case WXD_OT_BOX : { } break; case WXD_OT_IMAGE : { (pdst->det).i.fn = NULL; (pdst->det).i.bm = NULL; } break; case WXD_OT_DOT_FILLED : case WXD_OT_DOT_WHITE : { } break; } #line 1863 "WxdkdrawObj.cpt" } /** Check whether a layer is used in a drawing, remove layer if unused. @param pdrw Drawing to check and modify. @param play Layer to check and probably remove. */ static void i_check_layer_structure_removal(Wxd_drawing_t *pdrw, Wxd_layer_t *play) { Wxd_object_t *pobj; #line 1878 "WxdkdrawObj.cpt" play->used = 0x00; dk4sto_it_reset(pdrw->i_flat); do { pobj = (Wxd_object_t *)dk4sto_it_next(pdrw->i_flat); if (NULL != pobj) { if (NULL != pobj->play) { pobj->play->used = 0x01; } } } while (NULL != pobj); if (0x00 == play->used) { #line 1889 "WxdkdrawObj.cpt" dk4sto_remove(pdrw->s_layers, play, NULL); dk4sto_it_reset(pdrw->i_layers); dk4mem_free(play); } #line 1894 "WxdkdrawObj.cpt" } /** Find group for object. @param pdrw Drawing containing the object. @param pobj Object to search for. @return Valid pointer on success, NULL if not found. */ static Wxd_object_t * i_find_group_for(Wxd_drawing_t *pdrw, Wxd_object_t *pobj) { Wxd_object_t *back = NULL; /* Result */ Wxd_object_t *pgrc = NULL; /* Group candidate */ Wxd_object_t *pgrp = NULL; /* Current (sub)group tested */ Wxd_object_t *pno = NULL; /* Next object */ void *pt = NULL; /* Test whether object contained */ #line 1915 "WxdkdrawObj.cpt" dk4sto_it_reset(pdrw->i_stru); do { pgrc = (Wxd_object_t *)dk4sto_it_next(pdrw->i_stru); if (NULL != pgrc) { if (WXD_OT_GROUP_BEGIN == pgrc->ot) { if (NULL != dk4sto_it_find_exact((pgrc->det).g.i_e, pobj)) { /* Object found in top-level group */ back = pgrc; } else { /* Must search group structure recursively */ pgrp = pgrc; dk4sto_it_reset((pgrp->det).g.i_e); while ((NULL != pgrp) && (NULL == back)) { pno = (Wxd_object_t *)dk4sto_it_next((pgrp->det).g.i_e); if (NULL != pno) { if (WXD_OT_GROUP_BEGIN == pno->ot) { pt = dk4sto_it_find_exact((pno->det).g.i_e, pobj); if (NULL != pt) { back = pno; } else { pgrp = pno; dk4sto_it_reset((pgrp->det).g.i_e); } } } else { /* No more objects in group, go up 1 level */ pgrp = pgrp->pa; } } } } } } while ((NULL != pgrc) && (NULL == back)); #if TRACE_DEBUG if (NULL == back) { #line 1960 "WxdkdrawObj.cpt" } #endif #line 1963 "WxdkdrawObj.cpt" return back; } void wxdobj_obj_delete(Wxd_object_t *pobj) { #line 1972 "WxdkdrawObj.cpt" if (NULL != pobj) { switch ( (int)(pobj->ot) ) { case WXD_OT_GROUP_BEGIN : { #line 1975 "WxdkdrawObj.cpt" if (NULL != (pobj->det).g.i_e) { dk4sto_it_close((pobj->det).g.i_e); } if (NULL != (pobj->det).g.s_e) { dk4sto_close((pobj->det).g.s_e); } (pobj->det).g.s_e = NULL; (pobj->det).g.i_e = NULL; } break; case WXD_OT_TEXT : { #line 1985 "WxdkdrawObj.cpt" dk4mem_release((pobj->det).t.t); dk4mem_release((pobj->det).t.tsc); } break; case WXD_OT_POLYLINE : case WXD_OT_POLYGON : { #line 1989 "WxdkdrawObj.cpt" dk4mem_release((pobj->det).p.p); } break; case WXD_OT_O_SPLINE : case WXD_OT_C_SPLINE : { #line 1992 "WxdkdrawObj.cpt" dk4mem_release((pobj->det).s.p); } break; case WXD_OT_IMAGE : { #line 1995 "WxdkdrawObj.cpt" dk4mem_release((pobj->det).i.fn); if (NULL != (pobj->det).i.bm) { #line 1997 "WxdkdrawObj.cpt" delete (pobj->det).i.bm; (pobj->det).i.bm = NULL; } #if TRACE_DEBUG else { #line 2002 "WxdkdrawObj.cpt" } #endif } break; #if TRACE_DEBUG case WXD_OT_O_ARC : { #line 2007 "WxdkdrawObj.cpt" } break; case WXD_OT_C_ARC : { #line 2009 "WxdkdrawObj.cpt" } break; case WXD_OT_CIRCLE : { #line 2011 "WxdkdrawObj.cpt" } break; case WXD_OT_ELLIPSE : { #line 2013 "WxdkdrawObj.cpt" } break; case WXD_OT_BOX : { #line 2015 "WxdkdrawObj.cpt" } break; case WXD_OT_DOT_FILLED : { #line 2017 "WxdkdrawObj.cpt" } break; case WXD_OT_DOT_WHITE : { #line 2019 "WxdkdrawObj.cpt" } break; default : { #line 2021 "WxdkdrawObj.cpt" } break; #endif } dk4mem_free(pobj); } #if TRACE_DEBUG else { #line 2028 "WxdkdrawObj.cpt" } #endif #line 2031 "WxdkdrawObj.cpt" } /** Internally delete a group structure recursively. @param pgrp Group structure object to delete (must not be NULL, must be WXD_OT_GROUP_BEGIN type, s_e and i_e must not be NULL). */ static void grp_delete_recursive(Wxd_object_t *pgrp) { Wxd_object_t *no; /* Next object */ Wxd_object_t *ng; /* Next group */ #line 2047 "WxdkdrawObj.cpt" dk4sto_it_reset((pgrp->det).g.i_e); while (NULL != pgrp) { no = (Wxd_object_t *)dk4sto_it_next((pgrp->det).g.i_e); if (NULL != no) { if (WXD_OT_GROUP_BEGIN == no->ot) { if ((NULL != (no->det).g.s_e) && (NULL != (no->det).g.i_e)) { dk4sto_it_reset((no->det).g.i_e); pgrp = no; } else { dk4sto_remove((pgrp->det).g.s_e, no, NULL); dk4sto_it_reset((pgrp->det).g.i_e); #if 0 if (NULL != (no->det).g.s_e) { dk4sto_close((no->det).g.s_e); (no->det).g.s_e = NULL; } dk4mem_free(no); #endif wxdobj_obj_delete(no); } } else { no->pa = NULL; dk4sto_remove((pgrp->det).g.s_e, no, NULL); dk4sto_it_reset((pgrp->det).g.i_e); } } else { ng = pgrp->pa; if (NULL != ng) { dk4sto_remove((ng->det).g.s_e, pgrp, NULL); dk4sto_it_reset((ng->det).g.i_e); } #if 0 dk4sto_it_close((pgrp->det).g.i_e); (pgrp->det).g.i_e = NULL; dk4sto_close((pgrp->det).g.s_e); (pgrp->det).g.s_e = NULL; dk4mem_free(pgrp); #endif wxdobj_obj_delete(pgrp); pgrp = ng; } } #line 2093 "WxdkdrawObj.cpt" } void wxdobj_grp_delete_recursive(Wxd_object_t *pgrp) { #line 2101 "WxdkdrawObj.cpt" if (NULL != pgrp) { if (WXD_OT_GROUP_BEGIN == pgrp->ot) { if ((NULL != (pgrp->det).g.s_e) && (NULL != (pgrp->det).g.i_e)) { grp_delete_recursive(pgrp); } else { if (NULL != (pgrp->det).g.s_e) { dk4sto_close((pgrp->det).g.s_e); (pgrp->det).g.s_e = NULL; } dk4mem_free(pgrp); } } } else { } #line 2118 "WxdkdrawObj.cpt" } void wxdobj_drw_delete(Wxd_drawing_t *pdrw) { Wxd_object_t *pgrp; /* Current group to delete */ Wxd_stipple_t *pstip; /* Current stipple to delete */ Wxd_layer_t *play; /* Current layer to delete */ Wxd_font_t *pfont; /* Current font to delete */ #line 2130 "WxdkdrawObj.cpt" if (NULL != pdrw) { /* Delete structured information */ #line 2135 "WxdkdrawObj.cpt" if (NULL != pdrw->s_stru) { if (NULL != pdrw->i_stru) { dk4sto_it_reset(pdrw->i_stru); do { pgrp = (Wxd_object_t *)dk4sto_it_next(pdrw->i_stru); if (NULL != pgrp) { if (WXD_OT_GROUP_BEGIN == pgrp->ot) { wxdobj_grp_delete_recursive(pgrp); } else { pgrp->pa = NULL; } } } while (NULL != pgrp); dk4sto_it_close(pdrw->i_stru); pdrw->i_stru = NULL; } dk4sto_close(pdrw->s_stru); pdrw->s_stru = NULL; } #line 2156 "WxdkdrawObj.cpt" /* Delete stipples */ #line 2160 "WxdkdrawObj.cpt" if (NULL != pdrw->s_stip) { #line 2161 "WxdkdrawObj.cpt" if (NULL != pdrw->i_stip) { #line 2162 "WxdkdrawObj.cpt" dk4sto_it_reset(pdrw->i_stip); do { #line 2164 "WxdkdrawObj.cpt" pstip = (Wxd_stipple_t *)dk4sto_it_next(pdrw->i_stip); if (NULL != pstip) { #line 2167 "WxdkdrawObj.cpt" if (NULL != pstip->bm) { #line 2168 "WxdkdrawObj.cpt" delete (pstip->bm); pstip->bm = NULL; } else { #line 2172 "WxdkdrawObj.cpt" } dk4mem_free(pstip); } } while (NULL != pstip); dk4sto_it_close(pdrw->i_stip); pdrw->i_stip = NULL; } #if TRACE_DEBUG else { #line 2181 "WxdkdrawObj.cpt" } #endif dk4sto_close(pdrw->s_stip); pdrw->s_stip = NULL; } #if TRACE_DEBUG else { #line 2188 "WxdkdrawObj.cpt" } #endif #line 2191 "WxdkdrawObj.cpt" /* Delete layers */ #line 2195 "WxdkdrawObj.cpt" if (NULL != pdrw->s_layers) { if (NULL != pdrw->i_layers) { dk4sto_it_reset(pdrw->i_layers); do { play = (Wxd_layer_t *)dk4sto_it_next(pdrw->i_layers); if (NULL != play) { #line 2202 "WxdkdrawObj.cpt" dk4mem_free(play); } } while (NULL != play); dk4sto_it_close(pdrw->i_layers); pdrw->i_layers = NULL; } dk4sto_close(pdrw->s_layers); pdrw->s_layers = NULL; } #line 2212 "WxdkdrawObj.cpt" /* Delete flat list and objects */ #line 2216 "WxdkdrawObj.cpt" if (NULL != pdrw->s_flat) { if (NULL != pdrw->i_flat) { dk4sto_it_reset(pdrw->i_flat); do { pgrp = (Wxd_object_t *)dk4sto_it_next(pdrw->i_flat); if (NULL != pgrp) { #line 2222 "WxdkdrawObj.cpt" wxdobj_obj_delete(pgrp); } } while (NULL != pgrp); dk4sto_it_close(pdrw->i_flat); pdrw->i_flat = NULL; } dk4sto_close(pdrw->s_flat); pdrw->s_flat = NULL; } #line 2232 "WxdkdrawObj.cpt" #line 2233 "WxdkdrawObj.cpt" /* Delete font structures */ if (NULL != pdrw->s_fonts) { if (NULL != pdrw->i_fonts) { dk4sto_it_reset(pdrw->i_fonts); do { pfont = (Wxd_font_t *)dk4sto_it_next(pdrw->i_fonts); if (NULL != pfont) { #line 2243 "WxdkdrawObj.cpt" wxdfont_delete(pfont); } } while (NULL != pfont); dk4sto_it_close(pdrw->i_fonts); pdrw->i_fonts = NULL; } dk4sto_close(pdrw->s_fonts); pdrw->s_fonts = NULL; } #line 2253 "WxdkdrawObj.cpt" dk4mem_free(pdrw); #line 2255 "WxdkdrawObj.cpt" } #if TRACE_DEBUG else { #line 2258 "WxdkdrawObj.cpt" } #endif #line 2261 "WxdkdrawObj.cpt" } void wxdobj_drw_set_xsubs(Wxd_drawing_t *pdrw, size_t xs) { if (NULL != pdrw) { if ((size_t)2U > xs) { xs = (size_t)2U; } pdrw->xsubs = xs; } } void wxdobj_drw_require_redraw(Wxd_drawing_t *pdrw, int level) { #line 2282 "WxdkdrawObj.cpt" if (NULL != pdrw) { if (level > pdrw->redraw) { pdrw->redraw = level; } } #line 2288 "WxdkdrawObj.cpt" } int wxdobj_drw_get_required_redraw_level(Wxd_drawing_t *pdrw, int level) { #line 2296 "WxdkdrawObj.cpt" if (NULL != pdrw) { if (pdrw->redraw > level) { level = pdrw->redraw; } } #line 2301 "WxdkdrawObj.cpt" return level; } void wxdobj_drw_reset_required_redraw_level(Wxd_drawing_t *pdrw) { #line 2310 "WxdkdrawObj.cpt" if (NULL != pdrw) { pdrw->redraw = WXD_REFRESH_NONE; } #line 2314 "WxdkdrawObj.cpt" } Wxd_drawing_t * wxdobj_drw_new(void) { Wxd_drawing_t *back = NULL; bool ok = false; #line 2324 "WxdkdrawObj.cpt" back = dk4mem_new(Wxd_drawing_t,1,NULL); if (NULL != back) { /* Initialize drawing members */ back->s_stru = back->s_flat = back->s_stip = back->s_layers = back->s_fonts = NULL; back->i_stru = back->i_flat = back->i_stip = back->i_layers = back->i_fonts = NULL; (back->bb).xl = 0L; (back->bb).yb = 0L; (back->bb).xr = 130048000L; (back->bb).yt = 73152000L; back->xsubs = (size_t)8U; back->cx = 65024000L; back->cy = 36576000L; back->baselw = 101600L; back->bleft = 16256000L; back->bright = 16256000L; back->bbottom = 16256000L; back->btop = 16256000L; back->fv_maj = 1U; back->fv_min = 0U; back->zl = 0; back->gridunit = 0U; back->gridbase = 0U; back->s_stru = dk4sto_open(NULL); back->s_flat = dk4sto_open(NULL); back->s_stip = dk4sto_open(NULL); back->s_layers = dk4sto_open(NULL); back->s_fonts = dk4sto_open(NULL); /* After loading a drawing the first repaint must do a complete redraw. */ back->redraw = WXD_REFRESH_GRID; /* Allocate storages and iterators. */ if ( (NULL != back->s_stru) && (NULL != back->s_flat) && (NULL != back->s_stip) && (NULL != back->s_layers) && (NULL != back->s_fonts) ) { dk4sto_set_comp(back->s_stru, drawobj_compare_object, 0); dk4sto_set_comp(back->s_flat, drawobj_compare_object, 0); dk4sto_set_comp(back->s_stip, drawobj_compare_stipples, 0); dk4sto_set_comp(back->s_layers, drawobj_compare_layers, 0); dk4sto_set_comp(back->s_fonts, wxdfont_compare, 0); back->i_stru = dk4sto_it_open(back->s_stru, NULL); back->i_flat = dk4sto_it_open(back->s_flat, NULL); back->i_stip = dk4sto_it_open(back->s_stip, NULL); back->i_layers = dk4sto_it_open(back->s_layers, NULL); back->i_fonts = dk4sto_it_open(back->s_fonts, NULL); if ( (NULL != back->i_stru) && (NULL != back->i_flat) && (NULL != back->i_stip) && (NULL != back->i_layers) && (NULL != back->i_fonts) ) { ok = true; } } /* Check whether initialization completed successfully */ if(!(ok)) { #line 2390 "WxdkdrawObj.cpt" wxdobj_drw_delete(back); back = NULL; } } #line 2395 "WxdkdrawObj.cpt" return back; } #if 0 static Wxd_object_t * wxdobj_obj_new_text( wxChar const *t, wxChar const *tsc, Wxd_object_t const *ptpl ) { Wxd_object_t *back = NULL; #line 2411 "WxdkdrawObj.cpt" if (NULL != t) { back = dk4mem_new(Wxd_object_t,1,NULL); if (NULL != back) { wxdobj_obj_init(back, WXD_OT_TEXT, ptpl); (back->det).t.t = dk4strx_dup(t, NULL); if (NULL == (back->det).t.t) { #line 2417 "WxdkdrawObj.cpt" dk4mem_free(back); back = NULL; } else { if (NULL != tsc) { (back->det).t.tsc = dk4strx_dup(tsc, NULL); if (NULL == (back->det).t.tsc) { #line 2424 "WxdkdrawObj.cpt" wxdobj_obj_delete(back); back = NULL; } } } } #if TRACE_DEBUG else { #line 2432 "WxdkdrawObj.cpt" } #endif } #line 2435 "WxdkdrawObj.cpt" return back; } #endif static Wxd_object_t * wxdobj_obj_new_polyany(uint16_t np, int ot, Wxd_object_t const *ptpl) { Wxd_object_t *back = NULL; #line 2447 "WxdkdrawObj.cpt" back = dk4mem_new(Wxd_object_t,1,NULL); if (NULL != back) { wxdobj_obj_init(back, ot, ptpl); (back->det).p.n = np; (back->det).p.p = NULL; (back->det).p.p = dk4mem_new(Wxd_point_t,((size_t)np),NULL); if (NULL == (back->det).p.p) { #line 2454 "WxdkdrawObj.cpt" dk4mem_free(back); back = NULL; } } #line 2458 "WxdkdrawObj.cpt" return back; } Wxd_object_t * wxdobj_obj_new_polyline(uint16_t np, Wxd_object_t const *ptpl) { Wxd_object_t *back = NULL; #line 2468 "WxdkdrawObj.cpt" if ((uint16_t)1U < np) { back = wxdobj_obj_new_polyany(np, WXD_OT_POLYLINE, ptpl); } #line 2471 "WxdkdrawObj.cpt" return back; } Wxd_object_t * wxdobj_obj_new_polygon(uint16_t np, Wxd_object_t const *ptpl) { Wxd_object_t *back = NULL; #line 2481 "WxdkdrawObj.cpt" if ((uint16_t)1U < np) { back = wxdobj_obj_new_polyany(np, WXD_OT_POLYGON, ptpl); } #line 2484 "WxdkdrawObj.cpt" return back; } Wxd_object_t * wxdobj_obj_new_spline(uint16_t np, int cl, Wxd_object_t const *ptpl) { Wxd_object_t *back = NULL; #line 2494 "WxdkdrawObj.cpt" if ((uint16_t)1U < np) { back = dk4mem_new(Wxd_object_t,1,NULL); if (NULL != back) { wxdobj_obj_init( back, ((0 != cl) ? (WXD_OT_C_SPLINE) : (WXD_OT_O_SPLINE)), ptpl ); (back->det).s.n = np; (back->det).s.p = dk4mem_new(Wxd_spline_point_t,((size_t)np),NULL); if (NULL == (back->det).s.p) { #line 2503 "WxdkdrawObj.cpt" dk4mem_free(back); back = NULL; } } #if TRACE_DEBUG else { #line 2509 "WxdkdrawObj.cpt" } #endif } #line 2512 "WxdkdrawObj.cpt" return back; } Wxd_object_t * wxdobj_obj_new_arc(int cl, Wxd_object_t const *ptpl) { Wxd_object_t *back = NULL; #line 2522 "WxdkdrawObj.cpt" back = dk4mem_new(Wxd_object_t,1,NULL); if (NULL != back) { wxdobj_obj_init( back, ((0 != cl) ? (WXD_OT_C_ARC) : (WXD_OT_O_ARC)), ptpl ); } #if TRACE_DEBUG else { #line 2530 "WxdkdrawObj.cpt" } #endif #line 2533 "WxdkdrawObj.cpt" return back; } Wxd_object_t * wxdobj_obj_new_circle(Wxd_object_t const *ptpl) { Wxd_object_t *back = NULL; #line 2543 "WxdkdrawObj.cpt" back = dk4mem_new(Wxd_object_t,1,NULL); if (NULL != back) { wxdobj_obj_init(back, WXD_OT_CIRCLE, ptpl); } #if TRACE_DEBUG else { #line 2549 "WxdkdrawObj.cpt" } #endif #line 2552 "WxdkdrawObj.cpt" return back; } Wxd_object_t * wxdobj_obj_new_ellipse(Wxd_object_t const *ptpl) { Wxd_object_t *back = NULL; #line 2562 "WxdkdrawObj.cpt" back = dk4mem_new(Wxd_object_t,1,NULL); if (NULL != back) { wxdobj_obj_init(back, WXD_OT_ELLIPSE, ptpl); } #if TRACE_DEBUG else { #line 2568 "WxdkdrawObj.cpt" } #endif #line 2571 "WxdkdrawObj.cpt" return back; } Wxd_object_t * wxdobj_obj_new_box(Wxd_object_t const *ptpl) { Wxd_object_t *back = NULL; #line 2581 "WxdkdrawObj.cpt" back = dk4mem_new(Wxd_object_t,1,NULL); if (NULL != back) { wxdobj_obj_init(back, WXD_OT_BOX, ptpl); } #if TRACE_DEBUG else { #line 2587 "WxdkdrawObj.cpt" } #endif #line 2590 "WxdkdrawObj.cpt" return back; } Wxd_object_t * wxdobj_obj_new_image(wxChar const *fn, Wxd_object_t const *ptpl) { Wxd_object_t *back = NULL; #line 2600 "WxdkdrawObj.cpt" if (NULL != fn) { back = dk4mem_new(Wxd_object_t,1,NULL); if (NULL != back) { wxdobj_obj_init(back, WXD_OT_IMAGE, ptpl); (back->det).i.fn = dk4strx_dup(fn, NULL); if (NULL == (back->det).i.fn) { #line 2606 "WxdkdrawObj.cpt" wxdobj_obj_delete(back); back = NULL; } } } #if TRACE_DEBUG else { #line 2613 "WxdkdrawObj.cpt" } #endif #line 2616 "WxdkdrawObj.cpt" return back; } Wxd_object_t * wxdobj_obj_new_dot(int wh, Wxd_object_t const *ptpl) { Wxd_object_t *back = NULL; #line 2626 "WxdkdrawObj.cpt" back = dk4mem_new(Wxd_object_t,1,NULL); if (NULL != back) { wxdobj_obj_init( back, ((0 != wh) ? (WXD_OT_DOT_WHITE) : (WXD_OT_DOT_FILLED)), ptpl ); } #if TRACE_DEBUG else { #line 2634 "WxdkdrawObj.cpt" } #endif #line 2637 "WxdkdrawObj.cpt" return back; } Wxd_object_t * wxdobj_obj_new_textlabel(wxChar const *te, Wxd_object_t const *ptpl) { Wxd_object_t *back = NULL; #line 2647 "WxdkdrawObj.cpt" if (NULL != te) { back = dk4mem_new(Wxd_object_t,1,NULL); if (NULL != back) { wxdobj_obj_init(back, WXD_OT_TEXT, ptpl); if (NULL != ptpl) { back->fc[0] = ptpl->sc[0]; back->fc[1] = ptpl->sc[1]; back->fc[2] = ptpl->sc[2]; } (back->det).t.t = dk4strx_dup(te, NULL); if (NULL == (back->det).t.t) { #line 2658 "WxdkdrawObj.cpt" wxdobj_obj_delete(back); back = NULL; } } #if TRACE_DEBUG else { #line 2664 "WxdkdrawObj.cpt" } #endif } #if TRACE_DEBUG else { #line 2669 "WxdkdrawObj.cpt" } #endif #line 2672 "WxdkdrawObj.cpt" return back; } int wxdobj_needs_stipple( Wxd_object_t *pobj ) { int back = 0; #line 2684 "WxdkdrawObj.cpt" switch ( (int)(pobj->ot) ) { case WXD_OT_POLYGON : case WXD_OT_C_SPLINE : case WXD_OT_C_ARC : case WXD_OT_CIRCLE : case WXD_OT_ELLIPSE : case WXD_OT_BOX : { #line 2691 "WxdkdrawObj.cpt" #line 2692 "WxdkdrawObj.cpt" if (WXD_FS_PURE < pobj->fs) { back = 1; } } break; } #line 2697 "WxdkdrawObj.cpt" return back; } /** Find existing stipple structure for object or create a new one. @param pdrw Drawing. @param pobj Object. @return Address of stipple on success, NULL on error. */ static Wxd_stipple_t * i_find_stipple_structure( Wxd_drawing_t *pdrw, Wxd_object_t *pobj ) { Wxd_stipple_t teststip; Wxd_stipple_t *back; #line 2718 "WxdkdrawObj.cpt" teststip.cd[0] = pobj->fs; teststip.cd[1] = pobj->fc[0]; teststip.cd[2] = pobj->fc[1]; teststip.cd[3] = pobj->fc[2]; teststip.cd[4] = pobj->sc[0]; teststip.cd[5] = pobj->sc[1]; teststip.cd[6] = pobj->sc[2]; teststip.cd[7] = 0x01; teststip.bm = NULL; back = (Wxd_stipple_t *)dk4sto_it_find_like( pdrw->i_stip, (const void *)(&teststip), 0 ); if (NULL == back) { #line 2732 "WxdkdrawObj.cpt" back = dk4mem_new(Wxd_stipple_t,1,NULL); if (NULL != back) { #line 2734 "WxdkdrawObj.cpt" DK4_MEMCPY(back,&teststip,sizeof(Wxd_stipple_t)); back->bm = NULL; if (0 == dk4sto_add(pdrw->s_stip, (void *)back, NULL)) { dk4mem_free(back); #line 2738 "WxdkdrawObj.cpt" back = NULL; } #if TRACE_DEBUG else { #line 2742 "WxdkdrawObj.cpt" } #endif } #if TRACE_DEBUG else { #line 2747 "WxdkdrawObj.cpt" } #endif } #line 2750 "WxdkdrawObj.cpt" return back; } static int i_find_layer_structure(Wxd_drawing_t *pdrw, Wxd_object_t *pobj) { Wxd_layer_t *ptest; int back = 0; #line 2762 "WxdkdrawObj.cpt" if (NULL == pobj->play) { ptest = (Wxd_layer_t *)dk4sto_it_find_like( pdrw->i_layers, &(pobj->lay), 1 ); if (NULL != ptest) { pobj->play = ptest; back = 1; } else { ptest = dk4mem_new(Wxd_layer_t,1,NULL); if (NULL != ptest) { ptest->lay = pobj->lay; ptest->active = 0x01; ptest->used = 0x01; if (0 != dk4sto_add(pdrw->s_layers, ptest, NULL)) { pobj->play = ptest; back = 1; } else { #line 2781 "WxdkdrawObj.cpt" dk4mem_free(ptest); } } #if TRACE_DEBUG else { #line 2786 "WxdkdrawObj.cpt" } #endif } } else { back = 1; } #line 2793 "WxdkdrawObj.cpt" return back; } static int wxdobj_drw_layer_and_stipple( Wxd_drawing_t *pdrw, Wxd_object_t *pobj ) { int back = 1; #line 2807 "WxdkdrawObj.cpt" if (NULL == pobj->play) { if (0 == i_find_layer_structure(pdrw, pobj)) { back = 0; } } if (0 != wxdobj_needs_stipple(pobj)) { #line 2813 "WxdkdrawObj.cpt" if (NULL == pobj->psti) { #line 2814 "WxdkdrawObj.cpt" pobj->psti = i_find_stipple_structure(pdrw, pobj); if (NULL == pobj->psti) { #line 2816 "WxdkdrawObj.cpt" back = 0; } #if TRACE_DEBUG else { #line 2821 "WxdkdrawObj.cpt" #line 2822 "WxdkdrawObj.cpt" } #endif } } #line 2826 "WxdkdrawObj.cpt" return back; } int wxdobj_drw_register_object( Wxd_drawing_t *pdrw, Wxd_object_t *pgrp, Wxd_object_t *pobj ) { int back = 0; #line 2840 "WxdkdrawObj.cpt" if ((NULL != pdrw) && (NULL != pobj)) { if (WXD_OT_GROUP_BEGIN == pobj->ot) { /* Group objects go to structured storage only, no layer structure */ if (NULL != pgrp) { if (0 != dk4sto_add((pgrp->det).g.s_e, pobj, NULL)) { pobj->pa = pgrp; back = 1; } #if TRACE_DEBUG else { #line 2852 "WxdkdrawObj.cpt" } #endif } else { if (0 != dk4sto_add(pdrw->s_stru, pobj, NULL)) { back = 1; } #if TRACE_DEBUG else { #line 2861 "WxdkdrawObj.cpt" } #endif } } else { if (0 != wxdobj_drw_layer_and_stipple(pdrw, pobj)) { /* Non-group elements are added to flat and structured storage */ if (0 != dk4sto_add(pdrw->s_flat, pobj, NULL)) { /* Add to structured storage, either group or top-level storage. */ if (NULL != pgrp) { if (0 != dk4sto_add((pgrp->det).g.s_e, pobj, NULL)) { back = 1; pobj->pa = pgrp; } else { #line 2881 "WxdkdrawObj.cpt" dk4sto_remove(pdrw->s_flat, pobj, NULL); } } else { if (0 != dk4sto_add(pdrw->s_stru, pobj, NULL)) { back = 1; } else { #line 2889 "WxdkdrawObj.cpt" dk4sto_remove(pdrw->s_flat, pobj, NULL); } } } #if TRACE_DEBUG else { #line 2895 "WxdkdrawObj.cpt" } #endif } } } #if TRACE_DEBUG else { #line 2902 "WxdkdrawObj.cpt" } #endif #line 2905 "WxdkdrawObj.cpt" return back; } Wxd_object_t * wxdobj_drw_add_group( Wxd_drawing_t *pdrw, Wxd_object_t *pgrp ) { Wxd_object_t *back = NULL; #line 2918 "WxdkdrawObj.cpt" if (NULL != pdrw) { back = dk4mem_new(Wxd_object_t,1,NULL); if (NULL != back) { wxdobj_obj_init(back, WXD_OT_GROUP_BEGIN, NULL); (back->det).g.s_e = dk4sto_open(NULL); if (NULL != (back->det).g.s_e) { dk4sto_set_comp( (back->det).g.s_e, drawobj_compare_object, WXD2LAT_OBJ_COMPARE_CR_PROPERTIES ); (back->det).g.i_e = dk4sto_it_open((back->det).g.s_e, NULL); if (NULL != (back->det).g.i_e) { if (0 == wxdobj_drw_register_object(pdrw, pgrp, back)) { wxdobj_obj_delete(back); back = NULL; #line 2933 "WxdkdrawObj.cpt" } } else { #line 2936 "WxdkdrawObj.cpt" wxdobj_obj_delete(back); back = NULL; } } else { #line 2941 "WxdkdrawObj.cpt" wxdobj_obj_delete(back); back = NULL; } } #if TRACE_DEBUG else { #line 2947 "WxdkdrawObj.cpt" } #endif } #if TRACE_DEBUG else { #line 2952 "WxdkdrawObj.cpt" } #endif #line 2955 "WxdkdrawObj.cpt" return back; } Wxd_object_t * wxdobj_add_polyline( Wxd_drawing_t *pdrw, Wxd_object_t *pgrp, uint16_t np, int cl, Wxd_object_t const *ptpl ) { Wxd_object_t *back = NULL; #line 2971 "WxdkdrawObj.cpt" if (NULL != pdrw) { if (0 != cl) { back = wxdobj_obj_new_polygon(np, ptpl); } else { back = wxdobj_obj_new_polyline(np, ptpl); } if (NULL != back) { if (0 == wxdobj_drw_register_object(pdrw, pgrp, back)) { wxdobj_obj_delete(back); back = NULL; } } } #line 2986 "WxdkdrawObj.cpt" return back; } bool wxdobj_add_polypoint( Wxd_object_t *pobj, uint16_t pind, dk4_er_t *erp ) { dk4_er_t er; /* Error report */ Wxd_point_t *pnew; /* New allocated points array */ size_t btc; /* Bytes to copy */ uint16_t nn; /* New array size */ uint16_t num; /* Number of elements to move */ uint16_t i; /* Index of element to copy */ bool back = false; #line 3006 "WxdkdrawObj.cpt" if ( (NULL != pobj) && ( (WXD_OT_POLYLINE == pobj->ot) || (WXD_OT_POLYGON == pobj->ot) ) && (NULL != (pobj->det).p.p) ) { dk4error_init(&er); nn = dk4ma_uint16_t_add((pobj->det).p.n, 1U, &er); if (DK4_E_NONE == er.ec) { pnew = dk4mem_new(Wxd_point_t,((size_t)nn),&er); if (NULL != pnew) { back = true; btc = sizeof(Wxd_point_t) * (size_t)((pobj->det).p.n); DK4_MEMCPY(pnew,(pobj->det).p.p,btc); dk4mem_free((pobj->det).p.p); (pobj->det).p.p = pnew; if (pind < (pobj->det).p.n) { num = (pobj->det).p.n - pind; for (i = 0; i < num; i++) { ((pobj->det).p.p)[(pobj->det).p.n - i].x = ((pobj->det).p.p)[(pobj->det).p.n - i - 1].x; ((pobj->det).p.p)[(pobj->det).p.n - i].y = ((pobj->det).p.p)[(pobj->det).p.n - i - 1].y; } } else { ((pobj->det).p.p)[(pobj->det).p.n].x = ((pobj->det).p.p)[(pobj->det).p.n - 1].x; ((pobj->det).p.p)[(pobj->det).p.n].y = ((pobj->det).p.p)[(pobj->det).p.n - 1].y; } (pobj->det).p.n = nn; } else { /* ERROR: Memory (already reported) */ } } else { dk4error_copy(erp, &er); } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } #line 3052 "WxdkdrawObj.cpt" return back; } bool wxdobj_del_polypoint( Wxd_object_t *pobj, uint16_t pind, dk4_er_t *erp ) { Wxd_point_t *pnew; size_t btc; uint16_t num; uint16_t i; uint16_t nn; bool back = false; #line 3071 "WxdkdrawObj.cpt" #line 3072 "WxdkdrawObj.cpt" if ( (NULL != pobj) && ( (WXD_OT_POLYLINE == pobj->ot) || (WXD_OT_POLYGON == pobj->ot) ) ) { #line 3079 "WxdkdrawObj.cpt" #line 3080 "WxdkdrawObj.cpt" back = true; if (pind < ((pobj->det).p.n - 1U)) { #line 3082 "WxdkdrawObj.cpt" num = (pobj->det).p.n - 1U - pind; for (i = 0U; i < num; i++) { ((pobj->det).p.p)[pind + i].x = ((pobj->det).p.p)[pind + i + 1U].x; ((pobj->det).p.p)[pind + i].y = ((pobj->det).p.p)[pind + i + 1U].y; } } #if TRACE_DEBUG else { #line 3092 "WxdkdrawObj.cpt" } #endif nn = (pobj->det).p.n - 1U; pnew = dk4mem_new(Wxd_point_t,((size_t)nn),erp); if (NULL != pnew) { #line 3097 "WxdkdrawObj.cpt" btc = sizeof(Wxd_point_t) * ((size_t)nn); DK4_MEMCPY(pnew,(pobj->det).p.p,btc); dk4mem_free((pobj->det).p.p); (pobj->det).p.p = pnew; } #if TRACE_DEBUG else { #line 3104 "WxdkdrawObj.cpt" } #endif (pobj->det).p.n = (pobj->det).p.n - 1U; #line 3108 "WxdkdrawObj.cpt" } else { #line 3110 "WxdkdrawObj.cpt" dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } #line 3113 "WxdkdrawObj.cpt" #line 3114 "WxdkdrawObj.cpt" return back; } Wxd_object_t * wxdobj_add_spline( Wxd_drawing_t *pdrw, Wxd_object_t *pgrp, uint16_t np, int cl, Wxd_object_t const *ptpl ) { Wxd_object_t *back = NULL; #line 3130 "WxdkdrawObj.cpt" if (NULL != pdrw) { back = wxdobj_obj_new_spline(np, cl, ptpl); if (NULL != back) { if (0 == wxdobj_drw_register_object(pdrw, pgrp, back)) { wxdobj_obj_delete(back); back = NULL; } } } #line 3140 "WxdkdrawObj.cpt" return back; } bool wxdobj_add_splinepoint( Wxd_object_t *pobj, uint16_t pind, dk4_er_t *erp ) { dk4_er_t er; /* Error report */ Wxd_spline_point_t *pnew; /* New allocated points array */ size_t btc; /* Bytes to copy */ uint16_t nn; /* New array size */ uint16_t num; /* Number of elements to move */ uint16_t i; /* Index of element to copy */ bool back = false; #line 3160 "WxdkdrawObj.cpt" if ( (NULL != pobj) && ( (WXD_OT_O_SPLINE == pobj->ot) || (WXD_OT_C_SPLINE == pobj->ot) ) && (NULL != (pobj->det).s.p) ) { dk4error_init(&er); nn = dk4ma_uint16_t_add((pobj->det).s.n, 1U, &er); if (DK4_E_NONE == er.ec) { pnew = dk4mem_new(Wxd_spline_point_t,((size_t)nn),&er); if (NULL != pnew) { back = true; btc = sizeof(Wxd_spline_point_t) * (size_t)((pobj->det).s.n); DK4_MEMCPY(pnew,(pobj->det).s.p,btc); dk4mem_free((pobj->det).s.p); (pobj->det).s.p = pnew; if (pind < (pobj->det).s.n) { num = (pobj->det).s.n - pind; for (i = 0; i < num; i++) { ((pobj->det).s.p)[(pobj->det).s.n - i].x = ((pobj->det).s.p)[(pobj->det).s.n - i - 1].x; ((pobj->det).s.p)[(pobj->det).s.n - i].y = ((pobj->det).s.p)[(pobj->det).s.n - i - 1].y; ((pobj->det).s.p)[(pobj->det).s.n - i].s = ((pobj->det).s.p)[(pobj->det).s.n - i - 1].s; } } else { ((pobj->det).s.p)[(pobj->det).s.n].x = ((pobj->det).s.p)[(pobj->det).s.n - 1].x; ((pobj->det).s.p)[(pobj->det).s.n].y = ((pobj->det).s.p)[(pobj->det).s.n - 1].y; ((pobj->det).s.p)[(pobj->det).s.n].s = ((pobj->det).s.p)[(pobj->det).s.n - 1].s; } (pobj->det).s.n = nn; } else { /* ERROR: Memory (already reported) */ } } else { dk4error_copy(erp, &er); } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } #line 3210 "WxdkdrawObj.cpt" return back; } bool wxdobj_del_splinepoint( Wxd_object_t *pobj, uint16_t pind, dk4_er_t *erp ) { Wxd_spline_point_t *pnew; size_t btc; uint16_t num; uint16_t i; uint16_t nn; bool back = false; #line 3229 "WxdkdrawObj.cpt" #line 3230 "WxdkdrawObj.cpt" if ( (NULL != pobj) && ( (WXD_OT_O_SPLINE == pobj->ot) || (WXD_OT_C_SPLINE == pobj->ot) ) ) { #line 3237 "WxdkdrawObj.cpt" #line 3238 "WxdkdrawObj.cpt" back = true; if (pind < ((pobj->det).s.n - 1U)) { #line 3240 "WxdkdrawObj.cpt" num = (pobj->det).s.n - 1U - pind; for (i = 0U; i < num; i++) { ((pobj->det).s.p)[pind + i].x = ((pobj->det).s.p)[pind + i + 1U].x; ((pobj->det).s.p)[pind + i].y = ((pobj->det).s.p)[pind + i + 1U].y; ((pobj->det).s.p)[pind + i].s = ((pobj->det).s.p)[pind + i + 1U].s; } } #if TRACE_DEBUG else { #line 3252 "WxdkdrawObj.cpt" } #endif nn = (pobj->det).s.n - 1U; pnew = dk4mem_new(Wxd_spline_point_t,((size_t)nn),erp); if (NULL != pnew) { #line 3257 "WxdkdrawObj.cpt" btc = sizeof(Wxd_spline_point_t) * ((size_t)nn); DK4_MEMCPY(pnew,(pobj->det).s.p,btc); dk4mem_free((pobj->det).s.p); (pobj->det).s.p = pnew; } #if TRACE_DEBUG else { #line 3264 "WxdkdrawObj.cpt" } #endif (pobj->det).s.n = (pobj->det).s.n - 1U; #line 3268 "WxdkdrawObj.cpt" } else { #line 3270 "WxdkdrawObj.cpt" dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } #line 3273 "WxdkdrawObj.cpt" #line 3274 "WxdkdrawObj.cpt" return back; } Wxd_object_t * wxdobj_add_arc( Wxd_drawing_t *pdrw, Wxd_object_t *pgrp, int cl, Wxd_object_t const *ptpl ) { Wxd_object_t *back = NULL; #line 3289 "WxdkdrawObj.cpt" if (NULL != pdrw) { back = wxdobj_obj_new_arc(cl, ptpl); if (NULL != back) { if (0 == wxdobj_drw_register_object(pdrw, pgrp, back)) { wxdobj_obj_delete(back); back = NULL; } } } #line 3299 "WxdkdrawObj.cpt" return back; } Wxd_object_t * wxdobj_add_circle( Wxd_drawing_t *pdrw, Wxd_object_t *pgrp, Wxd_object_t const *ptpl ) { Wxd_object_t *back = NULL; #line 3313 "WxdkdrawObj.cpt" if (NULL != pdrw) { back = wxdobj_obj_new_circle(ptpl); if (NULL != back) { if (0 == wxdobj_drw_register_object(pdrw, pgrp, back)) { wxdobj_obj_delete(back); back = NULL; } } } #line 3323 "WxdkdrawObj.cpt" return back; } Wxd_object_t * wxdobj_add_ellipse( Wxd_drawing_t *pdrw, Wxd_object_t *pgrp, Wxd_object_t const *ptpl ) { Wxd_object_t *back = NULL; #line 3337 "WxdkdrawObj.cpt" if (NULL != pdrw) { back = wxdobj_obj_new_ellipse(ptpl); if (NULL != back) { if (0 == wxdobj_drw_register_object(pdrw, pgrp, back)) { wxdobj_obj_delete(back); back = NULL; } } } #line 3347 "WxdkdrawObj.cpt" return back; } Wxd_object_t * wxdobj_add_box( Wxd_drawing_t *pdrw, Wxd_object_t *pgrp, Wxd_object_t const *ptpl ) { Wxd_object_t *back = NULL; #line 3361 "WxdkdrawObj.cpt" if (NULL != pdrw) { back = wxdobj_obj_new_box(ptpl); if (NULL != back) { if (0 == wxdobj_drw_register_object(pdrw, pgrp, back)) { wxdobj_obj_delete(back); back = NULL; } } } #line 3371 "WxdkdrawObj.cpt" return back; } Wxd_object_t * wxdobj_add_image( Wxd_drawing_t *pdrw, Wxd_object_t *pgrp, wxChar const *fn, Wxd_object_t const *ptpl ) { Wxd_object_t *back = NULL; #line 3386 "WxdkdrawObj.cpt" if (NULL != pdrw) { back = wxdobj_obj_new_image(fn, ptpl); if (NULL != back) { if (0 == wxdobj_drw_register_object(pdrw, pgrp, back)) { wxdobj_obj_delete(back); back = NULL; } } } #line 3396 "WxdkdrawObj.cpt" return back; } Wxd_object_t * wxdobj_add_dot( Wxd_drawing_t *pdrw, Wxd_object_t *pgrp, int wh, Wxd_object_t const *ptpl ) { Wxd_object_t *back = NULL; #line 3411 "WxdkdrawObj.cpt" if (NULL != pdrw) { back = wxdobj_obj_new_dot(wh, ptpl); if (NULL != back) { if (0 == wxdobj_drw_register_object(pdrw, pgrp, back)) { wxdobj_obj_delete(back); back = NULL; } } } #line 3421 "WxdkdrawObj.cpt" return back; } Wxd_object_t * wxdobj_add_textlabel( Wxd_drawing_t *pdrw, Wxd_object_t *pgrp, wxChar const *te, Wxd_object_t const *ptpl ) { Wxd_object_t *back = NULL; #line 3436 "WxdkdrawObj.cpt" if ((NULL != pdrw) && (NULL != te)) { back = wxdobj_obj_new_textlabel(te, ptpl); if (NULL != back) { if (0 == wxdobj_drw_register_object(pdrw, pgrp, back)) { wxdobj_obj_delete(back); back= NULL; } } } #line 3446 "WxdkdrawObj.cpt" return back; } Wxd_object_t * wxdobj_find_group_for(Wxd_drawing_t *pdrw, Wxd_object_t *pobj) { Wxd_object_t *back = NULL; #line 3456 "WxdkdrawObj.cpt" if ((NULL != pdrw) && (NULL != pobj)) { back = i_find_group_for(pdrw, pobj); } #line 3460 "WxdkdrawObj.cpt" return back; } int wxdobj_find_layer_structure(Wxd_drawing_t *pdrw, Wxd_object_t *pobj) { int back = 0; #line 3470 "WxdkdrawObj.cpt" if ((NULL != pdrw) && (NULL != pobj)) { back = i_find_layer_structure(pdrw, pobj); } #line 3473 "WxdkdrawObj.cpt" return back; } /** Modify object layer internally. @param pdrw Drawing to modify. @param pobj Object to modify. @param nl New layer differing from objects current layer. @return 1 on success, 0 on error. */ static int i_modify_layer( Wxd_drawing_t *pdrw, Wxd_object_t *pobj, int16_t nl ) { Wxd_layer_t *playold; /* Old layer structure */ Wxd_object_t *pgrp; /* Group containing the object */ int back = 0; /* Result */ #line 3497 "WxdkdrawObj.cpt" playold = pobj->play; pobj->play = NULL; if (NULL != dk4sto_it_find_exact(pdrw->i_flat, pobj)) { /* In flat list */ if (NULL != dk4sto_it_find_exact(pdrw->i_stru, pobj)) { /* Top-level element */ dk4sto_remove(pdrw->s_stru, pobj, NULL); dk4sto_remove(pdrw->s_flat, pobj, NULL); pobj->lay = nl; back = wxdobj_drw_register_object(pdrw, NULL, pobj); if (0 == back) { #line 3512 "WxdkdrawObj.cpt" wxdobj_obj_delete(pobj); } wxdobj_drw_require_redraw(pdrw, WXD_REFRESH_DRAWING); } else { /* Member of a group */ pgrp = i_find_group_for(pdrw, pobj); if (NULL != pgrp) { /* Group found */ dk4sto_remove((pgrp->det).g.s_e, pobj, NULL); dk4sto_remove(pdrw->s_flat, pobj, NULL); pobj->lay = nl; back = wxdobj_drw_register_object(pdrw, pgrp, pobj); if (0 == back) { #line 3530 "WxdkdrawObj.cpt" wxdobj_obj_delete(pobj); } wxdobj_drw_require_redraw(pdrw, WXD_REFRESH_DRAWING); } else { #line 3535 "WxdkdrawObj.cpt" /* Group not found */ } } } else { #line 3542 "WxdkdrawObj.cpt" /* Not in flat list */ } /* Find layer structure */ if (0 != back) { back = i_find_layer_structure(pdrw, pobj); } /* Remove playold from drawing if not used by other objects */ if (NULL != playold) { i_check_layer_structure_removal(pdrw, playold); } #line 3556 "WxdkdrawObj.cpt" return back; } int wxdobj_modify_layer( Wxd_drawing_t *pdrw, Wxd_object_t *pobj, int16_t nl ) { int back = 0; #line 3570 "WxdkdrawObj.cpt" if ((NULL != pdrw) && (NULL != pobj)) { if (pobj->lay != nl) { back = i_modify_layer(pdrw, pobj, nl); } else { back = 1; } } #if TRACE_DEBUG else { #line 3580 "WxdkdrawObj.cpt" } #endif #line 3583 "WxdkdrawObj.cpt" return back; } void wxdobj_bb_correct(Wxd_bb_t *bbptr, uint16_t *ppoint) { int32_t x; #line 3594 "WxdkdrawObj.cpt" if (NULL != bbptr) { if (bbptr->xl > bbptr->xr) { if (bbptr->yb > bbptr->yt) { x = bbptr->xl; bbptr->xl = bbptr->xr; bbptr->xr = x; x = bbptr->yb; bbptr->yb = bbptr->yt; bbptr->yt = x; if (NULL != ppoint) { switch ( (int)(*ppoint) ) { case 3 : { *ppoint = (uint16_t)0U; } break; case 2 : { *ppoint = (uint16_t)0U; } break; case 1 : { *ppoint = (uint16_t)3U; } break; default : { *ppoint = (uint16_t)2U; } break; } } } else { x = bbptr->xl; bbptr->xl = bbptr->xr; bbptr->xr = x; if (NULL != ppoint) { switch ( (int)(*ppoint) ) { case 3 : { *ppoint = (uint16_t)2U; } break; case 2 : { *ppoint = (uint16_t)3U; } break; case 1 : { *ppoint = (uint16_t)0U; } break; default : { *ppoint = (uint16_t)1U; } break; } } } } else { if (bbptr->yb > bbptr->yt) { x = bbptr->yb; bbptr->yb = bbptr->yt; bbptr->yt = x; if (NULL != ppoint) { switch ( (int)(*ppoint) ) { case 3 : { *ppoint = (uint16_t)0U; } break; case 2 : { *ppoint = (uint16_t)1U; } break; case 1 : { *ppoint = (uint16_t)2U; } break; default : { *ppoint = (uint16_t)3U; } break; } } } } } #line 3666 "WxdkdrawObj.cpt" } bool wxdobj_bb_is_null_area(Wxd_bb_t *bbptr) { bool back = false; #line 3675 "WxdkdrawObj.cpt" if (NULL != bbptr) { if (bbptr->xl >= bbptr->xr) { back = true; } if (bbptr->yb >= bbptr->yt) { back = true; } } #line 3683 "WxdkdrawObj.cpt" return back; } static int32_t wxdobj_i32_max(int32_t a, int32_t b) { return ((a >= b) ? (a) : (b)); } static int32_t wxdobj_i32_min(int32_t a, int32_t b) { return ((a <= b) ? (a) : (b)); } bool wxdobj_bb_intersection( Wxd_bb_t *res, Wxd_bb_t const *a, Wxd_bb_t const *b ) { if ((NULL == res) || (NULL == a) || (NULL == b)) { return false; } if (a->xr < b->xl) return false; if (b->xr < a->xl) return false; if (a->yt < b->yb) return false; if (b->yt < a->yb) return false; res->xl = wxdobj_i32_max(a->xl, b->xl); res->xr = wxdobj_i32_min(a->xr, b->xr); res->yb = wxdobj_i32_max(a->yb, b->yb); res->yt = wxdobj_i32_min(a->yt, b->yt); return true; } static dk4_bif_t * wxdobj_image_bif_open( Wxd_object_t *pobj, int dkenc, int wxenc ) { dkChar fnb[DK4_MAX_PATH]; dk4_bif_t *back = NULL; const size_t szfnb = DK4_SIZEOF(fnb,dkChar); int res; #line 3742 "WxdkdrawObj.cpt" res = dk4recwx_wxchar_to_dkchar( fnb, szfnb, dkenc, (pobj->det).i.fn, wxenc, NULL ); if (0 != res) { back = dk4bif_open(fnb, 1, NULL, NULL); } #if TRACE_DEBUG else { #line 3750 "WxdkdrawObj.cpt" } #endif #line 3753 "WxdkdrawObj.cpt" return back; } void wxdobj_image_placement( Wxd_object_t *pobj ) { double iw; /* Image width */ double ih; /* Image height */ double sw; /* Scale factor for width */ double sh; /* Scale factor for height */ double l; /* Length */ double b; /* Border */ #line 3770 "WxdkdrawObj.cpt" #line 3771 "WxdkdrawObj.cpt" #line 3772 "WxdkdrawObj.cpt" #line 3773 "WxdkdrawObj.cpt" #line 3774 "WxdkdrawObj.cpt" if (0 != ((uint16_t)(WXD_IMFL_ASPECT) & (pobj->det).i.fl)) { #line 3776 "WxdkdrawObj.cpt" wxSize wxsz = ((pobj->det).i.bm)->GetSize(); iw = (double)(wxsz.GetWidth()); ih = (double)(wxsz.GetHeight()); if ( (0.0 < (pobj->det).i.xres) && (0.0 < (pobj->det).i.yres) && ((pobj->det).i.xres != (pobj->det).i.yres) ) { #line 3783 "WxdkdrawObj.cpt" iw = iw / (pobj->det).i.xres; ih = ih / (pobj->det).i.yres; } sw = ( (double)((pobj->det).i.br.xr) - (double)((pobj->det).i.br.xl) ) / iw; sh = ( (double)((pobj->det).i.br.yt) - (double)((pobj->det).i.br.yb) ) / ih; if (sw <= sh) { #line 3793 "WxdkdrawObj.cpt" (pobj->det).i.pl.xmin = (pobj->det).i.br.xl; (pobj->det).i.pl.xmax = (pobj->det).i.br.xr; l = sw * ih; b = (double)((pobj->det).i.br.yt) - (double)((pobj->det).i.br.yb); b = (b - l) / 2.0; (pobj->det).i.pl.ymin = (pobj->det).i.br.yb + b; (pobj->det).i.pl.ymax = (pobj->det).i.br.yt - b; } else { #line 3802 "WxdkdrawObj.cpt" (pobj->det).i.pl.ymin = (pobj->det).i.br.yb; (pobj->det).i.pl.ymax = (pobj->det).i.br.yt; l = sh * iw; b = (double)((pobj->det).i.br.xr) - (double)((pobj->det).i.br.xl); b = (b - l) / 2.0; (pobj->det).i.pl.xmin = (pobj->det).i.br.xl + b; (pobj->det).i.pl.xmax = (pobj->det).i.br.xr - b; } } else { #line 3812 "WxdkdrawObj.cpt" (pobj->det).i.pl.xmin = (pobj->det).i.br.xl; (pobj->det).i.pl.xmax = (pobj->det).i.br.xr; (pobj->det).i.pl.ymin = (pobj->det).i.br.yb; (pobj->det).i.pl.ymax = (pobj->det).i.br.yt; } #line 3818 "WxdkdrawObj.cpt" #line 3819 "WxdkdrawObj.cpt" #line 3820 "WxdkdrawObj.cpt" #line 3821 "WxdkdrawObj.cpt" #line 3822 "WxdkdrawObj.cpt" } void wxdobj_load_image( Wxd_object_t *pobj, int dkenc, int wxenc ) { dk4_bif_t *bifptr; wxString strfn((pobj->det).i.fn); #line 3836 "WxdkdrawObj.cpt" if (NULL == (pobj->det).i.bm) { #line 3837 "WxdkdrawObj.cpt" (pobj->det).i.xres = -1.0; (pobj->det).i.yres = -1.0; (pobj->det).i.t = wxdobj_image_type((pobj->det).i.fn); if (wxBITMAP_TYPE_INVALID != (pobj->det).i.t) { (pobj->det).i.bm = new wxBitmap( strfn, (pobj->det).i.t ); if (NULL != (pobj->det).i.bm) { #line 3845 "WxdkdrawObj.cpt" if (!(((pobj->det).i.bm)->IsOk())) { #line 3846 "WxdkdrawObj.cpt" delete ((pobj->det).i.bm); (pobj->det).i.bm = NULL; } } if (NULL != (pobj->det).i.bm) { #line 3851 "WxdkdrawObj.cpt" if (0 != ((uint16_t)(WXD_IMFL_ASPECT) & (pobj->det).i.fl)) { #line 3853 "WxdkdrawObj.cpt" bifptr = wxdobj_image_bif_open(pobj, dkenc, wxenc); if (NULL != bifptr) { (pobj->det).i.xres = dk4bif_get_xres(bifptr); (pobj->det).i.yres = dk4bif_get_yres(bifptr); #line 3858 "WxdkdrawObj.cpt" #line 3859 "WxdkdrawObj.cpt" dk4bif_close(bifptr); } } #if TRACE_DEBUG else { #line 3864 "WxdkdrawObj.cpt" } #endif wxdobj_image_placement(pobj); } #if TRACE_DEBUG else { #line 3870 "WxdkdrawObj.cpt" } #endif } #if TRACE_DEBUG else { #line 3875 "WxdkdrawObj.cpt" } #endif } #if TRACE_DEBUG else { #line 3880 "WxdkdrawObj.cpt" } #endif #line 3883 "WxdkdrawObj.cpt" } void wxdobj_unmark_recursively(Wxd_object_t *pobj, uint8_t marker) { Wxd_object_t *po; #line 3892 "WxdkdrawObj.cpt" if (NULL != pobj) { pobj->mark &= (~(marker)); if (WXD_OT_GROUP_BEGIN == pobj->ot) { dk4sto_it_reset((pobj->det).g.i_e); do { po = (Wxd_object_t *)dk4sto_it_next((pobj->det).g.i_e); if (NULL != po) { wxdobj_unmark_recursively(po, marker); } } while (NULL != po); } } #line 3905 "WxdkdrawObj.cpt" } void wxdobj_unmark_all(Wxd_drawing_t *pdrw, uint8_t marker) { Wxd_object_t *pobj; #line 3914 "WxdkdrawObj.cpt" uint8_t mask; mask = (~(marker)); dk4sto_it_reset(pdrw->i_flat); do { pobj = (Wxd_object_t *)dk4sto_it_next(pdrw->i_flat); if (NULL != pobj) { pobj->mark &= mask; } } while (NULL != pobj); dk4sto_it_reset(pdrw->i_stru); do { pobj = (Wxd_object_t *)dk4sto_it_next(pdrw->i_stru); if (NULL != pobj) { pobj->mark &= mask; } } while (NULL != pobj); #line 3932 "WxdkdrawObj.cpt" } void wxdobj_mark_recursively(Wxd_object_t *pobj, uint8_t marker) { Wxd_object_t *po; #line 3941 "WxdkdrawObj.cpt" if (NULL != pobj) { pobj->mark |= marker; if (WXD_OT_GROUP_BEGIN == pobj->ot) { dk4sto_it_reset((pobj->det).g.i_e); do { po = (Wxd_object_t *)dk4sto_it_next((pobj->det).g.i_e); if (NULL != po) { wxdobj_mark_recursively(po, marker); } } while (NULL != po); } } #line 3954 "WxdkdrawObj.cpt" } /** Find sector for point relative to box. @param pbox Box. @param r Rounded corners radius. @param ppt Point. @return Sector number, one from: - 0: Point is lower left than box center. - 1: Point is centered below box. - 2: Point is lower right than box center. - 3: Point is left from box center. - 4: Point is in box center. - 5: Point is right from box center. - 6: Point is upper left from box center. - 7: Point is centered over box. - 8: Point is upper right from box center. */ static int wxdobj_box_sector(Wxd_bb_t *pbox, uint32_t r, dk4_gra_point_t *ppt) { int back = 4; #line 3979 "WxdkdrawObj.cpt" if (ppt->x < (double)(pbox->xl) + (double)r) { /* X: left */ if (ppt->y < (double)(pbox->yb) + (double)r) { back = 0; } else { if (ppt->y > (double)(pbox->yt) - (double)r) { back = 6; } else { back = 3; } } } else { if (ppt->x > (double)(pbox->xr) - (double)r) { /* X: right */ if (ppt->y < (double)(pbox->yb) + (double)r) { back = 2; } else { if (ppt->y > (double)(pbox->yt) - (double)r) { back = 8; } else { back = 5; } } } else { /* X: centered */ if (ppt->y < (double)(pbox->yb) + (double)r) { back = 1; } else { if (ppt->y > (double)(pbox->yt) - (double)r) { back = 7; } } } } #line 4021 "WxdkdrawObj.cpt" return back; } double wxdobj_dist_box( Wxd_bb_t *pbox, uint32_t r, dk4_gra_point_t *ppt, bool bCtrlPt, uint16_t *pIndex ) { dk4_gra_point_t pta; dk4_gra_point_t ptb; double d; double back = -1.0; uint16_t n; #line 4041 "WxdkdrawObj.cpt" if (bCtrlPt) { pta.x = (double)(pbox->xl); pta.y = (double)(pbox->yb); back = dk4gratool_dist_point_point(&pta, ppt, NULL); n = 0; pta.x = (double)(pbox->xr); pta.y = (double)(pbox->yb); d = dk4gratool_dist_point_point(&pta, ppt, NULL); if (d < back) { back = d; n = 1; } pta.x = (double)(pbox->xr); pta.y = (double)(pbox->yt); d = dk4gratool_dist_point_point(&pta, ppt, NULL); if (d < back) { back = d; n = 2; } pta.x = (double)(pbox->xl); pta.y = (double)(pbox->yt); d = dk4gratool_dist_point_point(&pta, ppt, NULL); if (d < back) { back = d; n = 3; } if (NULL != pIndex) { *pIndex = n; } } else { if ((uint32_t)0UL == r) { pta.x = (double)(pbox->xl); pta.y = (double)(pbox->yb); ptb.x = (double)(pbox->xr); ptb.y = (double)(pbox->yb); back = dk4gratool_dist_point_track(&pta, &ptb, ppt, NULL); pta.x = (double)(pbox->xr); pta.y = (double)(pbox->yt); d = dk4gratool_dist_point_track(&pta, &ptb, ppt, NULL); if ((0.0 <= d) && (d < back)) { back = d; } ptb.x = (double)(pbox->xl); ptb.y = (double)(pbox->yt); d = dk4gratool_dist_point_track(&pta, &ptb, ppt, NULL); if ((0.0 <= d) && (d < back)) { back = d; } pta.x = (double)(pbox->xl); pta.y = (double)(pbox->yb); d = dk4gratool_dist_point_track(&pta, &ptb, ppt, NULL); if ((0.0 <= d) && (d < back)) { back = d; } } else { switch (wxdobj_box_sector(pbox, r, ppt)) { case 0: { pta.x = (double)(pbox->xl); pta.y = (double)(pbox->yb); back = dk4gratool_dist_point_point(&pta, ppt, NULL); back = fabs(back - (double)r); } break; case 1: { pta.x = (double)(pbox->xl); pta.y = (double)(pbox->yb); ptb.x = (double)(pbox->xr); ptb.y = (double)(pbox->yb); back = dk4gratool_dist_point_track(&pta, &ptb, ppt, NULL); } break; case 2: { pta.x = (double)(pbox->xr); pta.y = (double)(pbox->yb); back = dk4gratool_dist_point_point(&pta, ppt, NULL); back = fabs(back - (double)r); } break; case 3: { pta.x = (double)(pbox->xl); pta.y = (double)(pbox->yb); ptb.x = (double)(pbox->xl); ptb.y = (double)(pbox->yt); back = dk4gratool_dist_point_track(&pta, &ptb, ppt, NULL); } break; case 5: { pta.x = (double)(pbox->xr); pta.y = (double)(pbox->yb); ptb.x = (double)(pbox->xr); ptb.y = (double)(pbox->yt); back = dk4gratool_dist_point_track(&pta, &ptb, ppt, NULL); } break; case 6: { pta.x = (double)(pbox->xl); pta.y = (double)(pbox->yt); back = dk4gratool_dist_point_point(&pta, ppt, NULL); back = fabs(back - (double)r); } break; case 7: { pta.x = (double)(pbox->xl); pta.y = (double)(pbox->yt); ptb.x = (double)(pbox->xr); ptb.y = (double)(pbox->yt); back = dk4gratool_dist_point_track(&pta, &ptb, ppt, NULL); } break; case 8: { pta.x = (double)(pbox->xr); pta.y = (double)(pbox->yt); back = dk4gratool_dist_point_point(&pta, ppt, NULL); back = fabs(back - (double)r); } break; default : { pta.x = (double)(pbox->xl); pta.y = (double)(pbox->yb); ptb.x = (double)(pbox->xr); ptb.y = (double)(pbox->yb); back = dk4gratool_dist_point_track(&pta, &ptb, ppt, NULL); pta.x = (double)(pbox->xr); pta.y = (double)(pbox->yt); d = dk4gratool_dist_point_track(&pta, &ptb, ppt, NULL); if ((0.0 <= d) && (d < back)) { back = d; } ptb.x = (double)(pbox->xl); ptb.y = (double)(pbox->yt); d = dk4gratool_dist_point_track(&pta, &ptb, ppt, NULL); if ((0.0 <= d) && (d < back)) { back = d; } pta.x = (double)(pbox->xl); pta.y = (double)(pbox->yb); d = dk4gratool_dist_point_track(&pta, &ptb, ppt, NULL); if ((0.0 <= d) && (d < back)) { back = d; } } break; } } } #line 4151 "WxdkdrawObj.cpt" return back; } bool wxdobj_ctrlpt_dist_box( Wxd_bb_t *pbox, dk4_gra_point_t *ppt, uint16_t *pIndex, double dlim ) { double d; uint16_t ind = (uint16_t)0U; bool back = false; d = wxdobj_dist_box(pbox, (uint32_t)0UL, ppt, true, &ind); if (dlim >= d) { *pIndex = ind; back = true; } return back; } static double wxdobj_dist_dot( Wxd_object_t *pobj, dk4_gra_point_t *grapt ) { dk4_gra_point_t pta; double back = 0.0; double r; #line 4189 "WxdkdrawObj.cpt" pta.x = (double)((pobj->det).d.x); pta.y = (double)((pobj->det).d.y); back = dk4gratool_dist_point_point(grapt, &pta, NULL); /* (d / 2) * (16256000 / 160) */ r = 50800.0 * (double)((pobj->det).d.d); if (WXD_OT_DOT_WHITE == pobj->ot) { r += 101600.0; } if (back > r) { back = back - r; } #line 4200 "WxdkdrawObj.cpt" return back; } double wxdobj_distance_to_point( Wxd_object_t *pobj, Wxd_point_t const *ppt, bool bCtrlPt, uint16_t *pIndex ) { dk4_gra_point_t grapt; /* Point to test in double coords */ dk4_gra_point_t pta; /* Section start point */ dk4_gra_point_t ptb; /* Section end point */ double back = -1.0; /* Result distance */ double d; /* Distance in current test */ double alpha; /* Ellipse rotation in degree */ uint16_t i; /* Traverse point array */ #line 4221 "WxdkdrawObj.cpt" grapt.x = (double)(ppt->x); grapt.y = (double)(ppt->y); switch ( pobj->ot ) { case WXD_OT_TEXT : { pta.x = (double)((pobj->det).t.x); pta.y = (double)((pobj->det).t.y); back = dk4gratool_dist_point_point(&grapt, &pta, NULL); if (bCtrlPt && (NULL != pIndex)) { *pIndex = (uint16_t)0U; } } break; case WXD_OT_POLYLINE : case WXD_OT_POLYGON : { if ((NULL != (pobj->det).p.p) && (1 < (pobj->det).p.n)) { if (bCtrlPt) { for (i = 0; i < (pobj->det).p.n; i++) { pta.x = (double)(((pobj->det).p.p)[i].x); pta.y = (double)(((pobj->det).p.p)[i].y); d = dk4gratool_dist_point_point(&pta, &grapt, NULL); if (0 == i) { back = d; if (NULL != pIndex) { *pIndex = (uint16_t)0U; } } else { if (d < back) { back = d; if (NULL != pIndex) { *pIndex = (uint16_t)i; } } } } } else { pta.x = (double)(((pobj->det).p.p)[0].x); pta.y = (double)(((pobj->det).p.p)[0].y); for (i = 0; i < ((pobj->det).p.n - (uint16_t)1U); i++) { ptb.x = (double)(((pobj->det).p.p)[i + (uint16_t)1U].x); ptb.y = (double)(((pobj->det).p.p)[i + (uint16_t)1U].y); d = dk4gratool_dist_point_track(&pta,&ptb,&grapt,NULL); if (0.0 < d) { if ((0.0 > back) || (d < back)) { back = d; } } DK4_MEMCPY(&pta,&ptb,sizeof(dk4_gra_point_t)); } if (WXD_OT_POLYGON == pobj->ot) { ptb.x = (double)(((pobj->det).p.p)[0].x); ptb.y = (double)(((pobj->det).p.p)[0].y); d = dk4gratool_dist_point_track(&pta,&ptb,&grapt,NULL); if (0.0 < d) { if ((0.0 > back) || (d < back)) { back = d; } } } } } } break; case WXD_OT_O_SPLINE : case WXD_OT_C_SPLINE : { if ((NULL != (pobj->det).s.p) && (1 < (pobj->det).s.n)) { if (bCtrlPt) { for (i = 0; i < (pobj->det).s.n; i++) { pta.x = (double)(((pobj->det).s.p)[i].x); pta.y = (double)(((pobj->det).s.p)[i].y); d = dk4gratool_dist_point_point(&pta, &grapt, NULL); if (0 == i) { back = d; if (NULL != pIndex) { *pIndex = (uint16_t)0U; } } else { if (d < back) { back = d; if (NULL != pIndex) { *pIndex = (uint16_t)i; } } } } } else { pta.x = (double)(((pobj->det).s.p)[0].x); pta.y = (double)(((pobj->det).s.p)[0].y); for (i = 0; i < ((pobj->det).s.n - (uint16_t)1U); i++) { ptb.x = (double)(((pobj->det).s.p)[i + (uint16_t)1U].x); ptb.y = (double)(((pobj->det).s.p)[i + (uint16_t)1U].y); d = dk4gratool_dist_point_track(&pta,&ptb,&grapt,NULL); if (0.0 < d) { if ((0.0 > back) || (d < back)) { back = d; } } DK4_MEMCPY(&pta,&ptb,sizeof(dk4_gra_point_t)); } if (WXD_OT_C_SPLINE == pobj->ot) { ptb.x = (double)(((pobj->det).s.p)[0].x); ptb.y = (double)(((pobj->det).s.p)[0].y); d = dk4gratool_dist_point_track(&pta,&ptb,&grapt,NULL); if (0.0 < d) { if ((0.0 > back) || (d < back)) { back = d; } } } } } } break; case WXD_OT_O_ARC : case WXD_OT_C_ARC : { pta.x = (double)((pobj->det).a.x1); pta.y = (double)((pobj->det).a.y1); back = dk4gratool_dist_point_point(&grapt, &pta, NULL); if (NULL != pIndex) { *pIndex = (uint16_t)0U; } pta.x = (double)((pobj->det).a.x2); pta.y = (double)((pobj->det).a.y2); d = dk4gratool_dist_point_point(&grapt, &pta, NULL); if ((0.0 <= d) && (d < back)) { back = d; if (NULL != pIndex) { *pIndex = (uint16_t)1U; } } pta.x = (double)((pobj->det).a.x3); pta.y = (double)((pobj->det).a.y3); d = dk4gratool_dist_point_point(&grapt, &pta, NULL); if ((0.0 <= d) && (d < back)) { back = d; if (NULL != pIndex) { *pIndex = (uint16_t)2U; } } if ((WXD_OT_C_ARC == pobj->ot) && (!(bCtrlPt))) { if (0 != (pobj->det).a.d) { pta.x = (double)((pobj->det).a.x1); pta.y = (double)((pobj->det).a.y1); ptb.x = (pobj->det).a.x; ptb.y = (pobj->det).a.y; d = dk4gratool_dist_point_track(&pta, &ptb, &grapt, NULL); if ((0.0 <= d) && (d < back)) { back = d; } pta.x = (double)((pobj->det).a.x3); pta.y = (double)((pobj->det).a.y3); d = dk4gratool_dist_point_track(&pta, &ptb, &grapt, NULL); if ((0.0 <= d) && (d < back)) { back = d; } } } } break; case WXD_OT_CIRCLE : { if (bCtrlPt) { for (i = 0; i < 4; i++) { switch (i) { case 0 : { pta.x = (double)((pobj->det).e.rx); pta.y = 0.0; } break; case 1 : { pta.x = 0.0; pta.y = (double)((pobj->det).e.rx); } break; case 2 : { pta.x = 0.0 - (double)((pobj->det).e.rx); pta.y = 0.0; } break; case 3 : { pta.x = 0.0; pta.y = 0.0 - (double)((pobj->det).e.rx); } break; } pta.x += (double)((pobj->det).e.x); pta.y += (double)((pobj->det).e.y); d = dk4gratool_dist_point_point(&grapt, &pta, NULL); if (0 == i) { back = d; if (NULL != pIndex) { *pIndex = i; } } else { if (d < back) { back = d; if (NULL != pIndex) { *pIndex = i; } } } } if (NULL != pIndex) { #line 4389 "WxdkdrawObj.cpt" } } else { pta.x = (double)((pobj->det).e.x); pta.y = (double)((pobj->det).e.y); d = dk4gratool_dist_point_point(&grapt, &pta, NULL); d = d - (double)((pobj->det).e.rx); back = fabs(d); if (NULL != pIndex) { *pIndex = (uint16_t)0U; } } } break; case WXD_OT_ELLIPSE : { if (bCtrlPt) { #line 4403 "WxdkdrawObj.cpt" alpha = (M_PI * (double)((pobj->det).e.a)) / 180.0; for (i = 0; i < 4; i++) { switch (i) { case 0 : { pta.x = (double)((pobj->det).e.rx); pta.y = 0.0; } break; case 1 : { pta.x = 0.0; pta.y = (double)((pobj->det).e.ry); } break; case 2 : { pta.x = 0.0 - (double)((pobj->det).e.rx); pta.y = 0.0; } break; case 3 : { pta.x = 0.0; pta.y = 0.0 - (double)((pobj->det).e.ry); } break; } dk4gratool_rotate_point(&pta, alpha); pta.x += (double)((pobj->det).e.x); pta.y += (double)((pobj->det).e.y); d = dk4gratool_dist_point_point(&grapt, &pta, NULL); if (0 == i) { back = d; if (NULL != pIndex) { *pIndex = i; } } else { if (d < back) { back = d; if (NULL != pIndex) { *pIndex = i; } } } } if (NULL != pIndex) { #line 4440 "WxdkdrawObj.cpt" } } else { pta.x = (double)((pobj->det).e.x); pta.y = (double)((pobj->det).e.y); back = dk4gratool_dist_point_ellipse( &pta,(double)((pobj->det).e.rx),(double)((pobj->det).e.ry), ((M_PI * (double)((pobj->det).e.a)) / 180.0), &grapt, NULL ); } } break; case WXD_OT_BOX : { back = wxdobj_dist_box( &((pobj->det).b.b), (pobj->det).b.r, &grapt, bCtrlPt, pIndex ); } break; case WXD_OT_IMAGE : { back = wxdobj_dist_box( &((pobj->det).i.br), 0UL, &grapt, bCtrlPt, pIndex ); } break; case WXD_OT_DOT_FILLED : case WXD_OT_DOT_WHITE : { back = wxdobj_dist_dot(pobj, &grapt); if (NULL != pIndex) { *pIndex = (uint16_t)0U; } } break; } #line 4466 "WxdkdrawObj.cpt" return back; } Wxd_stipple_t * wxdobj_find_stipple_structure( Wxd_drawing_t *pdrw, Wxd_object_t *pobj ) { if ((NULL != pdrw) && (NULL != pobj)) { return (i_find_stipple_structure(pdrw,pobj)); } return NULL; } void wxdobj_remove_unused_stipples( Wxd_drawing_t *pdrw ) { Wxd_stipple_t *pstip; Wxd_object_t *pobj; bool changed; #line 4494 "WxdkdrawObj.cpt" /* Mark all stipples as unused */ dk4sto_it_reset(pdrw->i_stip); do { pstip = (Wxd_stipple_t *)dk4sto_it_next(pdrw->i_stip); if (NULL != pstip) { pstip->cd[7] = 0x00; } } while (NULL != pstip); /* Mark used stipples */ dk4sto_it_reset(pdrw->i_flat); do { pobj = (Wxd_object_t *)dk4sto_it_next(pdrw->i_flat); if (NULL != pobj) { if (NULL != pobj->psti) { pobj->psti->cd[7] = 0x01; } } } while (NULL != pobj); /* Remove stipples not marked as used */ do { changed = false; dk4sto_it_reset(pdrw->i_stip); do { pstip = (Wxd_stipple_t *)dk4sto_it_next(pdrw->i_stip); if (NULL != pstip) { if (0x00 == pstip->cd[7]) { #line 4527 "WxdkdrawObj.cpt" #if TRACE_DEBUG for (size_t i = 0; i < 8; i++) { #line 4530 "WxdkdrawObj.cpt" } #line 4532 "WxdkdrawObj.cpt" #endif changed = true; dk4sto_remove(pdrw->s_stip, pstip, NULL); if (NULL != pstip->bm) { delete (pstip->bm); } dk4mem_free(pstip); } } } while ((NULL != pstip) && (!(changed))); } while (changed); #line 4544 "WxdkdrawObj.cpt" } void wxdobj_remove_unused_fonts( Wxd_drawing_t *pdrw ) { Wxd_font_t *pfont; Wxd_object_t *pobj; bool changed; #line 4557 "WxdkdrawObj.cpt" /* Mark all fonts as unused */ dk4sto_it_reset(pdrw->i_fonts); do { pfont = (Wxd_font_t *)dk4sto_it_next(pdrw->i_fonts); if (NULL != pfont) { pfont->used = false; } } while (NULL != pfont); /* Mark used fonts */ dk4sto_it_reset(pdrw->i_flat); do { pobj = (Wxd_object_t *)dk4sto_it_next(pdrw->i_flat); if (NULL != pobj) { if (WXD_OT_TEXT == pobj->ot) { if (NULL != (pobj->det).t.font) { ((pobj->det).t.font)->used = true; } } } } while (NULL != pobj); /* Remove fonts not marked as used */ do { changed = false; dk4sto_it_reset(pdrw->i_fonts); do { pfont = (Wxd_font_t *)dk4sto_it_next(pdrw->i_fonts); if (NULL != pfont) { if (!(pfont->used)) { changed = true; dk4sto_remove(pdrw->s_fonts, pfont, NULL); if (NULL != pfont->font) { delete (pfont->font); pfont->font = NULL; } dk4mem_free(pfont); } } } while ((NULL != pfont) && (!(changed))); } while (changed); #line 4602 "WxdkdrawObj.cpt" } size_t wxdobj_get_number_of_layers( Wxd_drawing_t *pdrw ) { size_t back = 0U; #line 4613 "WxdkdrawObj.cpt" if (NULL != pdrw) { if (NULL != pdrw->i_layers) { dk4sto_it_reset(pdrw->i_layers); while (NULL != dk4sto_it_next(pdrw->i_layers)) { back++; } } } #line 4619 "WxdkdrawObj.cpt" return back; } void wxdobj_obj_delete_from_drawing( Wxd_drawing_t *pdrw, Wxd_object_t *pobj ) { Wxd_object_t *po; Wxd_object_t *pn; #line 4633 "WxdkdrawObj.cpt" if ((NULL != pdrw) && (NULL != pobj)) { if (WXD_OT_GROUP_BEGIN == pobj->ot) { #line 4635 "WxdkdrawObj.cpt" dk4sto_remove(pdrw->s_stru, (void *)pobj, NULL); pobj->pa = NULL; dk4sto_it_reset((pobj->det).g.i_e); while (NULL != pobj) { #line 4639 "WxdkdrawObj.cpt" po = (Wxd_object_t *)dk4sto_it_next((pobj->det).g.i_e); if (NULL != po) { #line 4641 "WxdkdrawObj.cpt" if (WXD_OT_GROUP_BEGIN == po->ot) { #line 4642 "WxdkdrawObj.cpt" if ( (NULL != (po->det).g.s_e) && (NULL != (po->det).g.i_e) ) { #line 4646 "WxdkdrawObj.cpt" dk4sto_it_reset((po->det).g.i_e); po->pa = pobj; pobj = po; } else { #line 4651 "WxdkdrawObj.cpt" wxdobj_obj_delete(po); } } else { #line 4655 "WxdkdrawObj.cpt" dk4sto_remove(pdrw->s_flat, (void *)po, NULL); wxdobj_obj_delete(po); } } else { #line 4660 "WxdkdrawObj.cpt" pn = pobj->pa; wxdobj_obj_delete(pobj); pobj = pn; } #line 4665 "WxdkdrawObj.cpt" } } else { #line 4668 "WxdkdrawObj.cpt" dk4sto_remove(pdrw->s_stru, (void *)pobj, NULL); dk4sto_remove(pdrw->s_flat, (void *)pobj, NULL); wxdobj_obj_delete(pobj); } } else { #line 4674 "WxdkdrawObj.cpt" if (NULL != pobj) { wxdobj_obj_delete(pobj); } } #line 4679 "WxdkdrawObj.cpt" } int wxdobj_shift(Wxd_object_t *pobj, Wxd_point_t *ppt, int doit) { dk4_er_t er; int32_t xdiff = (int32_t)0L; int32_t ydiff = (int32_t)0L; int back = 0; uint16_t i = 0; #line 4692 "WxdkdrawObj.cpt" if (NULL != pobj) { if (NULL != ppt) { xdiff = ppt->x; ydiff = ppt->y; if (((int32_t)0L != xdiff) || ((int32_t)0L != ydiff)) { dk4error_init(&er); back = 1; switch (pobj->ot) { case WXD_OT_TEXT : { #line 4701 "WxdkdrawObj.cpt" if (0 != doit) { (pobj->det).t.x = dk4ma_int32_t_add( (pobj->det).t.x, xdiff, &er ); (pobj->det).t.y = dk4ma_int32_t_add( (pobj->det).t.y, ydiff, &er ); } else { (void)dk4ma_int32_t_add( (pobj->det).t.x, xdiff, &er ); (void)dk4ma_int32_t_add( (pobj->det).t.y, ydiff, &er ); } } break; case WXD_OT_POLYLINE : case WXD_OT_POLYGON : { #line 4720 "WxdkdrawObj.cpt" if ( (NULL != (pobj->det).p.p) && ((uint16_t)0U < (pobj->det).p.n) ) { for (i = 0; i < (pobj->det).p.n; i++) { if (0 != doit) { ((pobj->det).p.p)[i].x = dk4ma_int32_t_add( ((pobj->det).p.p)[i].x, xdiff, &er ); ((pobj->det).p.p)[i].y = dk4ma_int32_t_add( ((pobj->det).p.p)[i].y, ydiff, &er ); } else { (void)dk4ma_int32_t_add( ((pobj->det).p.p)[i].x, xdiff, &er ); (void)dk4ma_int32_t_add( ((pobj->det).p.p)[i].y, ydiff, &er ); } } } } break; case WXD_OT_O_SPLINE : case WXD_OT_C_SPLINE : { #line 4748 "WxdkdrawObj.cpt" if ( (NULL != (pobj->det).s.p) && ((uint16_t)0U < (pobj->det).s.n) ) { for (i = 0; i < (pobj->det).s.n; i++) { if (0 != doit) { ((pobj->det).s.p)[i].x = dk4ma_int32_t_add( ((pobj->det).s.p)[i].x, xdiff, &er ); ((pobj->det).s.p)[i].y = dk4ma_int32_t_add( ((pobj->det).s.p)[i].y, ydiff, &er ); } else { (void)dk4ma_int32_t_add( ((pobj->det).s.p)[i].x, xdiff, &er ); (void)dk4ma_int32_t_add( ((pobj->det).s.p)[i].y, ydiff, &er ); } } } } break; case WXD_OT_O_ARC : case WXD_OT_C_ARC : { #line 4776 "WxdkdrawObj.cpt" if (0 != doit) { (pobj->det).a.x1 = dk4ma_int32_t_add( (pobj->det).a.x1, xdiff, &er ); (pobj->det).a.y1 = dk4ma_int32_t_add( (pobj->det).a.y1, ydiff, &er ); (pobj->det).a.x2 = dk4ma_int32_t_add( (pobj->det).a.x2, xdiff, &er ); (pobj->det).a.y2 = dk4ma_int32_t_add( (pobj->det).a.y2, ydiff, &er ); (pobj->det).a.x3 = dk4ma_int32_t_add( (pobj->det).a.x3, xdiff, &er ); (pobj->det).a.y3 = dk4ma_int32_t_add( (pobj->det).a.y3, ydiff, &er ); (pobj->det).a.x += (double)xdiff; (pobj->det).a.y += (double)ydiff; } else { (void)dk4ma_int32_t_add((pobj->det).a.x1,xdiff,&er); (void)dk4ma_int32_t_add((pobj->det).a.y1,ydiff,&er); (void)dk4ma_int32_t_add((pobj->det).a.x2,xdiff,&er); (void)dk4ma_int32_t_add((pobj->det).a.y2,ydiff,&er); (void)dk4ma_int32_t_add((pobj->det).a.x3,xdiff,&er); (void)dk4ma_int32_t_add((pobj->det).a.y3,ydiff,&er); } } break; case WXD_OT_CIRCLE : case WXD_OT_ELLIPSE : { #line 4809 "WxdkdrawObj.cpt" if (0 != doit) { (pobj->det).e.x = dk4ma_int32_t_add( (pobj->det).e.x, xdiff, &er ); (pobj->det).e.y = dk4ma_int32_t_add( (pobj->det).e.y, ydiff, &er ); } else { (void)dk4ma_int32_t_add((pobj->det).e.x,xdiff,&er); (void)dk4ma_int32_t_add((pobj->det).e.y,ydiff,&er); } } break; case WXD_OT_BOX : { #line 4824 "WxdkdrawObj.cpt" if (0 != doit) { (pobj->det).b.b.xl = dk4ma_int32_t_add( (pobj->det).b.b.xl, xdiff, &er ); (pobj->det).b.b.xr = dk4ma_int32_t_add( (pobj->det).b.b.xr, xdiff, &er ); (pobj->det).b.b.yb = dk4ma_int32_t_add( (pobj->det).b.b.yb, ydiff, &er ); (pobj->det).b.b.yt = dk4ma_int32_t_add( (pobj->det).b.b.yt, ydiff, &er ); } else { (void)dk4ma_int32_t_add( (pobj->det).b.b.xl, xdiff, &er ); (void)dk4ma_int32_t_add( (pobj->det).b.b.xr, xdiff, &er ); (void)dk4ma_int32_t_add( (pobj->det).b.b.yb, ydiff, &er ); (void)dk4ma_int32_t_add( (pobj->det).b.b.yt, ydiff, &er ); } } break; case WXD_OT_IMAGE : { #line 4855 "WxdkdrawObj.cpt" if (0 != doit) { (pobj->det).i.br.xl = dk4ma_int32_t_add( (pobj->det).i.br.xl, xdiff, &er ); (pobj->det).i.br.xr = dk4ma_int32_t_add( (pobj->det).i.br.xr, xdiff, &er ); (pobj->det).i.br.yb = dk4ma_int32_t_add( (pobj->det).i.br.yb, ydiff, &er ); (pobj->det).i.br.yt = dk4ma_int32_t_add( (pobj->det).i.br.yt, ydiff, &er ); /* Re-calculate image placement */ wxdobj_image_placement(pobj); } else { (void)dk4ma_int32_t_add( (pobj->det).i.br.xl, xdiff, &er ); (void)dk4ma_int32_t_add( (pobj->det).i.br.xr, xdiff, &er ); (void)dk4ma_int32_t_add( (pobj->det).i.br.yb, ydiff, &er ); (void)dk4ma_int32_t_add( (pobj->det).i.br.yt, ydiff, &er ); } } break; case WXD_OT_DOT_FILLED : case WXD_OT_DOT_WHITE : { #line 4889 "WxdkdrawObj.cpt" if (0 != doit) { (pobj->det).d.x = dk4ma_int32_t_add( (pobj->det).d.x, xdiff, &er ); (pobj->det).d.y = dk4ma_int32_t_add( (pobj->det).d.y, ydiff, &er ); } else { (void)dk4ma_int32_t_add((pobj->det).d.x,xdiff,&er); (void)dk4ma_int32_t_add((pobj->det).d.y,ydiff,&er); } } break; } if (DK4_E_NONE != er.ec) { back = 0; #line 4905 "WxdkdrawObj.cpt" } } else { back = 1; } } else { back = 1; } } #line 4916 "WxdkdrawObj.cpt" return back; } int wxdobj_shift_marked(Wxd_drawing_t *pdrw, Wxd_point_t *ppt, int doit) { Wxd_object_t *pobj; int back = 0; #line 4927 "WxdkdrawObj.cpt" if (NULL != pdrw) { back = 1; dk4sto_it_reset(pdrw->i_flat); do { pobj = (Wxd_object_t *)dk4sto_it_next(pdrw->i_flat); if (NULL != pobj) { if ((uint8_t)0U != (OBJ_MARKER_1 & (pobj->mark))) { if (0 == wxdobj_shift(pobj, ppt, doit)) { back = 0; } } } } while (NULL != pobj); } #line 4942 "WxdkdrawObj.cpt" return back; } Wxd_object_t * wxdobj_copy(Wxd_object_t *psrc) { Wxd_object_t *back = NULL; wxBitmap *obm = NULL; size_t npt; #line 4954 "WxdkdrawObj.cpt" if (NULL != psrc) { if (WXD_OT_GROUP_BEGIN != psrc->ot) { back = dk4mem_new(Wxd_object_t,1,NULL); if (NULL != back) { DK4_MEMCPY(back,psrc,sizeof(Wxd_object_t)); back->pa = NULL; switch (psrc->ot) { case WXD_OT_TEXT : { /* t.t, t.tsc */ (back->det).t.t = NULL; (back->det).t.tsc = NULL; (back->det).t.t = dk4strx_dup((psrc->det).t.t, NULL); if (NULL != (back->det).t.t) { if (NULL != (psrc->det).t.tsc) { (back->det).t.tsc = dk4strx_dup((psrc->det).t.tsc, NULL); if (NULL == (back->det).t.tsc) { wxdobj_obj_delete(back); back = NULL; } } } else { wxdobj_obj_delete(back); back = NULL; } } break; case WXD_OT_POLYLINE : case WXD_OT_POLYGON : { /* p.p */ npt = (size_t)((psrc->det).p.n); (back->det).p.p = dk4mem_new(Wxd_point_t, npt, NULL); if (NULL != (back->det).p.p) { npt *= sizeof(Wxd_point_t); DK4_MEMCPY((back->det).p.p,(psrc->det).p.p,npt); } else { wxdobj_obj_delete(back); back = NULL; } } break; case WXD_OT_O_SPLINE : case WXD_OT_C_SPLINE : { /* s.p */ npt = (size_t)((psrc->det).s.n); (back->det).s.p = dk4mem_new(Wxd_spline_point_t,npt,NULL); if (NULL != (back->det).s.p) { npt *= sizeof(Wxd_spline_point_t); DK4_MEMCPY((back->det).s.p,(psrc->det).s.p,npt); } else { wxdobj_obj_delete(back); back = NULL; } } break; case WXD_OT_IMAGE : { /* i.fn, i.bm */ (back->det).i.fn = NULL; (back->det).i.bm = NULL; obm = (psrc->det).i.bm; (back->det).i.fn = dk4strx_dup((psrc->det).i.fn, NULL); if (NULL != (back->det).i.fn) { (back->det).i.bm = new wxBitmap( obm->GetSubBitmap( wxRect(0, 0, obm->GetWidth(), obm->GetHeight()) ) ); if (NULL == (back->det).i.bm) { wxdobj_obj_delete(back); back = NULL; } else { if (!(((back->det).i.bm)->IsOk())) { wxdobj_obj_delete(back); back = NULL; } } } else { wxdobj_obj_delete(back); back = NULL; } } break; } } } } #line 5041 "WxdkdrawObj.cpt" return back; } /** Test whether the entire group contents can be shifted by given vector. @param pgrsrc Group containing objects to shift. @param psh Shift vector. @param doit Flag: Really do shift operation, 0=test only. @return 1 on success, 0 on error (numeric overflow). */ static int wxdobj_i_group_shift( Wxd_object_t *pgrsrc, Wxd_point_t *psh, int doit ) { Wxd_object_t *pno; int back = 1; #line 5064 "WxdkdrawObj.cpt" pgrsrc->pa = NULL; dk4sto_it_reset((pgrsrc->det).g.i_e); while ((1 == back) && (NULL != pgrsrc)) { pno = (Wxd_object_t *)dk4sto_it_next((pgrsrc->det).g.i_e); if (NULL != pno) { if (WXD_OT_GROUP_BEGIN == pno->ot) { if ( (NULL != (pgrsrc->det).g.s_e) && (NULL != (pgrsrc->det).g.i_e) ) { pno->pa = pgrsrc; pgrsrc = pno; dk4sto_it_reset((pgrsrc->det).g.i_e); } } else { if (0 == wxdobj_shift(pno, psh, doit)) { back = 0; } } } else { pgrsrc = pgrsrc->pa; } } #line 5089 "WxdkdrawObj.cpt" return back; } /** Test whether the entire group contents can be shifted by given vector. @param pgrsrc Group containing objects to shift. @param psh Shift vector. @return 1 on success, 0 on error (numeric overflow). */ static int wxdobj_group_test_shift( Wxd_object_t *pgrsrc, Wxd_point_t *psh ) { int back = 0; #line 5109 "WxdkdrawObj.cpt" if (NULL != pgrsrc) { if (NULL != psh) { if (((int32_t)0L != psh->x) || ((int32_t)0L != psh->y)) { back = wxdobj_i_group_shift(pgrsrc, psh, 0); } else { #line 5115 "WxdkdrawObj.cpt" back = 1; } } else { #line 5119 "WxdkdrawObj.cpt" back = 1; } } #line 5123 "WxdkdrawObj.cpt" return back; } /** Copy group contents recursively. Both source and destination group object must be root group objects having no parent. @param pdrw Drawing containing both groups. @param pgrdst Destination group. @param pgrsrc Source group. @param psh Shift vector for the copy. @return 1 on success, 0 on error. */ static int wxdobj_i_group_copy( Wxd_drawing_t *pdrw, Wxd_object_t *pgrdst, Wxd_object_t *pgrsrc, Wxd_point_t *psh ) { Wxd_object_t *pso; Wxd_object_t *pdo; int back = 1; #line 5152 "WxdkdrawObj.cpt" dk4sto_it_reset((pgrsrc->det).g.i_e); while ((NULL != pgrsrc) && (NULL != pgrdst) && (1 == back)) { pso = (Wxd_object_t *)dk4sto_it_next((pgrsrc->det).g.i_e); if (NULL != pso) { if (WXD_OT_GROUP_BEGIN == pso->ot) { if ( (NULL != (pso->det).g.s_e) && (NULL != (pso->det).g.i_e) ) { pdo = wxdobj_drw_add_group(pdrw, pgrdst); if (NULL != pdo) { dk4sto_it_reset((pso->det).g.i_e); pgrsrc = pso; pgrdst = pdo; } else { back = 0; } } } else { pdo = wxdobj_copy(pso); if (NULL != pdo) { if (0 != wxdobj_drw_register_object(pdrw, pgrdst, pdo)) { wxdobj_shift(pdo, psh, 1); } else { wxdobj_obj_delete(pdo); back = 0; } } else { back = 0; } } } else { pgrsrc = pgrsrc->pa; pgrdst = pgrdst->pa; } } #line 5194 "WxdkdrawObj.cpt" return back; } int wxdobj_copy_recursive( Wxd_drawing_t *pdrw, Wxd_object_t *pobj, Wxd_point_t *psh ) { Wxd_object_t *pno; Wxd_object_t *png; int back = 0; #line 5210 "WxdkdrawObj.cpt" if ((NULL != pdrw) && (NULL != pobj)) { if (WXD_OT_GROUP_BEGIN != pobj->ot) { /* Copy simple object */ if (0 != wxdobj_shift(pobj, psh, 0)) { pno = wxdobj_copy(pobj); if (NULL != pno) { wxdobj_shift(pno, psh, 1); if (0 != wxdobj_drw_register_object(pdrw, NULL, pno)) { back = 1; wxdobj_bb_simple_object(pdrw, pno); } else { wxdobj_obj_delete(pno); /* ERROR: Memory */ #if 0 dk4error_set_simple_error_code( &m_oErrorReport, DK4_E_MEMORY_ALLOCATION_FAILED ); #endif back = 0; } } else { /* ERROR: Memory */ #if 0 dk4error_set_simple_error_code( &m_oErrorReport, DK4_E_MEMORY_ALLOCATION_FAILED ); #endif back = 0; } } else { #line 5245 "WxdkdrawObj.cpt" /* ERROR: Failed to shift */ #if 0 dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_OVERFLOW_COORDINATES ); #endif back = 0; } } else { /* Copy a group of objects, probably including subgroups... */ if (0 != wxdobj_group_test_shift(pobj, psh)) { png = wxdobj_drw_add_group(pdrw, NULL); if (NULL != png) { back = wxdobj_i_group_copy(pdrw, png, pobj, psh); wxdobj_bb_modified_object(pdrw, png); } else { /* ERROR: Memory */ #if 0 dk4error_set_simple_error_code( &m_oErrorReport, DK4_E_MEMORY_ALLOCATION_FAILED ); #endif back = false; } } else { #line 5275 "WxdkdrawObj.cpt" /* ERROR: Failed to shift */ #if 0 dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_OVERFLOW_COORDINATES ); #endif back = false; } } } #line 5286 "WxdkdrawObj.cpt" return back; } Wxd_object_t * wxdobj_point_move_find_object( Wxd_drawing_t *pdrw, Wxd_point_t const *ppt, uint16_t *pindex, double dlim ) { Wxd_object_t *back = NULL; /* Object to modify */ Wxd_object_t *pcand = NULL; /* Current object to test */ double backd; /* Distance to back */ double candd; /* Distance to cand */ double backx; /* Distance to back */ double candx; /* Distance to cand */ uint16_t backi; /* Point index on back */ uint16_t candi; /* Point index on cand */ #line 5308 "WxdkdrawObj.cpt" if ((NULL != pdrw) && (NULL != ppt) && (NULL != pindex)) { dk4sto_it_reset(pdrw->i_flat); do { pcand = (Wxd_object_t *)dk4sto_it_next(pdrw->i_flat); if (NULL != pcand) { #line 5313 "WxdkdrawObj.cpt" if (wxdobj_is_active(pcand)) { switch ( (int)(pcand->ot) ) { case WXD_OT_TEXT : case WXD_OT_POLYLINE : case WXD_OT_O_SPLINE : case WXD_OT_O_ARC : case WXD_OT_POLYGON : case WXD_OT_C_SPLINE : case WXD_OT_C_ARC : case WXD_OT_CIRCLE : case WXD_OT_ELLIPSE : case WXD_OT_BOX : case WXD_OT_IMAGE : case WXD_OT_DOT_FILLED : case WXD_OT_DOT_WHITE : { candd = wxdobj_distance_to_point(pcand,ppt,true,&candi); candx = wxdobj_distance_to_point(pcand, ppt); #line 5331 "WxdkdrawObj.cpt" if (dlim >= candd) { #line 5332 "WxdkdrawObj.cpt" if (NULL == back) { #line 5333 "WxdkdrawObj.cpt" back = pcand; backd = candd; backx = candx; backi = candi; } else { #line 5339 "WxdkdrawObj.cpt" if (backd > candd) { #line 5340 "WxdkdrawObj.cpt" back = pcand; backd = candd; backx = candx; backi = candi; } else { if ((!(backd < candd)) && (backx > candx)) { #line 5348 "WxdkdrawObj.cpt" back = pcand; backd = candd; backx = candx; backi = candi; } #if TRACE_DEBUG else { #line 5355 "WxdkdrawObj.cpt" } #endif } } } #if TRACE_DEBUG else { #line 5362 "WxdkdrawObj.cpt" } #endif } break; } } } } while (NULL != pcand); if (NULL != back) { *pindex = backi; } } #line 5374 "WxdkdrawObj.cpt" return back; } Wxd_object_t * wxdobj_modify_spline_find_object( Wxd_drawing_t *pdrw, Wxd_point_t const *ppt, uint16_t *pindex, double dlim ) { Wxd_object_t *back = NULL; /* Object to modify */ Wxd_object_t *pcand = NULL; /* Current object to test */ double backd; /* Distance to back */ double candd; /* Distance to cand */ double backx; /* Distance to back */ double candx; /* Distance to cand */ uint16_t backi; /* Point index on back */ uint16_t candi; /* Point index on cand */ #line 5396 "WxdkdrawObj.cpt" if ((NULL != pdrw) && (NULL != ppt) && (NULL != pindex)) { dk4sto_it_reset(pdrw->i_flat); do { pcand = (Wxd_object_t *)dk4sto_it_next(pdrw->i_flat); if (NULL != pcand) { #line 5401 "WxdkdrawObj.cpt" if (wxdobj_is_active(pcand)) { switch ( (int)(pcand->ot) ) { case WXD_OT_O_SPLINE : case WXD_OT_C_SPLINE : { candd = wxdobj_distance_to_point(pcand,ppt,true,&candi); candx = wxdobj_distance_to_point(pcand, ppt); #line 5409 "WxdkdrawObj.cpt" if (dlim >= candd) { #line 5410 "WxdkdrawObj.cpt" if (NULL == back) { #line 5411 "WxdkdrawObj.cpt" back = pcand; backd = candd; backx = candx; backi = candi; } else { #line 5417 "WxdkdrawObj.cpt" if (backd > candd) { #line 5418 "WxdkdrawObj.cpt" back = pcand; backd = candd; backx = candx; backi = candi; } else { if ((!(backd < candd)) && (backx > candx)) { #line 5426 "WxdkdrawObj.cpt" back = pcand; backd = candd; backx = candx; backi = candi; } #if TRACE_DEBUG else { #line 5433 "WxdkdrawObj.cpt" } #endif } } } #if TRACE_DEBUG else { #line 5440 "WxdkdrawObj.cpt" } #endif } break; } } } } while (NULL != pcand); if (NULL != back) { *pindex = backi; } } #line 5452 "WxdkdrawObj.cpt" return back; } Wxd_object_t * wxdobj_rotate_find_object( Wxd_drawing_t *pdrw, Wxd_point_t const *ppt, uint16_t *pindex, double dlim ) { Wxd_object_t *back = NULL; /* Object to modify */ Wxd_object_t *pcand = NULL; /* Current object to test */ double backd; /* Distance to back */ double candd; /* Distance to cand */ double backx; /* Distance to back */ double candx; /* Distance to cand */ uint16_t backi; /* Point index on back */ uint16_t candi; /* Point index on cand */ bool is_rotatable; /* Object is rotatable */ #line 5476 "WxdkdrawObj.cpt" if ((NULL != pdrw) && (NULL != ppt) && (NULL != pindex)) { dk4sto_it_reset(pdrw->i_flat); do { pcand = (Wxd_object_t *)dk4sto_it_next(pdrw->i_flat); if (NULL != pcand) { #line 5481 "WxdkdrawObj.cpt" if (wxdobj_is_active(pcand)) { is_rotatable = false; switch ( (int)(pcand->ot) ) { case WXD_OT_TEXT : case WXD_OT_POLYLINE : case WXD_OT_O_SPLINE : case WXD_OT_O_ARC : case WXD_OT_POLYGON : case WXD_OT_C_SPLINE : case WXD_OT_C_ARC : case WXD_OT_CIRCLE : case WXD_OT_ELLIPSE : case WXD_OT_BOX : case WXD_OT_IMAGE : { is_rotatable = true; } break; case WXD_OT_DOT_FILLED : case WXD_OT_DOT_WHITE : { if (NULL != pcand->pa) { is_rotatable = true; } } break; } if (is_rotatable) { candd = wxdobj_distance_to_point(pcand,ppt,true,&candi); candx = wxdobj_distance_to_point(pcand, ppt); #line 5508 "WxdkdrawObj.cpt" if (dlim >= candd) { #line 5509 "WxdkdrawObj.cpt" if (NULL == back) { #line 5510 "WxdkdrawObj.cpt" back = pcand; backd = candd; backx = candx; backi = candi; } else { #line 5516 "WxdkdrawObj.cpt" if (backd > candd) { #line 5517 "WxdkdrawObj.cpt" back = pcand; backd = candd; backx = candx; backi = candi; } else { if ((!(backd < candd)) && (backx > candx)) { #line 5525 "WxdkdrawObj.cpt" back = pcand; backd = candd; backx = candx; backi = candi; } #if TRACE_DEBUG else { #line 5532 "WxdkdrawObj.cpt" } #endif } } } #if TRACE_DEBUG else { #line 5539 "WxdkdrawObj.cpt" } #endif } } } } while (NULL != pcand); if (NULL != back) { *pindex = backi; } } #line 5550 "WxdkdrawObj.cpt" return back; } /** Check whether to insert the new point before the selected point or append after the selected point. @param pobj Object to modify. @param ppt Mouse position, not grid-aligned. @param ileft Index of "left side" point. @param ipoint Index of selected point. @param iright Index of "right side" point. @param pbapp Address of flag to set for appending (true) or inserting (false). */ static void wxdobj_point_add_find_poly_point( Wxd_object_t *pobj, Wxd_point_t const *ppt, uint16_t ileft, uint16_t ipoint, uint16_t iright, bool *pbapp ) { dk4_gra_point_t pta; dk4_gra_point_t ptb; dk4_gra_point_t ptc; dk4_gra_point_t ptt; double da; double db; #line 5584 "WxdkdrawObj.cpt" pta.x = (double)(((pobj->det).p.p)[ileft].x); pta.y = (double)(((pobj->det).p.p)[ileft].y); ptb.x = (double)(((pobj->det).p.p)[iright].x); ptb.y = (double)(((pobj->det).p.p)[iright].y); ptc.x = (double)(((pobj->det).p.p)[ipoint].x); ptc.y = (double)(((pobj->det).p.p)[ipoint].y); ptt.x = (double)(ppt->x); ptt.y = (double)(ppt->y); da = dk4gratool_dist_point_track(&pta, &ptc, &ptt, NULL); db = dk4gratool_dist_point_track(&ptb, &ptc, &ptt, NULL); *pbapp = (db < da); #line 5596 "WxdkdrawObj.cpt" } /** Check whether to insert the new point before the selected point or append after the selected point. @param pobj Object to modify. @param ppt Mouse position, not grid-aligned. @param ileft Index of "left side" point. @param ipoint Index of selected point. @param iright Index of "right side" point. @param pbapp Address of flag to set for appending (true) or inserting (false). */ static void wxdobj_point_add_find_spline_point( Wxd_object_t *pobj, Wxd_point_t const *ppt, uint16_t ileft, uint16_t ipoint, uint16_t iright, bool *pbapp ) { dk4_gra_point_t pta; dk4_gra_point_t ptb; dk4_gra_point_t ptc; dk4_gra_point_t ptt; double da; double db; #line 5629 "WxdkdrawObj.cpt" pta.x = (double)(((pobj->det).s.p)[ileft].x); pta.y = (double)(((pobj->det).s.p)[ileft].y); ptb.x = (double)(((pobj->det).s.p)[iright].x); ptb.y = (double)(((pobj->det).s.p)[iright].y); ptc.x = (double)(((pobj->det).s.p)[ipoint].x); ptc.y = (double)(((pobj->det).s.p)[ipoint].y); ptt.x = (double)(ppt->x); ptt.y = (double)(ppt->y); da = dk4gratool_dist_point_track(&pta, &ptc, &ptt, NULL); db = dk4gratool_dist_point_track(&ptb, &ptc, &ptt, NULL); *pbapp = (db < da); #line 5641 "WxdkdrawObj.cpt" } /** Find object to add points to or delete points from. @param pdrw Drawing to search. @param ppt Mouse position. @param pindex Address of index variable to set on success. @param dlim Distance limit. @param doadd Flag: Find object to add points to. @return Object found. */ static Wxd_object_t * wxdobj_point_del_find_object_internal( Wxd_drawing_t *pdrw, Wxd_point_t const *ppt, uint16_t *pindex, double dlim, int doadd ) { Wxd_object_t *back = NULL; /* Object to modify */ Wxd_object_t *pcand = NULL; /* Current object to test */ double backd; /* Distance to back */ double candd; /* Distance to cand */ double backx; /* Distance to back */ double candx; /* Distance to cand */ uint16_t backi; /* Point index on back */ uint16_t candi; /* Point index on cand */ bool btest; if ((NULL != pdrw) && (NULL != ppt) && (NULL != pindex)) { backi = (uint16_t)0U; dk4sto_it_reset(pdrw->i_flat); do { pcand = (Wxd_object_t *)dk4sto_it_next(pdrw->i_flat); if (NULL != pcand) { btest = false; /* For open splines and polylines we need at least 2 points remaining after deleting a point. For closed splines and polygons we need at least 3 points remaining after deleting a point. 2020-08-28 When adding point there must be less than UINT16_MAX existing points. */ switch ( (int)(pcand->ot) ) { case WXD_OT_POLYLINE : { if (0 != doadd) { if (UINT16_MAX > (pcand->det).p.n) { btest = true; } } else { if ((uint16_t)2U < (pcand->det).p.n) { btest = true; } } } break; case WXD_OT_POLYGON : { if (0 != doadd) { if (UINT16_MAX > (pcand->det).p.n) { btest = true; } } else { if ((uint16_t)3U < (pcand->det).p.n) { btest = true; } } } break; case WXD_OT_O_SPLINE : { if (0 != doadd) { if (UINT16_MAX > (pcand->det).s.n) { btest = true; } } else { if ((uint16_t)2U < (pcand->det).s.n) { btest = true; } } } break; case WXD_OT_C_SPLINE : { if (0 != doadd) { if (UINT16_MAX > (pcand->det).s.n) { btest = true; } } else { if ((uint16_t)3U < (pcand->det).s.n) { btest = true; } } } break; } if (btest) { if (!wxdobj_is_active(pcand)) { btest = false; } } if (btest) { candd = wxdobj_distance_to_point(pcand, ppt, true, &candi); candx = wxdobj_distance_to_point(pcand, ppt); if (dlim >= candd) { if (NULL == back) { back = pcand; backd = candd; backx = candx; backi = candi; } else { if (backd > candd) { back = pcand; backd = candd; backx = candx; backi = candi; } else { if ((!(backd < candd)) && (backx > candx)) { back = pcand; backd = candd; backx = candx; backi = candi; } #if TRACE_DEBUG else { #line 5769 "WxdkdrawObj.cpt" } #endif } } } #if TRACE_DEBUG else { #line 5776 "WxdkdrawObj.cpt" } #endif } } } while (NULL != pcand); if (NULL != back) { *pindex = backi; } } return back; } Wxd_object_t * wxdobj_point_add_find_object( Wxd_drawing_t *pdrw, Wxd_point_t const *ppt, uint16_t *pindex, bool *pbapp, double dlim ) { dk4_gra_point_t pta; dk4_gra_point_t ptb; dk4_gra_point_t ptt; Wxd_object_t *back = NULL; double da; double db; uint16_t ileft = (uint16_t)0U; uint16_t iright = (uint16_t)0U; bool bAppend = false; #line 5809 "WxdkdrawObj.cpt" back = wxdobj_point_del_find_object_internal(pdrw, ppt, pindex, dlim, 1); if (NULL != back) { ileft = *pindex - (uint16_t)1U; iright = *pindex + (uint16_t)1U; switch ( (int)(back->ot) ) { case WXD_OT_POLYLINE : { #line 5815 "WxdkdrawObj.cpt" if ((uint16_t)0U < *pindex) { if ( ((back->det).p.n - (uint16_t)1U) > *pindex) { #line 5818 "WxdkdrawObj.cpt" wxdobj_point_add_find_poly_point( back, ppt, ileft, *pindex, iright, &bAppend ); } else { #line 5823 "WxdkdrawObj.cpt" pta.x = (double)(((back->det).p.p)[ileft].x); pta.y = (double)(((back->det).p.p)[ileft].y); ptb.x = (double)(((back->det).p.p)[*pindex].x); ptb.y = (double)(((back->det).p.p)[*pindex].y); ptt.x = (double)(ppt->x); ptt.y = (double)(ppt->y); da = dk4gratool_dist_point_point(&ptb, &pta, NULL); db = dk4gratool_dist_point_point(&ptt, &pta, NULL); bAppend = (db > da); } } else { #line 5835 "WxdkdrawObj.cpt" pta.x = (double)(((back->det).p.p)[0].x); pta.y = (double)(((back->det).p.p)[0].y); ptb.x = (double)(((back->det).p.p)[1].x); ptb.y = (double)(((back->det).p.p)[1].y); ptt.x = (double)(ppt->x); ptt.y = (double)(ppt->y); da = dk4gratool_dist_point_point(&pta, &ptb, NULL); db = dk4gratool_dist_point_point(&ptt, &ptb, NULL); bAppend = (db <= da); } } break; case WXD_OT_O_SPLINE : { #line 5847 "WxdkdrawObj.cpt" if ((uint16_t)0U < *pindex) { if ( ((back->det).s.n - (uint16_t)1U) > *pindex) { #line 5850 "WxdkdrawObj.cpt" wxdobj_point_add_find_spline_point( back, ppt, ileft, *pindex, iright, &bAppend ); } else { #line 5855 "WxdkdrawObj.cpt" pta.x = (double)(((back->det).s.p)[ileft].x); pta.y = (double)(((back->det).s.p)[ileft].y); ptb.x = (double)(((back->det).s.p)[*pindex].x); ptb.y = (double)(((back->det).s.p)[*pindex].y); ptt.x = (double)(ppt->x); ptt.y = (double)(ppt->y); da = dk4gratool_dist_point_point(&ptb, &pta, NULL); db = dk4gratool_dist_point_point(&ptt, &pta, NULL); bAppend = (db > da); } } else { #line 5867 "WxdkdrawObj.cpt" pta.x = (double)(((back->det).s.p)[0].x); pta.y = (double)(((back->det).s.p)[0].y); ptb.x = (double)(((back->det).s.p)[1].x); ptb.y = (double)(((back->det).s.p)[1].y); ptt.x = (double)(ppt->x); ptt.y = (double)(ppt->y); da = dk4gratool_dist_point_point(&pta, &ptb, NULL); db = dk4gratool_dist_point_point(&ptt, &ptb, NULL); bAppend = (db <= da); } } break; case WXD_OT_POLYGON : { #line 5879 "WxdkdrawObj.cpt" if ((uint16_t)0U < *pindex) { if ( ((back->det).p.n - (uint16_t)1U) <= *pindex) { #line 5882 "WxdkdrawObj.cpt" iright = (uint16_t)0U; } } else { #line 5886 "WxdkdrawObj.cpt" ileft = (back->det).p.n - (uint16_t)1U; } wxdobj_point_add_find_poly_point( back, ppt, ileft, *pindex, iright, &bAppend ); } break; case WXD_OT_C_SPLINE : { #line 5893 "WxdkdrawObj.cpt" if ((uint16_t)0U < *pindex) { if ( ((back->det).s.n - (uint16_t)1U) <= *pindex) { iright = (uint16_t)0U; } } else { #line 5899 "WxdkdrawObj.cpt" ileft = (back->det).s.n - (uint16_t)1U; } wxdobj_point_add_find_spline_point( back, ppt, ileft, *pindex, iright, &bAppend ); } break; } *pbapp = bAppend; } #line 5908 "WxdkdrawObj.cpt" return back; } Wxd_object_t * wxdobj_point_del_find_object( Wxd_drawing_t *pdrw, Wxd_point_t const *ppt, uint16_t *pindex, double dlim ) { return (wxdobj_point_del_find_object_internal(pdrw, ppt, pindex, dlim, 0)); } static void wxdobj_get_box_control_point( Wxd_point_t *pdst, Wxd_bb_t const *psrc, uint16_t pind ) { switch ( (int)pind ) { case 3 : { pdst->x = psrc->xl; pdst->y = psrc->yt; } break; case 2 : { pdst->x = psrc->xr; pdst->y = psrc->yt; } break; case 1 : { pdst->x = psrc->xr; pdst->y = psrc->yb; } break; default : { pdst->x = psrc->xl; pdst->y = psrc->yb; } break; } } static void wxdobj_set_box_control_point( Wxd_bb_t *pdst, Wxd_point_t const *psrc, uint16_t pind ) { switch ( (int)pind ) { case 3 : { pdst->xl = psrc->x; pdst->yt = psrc->y; } break; case 2 : { pdst->xr = psrc->x; pdst->yt = psrc->y; } break; case 1 : { pdst->xr = psrc->x; pdst->yb = psrc->y; } break; default : { pdst->xl = psrc->x; pdst->yb = psrc->y; } break; } } static void wxdobj_set_ellipse_control_point( Wxd_object_t *pdst, Wxd_point_t const *psrc, uint16_t pind, dk4_er_t *erp ) { int32_t r; int16_t rot; double dx; double dy; double a; #line 5993 "WxdkdrawObj.cpt" #line 5994 "WxdkdrawObj.cpt" #line 5995 "WxdkdrawObj.cpt" dx = (double)(psrc->x) - (double)((pdst->det).e.x); dy = (double)(psrc->y) - (double)((pdst->det).e.y); #line 5998 "WxdkdrawObj.cpt" #line 5999 "WxdkdrawObj.cpt" r = dk4ma_int32_from_double( dk4ma_rint(sqrt(dx * dx + dy * dy)), erp ); #line 6002 "WxdkdrawObj.cpt" a = atan2(dy, dx); #line 6003 "WxdkdrawObj.cpt" if (dk4ma_is_finite(a)) { rot = dk4ma_int16_from_double( dk4ma_rint((180.0 * a) / M_PI), erp ); #line 6007 "WxdkdrawObj.cpt" while (-360 > rot) { rot += (int16_t)360; } while ( 360 < rot) { rot -= (int16_t)360; } #line 6010 "WxdkdrawObj.cpt" switch ( (int)pind ) { case 3 : { #line 6012 "WxdkdrawObj.cpt" (pdst->det).e.ry = r; #line 6013 "WxdkdrawObj.cpt" rot -= 270; while (-360 > rot) { rot += (int16_t)360; } } break; case 2 : { #line 6017 "WxdkdrawObj.cpt" (pdst->det).e.rx = r; #line 6018 "WxdkdrawObj.cpt" rot -= 180; while (-360 > rot) { rot += (int16_t)360; } } break; case 1 : { #line 6022 "WxdkdrawObj.cpt" (pdst->det).e.ry = r; #line 6023 "WxdkdrawObj.cpt" rot -= 90; while (-360 > rot) { rot += (int16_t)360; } } break; default : { #line 6027 "WxdkdrawObj.cpt" (pdst->det).e.rx = r; #line 6028 "WxdkdrawObj.cpt" } break; } (pdst->det).e.a = rot; #line 6031 "WxdkdrawObj.cpt" } else { #line 6033 "WxdkdrawObj.cpt" dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); } #line 6035 "WxdkdrawObj.cpt" } bool wxdobj_get_control_point( Wxd_point_t *pdst, Wxd_object_t const *psrc, uint16_t pind ) { dk4_er_t er; /* Error report */ dk4_gra_point_t pta; /* Graphics point */ bool back = false; /* Function result */ #line 6050 "WxdkdrawObj.cpt" if ((NULL != pdst) && (NULL != psrc)) { switch ( (int)(psrc->ot) ) { case WXD_OT_TEXT : { pdst->x = (psrc->det).t.x; pdst->y = (psrc->det).t.y; back = true; } break; case WXD_OT_POLYLINE : case WXD_OT_POLYGON : { if ((NULL != (psrc->det).p.p) && (pind < (psrc->det).p.n)) { pdst->x = ((psrc->det).p.p)[pind].x; pdst->y = ((psrc->det).p.p)[pind].y; back = true; } } break; case WXD_OT_O_SPLINE : case WXD_OT_C_SPLINE : { if ((NULL != (psrc->det).s.p) && (pind < (psrc->det).s.n)) { pdst->x = ((psrc->det).s.p)[pind].x; pdst->y = ((psrc->det).s.p)[pind].y; back = true; } } break; case WXD_OT_O_ARC : case WXD_OT_C_ARC : { if (2U == pind) { pdst->x = (psrc->det).a.x3; pdst->y = (psrc->det).a.y3; back = true; } else { if (1U == pind) { pdst->x = (psrc->det).a.x2; pdst->y = (psrc->det).a.y2; back = true; } else { pdst->x = (psrc->det).a.x1; pdst->y = (psrc->det).a.y1; back = true; } } } break; case WXD_OT_CIRCLE : { if ((uint32_t)(DK4_I32_MAX) >= (psrc->det).e.rx) { dk4error_init(&er); switch ( (int)pind ) { case 3 : { pdst->x = (psrc->det).e.x; pdst->y = dk4ma_int32_t_sub( (psrc->det).e.y,(int32_t)((psrc->det).e.rx),&er ); } break; case 2 : { pdst->x = dk4ma_int32_t_sub( (psrc->det).e.x,(int32_t)((psrc->det).e.rx),&er ); pdst->y = (psrc->det).e.y; } break; case 1 : { pdst->x = (psrc->det).e.x; pdst->y = dk4ma_int32_t_add( (psrc->det).e.y,(int32_t)((psrc->det).e.rx),&er ); } break; default : { pdst->x = dk4ma_int32_t_add( (psrc->det).e.x,(int32_t)((psrc->det).e.rx),&er ); pdst->y = (psrc->det).e.y; } break; } if (DK4_E_NONE == er.ec) { back = true; } } } break; case WXD_OT_ELLIPSE : { dk4error_init(&er); if ((int16_t)0 == (psrc->det).e.a) { /* Not rotated */ if ( ((uint32_t)(DK4_I32_MAX) >= (psrc->det).e.rx) && ((uint32_t)(DK4_I32_MAX) >= (psrc->det).e.ry) ) { switch ( (int)pind ) { case 3 : { pdst->x = (psrc->det).e.x; pdst->y = dk4ma_int32_t_sub( (psrc->det).e.y, (int32_t)((psrc->det).e.ry), &er ); } break; case 2 : { pdst->x = dk4ma_int32_t_sub( (psrc->det).e.x, (int32_t)((psrc->det).e.rx), &er ); pdst->y = (psrc->det).e.y; } break; case 1 : { pdst->x = (psrc->det).e.x; pdst->y = dk4ma_int32_t_add( (psrc->det).e.y, (int32_t)((psrc->det).e.ry), &er ); } break; default : { pdst->x = dk4ma_int32_t_add( (psrc->det).e.x, (int32_t)((psrc->det).e.rx), &er ); pdst->y = (psrc->det).e.y; } break; } } if (DK4_E_NONE == er.ec) { back = true; } } else { /* Rotated */ switch ( (int)pind ) { case 3 : { pta.x = 0.0; pta.y = 0.0 - (double)((psrc->det).e.ry); } break; case 2 : { pta.x = 0.0 - (double)((psrc->det).e.rx); pta.y = 0.0; } break; case 1 : { pta.x = 0.0; pta.y = (double)((psrc->det).e.ry); } break; default : { pta.x = (double)((psrc->det).e.rx); pta.y = 0.0; } break; } dk4gratool_rotate_point( &pta, ((M_PI * (double)((psrc->det).e.a)) / 180.0) ); pta.x += (double)((psrc->det).e.x); pta.y += (double)((psrc->det).e.y); pdst->x = dk4ma_int32_from_double(dk4ma_rint(pta.x), &er); pdst->y = dk4ma_int32_from_double(dk4ma_rint(pta.y), &er); if (DK4_E_NONE == er.ec) { back = true; } } } break; case WXD_OT_BOX : { wxdobj_get_box_control_point(pdst, &((psrc->det).b.b), pind); back = true; } break; case WXD_OT_IMAGE : { wxdobj_get_box_control_point(pdst, &((psrc->det).i.br), pind); back = true; } break; case WXD_OT_DOT_FILLED : case WXD_OT_DOT_WHITE : { pdst->x = (psrc->det).d.x; pdst->y = (psrc->det).d.y; back = true; } break; } } #line 6212 "WxdkdrawObj.cpt" return back; } bool wxdobj_set_control_point( Wxd_object_t *pdst, Wxd_point_t const *psrc, uint16_t pind ) { dk4_er_t er; /* Error report */ double dx; /* X difference control point, center */ double dy; /* Y difference control point, center */ int32_t newr; /* New radius */ bool back = false; /* Function result */ #line 6230 "WxdkdrawObj.cpt" if ((NULL != pdst) && (NULL != psrc)) { #line 6232 "WxdkdrawObj.cpt" #line 6233 "WxdkdrawObj.cpt" switch ( (int)(pdst->ot) ) { case WXD_OT_TEXT : { (pdst->det).t.x = psrc->x; (pdst->det).t.y = psrc->y; back = true; } break; case WXD_OT_POLYLINE : case WXD_OT_POLYGON : { if ((NULL != (pdst->det).p.p) && (pind < (pdst->det).p.n)) { ((pdst->det).p.p)[pind].x = psrc->x; ((pdst->det).p.p)[pind].y = psrc->y; back = true; } } break; case WXD_OT_O_SPLINE : case WXD_OT_C_SPLINE : { if ((NULL != (pdst->det).s.p) && (pind < (pdst->det).s.n)) { ((pdst->det).s.p)[pind].x = psrc->x; ((pdst->det).s.p)[pind].y = psrc->y; back = true; } } break; case WXD_OT_O_ARC : case WXD_OT_C_ARC : { if (2U == pind) { (pdst->det).a.x3 = psrc->x; (pdst->det).a.y3 = psrc->y; back = true; } else { if (1U == pind) { (pdst->det).a.x2 = psrc->x; (pdst->det).a.y2 = psrc->y; back = true; } else { (pdst->det).a.x1 = psrc->x; (pdst->det).a.y1 = psrc->y; back = true; } } wxdarc_calculation( &((pdst->det).a.x), &((pdst->det).a.y), &((pdst->det).a.r), &((pdst->det).a.a), &((pdst->det).a.b), &((pdst->det).a.d), (pdst->det).a.x1, (pdst->det).a.y1, (pdst->det).a.x2, (pdst->det).a.y2, (pdst->det).a.x3, (pdst->det).a.y3 ); } break; case WXD_OT_CIRCLE : { dk4error_init(&er); #if 0 /* 2020-03-24 Modification Clang static analyzer complains about this line because newr is overwritten in all the if/else branches below. */ newr = (int32_t)0L; #endif if ((pdst->det).e.x == psrc->x) { newr = dk4ma_int32_t_abs( dk4ma_int32_t_sub((pdst->det).e.y, psrc->y, &er), &er ); } else { if ((pdst->det).e.y == psrc->y) { newr = dk4ma_int32_t_abs( dk4ma_int32_t_sub((pdst->det).e.x,psrc->x,&er), &er ); } else { dx = (double)((pdst->det).e.x) - (double)(psrc->x); dy = (double)((pdst->det).e.y) - (double)(psrc->y); newr = dk4ma_int32_from_double( sqrt(dx * dx + dy * dy), &er ); } } if (DK4_E_NONE == er.ec) { (pdst->det).e.rx = newr; back = true; } } break; case WXD_OT_ELLIPSE : { #line 6321 "WxdkdrawObj.cpt" dk4error_init(&er); switch ( (int)pind ) { case 3 : { #line 6324 "WxdkdrawObj.cpt" if ((pdst->det).e.x == psrc->x) { if (psrc->y <= (pdst->det).e.y) { (pdst->det).e.a = 0; (pdst->det).e.ry = dk4ma_int32_t_sub( (pdst->det).e.y, psrc->y, &er ); } else { (pdst->det).e.a = 180; (pdst->det).e.ry = dk4ma_int32_t_sub( psrc->y, (pdst->det).e.y, &er ); } } else { if ((pdst->det).e.y == psrc->y) { if (psrc->x >= (pdst->det).e.x) { (pdst->det).e.a = 90; (pdst->det).e.ry = dk4ma_int32_t_sub( psrc->x, (pdst->det).e.x, &er ); } else { (pdst->det).e.a = -90; (pdst->det).e.ry = dk4ma_int32_t_sub( (pdst->det).e.x, psrc->x, &er ); } } else { wxdobj_set_ellipse_control_point( pdst, psrc, pind, &er ); } } } break; case 2 : { #line 6361 "WxdkdrawObj.cpt" if ((pdst->det).e.y == psrc->y) { if (psrc->x <= (pdst->det).e.x) { (pdst->det).e.a = 0; (pdst->det).e.rx = dk4ma_int32_t_sub( (pdst->det).e.x, psrc->x, &er ); } else { (pdst->det).e.a = 180; (pdst->det).e.rx = dk4ma_int32_t_sub( psrc->x, (pdst->det).e.x, &er ); } } else { if ((pdst->det).e.x == psrc->x) { if (psrc->y <= (pdst->det).e.y) { (pdst->det).e.a = 90; (pdst->det).e.rx = dk4ma_int32_t_sub( (pdst->det).e.y, psrc->y, &er ); } else { (pdst->det).e.a = -90; (pdst->det).e.rx = dk4ma_int32_t_sub( psrc->y, (pdst->det).e.y, &er ); } } else { wxdobj_set_ellipse_control_point( pdst, psrc, pind, &er ); } } } break; case 1 : { #line 6398 "WxdkdrawObj.cpt" if ((pdst->det).e.x == psrc->x) { if (psrc->y >= (pdst->det).e.y) { (pdst->det).e.a = 0; (pdst->det).e.ry = dk4ma_int32_t_sub( psrc->y, (pdst->det).e.y, &er ); } else { (pdst->det).e.a = 180; (pdst->det).e.ry = dk4ma_int32_t_sub( (pdst->det).e.y, psrc->y, &er ); } } else { if ((pdst->det).e.y == psrc->y) { if (psrc->x <= (pdst->det).e.x) { (pdst->det).e.a = 90; (pdst->det).e.ry = dk4ma_int32_t_sub( (pdst->det).e.x, psrc->x, &er ); } else { (pdst->det).e.a = -90; (pdst->det).e.ry = dk4ma_int32_t_sub( psrc->x, (pdst->det).e.x, &er ); } } else { wxdobj_set_ellipse_control_point( pdst, psrc, pind, &er ); } } } break; default : { #line 6435 "WxdkdrawObj.cpt" if ((pdst->det).e.y == psrc->y) { #line 6436 "WxdkdrawObj.cpt" if (psrc->x >= (pdst->det).e.x) { (pdst->det).e.a = 0; (pdst->det).e.rx = dk4ma_int32_t_sub( psrc->x, (pdst->det).e.x, &er ); } else { (pdst->det).e.a = 180; (pdst->det).e.rx = dk4ma_int32_t_sub( (pdst->det).e.x, psrc->x, &er ); } } else { if ((pdst->det).e.x == psrc->x) { #line 6451 "WxdkdrawObj.cpt" if (psrc->y >= (pdst->det).e.y) { (pdst->det).e.a = 90; (pdst->det).e.rx = dk4ma_int32_t_sub( psrc->y, (pdst->det).e.y, &er ); } else { (pdst->det).e.a = -90; (pdst->det).e.rx = dk4ma_int32_t_sub( (pdst->det).e.y, psrc->y, &er ); } } else { #line 6465 "WxdkdrawObj.cpt" wxdobj_set_ellipse_control_point( pdst, psrc, pind, &er ); } } } break; } if (DK4_E_NONE == er.ec) { back = true; } } break; case WXD_OT_BOX : { wxdobj_set_box_control_point(&((pdst->det).b.b), psrc, pind); back = true; } break; case WXD_OT_IMAGE : { wxdobj_set_box_control_point(&((pdst->det).i.br), psrc, pind); back = true; } break; case WXD_OT_DOT_FILLED : case WXD_OT_DOT_WHITE : { (pdst->det).d.x = psrc->x; (pdst->det).d.y = psrc->y; back = true; } break; } } #line 6491 "WxdkdrawObj.cpt" return back; } void wxdobj_delete_control_point( Wxd_object_t *pdst, uint16_t pind ) { Wxd_point_t *ptrppt; /* New poly points array */ Wxd_spline_point_t *ptrspl; /* New spline points array */ double olds; /* Old s value */ size_t sz; /* Number of points to allocate */ uint16_t i; /* Traverse control points */ bool bCanDo; /* Can delete point from this object */ bool bBorder; /* Deleted point was border point */ #line 6510 "WxdkdrawObj.cpt" if (NULL != pdst) { bCanDo = false; switch ( (int)(pdst->ot) ) { case WXD_OT_POLYLINE : { if ((uint16_t)2U < (pdst->det).p.n) { bCanDo = true; } } break; case WXD_OT_POLYGON : { if ((uint16_t)3U < (pdst->det).p.n) { bCanDo = true; } } break; case WXD_OT_O_SPLINE : { if ((uint16_t)2U < (pdst->det).s.n) { bCanDo = true; } } break; case WXD_OT_C_SPLINE : { if ((uint16_t)3U < (pdst->det).s.n) { bCanDo = true; } } break; } if (bCanDo) { switch ( (int)(pdst->ot) ) { case WXD_OT_POLYLINE : case WXD_OT_POLYGON : { ptrppt = NULL; sz = (size_t)((pdst->det).p.n); sz--; ptrppt = dk4mem_new(Wxd_point_t, sz, NULL); if (NULL != ptrppt) { DK4_MEMCPY(\ ptrppt, (pdst->det).p.p,\ (sz * sizeof(Wxd_point_t))\ ); if ((size_t)pind < sz) { DK4_MEMCPY(\ &(ptrppt[pind]),\ &(((pdst->det).p.p)[pind + (uint16_t)1U]),\ (\ sizeof(Wxd_point_t) * (sz - (size_t)pind)\ )\ ); } dk4mem_free((pdst->det).p.p); (pdst->det).p.p = ptrppt; (pdst->det).p.n = sz; } else { if ((size_t)pind < sz) { /* Can not do one large memcpy as source and destination range would overlap. */ for (i = pind; (size_t)i < sz; i++) { DK4_MEMCPY(\ &(((pdst->det).p.p)[i]),\ &(((pdst->det).p.p)[i + (uint16_t)1U]),\ sizeof(Wxd_point_t)\ ); } } (pdst->det).p.n = sz; } } break; case WXD_OT_O_SPLINE : case WXD_OT_C_SPLINE : { ptrspl = NULL; sz = (size_t)((pdst->det).s.n); sz--; olds = ((pdst->det).s.p)[pind].s; bBorder = false; if ( (((pdst->det).s.n - (uint16_t)1U) == pind) || ((uint16_t)0U == pind) ) { bBorder = true; } ptrspl = dk4mem_new(Wxd_spline_point_t, sz, NULL); if (NULL != ptrspl) { DK4_MEMCPY(\ ptrspl, (pdst->det).s.p,\ (sz * sizeof(Wxd_spline_point_t))\ ); if ((size_t)pind < sz) { DK4_MEMCPY(\ &(ptrspl[pind]),\ &(((pdst->det).s.p)[pind + (uint16_t)1U]),\ (\ sizeof(Wxd_spline_point_t)\ * (sz - (size_t)pind)\ )\ ); } dk4mem_free((pdst->det).s.p); (pdst->det).s.p = ptrspl; (pdst->det).s.n = sz; } else { if ((size_t)pind < sz) { /* Can not do one large memcpy as source and destination range would overlap. */ for (i = pind; (size_t)i < sz; i++) { DK4_MEMCPY(\ &(((pdst->det).s.p)[i]),\ &(((pdst->det).s.p)[i + (uint16_t)1U]),\ sizeof(Wxd_spline_point_t)\ ); } } (pdst->det).s.n = sz; } if (bBorder) { if ((uint16_t)0U == pind) { ((pdst->det).s.p)[0].s = olds; } else { ((pdst->det).s.p)[sz - (size_t)1U].s = olds; } } } break; } } } #line 6627 "WxdkdrawObj.cpt" } bool wxdobj_add_control_point( Wxd_object_t *pdst, uint16_t pind, Wxd_point_t const *ppt ) { Wxd_spline_point_t *ptrspl; Wxd_point_t *ptrppt; size_t oldsz; size_t newsz; bool back = false; bool bCanDo = false; #line 6645 "WxdkdrawObj.cpt" if (NULL != pdst) { switch ( (int)(pdst->ot) ) { case WXD_OT_POLYLINE : case WXD_OT_POLYGON : { #line 6649 "WxdkdrawObj.cpt" if ((uint16_t)0xFFFFU > (pdst->det).p.n) { if (pind <= (pdst->det).p.n) { #line 6651 "WxdkdrawObj.cpt" oldsz = (size_t)((pdst->det).p.n); newsz = oldsz + (size_t)1U; ptrppt = dk4mem_new(Wxd_point_t,newsz,NULL); if (NULL != ptrppt) { #line 6655 "WxdkdrawObj.cpt" DK4_MEMCPY(\ ptrppt, (pdst->det).p.p,\ (oldsz * sizeof(Wxd_point_t))\ ); if ((size_t)pind < oldsz) { DK4_MEMCPY(\ &(ptrppt[pind + (uint16_t)1U]),\ &(((pdst->det).p.p)[pind]),\ (\ (oldsz - (size_t)pind)\ * sizeof(Wxd_point_t)\ )\ ); } dk4mem_free((pdst->det).p.p); (pdst->det).p.p = ptrppt; (pdst->det).p.n = (uint16_t)newsz; ((pdst->det).p.p)[pind].x = ppt->x; ((pdst->det).p.p)[pind].y = ppt->y; back = true; } else { #line 6677 "WxdkdrawObj.cpt" /* ERROR: Memory */ #if 0 dk4error_set_simple_error_code( &m_oErrorReport, DK4_E_MEMORY_ALLOCATION_FAILED ); #endif back = false; } } else { #line 6687 "WxdkdrawObj.cpt" /* ERROR: New point index out of range (bug) */ #if 0 dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_BUG_POINT_OOR ); #endif back = false; } } else { #line 6697 "WxdkdrawObj.cpt" /* ERROR: Too many points */ #if 0 dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_TOO_MANY_POINTS ); #endif back = false; } } break; case WXD_OT_O_SPLINE : case WXD_OT_C_SPLINE : { #line 6708 "WxdkdrawObj.cpt" if ((uint16_t)0xFFFFU > (pdst->det).s.n) { if (pind <= (pdst->det).s.n) { oldsz = (size_t)((pdst->det).s.n); newsz = oldsz + (size_t)1U; ptrspl = dk4mem_new(Wxd_spline_point_t,newsz,NULL); if (NULL != ptrspl) { DK4_MEMCPY(\ ptrspl, (pdst->det).s.p,\ (oldsz * sizeof(Wxd_spline_point_t))\ ); if ((size_t)pind < oldsz) { DK4_MEMCPY(\ &(ptrspl[pind + (uint16_t)1U]),\ &(((pdst->det).s.p)[pind]),\ (\ (oldsz - (size_t)pind)\ * sizeof(Wxd_spline_point_t)\ )\ ); } dk4mem_free((pdst->det).s.p); (pdst->det).s.p = ptrspl; (pdst->det).s.n = (uint16_t)newsz; ((pdst->det).s.p)[pind].x = ppt->x; ((pdst->det).s.p)[pind].y = ppt->y; back = true; if ((uint16_t)0U == pind) { ((pdst->det).s.p)[0].s = 0.0; ((pdst->det).s.p)[1].s = ((pdst->det).s.p)[2].s; } else { if (((pdst->det).s.n - (uint16_t)1U) == pind) { ((pdst->det).s.p)[pind].s = 0.0; ((pdst->det).s.p)[pind - (uint16_t)1U].s = ((pdst->det).s.p)[pind - (uint16_t)2U].s; } } } else { #line 6748 "WxdkdrawObj.cpt" /* ERROR: Memory */ #if 0 dk4error_set_simple_error_code( &m_oErrorReport, DK4_E_MEMORY_ALLOCATION_FAILED ); #endif back = false; } } else { #line 6758 "WxdkdrawObj.cpt" /* ERROR: New point index out of range (bug) */ #if 0 dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_BUG_POINT_OOR ); #endif back = false; } } else { #line 6768 "WxdkdrawObj.cpt" /* ERROR: Too many points */ #if 0 dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_TOO_MANY_POINTS ); #endif back = false; } } break; } if (bCanDo) { } } #line 6781 "WxdkdrawObj.cpt" return back; } bool wxdobj_control_pt_to_bb( Wxd_bb_t *pbox, Wxd_object_t const *pobj ) { bool back = false; uint16_t i; if (NULL != pbox) { wxdobj_det_init_bb(pbox); if (NULL != pobj) { switch ( (int)(pobj->ot) ) { case WXD_OT_TEXT : { wxdobj_bb_set_point( pbox, (pobj->det).t.x, (pobj->det).t.y ); back = true; } break; case WXD_OT_POLYLINE : case WXD_OT_POLYGON : { if ((0U < (pobj->det).p.n) && (NULL != (pobj->det).p.p)) { for (i = (uint16_t)0U; i < (pobj->det).p.n; i++) { if ((uint16_t)0U != i) { wxdobj_bb_add_point( pbox, ((pobj->det).p.p)[i].x, ((pobj->det).p.p)[i].y ); } else { wxdobj_bb_set_point( pbox, ((pobj->det).p.p)[i].x, ((pobj->det).p.p)[i].y ); } } back = true; } } break; case WXD_OT_O_SPLINE : case WXD_OT_C_SPLINE : { if ((0U < (pobj->det).s.n) && (NULL != (pobj->det).s.p)) { for (i = (uint16_t)0U; i < (pobj->det).s.n; i++) { if ((uint16_t)0U != i) { wxdobj_bb_add_point( pbox, ((pobj->det).s.p)[i].x, ((pobj->det).s.p)[i].y ); } else { wxdobj_bb_set_point( pbox, ((pobj->det).s.p)[i].x, ((pobj->det).s.p)[i].y ); } } back = true; } } break; case WXD_OT_O_ARC : case WXD_OT_C_ARC : { wxdobj_bb_set_point( pbox, (pobj->det).a.x1, (pobj->det).a.y1 ); wxdobj_bb_add_point( pbox, (pobj->det).a.x2, (pobj->det).a.y2 ); wxdobj_bb_add_point( pbox, (pobj->det).a.x3, (pobj->det).a.y3 ); back = true; } break; case WXD_OT_CIRCLE : case WXD_OT_ELLIPSE : { wxdobj_bb_set_point( pbox, (pobj->det).e.x, (pobj->det).e.y ); back = true; } break; case WXD_OT_BOX : { DK4_MEMCPY(pbox,&((pobj->det).b.b),sizeof(Wxd_bb_t)); back = true; } break; case WXD_OT_IMAGE : { DK4_MEMCPY(pbox,&((pobj->det).i.br),sizeof(Wxd_bb_t)); back = true; } break; case WXD_OT_DOT_FILLED : case WXD_OT_DOT_WHITE : { wxdobj_bb_set_point( pbox, (pobj->det).d.x, (pobj->det).d.y ); back = true; } break; } } } return back; } bool wxdobj_flip_object( Wxd_object_t *pobj, Wxd_bb_t const *pbox, bool bVert, bool bRealRun ) { dk4_er_t er; uint16_t i; bool back = false; #line 6898 "WxdkdrawObj.cpt" if ((NULL != pobj) && (NULL != pbox)) { dk4error_init(&er); switch ( (int)(pobj->ot) ) { case WXD_OT_TEXT : { if (bRealRun) { if (bVert) { (pobj->det).t.y = wxdobj_flip_coordinate( pbox->yb, pbox->yt, (pobj->det).t.y, &er ); (pobj->det).t.a = (int16_t)0 - (pobj->det).t.a; } else { (pobj->det).t.x = wxdobj_flip_coordinate( pbox->xl, pbox->xr, (pobj->det).t.x, &er ); (pobj->det).t.a = (int16_t)180 - (pobj->det).t.a; switch ( (int)((pobj->det).t.al) ) { case WXD_TA_RIGHT : { (pobj->det).t.al = (uint8_t)(WXD_TA_LEFT); } break; case WXD_TA_CENTERED : { (pobj->det).t.al = (uint8_t)(WXD_TA_CENTERED); } break; default : { (pobj->det).t.al = (uint8_t)(WXD_TA_RIGHT); } break; } } while ((int16_t)(-360) >= (pobj->det).t.a) { (pobj->det).t.a += (int16_t)360; } while ((int16_t)360 <= (pobj->det).t.a) { (pobj->det).t.a -= (int16_t)360; } } else { if (bVert) { (void)wxdobj_flip_coordinate( pbox->yb, pbox->yt, (pobj->det).t.y, &er ); } else { (void)wxdobj_flip_coordinate( pbox->xl, pbox->xr, (pobj->det).t.x, &er ); } } if (DK4_E_NONE == er.ec) { back = true; } } break; case WXD_OT_POLYLINE : case WXD_OT_POLYGON : { if ((NULL != (pobj->det).p.p) && (0U < (pobj->det).p.n)) { if (bRealRun) { if (bVert) { for (i = (uint16_t)0U; i < (pobj->det).p.n; i++) { ((pobj->det).p.p)[i].y = wxdobj_flip_coordinate( pbox->yb, pbox->yt, ((pobj->det).p.p)[i].y, &er ); } } else { for (i = (uint16_t)0U; i < (pobj->det).p.n; i++) { ((pobj->det).p.p)[i].x = wxdobj_flip_coordinate( pbox->xl, pbox->xr, ((pobj->det).p.p)[i].x, &er ); } } } else { if (bVert) { for (i = (uint16_t)0U; i < (pobj->det).p.n; i++) { (void)wxdobj_flip_coordinate( pbox->yb, pbox->yt, ((pobj->det).p.p)[i].y, &er ); } } else { for (i = (uint16_t)0U; i < (pobj->det).p.n; i++) { (void)wxdobj_flip_coordinate( pbox->xl, pbox->xr, ((pobj->det).p.p)[i].x, &er ); } } } if (DK4_E_NONE == er.ec) { back = true; } } } break; case WXD_OT_O_SPLINE : case WXD_OT_C_SPLINE : { if ((NULL != (pobj->det).s.p) && (0U < (pobj->det).s.n)) { if (bRealRun) { if (bVert) { for (i = (uint16_t)0U; i < (pobj->det).s.n; i++) { ((pobj->det).s.p)[i].y = wxdobj_flip_coordinate( pbox->yb, pbox->yt, ((pobj->det).s.p)[i].y, &er ); } } else { for (i = (uint16_t)0U; i < (pobj->det).s.n; i++) { ((pobj->det).s.p)[i].x = wxdobj_flip_coordinate( pbox->xl, pbox->xr, ((pobj->det).s.p)[i].x, &er ); } } } else { if (bVert) { for (i = (uint16_t)0U; i < (pobj->det).s.n; i++) { (void)wxdobj_flip_coordinate( pbox->yb, pbox->yt, ((pobj->det).s.p)[i].y, &er ); } } else { for (i = (uint16_t)0U; i < (pobj->det).s.n; i++) { (void)wxdobj_flip_coordinate( pbox->xl, pbox->xr, ((pobj->det).s.p)[i].x, &er ); } } } if (DK4_E_NONE == er.ec) { back = true; } } } break; case WXD_OT_O_ARC : case WXD_OT_C_ARC : { if (bRealRun) { if (bVert) { (pobj->det).a.y1 = wxdobj_flip_coordinate( pbox->yb, pbox->yt, (pobj->det).a.y1, &er ); (pobj->det).a.y2 = wxdobj_flip_coordinate( pbox->yb, pbox->yt, (pobj->det).a.y2, &er ); (pobj->det).a.y3 = wxdobj_flip_coordinate( pbox->yb, pbox->yt, (pobj->det).a.y3, &er ); } else { (pobj->det).a.x1 = wxdobj_flip_coordinate( pbox->xl, pbox->xr, (pobj->det).a.x1, &er ); (pobj->det).a.x2 = wxdobj_flip_coordinate( pbox->xl, pbox->xr, (pobj->det).a.x2, &er ); (pobj->det).a.x3 = wxdobj_flip_coordinate( pbox->xl, pbox->xr, (pobj->det).a.x3, &er ); } wxdarc_calculation( &((pobj->det).a.x), &((pobj->det).a.y), &((pobj->det).a.r), &((pobj->det).a.a), &((pobj->det).a.b), &((pobj->det).a.d), (pobj->det).a.x1, (pobj->det).a.y1, (pobj->det).a.x2, (pobj->det).a.y2, (pobj->det).a.x3, (pobj->det).a.y3 ); } else { if (bVert) { (void)wxdobj_flip_coordinate( pbox->yb, pbox->yt, (pobj->det).a.y1, &er ); (void)wxdobj_flip_coordinate( pbox->yb, pbox->yt, (pobj->det).a.y2, &er ); (void)wxdobj_flip_coordinate( pbox->yb, pbox->yt, (pobj->det).a.y3, &er ); } else { (void)wxdobj_flip_coordinate( pbox->xl, pbox->xr, (pobj->det).a.x1, &er ); (void)wxdobj_flip_coordinate( pbox->xl, pbox->xr, (pobj->det).a.x2, &er ); (void)wxdobj_flip_coordinate( pbox->xl, pbox->xr, (pobj->det).a.x3, &er ); } } if (DK4_E_NONE == er.ec) { back = true; } } break; case WXD_OT_CIRCLE : case WXD_OT_ELLIPSE : { if (bRealRun) { if (bVert) { (pobj->det).e.y = wxdobj_flip_coordinate( pbox->yb, pbox->yt, (pobj->det).e.y, &er ); } else { (pobj->det).e.x = wxdobj_flip_coordinate( pbox->xl, pbox->xr, (pobj->det).e.x, &er ); } if ( (WXD_OT_ELLIPSE == pobj->ot) && ((int16_t)0 != (pobj->det).e.a) ) { if (bVert) { (pobj->det).e.a = (int16_t)0 - (pobj->det).e.a; } else { (pobj->det).e.a = (int16_t)180 - (pobj->det).e.a; } while ((int16_t)(-360) >= (pobj->det).t.a) { (pobj->det).t.a += (int16_t)360; } while ((int16_t)360 <= (pobj->det).t.a) { (pobj->det).t.a -= (int16_t)360; } } } else { if (bVert) { (void)wxdobj_flip_coordinate( pbox->yb, pbox->yt, (pobj->det).e.y, &er ); } else { (void)wxdobj_flip_coordinate( pbox->xl, pbox->xr, (pobj->det).e.x, &er ); } } if (DK4_E_NONE == er.ec) { back = true; } } break; case WXD_OT_BOX : { if (bRealRun) { if (bVert) { (pobj->det).b.b.yb = wxdobj_flip_coordinate( pbox->yb, pbox->yt, (pobj->det).b.b.yb, &er ); (pobj->det).b.b.yt = wxdobj_flip_coordinate( pbox->yb, pbox->yt, (pobj->det).b.b.yt, &er ); } else { (pobj->det).b.b.xl = wxdobj_flip_coordinate( pbox->xl, pbox->xr, (pobj->det).b.b.xl, &er ); (pobj->det).b.b.xr = wxdobj_flip_coordinate( pbox->xl, pbox->xr, (pobj->det).b.b.xr, &er ); } wxdobj_bb_correct(&((pobj->det).b.b)); } else { if (bVert) { (void)wxdobj_flip_coordinate( pbox->yb, pbox->yt, (pobj->det).b.b.yb, &er ); (void)wxdobj_flip_coordinate( pbox->yb, pbox->yt, (pobj->det).b.b.yt, &er ); } else { (void)wxdobj_flip_coordinate( pbox->xl, pbox->xr, (pobj->det).b.b.xl, &er ); (void)wxdobj_flip_coordinate( pbox->xl, pbox->xr, (pobj->det).b.b.xr, &er ); } } if (DK4_E_NONE == er.ec) { back = true; } } break; case WXD_OT_IMAGE : { if (bRealRun) { if (bVert) { (pobj->det).i.br.yb = wxdobj_flip_coordinate( pbox->yb, pbox->yt, (pobj->det).i.br.yb, &er ); (pobj->det).i.br.yt = wxdobj_flip_coordinate( pbox->yb, pbox->yt, (pobj->det).i.br.yt, &er ); } else { (pobj->det).i.br.xl = wxdobj_flip_coordinate( pbox->xl, pbox->xr, (pobj->det).i.br.xl, &er ); (pobj->det).i.br.xr = wxdobj_flip_coordinate( pbox->xl, pbox->xr, (pobj->det).i.br.xr, &er ); } wxdobj_bb_correct(&((pobj->det).i.br)); } else { if (bVert) { (void)wxdobj_flip_coordinate( pbox->yb, pbox->yt, (pobj->det).i.br.yb, &er ); (void)wxdobj_flip_coordinate( pbox->yb, pbox->yt, (pobj->det).i.br.yt, &er ); } else { (void)wxdobj_flip_coordinate( pbox->xl, pbox->xr, (pobj->det).i.br.xl, &er ); (void)wxdobj_flip_coordinate( pbox->xl, pbox->xr, (pobj->det).i.br.xr, &er ); } } if (DK4_E_NONE == er.ec) { back = true; } } break; case WXD_OT_DOT_FILLED : case WXD_OT_DOT_WHITE : { if (bRealRun) { if (bVert) { (pobj->det).d.y = wxdobj_flip_coordinate( pbox->yb, pbox->yt, (pobj->det).d.y, &er ); } else { (pobj->det).d.x = wxdobj_flip_coordinate( pbox->xl, pbox->xr, (pobj->det).d.x, &er ); } } else { if (bVert) { (void)wxdobj_flip_coordinate( pbox->yb, pbox->yt, (pobj->det).d.y, &er ); } else { (void)wxdobj_flip_coordinate( pbox->xl, pbox->xr, (pobj->det).d.x, &er ); } } if (DK4_E_NONE == er.ec) { back = true; } } break; } } #line 7247 "WxdkdrawObj.cpt" return back; } bool wxdobj_is_marked(Wxd_object_t const *pobj, uint8_t marker) { bool back = false; #line 7257 "WxdkdrawObj.cpt" if (NULL != pobj) { if ((uint8_t)0U != (marker & (pobj->mark))) { back = true; } } #line 7263 "WxdkdrawObj.cpt" return back; } int wxdobj_num_marked_2(Wxd_drawing_t *pdrw) { Wxd_object_t *pobj; int back = 0; #line 7274 "WxdkdrawObj.cpt" if (NULL != pdrw) { dk4sto_it_reset(pdrw->i_stru); do { pobj = (Wxd_object_t *)dk4sto_it_next(pdrw->i_stru); if (NULL != pobj) { if (wxdobj_is_marked(pobj, OBJ_MARKER_2)) { back++; } } } while ((NULL != pobj) && (2 > back)); } #line 7286 "WxdkdrawObj.cpt" return back; } #if TRACE_DEBUG static void wxdobj_report_bb(dk4_bb_t const *pbb) { #if TRACE_DEBUG #line 7298 "WxdkdrawObj.cpt" if (0 != dk4bb_have_x(pbb)) { #line 7300 "WxdkdrawObj.cpt" } else { #line 7303 "WxdkdrawObj.cpt" } if (0 != dk4bb_have_y(pbb)) { #line 7306 "WxdkdrawObj.cpt" } else { #line 7309 "WxdkdrawObj.cpt" } #line 7311 "WxdkdrawObj.cpt" #endif } #endif static bool wxdobj_bb_simple_text(Wxd_object_t *pobj) { #line 7322 "WxdkdrawObj.cpt" dk4bb_init(&(pobj->bb)); dk4bb_add_point( &(pobj->bb), (double)((pobj->det).t.x), (double)((pobj->det).t.y) ); #line 7328 "WxdkdrawObj.cpt" #line 7329 "WxdkdrawObj.cpt" return true; } static bool wxdobj_bb_simple_polyline(Wxd_object_t *pobj) { uint16_t u; bool back = false; #line 7341 "WxdkdrawObj.cpt" dk4bb_init(&(pobj->bb)); if ((NULL != (pobj->det).p.p) && ((uint16_t)0U < (pobj->det).p.n)) { back = true; for (u = (uint16_t)0U; u < (pobj->det).p.n; u++) { dk4bb_add_point( &(pobj->bb), (double)(((pobj->det).p.p)[u].x), (double)(((pobj->det).p.p)[u].y) ); } } #line 7353 "WxdkdrawObj.cpt" #line 7354 "WxdkdrawObj.cpt" return back; } static bool wxdobj_bb_simple_spline( Wxd_object_t *pobj, size_t subsegs ) { double aa[4]; /* Subsegment start */ double ab[4]; /* Subsegment end */ dk4_xsp_2d_t xsp; /* X-spline structure for calculations */ double divisor; /* Divisor for derivatives */ double t; /* Current "time" */ size_t ssegno; /* Current subsegment */ uint16_t nsegs; /* Number of segments in spline */ uint16_t a; /* Point A index */ uint16_t b; /* Point B index */ uint16_t c; /* Point C index */ uint16_t d; /* Point D index */ bool back = false; #line 7379 "WxdkdrawObj.cpt" divisor = 3.0 * ((double)subsegs); dk4bb_init(&(pobj->bb)); if ((NULL != (pobj->det).s.p) && ((uint16_t)1U < (pobj->det).s.n)) { back = true; #line 7383 "WxdkdrawObj.cpt" nsegs = (pobj->det).s.n; if (WXD_OT_C_SPLINE != pobj->ot) { nsegs--; } #line 7386 "WxdkdrawObj.cpt" dk4xsp2d_reset(&xsp); for (b = (uint16_t)0U; b < nsegs; b++) { #line 7389 "WxdkdrawObj.cpt" if (b < ((pobj->det).s.n - (uint16_t)1U)) { c = b + (uint16_t)1U; } else { c = 0; } #line 7395 "WxdkdrawObj.cpt" if ( (1.0e-7 > fabs(((pobj->det).s.p)[b].s)) && (1.0e-7 > fabs(((pobj->det).s.p)[c].s)) ) { #line 7399 "WxdkdrawObj.cpt" dk4bb_add_point( &(pobj->bb), ((pobj->det).s.p)[b].x, ((pobj->det).s.p)[b].y ); dk4bb_add_point( &(pobj->bb), ((pobj->det).s.p)[c].x, ((pobj->det).s.p)[c].y ); } else { #line 7407 "WxdkdrawObj.cpt" dk4xsp2d_reset_points(&xsp); dk4xsp2d_set_point( &xsp, (double)(((pobj->det).s.p)[b].x), (double)(((pobj->det).s.p)[b].y), ((pobj->det).s.p)[b].s, 1 ); dk4xsp2d_set_point( &xsp, (double)(((pobj->det).s.p)[c].x), (double)(((pobj->det).s.p)[c].y), ((pobj->det).s.p)[c].s, 2 ); if (b < ((pobj->det).s.n - (uint16_t)2U)) { d = b + (uint16_t)2U; #line 7424 "WxdkdrawObj.cpt" dk4xsp2d_set_point( &xsp, (double)(((pobj->det).s.p)[d].x), (double)(((pobj->det).s.p)[d].y), ((pobj->det).s.p)[d].s, 3 ); } else { if (WXD_OT_C_SPLINE == pobj->ot) { d = b - ((pobj->det).s.n - (uint16_t)2U); #line 7436 "WxdkdrawObj.cpt" dk4xsp2d_set_point( &xsp, (double)(((pobj->det).s.p)[d].x), (double)(((pobj->det).s.p)[d].y), ((pobj->det).s.p)[d].s, 3 ); } } if ((uint16_t)0U < b) { a = b - (uint16_t)1U; #line 7447 "WxdkdrawObj.cpt" dk4xsp2d_set_point( &xsp, (double)(((pobj->det).s.p)[a].x), (double)(((pobj->det).s.p)[a].y), ((pobj->det).s.p)[a].s, 0 ); } else { if (WXD_OT_C_SPLINE == pobj->ot) { a = (pobj->det).s.n - (uint16_t)1U; #line 7459 "WxdkdrawObj.cpt" dk4xsp2d_set_point( &xsp, (double)(((pobj->det).s.p)[a].x), (double)(((pobj->det).s.p)[a].y), ((pobj->det).s.p)[a].s, 0 ); } } /* Minimum number of sub segments is 2 */ if ((size_t)2U > subsegs) { subsegs = (size_t)2U; } /* Start point of segment */ dk4xsp2d_calculate_value_derivative(aa, &xsp, 0.0, NULL); aa[1] = aa[1] / divisor; aa[3] = aa[3] / divisor; for (ssegno = (size_t)0U; ssegno < subsegs; ssegno++) { if ((subsegs - (size_t)1U) == ssegno) { t = 1.0; } else { t = ((double)(ssegno + (size_t)1U)) / ((double)subsegs); } dk4xsp2d_calculate_value_derivative(ab, &xsp, t, NULL); ab[1] = ab[1] / divisor; ab[3] = ab[3] / divisor; dk4bb_add_bezier( &(pobj->bb), aa[0], aa[2], (aa[0] + aa[1]), (aa[2] + aa[3]), (ab[0] - ab[1]), (ab[2] - ab[3]), ab[0], ab[2] ); DK4_MEMCPY(aa,ab,sizeof(aa)); } } } } #line 7499 "WxdkdrawObj.cpt" #line 7500 "WxdkdrawObj.cpt" return back; } static bool wxdobj_bb_simple_arc(Wxd_object_t *pobj) { double a; double b; size_t i; int c; #line 7514 "WxdkdrawObj.cpt" dk4bb_init(&(pobj->bb)); dk4bb_add_point( &(pobj->bb), (double)((pobj->det).a.x1), (double)((pobj->det).a.y1) ); dk4bb_add_point( &(pobj->bb), (double)((pobj->det).a.x2), (double)((pobj->det).a.y2) ); dk4bb_add_point( &(pobj->bb), (double)((pobj->det).a.x3), (double)((pobj->det).a.y3) ); if ((int8_t)0 != (pobj->det).a.d) { if ((pobj->det).a.a <= (pobj->det).a.b) { a = (pobj->det).a.a; b = (pobj->det).a.b; } else { a = (pobj->det).a.b; b = (pobj->det).a.a; } c = 0; for (i = (size_t)0U; i < sz_arc_angles; i++) { if (a <= arc_angles[i]) { if (arc_angles[i] <= b) { switch (c) { case 3 : { dk4bb_add_y( &(pobj->bb), ((pobj->det).a.y - (pobj->det).a.r) ); } break; case 2 : { dk4bb_add_x( &(pobj->bb), ((pobj->det).a.x - (pobj->det).a.r) ); } break; case 1 : { dk4bb_add_y( &(pobj->bb), ((pobj->det).a.y + (pobj->det).a.r) ); } break; default : { dk4bb_add_x( &(pobj->bb), ((pobj->det).a.x + (pobj->det).a.r) ); } break; } } } if (4 <= ++c) { c = 0; } } if (WXD_OT_C_ARC == pobj->ot) { dk4bb_add_point(&(pobj->bb), (pobj->det).a.x, (pobj->det).a.y); } } #line 7568 "WxdkdrawObj.cpt" #line 7569 "WxdkdrawObj.cpt" return true; } static bool wxdobj_bb_simple_circle(Wxd_object_t *pobj) { #line 7579 "WxdkdrawObj.cpt" dk4bb_init(&(pobj->bb)); dk4bb_add_point( &(pobj->bb), ((double)((pobj->det).e.x) - (double)((pobj->det).e.rx)), ((double)((pobj->det).e.y) - (double)((pobj->det).e.rx)) ); dk4bb_add_point( &(pobj->bb), ((double)((pobj->det).e.x) + (double)((pobj->det).e.rx)), ((double)((pobj->det).e.y) + (double)((pobj->det).e.rx)) ); #line 7591 "WxdkdrawObj.cpt" #line 7592 "WxdkdrawObj.cpt" return true; } static bool wxdobj_bb_simple_ellipse(Wxd_object_t *pobj) { #line 7602 "WxdkdrawObj.cpt" dk4bb_init(&(pobj->bb)); dk4bb_add_rotated_ellipse( &(pobj->bb), (double)((pobj->det).e.x), (double)((pobj->det).e.y), (double)((pobj->det).e.rx), (double)((pobj->det).e.ry), ((M_PI * ((double)((pobj->det).e.a))) / 180.0) ); #line 7612 "WxdkdrawObj.cpt" #line 7613 "WxdkdrawObj.cpt" return true; } static bool wxdobj_bb_simple_box(Wxd_object_t *pobj) { #line 7623 "WxdkdrawObj.cpt" dk4bb_init(&(pobj->bb)); dk4bb_add_point( &(pobj->bb), (double)((pobj->det).b.b.xl), (double)((pobj->det).b.b.yb) ); dk4bb_add_point( &(pobj->bb), (double)((pobj->det).b.b.xr), (double)((pobj->det).b.b.yt) ); #line 7633 "WxdkdrawObj.cpt" #line 7634 "WxdkdrawObj.cpt" return true; } static bool wxdobj_bb_simple_image(Wxd_object_t *pobj) { #line 7644 "WxdkdrawObj.cpt" dk4bb_init(&(pobj->bb)); dk4bb_add_point( &(pobj->bb), (double)((pobj->det).i.br.xl), (double)((pobj->det).i.br.yb) ); dk4bb_add_point( &(pobj->bb), (double)((pobj->det).i.br.xr), (double)((pobj->det).i.br.yt) ); #line 7654 "WxdkdrawObj.cpt" #line 7655 "WxdkdrawObj.cpt" return true; } static bool wxdobj_bb_simple_dot(Wxd_drawing_t const *pdrw, Wxd_object_t *pobj) { #if 1 double r; #endif #line 7668 "WxdkdrawObj.cpt" dk4bb_init(&(pobj->bb)); #if 1 r = (((double)((pobj->det).d.d) * (double)(pdrw->baselw)) / 2.0); dk4bb_add_point( &(pobj->bb), ((double)((pobj->det).d.x) - r), ((double)((pobj->det).d.y) - r) ); dk4bb_add_point( &(pobj->bb), ((double)((pobj->det).d.x) + r), ((double)((pobj->det).d.y) + r) ); #else dk4bb_add_point(&(pobj->bb), (pobj->det).d.x, (pobj->det).d.y); #endif #line 7683 "WxdkdrawObj.cpt" #line 7684 "WxdkdrawObj.cpt" return true; } bool wxdobj_bb_simple_object( Wxd_drawing_t const *pdrw, Wxd_object_t *pobj ) { bool back = false; #line 7697 "WxdkdrawObj.cpt" if (NULL != pobj) { switch ( (int)(pobj->ot) ) { case WXD_OT_TEXT : { back = wxdobj_bb_simple_text(pobj); } break; case WXD_OT_POLYLINE : case WXD_OT_POLYGON : { back = wxdobj_bb_simple_polyline(pobj); } break; case WXD_OT_O_SPLINE : case WXD_OT_C_SPLINE : { back = wxdobj_bb_simple_spline(pobj, pdrw->xsubs); } break; case WXD_OT_O_ARC : case WXD_OT_C_ARC : { back = wxdobj_bb_simple_arc(pobj); } break; case WXD_OT_CIRCLE : { back = wxdobj_bb_simple_circle(pobj); } break; case WXD_OT_ELLIPSE : { back = wxdobj_bb_simple_ellipse(pobj); } break; case WXD_OT_BOX : { back = wxdobj_bb_simple_box(pobj); } break; case WXD_OT_IMAGE : { back = wxdobj_bb_simple_image(pobj); } break; case WXD_OT_DOT_FILLED : case WXD_OT_DOT_WHITE : { back = wxdobj_bb_simple_dot(pdrw, pobj); } break; } } #line 7729 "WxdkdrawObj.cpt" return back; } bool wxdobj_bb_group_structural( Wxd_drawing_t const *pdrw, Wxd_object_t *pobj ) { Wxd_object_t *po; bool back = false; #line 7743 "WxdkdrawObj.cpt" if (NULL != pobj) { dk4bb_init(&(pobj->bb)); } if ((NULL != pdrw) && (NULL != pobj)) { if (WXD_OT_GROUP_BEGIN == pobj->ot) { back = true; dk4sto_it_reset((pobj->det).g.i_e); do { po = (Wxd_object_t *)dk4sto_it_next((pobj->det).g.i_e); if (NULL != po) { #line 7753 "WxdkdrawObj.cpt" if (WXD_OT_GROUP_BEGIN == po->ot) { if (!wxdobj_bb_group_structural(pdrw, po)) { back = false; } } #line 7759 "WxdkdrawObj.cpt" dk4bb_add_bb(&(pobj->bb), &(po->bb)); } } while (NULL != po); } #line 7764 "WxdkdrawObj.cpt" } #line 7766 "WxdkdrawObj.cpt" return back; } bool wxdobj_bb_group_and_contents( Wxd_drawing_t const *pdrw, Wxd_object_t *pobj ) { Wxd_object_t *po; bool back = false; #line 7780 "WxdkdrawObj.cpt" if (NULL != pobj) { dk4bb_init(&(pobj->bb)); } if ((NULL != pdrw) && (NULL != pobj)) { if (WXD_OT_GROUP_BEGIN == pobj->ot) { back = true; dk4sto_it_reset((pobj->det).g.i_e); do { po = (Wxd_object_t *)dk4sto_it_next((pobj->det).g.i_e); if (NULL != po) { #line 7790 "WxdkdrawObj.cpt" if (WXD_OT_GROUP_BEGIN == po->ot) { if (!wxdobj_bb_group_and_contents(pdrw, po)) { back = false; } } else { if (!wxdobj_bb_simple_object(pdrw, po)) { back = false; } } #line 7801 "WxdkdrawObj.cpt" dk4bb_add_bb(&(pobj->bb), &(po->bb)); } } while (NULL != po); } #line 7806 "WxdkdrawObj.cpt" } #line 7808 "WxdkdrawObj.cpt" return back; } bool wxdobj_bb_modified_object( Wxd_drawing_t const *pdrw, Wxd_object_t *pobj ) { bool back = false; #line 7821 "WxdkdrawObj.cpt" if (NULL != pobj) { dk4bb_init(&(pobj->bb)); } if ((NULL != pdrw) && (NULL != pobj)) { if (WXD_OT_GROUP_BEGIN == pobj->ot) { /* If a group was modified (i.e. moved) rebuild bounding box information completely */ back = wxdobj_bb_group_and_contents(pdrw, pobj); } else { /* Rebuild bounding box information for simple object */ back = wxdobj_bb_simple_object(pdrw, pobj); if (NULL != pobj->pa) { /* If object is member of a group rebuild bounding box information in structural nodes */ while (NULL != pobj->pa) { pobj = pobj->pa; } if (!wxdobj_bb_group_structural(pdrw, pobj)) { back = false; } } } } #line 7850 "WxdkdrawObj.cpt" return back; } bool wxdobj_bb_for_drawing( Wxd_drawing_t *pdrw ) { Wxd_object_t *pobj; bool back = false; #line 7863 "WxdkdrawObj.cpt" if (NULL != pdrw) { back = true; dk4sto_it_reset(pdrw->i_flat); do { pobj = (Wxd_object_t *)dk4sto_it_next(pdrw->i_flat); if (NULL != pobj) { #line 7869 "WxdkdrawObj.cpt" if (!wxdobj_bb_simple_object(pdrw, pobj)) { back = false; } } } while (NULL != pobj); dk4sto_it_reset(pdrw->i_stru); do { pobj = (Wxd_object_t *)dk4sto_it_next(pdrw->i_stru); if (NULL != pobj) { if (WXD_OT_GROUP_BEGIN == pobj->ot) { #line 7880 "WxdkdrawObj.cpt" if (!wxdobj_bb_group_structural(pdrw, pobj)) { back = false; } } } } while (NULL != pobj); } #line 7888 "WxdkdrawObj.cpt" return back; } bool wxdobj_text_is_latex(Wxd_object_t const *pobj) { bool back = false; if (NULL != pobj) { if (WXD_OT_TEXT == pobj->ot) { if ( WXD_TEXT_FLAG_NONE != (WXD_TEXT_FLAG_LATEX & ((pobj->det).t.fl)) ) { back = true; } } } return back; } bool wxdobj_can_convert( int destot, const Wxd_object_t *pobj ) { bool back = false; #line 7920 "WxdkdrawObj.cpt" if (NULL != pobj) { switch (destot) { case WXD_OT_POLYLINE : { switch ( (int)(pobj->ot) ) { case WXD_OT_BOX : case WXD_OT_POLYLINE : case WXD_OT_O_SPLINE : case WXD_OT_O_ARC : case WXD_OT_POLYGON : case WXD_OT_C_SPLINE : case WXD_OT_C_ARC : { back = true; } break; } } break; case WXD_OT_O_SPLINE : { switch ( (int)(pobj->ot) ) { case WXD_OT_BOX : case WXD_OT_POLYLINE : case WXD_OT_O_SPLINE : case WXD_OT_O_ARC : case WXD_OT_POLYGON : case WXD_OT_C_SPLINE : case WXD_OT_C_ARC : { back = true; } break; } } break; case WXD_OT_O_ARC : { switch ( (int)(pobj->ot) ) { case WXD_OT_C_ARC : case WXD_OT_O_ARC : { back = true; } break; case WXD_OT_POLYLINE : case WXD_OT_POLYGON : { if ((uint16_t)3U == (pobj->det).p.n) { back = true; } } break; case WXD_OT_O_SPLINE : case WXD_OT_C_SPLINE : { if ((uint16_t)3U == (pobj->det).s.n) { back = true; } } break; } } break; case WXD_OT_POLYGON : { switch ( (int)(pobj->ot) ) { case WXD_OT_BOX : case WXD_OT_POLYLINE : case WXD_OT_O_SPLINE : case WXD_OT_O_ARC : case WXD_OT_POLYGON : case WXD_OT_C_SPLINE : case WXD_OT_C_ARC : { back = true; } break; } } break; case WXD_OT_C_SPLINE : { switch ( (int)(pobj->ot) ) { case WXD_OT_BOX : case WXD_OT_POLYLINE : case WXD_OT_O_SPLINE : case WXD_OT_O_ARC : case WXD_OT_POLYGON : case WXD_OT_C_SPLINE : case WXD_OT_C_ARC : { back = true; } break; } } break; case WXD_OT_C_ARC : { switch ( (int)(pobj->ot) ) { case WXD_OT_C_ARC : case WXD_OT_O_ARC : { back = true; } break; case WXD_OT_POLYLINE : case WXD_OT_POLYGON : { if ((uint16_t)3U == (pobj->det).p.n) { back = true; } } break; case WXD_OT_O_SPLINE : case WXD_OT_C_SPLINE : { if ((uint16_t)3U == (pobj->det).s.n) { back = true; } } break; } } break; case WXD_OT_DOT_FILLED : { switch ( (int)(pobj->ot) ) { case WXD_OT_DOT_FILLED : case WXD_OT_DOT_WHITE : case WXD_OT_CIRCLE : { back = true; } break; } } break; case WXD_OT_DOT_WHITE : { switch ( (int)(pobj->ot) ) { case WXD_OT_DOT_FILLED : case WXD_OT_DOT_WHITE : case WXD_OT_CIRCLE : { back = true; } break; } } break; } } #line 8035 "WxdkdrawObj.cpt" return back; } /** Rotate one point relatively to a center point by 90 degree. @param x Point x coordinate (in and out). @paam y Point y coordinate (in and out). @param x0 Center point x coordinate. @param y0 Center point y coordinate. @param neg Negative direction (false=positive direction). @param doit Really modify point (false=test only). @return True on success, false on error. */ static bool wxdobj_rotate_point( int32_t & x, int32_t & y, int32_t x0, int32_t y0, bool neg, bool doit ) { dk4_er_t er; int32_t dx; int32_t dy; int32_t nx; int32_t ny; bool back = false; if ((x == x0) && (y == y0)) { back = true; } else { dk4error_init(&er); dx = dk4ma_int32_t_sub(x, x0, &er); dy = dk4ma_int32_t_sub(y, y0, &er); if (neg) { nx = dk4ma_int32_t_add(x0, dy, &er); ny = dk4ma_int32_t_sub(y0, dx, &er); } else { nx = dk4ma_int32_t_sub(x0, dy, &er); ny = dk4ma_int32_t_add(y0, dx, &er); } if (DK4_E_NONE == er.ec) { back = true; if (doit) { x = nx; y = ny; } } } return back; } static bool wxdobj_rotate_text( Wxd_object_t *pobj, int32_t x0, int32_t y0, bool neg, bool doit ) { bool back; back = wxdobj_rotate_point( (pobj->det).t.x, (pobj->det).t.y, x0, y0, neg, doit ); if (doit) { if (neg) { (pobj->det).t.a -= (int16_t)90; if ((int16_t)0 > (pobj->det).t.a) { (pobj->det).t.a += (int16_t)360; } } else { (pobj->det).t.a += (int16_t)90; if ((int16_t)360 < (pobj->det).t.a) { (pobj->det).t.a -= (int16_t)360; } } } return back; } static bool wxdobj_rotate_polyline( Wxd_object_t *pobj, int32_t x0, int32_t y0, bool neg, bool doit ) { uint16_t i; bool back = false; bool res; if ((NULL != (pobj->det).p.p) && ((uint16_t)0U < (pobj->det).p.n)) { back = true; for (i = (uint16_t)0U; i < (pobj->det).p.n; i++) { res = wxdobj_rotate_point( ((pobj->det).p.p)[i].x,((pobj->det).p.p)[i].y,x0,y0,neg,doit ); if (!(res)) { back = false; } } } return back; } static bool wxdobj_rotate_spline( Wxd_object_t *pobj, int32_t x0, int32_t y0, bool neg, bool doit ) { uint16_t i; bool back = false; bool res; if ((NULL != (pobj->det).s.p) && ((uint16_t)0U < (pobj->det).s.n)) { back = true; for (i = (uint16_t)0U; i < (pobj->det).s.n; i++) { res = wxdobj_rotate_point( ((pobj->det).s.p)[i].x,((pobj->det).s.p)[i].y,x0,y0,neg,doit ); if (!(res)) { back = false; } } } return back; } static bool wxdobj_rotate_arc( Wxd_object_t *pobj, int32_t x0, int32_t y0, bool neg, bool doit ) { bool back = true; bool res; res = wxdobj_rotate_point((pobj->det).a.x1,(pobj->det).a.y1,x0,y0,neg,doit); if (!(res)) { back = false; } res = wxdobj_rotate_point((pobj->det).a.x2,(pobj->det).a.y2,x0,y0,neg,doit); if (!(res)) { back = false; } res = wxdobj_rotate_point((pobj->det).a.x3,(pobj->det).a.y3,x0,y0,neg,doit); if (!(res)) { back = false; } if (doit) { wxdarc_calculation( &((pobj->det).a.x), &((pobj->det).a.y), &((pobj->det).a.r), &((pobj->det).a.a), &((pobj->det).a.b), &((pobj->det).a.d), (pobj->det).a.x1, (pobj->det).a.y1, (pobj->det).a.x2, (pobj->det).a.y2, (pobj->det).a.x3, (pobj->det).a.y3 ); } return back; } static bool wxdobj_rotate_ellipse( Wxd_object_t *pobj, int32_t x0, int32_t y0, bool neg, bool doit ) { bool back = false; back = wxdobj_rotate_point( (pobj->det).e.x, (pobj->det).e.y, x0, y0, neg, doit ); if (doit && (WXD_OT_ELLIPSE == pobj->ot)) { if (neg) { (pobj->det).e.a -= (int16_t)90; if ((int16_t)0 > (pobj->det).e.a) { (pobj->det).e.a += (int16_t)360; } } else { (pobj->det).e.a += (int16_t)90; if ((int16_t)360 < (pobj->det).e.a) { (pobj->det).e.a -= (int16_t)360; } } } return back; } static bool wxdobj_rotate_bb( Wxd_bb_t *pbb, int32_t x0, int32_t y0, bool neg, bool doit ) { bool back = true; bool res; res = wxdobj_rotate_point(pbb->xl, pbb->yb, x0, y0, neg, doit); if (!(res)) { back = false; } res = wxdobj_rotate_point(pbb->xr, pbb->yt, x0, y0, neg, doit); if (!(res)) { back = false; } if (doit) { wxdobj_bb_correct(pbb); } return back; } static bool wxdobj_rotate_simple_object( Wxd_object_t *pobj, int32_t x0, int32_t y0, bool neg, bool doit ) { bool back = false; if (NULL != pobj) { switch ( (int)(pobj->ot) ) { case WXD_OT_TEXT : { back = wxdobj_rotate_text(pobj, x0, y0, neg, doit); } break; case WXD_OT_POLYLINE : case WXD_OT_POLYGON : { back = wxdobj_rotate_polyline(pobj, x0, y0, neg, doit); } break; case WXD_OT_O_SPLINE : case WXD_OT_C_SPLINE : { back = wxdobj_rotate_spline(pobj, x0, y0, neg, doit); } break; case WXD_OT_O_ARC : case WXD_OT_C_ARC : { back = wxdobj_rotate_arc(pobj, x0, y0, neg, doit); } break; case WXD_OT_CIRCLE : case WXD_OT_ELLIPSE : { back = wxdobj_rotate_ellipse(pobj, x0, y0, neg, doit); } break; case WXD_OT_BOX : { back = wxdobj_rotate_bb(&((pobj->det).b.b), x0, y0, neg, doit); } break; case WXD_OT_IMAGE : { back = wxdobj_rotate_bb(&((pobj->det).i.br), x0, y0, neg, doit); if (doit) { wxdobj_image_placement(pobj); } } break; case WXD_OT_DOT_FILLED : case WXD_OT_DOT_WHITE : { back = wxdobj_rotate_point( (pobj->det).d.x, (pobj->det).d.y, x0, y0, neg, doit ); } break; } } return back; } static bool wxdobj_rotate_structural_object( Wxd_object_t *pobj, int32_t x0, int32_t y0, bool neg, bool doit ) { Wxd_object_t *o; bool back = false; bool res; if (WXD_OT_GROUP_BEGIN == pobj->ot) { back = true; dk4sto_it_reset((pobj->det).g.i_e); do { o = (Wxd_object_t *)dk4sto_it_next((pobj->det).g.i_e); if (NULL != o) { switch ( (int)(o->ot) ) { case WXD_OT_GROUP_BEGIN : { res = wxdobj_rotate_structural_object( o, x0, y0, neg, doit ); } break; default : { res = wxdobj_rotate_simple_object( o, x0, y0, neg, doit ); } break; } if (!(res)) { back = false; } } } while (NULL != o); } return back; } bool wxdobj_rotate_object( Wxd_object_t *pobj, int32_t x0, int32_t y0, bool neg, bool doit ) { bool back = false; if (NULL != pobj) { switch ( (int)(pobj->ot) ) { case WXD_OT_GROUP_BEGIN : { back = wxdobj_rotate_structural_object( pobj, x0, y0, neg, doit ); } break; default : { back = wxdobj_rotate_simple_object( pobj, x0, y0, neg, doit ); } break; } } return back; } bool wxdobj_bb_equal(Wxd_bb_t const *pa, Wxd_bb_t const *pb) { bool back = false; #line 8392 "WxdkdrawObj.cpt" if ((NULL != pa) && (NULL != pb)) { #line 8394 "WxdkdrawObj.cpt" #line 8395 "WxdkdrawObj.cpt" if ( (pa->xl == pb->xl) && (pa->xr == pb->xr) && (pa->yb == pb->yb) && (pa->yt == pb->yt) ) { back = true; } } #line 8402 "WxdkdrawObj.cpt" return back; } /* vim: set ai sw=4 ts=4 : */