boat
C++23 geospatial library
Loading...
Searching...
No Matches
qt.hpp
Go to the documentation of this file.
1// Andrew Naplavkov
2
3#ifndef BOAT_GUI_QT_HPP
4#define BOAT_GUI_QT_HPP
5
6#include <QImage>
7#include <QPainter>
8#include <QPainterPath>
9#include <boat/gui/detail/geometry.hpp>
10#include <boat/gui/detail/gil.hpp>
11
12namespace boat::gui {
13
14constexpr auto to_qt = overloaded{
15 [](geometry::point auto&& v) { return QPointF(v.x(), v.y()); },
16 [](this auto&& self, geometry::box auto&& v) -> QRectF {
17 return {self(v.min_corner()), self(v.max_corner())};
18 },
19 [](this auto&& self, geometry::curve auto&& v) -> QList<QPointF> {
20 return v | std::views::transform(self) | std::ranges::to<QList>();
21 },
22 [](this auto&& self, geometry::polygon auto&& v) -> QPainterPath {
23 auto ret = QPainterPath{};
24 ret.addPolygon(self(v.outer()));
25 for (auto& item : v.inners())
26 ret.addPolygon(self(item));
27 return ret;
28 }};
29
30inline auto draw_geometry(QPainter& out)
31{
32 return overloaded{
33 [&](geometry::point auto&& v) { out.drawPoint(to_qt(v)); },
34 [&](geometry::linestring auto&& v) { out.drawPolyline(to_qt(v)); },
35 [&](geometry::polygon auto&& v) { out.drawPath(to_qt(v)); },
36 [](this auto&& self, geometry::multi auto&& v) -> void {
37 std::ranges::for_each(v, self);
38 },
39 [](this auto&& self, geometry::dynamic auto&& v) -> void {
40 std::visit(self, v);
41 }};
42}
43
44void draw_image( //
45 execution_policy auto policy,
46 boost::gil::rgba8c_view_t in,
47 geometry::matrix const& in_affine,
48 geometry::srs_spec auto&& in_crs,
49 QPainter& out,
50 geometry::matrix const& out_affine,
51 geometry::srs_spec auto&& out_crs)
52{
53 auto [fwd, inv] = bidirectional(in_affine, in_crs, out_affine, out_crs);
54 auto mbr =
55 fwd(multi_point(in.width(), in.height()))
56 .transform(geometry::minmax)
57 .transform(to_qt)
58 .transform(&QRectF::toAlignedRect)
59 .transform(std::bind_front(&QRect::intersected, out.window()));
60 if (!mbr || mbr->isEmpty())
61 return;
62 auto img = QImage{mbr->size(), QImage::Format_RGBA8888};
63 auto ys = std::views::iota(0, img.height());
64 auto pixel = get_pixel(in);
65 std::for_each(policy, ys.begin(), ys.end(), [&](int y) {
66 auto ln = reinterpret_cast<uint8_t*>(img.scanLine(y));
67 for (int x{}; x < img.width(); ++x) {
68 auto px =
69 inv(geometry::geographic::point(x + mbr->x(), y + mbr->y()))
70 .and_then(pixel);
71 if (px)
72 *reinterpret_cast<boost::gil::rgba8_pixel_t*>(ln + x * 4) = *px;
73 else
74 std::fill_n(ln + x * 4, 4, 0);
75 }
76 });
77 out.drawImage(mbr->topLeft(), img);
78}
79
80} // namespace boat::gui
81
82#endif // BOAT_GUI_QT_HPP
Definition vocabulary.hpp:40
Definition vocabulary.hpp:67
Definition vocabulary.hpp:43
Definition vocabulary.hpp:46
Definition vocabulary.hpp:49
Definition vocabulary.hpp:55
Definition vocabulary.hpp:58
Definition vocabulary.hpp:37
boost::qvm::mat< double, 3, 3 > matrix
Definition vocabulary.hpp:114
constexpr auto minmax
Definition algorithm.hpp:77
Definition cache.hpp:11
void draw_image(execution_policy auto policy, boost::gil::rgba8c_view_t in, geometry::matrix const &in_affine, geometry::srs_spec auto &&in_crs, QPainter &out, geometry::matrix const &out_affine, geometry::srs_spec auto &&out_crs)
Definition qt.hpp:44
constexpr auto to_qt
Definition qt.hpp:14
auto draw_geometry(QPainter &out)
Definition qt.hpp:30
model::d2::point_xy< double, boost::geometry::cs::geographic< boost::geometry::degree > > point
Definition vocabulary.hpp:75