Engauge Digitizer  2
ZoomTransition.cpp
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 
52 ZoomFactor ZoomTransition::zoomIn (ZoomFactor currentZoomFactor,
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 = (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 = (ZoomFactor) (zoomFactorOld - 1);
82  }
83 
84  return zoomFactorNew;
85 }
86 
87 ZoomFactor ZoomTransition::zoomOut (ZoomFactor currentZoomFactor,
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 = (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 = (ZoomFactor) (zoomFactorOld + 1);
117  }
118 
119  return zoomFactorNew;
120 }
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.
ZoomTransition()
Single constructor.
ZoomFactor zoomOut(ZoomFactor currentZoomFactor, double m11, double m22, bool actionZoomFillIsChecked) const
Zoom out.