%% options copyright owner = Dirk Krause copyright year = 2019-xxxx SPDX-License-Identifier: BSD-3-Clause # vim: set ai sw=4 ts=4 : %% module #include "wxdkdraw.h" #ifndef WXDKDRAWFRAME_H_INCLUDED #include "WxdkdrawFrame.h" #endif $!trace-include void WxdkdrawFrame::Control::CalculateZoomFactor(void) { int8_t zl; /* Local copy of zoom level to analyze */ m_dZoom = 1.0; if (NULL != m_pParent) { if (NULL != m_pParent->m_pDrw) { if ((uint8_t)0U != m_pParent->m_pDrw->gridunit) { /* Grid is in cm */ m_uGridOptical = 6400000UL; } else { /* Grid is inch based (1/2 inch) */ m_uGridOptical = 8128000UL; } zl = m_pParent->m_pDrw->zl; if ((int8_t)0 < zl) { while ((int8_t)1 < zl) { zl -= (int8_t)2; m_dZoom *= 2.0; m_uGridOptical /= (uint32_t)2UL; } if ((int8_t)0 < zl) { m_dZoom *= M_SQRT2; m_uGridOptical /= (uint32_t)2UL; } } else { if ((int8_t)0 > zl) { while ((int8_t)(-1) > zl) { zl += (int8_t)2; m_dZoom /= 2.0; m_uGridOptical *= (uint32_t)2UL; } if ((int8_t)0 > zl) { m_dZoom /= M_SQRT2; m_uGridOptical *= (uint32_t)2UL; } } } if ((uint8_t)0U != m_pParent->m_pDrw->gridbase) { m_uGridSnap = m_uGridOptical / (uint32_t)5UL; } else { m_uGridSnap = m_uGridOptical / (uint32_t)4UL; } } } } void WxdkdrawFrame::Control::CalculateGridDistances(void) { int8_t zl; /* Local copy of zoom level to analyze */ if (NULL != m_pParent) { if (NULL != m_pParent->m_pDrw) { if ((uint8_t)0U != m_pParent->m_pDrw->gridunit) { /* Grid is in cm */ m_uGridOptical = 6400000UL; } else { /* Grid is inch based (1/2 inch) */ m_uGridOptical = 8128000UL; } zl = m_pParent->m_pDrw->zl; if ((int8_t)0 < zl) { while ((int8_t)1 < zl) { zl -= (int8_t)2; m_uGridOptical /= (uint32_t)2UL; } if ((int8_t)0 < zl) { m_uGridOptical /= (uint32_t)2UL; } } else { if ((int8_t)0 > zl) { while ((int8_t)(-1) > zl) { zl += (int8_t)2; m_uGridOptical *= (uint32_t)2UL; } if ((int8_t)0 > zl) { m_uGridOptical *= (uint32_t)2UL; } } } if ((uint8_t)0U != m_pParent->m_pDrw->gridbase) { m_uGridSnap = m_uGridOptical / (uint32_t)5UL; } else { m_uGridSnap = m_uGridOptical / (uint32_t)4UL; } } } } void WxdkdrawFrame::Control::CalculateConversionCoefficients(void) { $? "+ CalculateConversionCoefficients" m_ptM.x = (m_ptRes.x * m_dZoom) / 16256000.0; m_ptN.x = (double)(m_szDrawco.GetWidth()) / 2.0; m_ptN.x -= ((double)(m_pParent->m_pDrw->cx) * m_ptRes.x * m_dZoom) / 16256000.0; m_ptM.y = 0.0 - (m_ptRes.y * m_dZoom) / 16256000.0; m_ptN.y = (double)(m_szDrawco.GetHeight()) / 2.0; m_ptN.y += ((double)(m_pParent->m_pDrw->cy) * m_ptRes.y * m_dZoom) / 16256000.0; $? ". mx = %g nx = %g", m_ptM.x, m_ptN.x $? ". my = %g ny = %g", m_ptM.y, m_ptN.y $? "- CalculateConversionCoefficients" } double WxdkdrawFrame::Control::ConvDist(double d) { #if TRACE_DEBUG double back; back = fabs(m_ptM.x * d); $? "= ConvDist ( %g ) = %g", d, back return back; #else return (fabs(m_ptM.x * d)); #endif } double WxdkdrawFrame::Control::ConvX(double x) { #if TRACE_DEBUG double back; back = m_ptM.x * x + m_ptN.x; $? "= ConvX ( %g ) = %g", x, back return back; #else return (m_ptM.x * x + m_ptN.x); #endif } double WxdkdrawFrame::Control::ConvY(double y) { #if TRACE_DEBUG double back; back = m_ptM.y * y + m_ptN.y; $? "= ConvY ( %g ) = %g", y, back return back; #else return (m_ptM.y * y + m_ptN.y); #endif } double WxdkdrawFrame::Control::ConvDist(int32_t d) { return (ConvDist((double)d)); } double WxdkdrawFrame::Control::ConvX(int32_t x) { return (ConvX((double)x)); } double WxdkdrawFrame::Control::ConvY(int32_t y) { return (ConvY((double)y)); } double WxdkdrawFrame::Control::InvX(double x) { #if TRACE_DEBUG double back; back = (x - m_ptN.x) / m_ptM.x; $? "= InvX ( %g ) = %g", x, back return back; #else return ((x - m_ptN.x) / m_ptM.x); #endif } double WxdkdrawFrame::Control::InvY(double y) { #if TRACE_DEBUG double back; back = (y - m_ptN.y) / m_ptM.y; $? "= InvY ( %g ) = %g", y, back return back; #else return ((y - m_ptN.y) / m_ptM.y); #endif } int32_t WxdkdrawFrame::Control::InvX(double x, bool & ok) { dk4_er_t er; /* Error report */ double invx; /* Inverted x value */ int32_t i32; /* Intermediate result */ int32_t back = (int32_t)0L; $? "+ InvX %g", x dk4error_init(&er); invx = InvX(x); i32 = dk4ma_int32_from_double(dk4ma_rint(invx), &er); if (DK4_E_NONE == er.ec) { back = i32; } else { $? "! overflow" ok = false; } $? "- InvX %ld", (long)back return back; } int32_t WxdkdrawFrame::Control::InvY(double y, bool & ok) { dk4_er_t er; /* Error report */ double invy; /* Inverted y value */ int32_t i32; /* Intermediate result */ int32_t back = (int32_t)0L; $? "+ InvY %g", y dk4error_init(&er); invy = InvY(y); i32 = dk4ma_int32_from_double(dk4ma_rint(invy), &er); if (DK4_E_NONE == er.ec) { back = i32; } else { $? "! overflow" ok = false; } $? "- InvY %ld", (long)back return back; } int32_t WxdkdrawFrame::Control::GridRoundDown(int32_t x,uint32_t gr,bool & ok,bool fo) { dk4_er_t er; /* Error report */ int32_t back; /* Function result */ int32_t rem; /* Division remainder */ $? "+ GridRoundDown %ld %lu %d", (long)x, (unsigned long)gr, (fo ? 1 : 0) back = x / (int32_t)gr; $? ". back = %ld", (long)back rem = x % (int32_t)gr; $? ". rem = %ld", (long)rem dk4error_init(&er); if (((int32_t)0L > rem) || ((fo) && ((int32_t)0L == rem))) { back--; } back = dk4ma_int32_t_mul(back, (int32_t)gr, &er); if (DK4_E_NONE != er.ec) { ok = false; } $? "- GridRoundDown %ld", (long)back return back; } int32_t WxdkdrawFrame::Control::GridRoundUp(int32_t x, uint32_t gr, bool & ok, bool fo) { dk4_er_t er; /* Error report */ int32_t back; /* Function result */ int32_t rem; /* Division remainder */ $? "+ GridRoundUp %ld %lu %d", (long)x, (unsigned long)gr, (fo ? 1 : 0) dk4error_init(&er); back = x / (int32_t)gr; rem = x % (int32_t)gr; if (((int32_t)0L < rem) || ((fo) && ((int32_t)0L == rem))) { back++; } back = dk4ma_int32_t_mul(back, (int32_t)gr, &er); if (DK4_E_NONE != er.ec) { ok = false; } $? "- GridRoundUp %ld", (long)back return back; } int32_t WxdkdrawFrame::Control::GridRoundNearest(int32_t x, uint32_t gr, bool & ok) { dk4_er_t er; /* Error report */ int32_t back; /* Function result */ int32_t rem; /* Division remainder */ $? "+ GridRoundNearest %ld %lu", (long)x, (unsigned long)gr dk4error_init(&er); back = x / (int32_t)gr; rem = x % (int32_t)gr; if ((int32_t)0L > rem) { if (rem <= ((int32_t)0L - (int32_t)gr / (int32_t)2L)) { back = dk4ma_int32_t_sub(back, (int32_t)1L, &er); } } else { if (rem >= (int32_t)gr / (int32_t)2L) { back = dk4ma_int32_t_add(back, (int32_t)1L, &er); } } back = dk4ma_int32_t_mul(back, (int32_t)gr, &er); if (DK4_E_NONE != er.ec) { ok = false; } $? "- GridRoundNearest %ld", (long)back return back; } int WxdkdrawFrame::Control::LineWidthForObject( Wxd_drawing_t const *pDrw, Wxd_object_t const *pObj, int iMarkup ) { int back; uint16_t lw; $? "+ LineWidthForObject" #if TRACE_DEBUG $? ". base lw = %d", (int)(pDrw->baselw) $? ". obj lw = %d", (int)(pObj->lw) $? ". product = %g", (double)(pDrw->baselw) * (double)(pObj->lw) $? ". convert = %g", ConvDist((double)(pDrw->baselw) * (double)(pObj->lw)) #endif #if VERSION_BEFORE_2020_08_16 back = (int)dk4ma_rint( ConvDist((double)(pDrw->baselw) * (double)(pObj->lw)) ); #else lw = pObj->lw; if (((uint16_t)0U == lw) && (WXD_MARKUP_NONE != iMarkup)) { lw = (uint16_t)2U; $? ". lw correction for iMarkup } back = (int)dk4ma_rint( ConvDist((double)(pDrw->baselw) * (double)lw) ); #endif $? ". back = %d", back if (0 == back) { back = 1; } $? "- LineWidthForObject %d", back return back; } /* vim: set ai sw=4 ts=4 : */