summaryrefslogtreecommitdiff
path: root/support/dktools/WxdkdrawControlTools.cpt
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2020-09-20 03:03:26 +0000
committerNorbert Preining <norbert@preining.info>2020-09-20 03:03:26 +0000
commit1f457376b478257b88d4a857f5ec1b6155442dd7 (patch)
tree2a06a60551dea362cf8cb0cb0ba66c78608717c4 /support/dktools/WxdkdrawControlTools.cpt
parentac690ca29ad5bf8a5203a65fd6252f7b564f4727 (diff)
CTAN sync 202009200303
Diffstat (limited to 'support/dktools/WxdkdrawControlTools.cpt')
-rw-r--r--support/dktools/WxdkdrawControlTools.cpt403
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 : */
+