-
Notifications
You must be signed in to change notification settings - Fork 105
/
template_image.h
171 lines (136 loc) · 4.74 KB
/
template_image.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
/*
* Copyright 2012, 2013 Thomas Schöps
* Copyright 2012-2017 Kai Pastor
*
* This file is part of OpenOrienteering.
*
* OpenOrienteering is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenOrienteering is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenOrienteering. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef OPENORIENTEERING_TEMPLATE_IMAGE_H
#define OPENORIENTEERING_TEMPLATE_IMAGE_H
#include <vector>
#include <QByteArray>
#include <QColor>
#include <QImage>
#include <QObject>
#include <QPointF>
#include <QRectF>
#include <QRgb>
#include <QScopedPointer>
#include <QString>
#include <QTransform>
#include <QVarLengthArray>
#include "templates/template.h"
class QPainter;
class QPointF;
class QRectF;
class QWidget;
class QXmlStreamReader;
class QXmlStreamWriter;
namespace OpenOrienteering {
class Georeferencing;
class Map;
class MapCoordF;
/**
* Template showing a raster image.
* Can be georeferenced or non-georeferenced.
*/
class TemplateImage : public Template
{
Q_OBJECT
public:
enum GeoreferencingType
{
Georeferencing_None = 0,
Georeferencing_WorldFile,
Georeferencing_GDAL
};
struct GeoreferencingOption
{
GeoreferencingType type;
QByteArray source;
QString crs_spec;
QTransform pixel_to_world;
};
using GeoreferencingOptions = QVarLengthArray<GeoreferencingOption, 3>;
/**
* Returns the filename extensions supported by this template class.
*/
static const std::vector<QByteArray>& supportedExtensions();
TemplateImage(const QString& path, Map* map);
~TemplateImage() override;
const char* getTemplateType() const override {return "TemplateImage";}
bool isRasterGraphics() const override {return true;}
bool saveTemplateFile() const override;
void saveTypeSpecificTemplateConfiguration(QXmlStreamWriter& xml) const override;
bool loadTypeSpecificTemplateConfiguration(QXmlStreamReader& xml) override;
bool loadTemplateFileImpl(bool configuring) override;
bool postLoadConfiguration(QWidget* dialog_parent, bool& out_center_in_view) override;
void unloadTemplateFileImpl() override;
void drawTemplate(QPainter* painter, const QRectF& clip_rect, double scale, bool on_screen, float opacity) const override;
QRectF getTemplateExtent() const override;
bool canBeDrawnOnto() const override {return true;}
/**
* Calculates the image's center of gravity in template coordinates by
* iterating over all pixels, leaving out the pixels with background_color.
*/
QPointF calcCenterOfGravity(QRgb background_color);
/** Returns the internal QImage. */
inline const QImage& getImage() const {return image;}
/**
* Returns which georeferencing methods are known to be available.
*
* (This does not imply that the image is in georeferenced mode.)
*
* Invariant: The list is never empty. It always contains at least an entry
* of type Georeferencing_None. This entry is always the last one.
*/
const GeoreferencingOptions& availableGeoreferencing() const { return available_georef; }
bool canChangeTemplateGeoreferenced() override;
bool trySetTemplateGeoreferenced(bool value, QWidget* dialog_parent) override;
public slots:
void updateGeoreferencing();
protected:
/**
* Searches for available georeferencing methods.
*/
GeoreferencingOptions findAvailableGeoreferencing() const;
/** Information about an undo step for the paint-on-template functionality. */
struct DrawOnImageUndoStep
{
/** Copy of previous image part */
QImage image;
/** X position of image part origin */
int x;
/** Y position of image part origin */
int y;
};
Template* duplicateImpl() const override;
void drawOntoTemplateImpl(MapCoordF* coords, int num_coords, QColor color, float width) override;
void drawOntoTemplateUndo(bool redo) override;
void addUndoStep(const DrawOnImageUndoStep& new_step);
void calculateGeoreferencing();
void applyGeoreferencingOption(const GeoreferencingOption& option);
void updatePosFromGeoreferencing();
QImage image;
std::vector< DrawOnImageUndoStep > undo_steps;
/// Current index in undo_steps, where 0 means before the first item.
int undo_index;
GeoreferencingOptions available_georef;
QScopedPointer<Georeferencing> georef;
// Temporary storage for crs spec. Use georef instead.
QString temp_crs_spec;
};
} // namespace OpenOrienteering
#endif