1 /*
2     SPDX-FileCopyrightText: 2011 Rafał Kułaga <rl.kulaga@gmail.com>
3 
4     SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 
7 #ifndef SIMPLEFOVEXPORTER_H
8 #define SIMPLEFOVEXPORTER_H
9 
10 #include "QList"
11 
12 class SkyPoint;
13 class FOV;
14 class KStarsData;
15 class SkyMap;
16 class QPaintDevice;
17 
18 /**
19   * \class SimpleFovExporter
20   * \brief SimpleFovExporter class is used for FOV representation exporting.
21   * Central point is defined by passed pointer to SkyPoint instance and field-of-view parameters
22   * are defined by FOV class instance. Fragment of sky is painted on passed QPaintDevice subclass.
23   * SimpleFovExporter class can be used for export of FOV representations in user-interactive mode as well as
24   * for export of multiple FOVs at once, without user interaction.
25   * \note Please note that SimpleFovExporter class instances may pause simulation clock if they're configured
26   * to do so (via setClockStopping() method).
27   * \note FOV representation's shape can be overridden (i.e. FOV image will be always rectangular) using
28   * setFovShapeOverriden() method.
29   */
30 class SimpleFovExporter
31 {
32   public:
33     /**
34           * \brief Constructor
35           */
36     SimpleFovExporter();
37 
38     /**
39           * \brief Paint FOV representation on passed QPaintDevice subclass.
40           * \param point central point of the exported FOV.
41           * \param fov represented field-of-view.
42           * \param pd paint device on which the representation of the FOV will be painted.
43           */
44     void exportFov(SkyPoint *point, FOV *fov, QPaintDevice *pd);
45 
46     /**
47           * \brief Paint FOV representation on passed QPaintDevice subclass.
48           * \param fov represented field-of-view.
49           * \param pd paint device on which the representation of the FOV will be painted.
50           */
51     void exportFov(FOV *fov, QPaintDevice *pd);
52 
53     /**
54           * \brief Paint FOV representation on passed QPaintDevice subclass.
55           * \param pd paint device on which the representation of the FOV will be painted.
56           */
57     void exportFov(QPaintDevice *pd);
58 
59     /**
60           * \brief Export multiple FOV representations.
61           * \param points list of central points.
62           * \param fovs list of fields-of-view.
63           * \param pds list of paint devices on which the representation of the FOV will be painted.
64           */
65     void exportFov(const QList<SkyPoint *> &points, const QList<FOV *> &fovs, const QList<QPaintDevice *> &pds);
66 
67     /**
68           * \brief Export multiple FOV representations.
69           * \param points list of central points.
70           * \param fov list of fields-of-view.
71           * \param pds list of paint devices on which the representation of the FOV will be painted.
72           */
73     void exportFov(const QList<SkyPoint *> &points, FOV *fov, const QList<QPaintDevice *> &pds);
74 
75     /**
76           * \brief Check if FOV export will cause simulation clock to be stopped.
77           * \return true if clock will be stopped for FOV export.
78           * \note If changed, previous clock state will be restored after FOV export is done.
79           */
isClockStopping()80     inline bool isClockStopping() const { return m_StopClock; }
81 
82     /**
83           * \brief Check if FOV representation will be always rectangular.
84           * \return true if FOV shape is overridden.
85           */
isFovShapeOverriden()86     inline bool isFovShapeOverriden() const { return m_OverrideFovShape; }
87 
88     /**
89           * \brief Check if FOV symbol will be drawn.
90           * \return true if FOV symbol will be drawn.
91           */
isFovSymbolDrawn()92     inline bool isFovSymbolDrawn() const { return m_DrawFovSymbol; }
93 
94     /**
95           * \brief Enable or disable stopping simulation for FOV export.
96           * \param stopping should be true if stopping is to be enabled.
97           */
setClockStopping(bool stopping)98     inline void setClockStopping(bool stopping) { m_StopClock = stopping; }
99 
100     /**
101           * \brief Enable or disable FOV shape overriding.
102           * \param overrideFovShape should be true if FOV representation is to be always rectangular.
103           */
setFovShapeOverriden(bool overrideFovShape)104     inline void setFovShapeOverriden(bool overrideFovShape) { m_OverrideFovShape = overrideFovShape; }
105 
106     /**
107           * \brief Enable or disable FOV symbol drawing.
108           * \param draw should be true if FOV symbol is to be drawn.
109           */
setFovSymbolDrawn(bool draw)110     inline void setFovSymbolDrawn(bool draw) { m_DrawFovSymbol = draw; }
111 
112     /**
113           * \brief Calculate zoom level at which given angular length will occupy given length in pixels.
114           * \param pixelSize size in pixels.
115           * \param degrees angular length.
116           * \return zoom level.
117           */
calculateZoomLevel(int pixelSize,float degrees)118     static inline double calculateZoomLevel(int pixelSize, float degrees) { return (pixelSize * 57.3 * 60) / degrees; }
119 
120     /**
121           * \brief Calculate pixel size of given angular length at given zoom level.
122           * \param degrees angular length.
123           * \param zoomLevel zoom level.
124           * \return size in pixels.
125           */
calculatePixelSize(float degrees,double zoomLevel)126     static inline double calculatePixelSize(float degrees, double zoomLevel)
127     {
128         return degrees * zoomLevel / (57.3 * 60.0);
129     }
130 
131   private:
132     /**
133           * \brief Save SkyMap state.
134           * \param savePos should be true if current position is to be saved.
135           */
136     void saveState(bool savePos);
137 
138     /**
139           * \brief Restore saved SkyMap state.
140           * \param restorePos should be true if saved position is to be restored.
141           */
142     void restoreState(bool restorePos);
143 
144     /**
145           * \brief Private FOV export method.
146           * \param point central point of the exported FOV.
147           * \param fov represented field-of-view.
148           * \param pd paint device on which the representation of the FOV will be painted.
149           * \note Call to this method will not change SkyMap's state.
150           */
151     void pExportFov(SkyPoint *point, FOV *fov, QPaintDevice *pd);
152 
153     KStarsData *m_KSData;
154     SkyMap *m_Map;
155 
156     bool m_StopClock;
157     bool m_OverrideFovShape;
158     bool m_DrawFovSymbol;
159 
160     bool m_PrevClockState;
161     bool m_PrevSlewing;
162     SkyPoint *m_PrevPoint;
163     double m_PrevZoom;
164 };
165 
166 #endif // SIMPLEFOVEXPORTER_H
167