1
/***************************************************************************
2
simplefovexporter.cpp - K Desktop Planetarium
5
copyright : (C) 2011 by Rafał Kułaga
6
email : rl.kulaga@gmail.com
7
***************************************************************************/
9
/***************************************************************************
11
* This program is free software; you can redistribute it and/or modify *
12
* it under the terms of the GNU General Public License as published by *
13
* the Free Software Foundation; either version 2 of the License, or *
14
* (at your option) any later version. *
16
***************************************************************************/
18
#include "simplefovexporter.h"
19
#include "kstarsdata.h"
21
#include "skyqpainter.h"
23
#include "skymapcomposite.h"
24
#include "kstars/Options.h"
26
SimpleFovExporter::SimpleFovExporter() :
27
m_KSData(KStarsData::Instance()), m_Map(KStars::Instance()->map()),
28
m_StopClock(false), m_OverrideFovShape(false), m_DrawFovSymbol(false),
29
m_PrevClockState(false), m_PrevSlewing(false), m_PrevPoint(0),
33
void SimpleFovExporter::exportFov(SkyPoint *point, FOV *fov, QPaintDevice *pd)
36
pExportFov(point, fov, pd);
40
void SimpleFovExporter::exportFov(FOV *fov, QPaintDevice *pd)
42
pExportFov(0, fov, pd);
45
void SimpleFovExporter::exportFov(QPaintDevice *pd)
47
SkyQPainter painter(m_Map, pd);
50
painter.drawSkyBackground();
52
// translate painter coordinates - it's necessary to extract only the area of interest (FOV)
53
int dx = (m_Map->width() - pd->width()) / 2;
54
int dy = (m_Map->height() - pd->height()) / 2;
55
painter.translate(-dx, -dy);
57
m_KSData->skyComposite()->draw(&painter);
58
m_Map->getSkyMapDrawAbstract()->drawOverlays(painter, false);
61
void SimpleFovExporter::exportFov(const QList<SkyPoint*> &points, const QList<FOV*> &fovs, const QList<QPaintDevice*> &pds)
63
Q_ASSERT(points.size() == fovs.size() == pds.size());
67
for(int i = 0; i < points.size(); i++)
69
exportFov(points.value(i), fovs.at(i), pds.value(i));
75
void SimpleFovExporter::exportFov(const QList<SkyPoint*> &points, FOV *fov, const QList<QPaintDevice*> &pds)
77
Q_ASSERT(points.size() == pds.size());
81
for(int i = 0; i < points.size(); i++)
83
exportFov(points.at(i), fov, pds.at(i));
89
void SimpleFovExporter::pExportFov(SkyPoint *point, FOV *fov, QPaintDevice *pd)
93
// center sky map on selected point
94
m_Map->setClickedPoint(point);
98
// this is temporary 'solution' that will be changed during the implementation of printing
99
// on large paper sizes (>A4), in which case it'll be desirable to export high-res FOV
101
if(pd->height() > m_Map->height() || pd->width() > m_Map->width())
106
// calculate zoom factor
109
int regionX(0), regionY(0);
110
double fovSizeX(0), fovSizeY(0);
111
if(fov->sizeX() > fov->sizeY())
113
zoom = calculateZoomLevel(pd->width(), fov->sizeX());
115
// calculate clipping region size
116
fovSizeX = calculatePixelSize(fov->sizeX(), zoom);
117
fovSizeY = calculatePixelSize(fov->sizeY(), zoom);
119
regionY = 0.5 * (pd->height() - fovSizeY);
124
zoom = calculateZoomLevel(pd->height(), fov->sizeY());
126
// calculate clipping region size
127
fovSizeX = calculatePixelSize(fov->sizeX(), zoom);
128
fovSizeY = calculatePixelSize(fov->sizeY(), zoom);
129
regionX = 0.5 * (pd->width() - fovSizeX);
133
if(fov->shape() == FOV::SQUARE)
135
region = QRegion(regionX, regionY, fovSizeX, fovSizeY, QRegion::Rectangle);
140
region = QRegion(regionX, regionY, fovSizeX, fovSizeY, QRegion::Ellipse);
143
m_Map->setZoomFactor(zoom);
145
SkyQPainter painter(m_Map, pd);
148
painter.drawSkyBackground();
150
if(!m_OverrideFovShape)
152
painter.setClipRegion(region);
154
// translate painter coordinates - it's necessary to extract only the area of interest (FOV)
155
int dx = (m_Map->width() - pd->width()) / 2;
156
int dy = (m_Map->height() - pd->height()) / 2;
157
painter.translate(-dx, -dy);
159
m_KSData->skyComposite()->draw(&painter);
160
m_Map->getSkyMapDrawAbstract()->drawOverlays(painter, false);
162
// reset painter coordinate transform to paint FOV symbol in the center
163
painter.resetTransform();
167
fov->draw(painter, zoom);
171
void SimpleFovExporter::saveState(bool savePos)
173
// stop simulation if it's not already stopped
174
m_PrevClockState = m_KSData->clock()->isActive();
175
if(m_StopClock && m_PrevClockState)
177
m_KSData->clock()->stop();
180
// disable useAnimatedSlewing option
181
m_PrevSlewing = Options::useAnimatedSlewing();
184
Options::setUseAnimatedSlewing(false);
187
// save current central point and zoom level
188
m_PrevPoint = savePos ? m_Map->focusPoint() : 0;
189
m_PrevZoom = Options::zoomFactor();
192
void SimpleFovExporter::restoreState(bool restorePos)
194
// restore previous useAnimatedSlewing option
197
Options::setUseAnimatedSlewing(true);
202
// restore previous central point
203
m_Map->setClickedPoint(m_PrevPoint);
206
// restore previous zoom level
207
m_Map->setZoomFactor(m_PrevZoom);
209
// restore clock state (if it was stopped)
210
if(m_StopClock && m_PrevClockState)
212
m_KSData->clock()->start();