diff options
author | Norbert Preining <norbert@preining.info> | 2020-09-20 03:03:26 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2020-09-20 03:03:26 +0000 |
commit | 1f457376b478257b88d4a857f5ec1b6155442dd7 (patch) | |
tree | 2a06a60551dea362cf8cb0cb0ba66c78608717c4 /support/dktools/WxdkdrawControlTools.cpt | |
parent | ac690ca29ad5bf8a5203a65fd6252f7b564f4727 (diff) |
CTAN sync 202009200303
Diffstat (limited to 'support/dktools/WxdkdrawControlTools.cpt')
-rw-r--r-- | support/dktools/WxdkdrawControlTools.cpt | 403 |
1 files changed, 403 insertions, 0 deletions
diff --git a/support/dktools/WxdkdrawControlTools.cpt b/support/dktools/WxdkdrawControlTools.cpt new file mode 100644 index 0000000000..31fc6a84fe --- /dev/null +++ b/support/dktools/WxdkdrawControlTools.cpt @@ -0,0 +1,403 @@ +%% 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 : */ + |