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