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
ZoomTransition()16 ZoomTransition::ZoomTransition ()
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
mapToFactor(ZoomFactor zoomFactor) const45 double ZoomTransition::mapToFactor (ZoomFactor zoomFactor) const
46 {
47 ENGAUGE_ASSERT (m_zoomMapToFactor.contains (zoomFactor));
48
49 return m_zoomMapToFactor [zoomFactor];
50 }
51
zoomIn(ZoomFactor currentZoomFactor,double m11,double m22,bool actionZoomFillIsChecked) const52 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 = 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
zoomOut(ZoomFactor currentZoomFactor,double m11,double m22,bool actionZoomFillIsChecked) const87 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 = 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 }
121