Engauge Digitizer  2
ZoomTransition.cpp
Go to the documentation of this file.
1 
2 /******************************************************************************************************
3  * (C) 2017 markummitchell@github.com. This file is part of Engauge Digitizer, which is released *
4  * under GNU General Public License version 2 (GPLv2) or (at your option) any later version. See file *
5  * LICENSE or go to gnu.org/licenses for details. Distribution requires prior written permission. *
6  ******************************************************************************************************/
7 
8 #include "EngaugeAssert.h"
9 #include "Logger.h"
10 #include <qmath.h>
11 #include "ZoomTransition.h"
12 
13 const double CLOSER = qPow (2, 1.0 / 3.0);
14 const double FARTHER = 1.0 / CLOSER;
15 
17 {
18  m_zoomMapToFactor [ZOOM_16_TO_1] = 16.0;
19  m_zoomMapToFactor [ZOOM_16_TO_1_FARTHER] = 16.0 * FARTHER;
20  m_zoomMapToFactor [ZOOM_8_TO_1_CLOSER] = 8.0 * CLOSER;
21  m_zoomMapToFactor [ZOOM_8_TO_1] = 8.0;
22  m_zoomMapToFactor [ZOOM_8_TO_1_FARTHER] = 8.0 * FARTHER;
23  m_zoomMapToFactor [ZOOM_4_TO_1_CLOSER] = 4.0 * CLOSER;
24  m_zoomMapToFactor [ZOOM_4_TO_1] = 4.0;
25  m_zoomMapToFactor [ZOOM_4_TO_1_FARTHER] = 4.0 * FARTHER;
26  m_zoomMapToFactor [ZOOM_2_TO_1_CLOSER] = 2.0 * CLOSER;
27  m_zoomMapToFactor [ZOOM_2_TO_1] = 2.0;
28  m_zoomMapToFactor [ZOOM_2_TO_1_FARTHER] = 2.0 * FARTHER;
29  m_zoomMapToFactor [ZOOM_1_TO_1_CLOSER] = 1.0 * CLOSER;
30  m_zoomMapToFactor [ZOOM_1_TO_1] = 1.0;
31  m_zoomMapToFactor [ZOOM_1_TO_1_FARTHER] = 1.0 * FARTHER;
32  m_zoomMapToFactor [ZOOM_1_TO_2_CLOSER] = 0.5 * CLOSER;
33  m_zoomMapToFactor [ZOOM_1_TO_2] = 0.5;
34  m_zoomMapToFactor [ZOOM_1_TO_2_FARTHER] = 0.5 * FARTHER;
35  m_zoomMapToFactor [ZOOM_1_TO_4_CLOSER] = 0.25 * CLOSER;
36  m_zoomMapToFactor [ZOOM_1_TO_4] = 0.25;
37  m_zoomMapToFactor [ZOOM_1_TO_4_FARTHER] = 0.25 * FARTHER;
38  m_zoomMapToFactor [ZOOM_1_TO_8_CLOSER] = 0.125 * CLOSER;
39  m_zoomMapToFactor [ZOOM_1_TO_8] = 0.125;
40  m_zoomMapToFactor [ZOOM_1_TO_8_FARTHER] = 0.125 * FARTHER;
41  m_zoomMapToFactor [ZOOM_1_TO_16_CLOSER] = 0.0625 * CLOSER;
42  m_zoomMapToFactor [ZOOM_1_TO_16] = 0.0625;
43 }
44 
45 double ZoomTransition::mapToFactor (ZoomFactor zoomFactor) const
46 {
47  ENGAUGE_ASSERT (m_zoomMapToFactor.contains (zoomFactor));
48 
49  return m_zoomMapToFactor [zoomFactor];
50 }
51 
53  double m11,
54  double m22,
55  bool actionZoomFillIsChecked) const
56 {
57  LOG4CPP_INFO_S ((*mainCat)) << "ZoomTransition::zoomIn";
58 
59  // Try to zoom in
60  ZoomFactor zoomFactorOld = currentZoomFactor;
61 
62  if (actionZoomFillIsChecked) {
63 
64  // Zooming in means user probably wants the more squished direction to be zoomed in by one step.
65  // Loop through the zoom values until a match is found
66  double xScale = m11;
67  double yScale = m22;
68  double scale = qMin(xScale, yScale); // Fit so large extent just fits
69 
70  for (int zoom = ZOOM_1_TO_16_CLOSER; zoom >= 0; zoom--) {
71  ZoomFactor zoomFactor = static_cast<ZoomFactor> (zoom);
72  if (scale < m_zoomMapToFactor [zoomFactor]) {
73  zoomFactorOld = zoomFactor;
74  break;
75  }
76  }
77  }
78 
79  ZoomFactor zoomFactorNew = ZOOM_16_TO_1;
80  if (zoomFactorOld > ZOOM_16_TO_1) {
81  zoomFactorNew = static_cast<ZoomFactor> (zoomFactorOld - 1);
82  }
83 
84  return zoomFactorNew;
85 }
86 
88  double m11,
89  double m22,
90  bool actionZoomFillIsChecked) const
91 {
92  LOG4CPP_INFO_S ((*mainCat)) << "ZoomTransition::zoomOut";
93 
94  // Try to zoom out
95  ZoomFactor zoomFactorOld = currentZoomFactor;
96 
97  if (actionZoomFillIsChecked) {
98 
99  // Zooming out means user probably wants the less squished direction to be zoomed out by one step.
100  // Loop through the zoom values until a match is found
101  double xScale = m11;
102  double yScale = m22;
103  double scale = qMax(xScale, yScale); // Fit so larger extent just fits
104 
105  for (int zoom = 0; zoom <= ZOOM_1_TO_16_CLOSER; zoom++) {
106  ZoomFactor zoomFactor = static_cast<ZoomFactor> (zoom);
107  if (scale > m_zoomMapToFactor [zoomFactor]) {
108  zoomFactorOld = zoomFactor;
109  break;
110  }
111  }
112  }
113 
114  ZoomFactor zoomFactorNew = ZOOM_1_TO_16;
115  if (zoomFactorOld < ZOOM_1_TO_16) {
116  zoomFactorNew = static_cast<ZoomFactor> (zoomFactorOld + 1);
117  }
118 
119  return zoomFactorNew;
120 }
const double CLOSER
double mapToFactor(ZoomFactor zoomFactor) const
Return the floating precision zoom factor given the enum value.
ZoomFactor zoomIn(ZoomFactor currentZoomFactor, double m11, double m22, bool actionZoomFillIsChecked) const
Zoom in.
#define LOG4CPP_INFO_S(logger)
Definition: convenience.h:18
ZoomTransition()
Single constructor.
const double FARTHER
log4cpp::Category * mainCat
Definition: Logger.cpp:14
ZoomFactor
Zoom factors ordered by zoom level so next one above/below is the next zoom level.
Definition: ZoomFactor.h:11
ZoomFactor zoomOut(ZoomFactor currentZoomFactor, double m11, double m22, bool actionZoomFillIsChecked) const
Zoom out.
#define ENGAUGE_ASSERT(cond)
Drop in replacement for Q_ASSERT if defined(QT_NO_DEBUG) && !defined(QT_FORCE_ASSERTS) define ENGAUGE...
Definition: EngaugeAssert.h:20