CVB++ 15.0
decl_image_scene.hpp
1#pragma once
2
3#include <atomic>
4
5#ifdef _MSC_VER
6# pragma warning(push, 1)
7# pragma warning(disable : 4127)
8#endif
9
10#include <QGraphicsScene>
11#include <QPainter>
12#include <QSize>
13#include <QRect>
14#include <QWidget>
15#include <QOpenGLFunctions>
16#include <QOpenGLWidget>
17#include <QtMath>
18#include <QThread>
19#include <QApplication>
20
21#ifdef _MSC_VER
22# pragma warning(pop)
23#endif
24
25#include "../../global.hpp"
26
27#include "../ui.hpp"
28
29#include "../../driver/driver.hpp"
30
31#include "decl_opengl_image_renderer.hpp"
32
33namespace Cvb
34{
35
36 CVB_BEGIN_INLINE_NS
37
38 namespace UI
39 {
40
42
48 class ImageScene : public QGraphicsScene
49 {
51 friend Cvb::UI::ImageView;
53
54 public:
56
60 explicit ImageScene(QObject *parent = nullptr)
61 : QGraphicsScene(parent)
62 , syncUploadRequired_(false)
63 {
64 engine_ = std::unique_ptr<Engine>(new RasterEngine(*this));
65 }
66
67 Cvb::UI::RenderEngine RenderEngine() const noexcept
68 {
69 return engine_->RenderEngine();
70 }
71
72 void SetRenderEngine(Cvb::UI::RenderEngine renderEngine);
73
74 protected:
76
82 virtual void UploadImage(const Image &image) noexcept;
83
85
91 class ImageView *ImageView() noexcept;
92
93 void Render(QPainter *painter, const QRectF &rect) noexcept
94 {
95 engine_->Render(painter, rect);
96 }
97
98 std::unique_ptr<Image> UpdateRenderTarget(const Image &image) noexcept
99 {
100 return engine_->UpdateRenderTarget(image);
101 }
102
103 void CopyImageData(const Image &image) noexcept
104 {
105 engine_->CopyImageData(image);
106 }
107
108 void UpdateSceneRect(const Image &image) noexcept;
109
110 void ScheduleSyncUpload() noexcept
111 {
112 syncUploadRequired_ = true;
113 }
114
115 private:
116 class Engine
117 {
118 public:
119 explicit Engine(class ImageScene &imageScene) noexcept
120 : imageScene_(imageScene)
121 {
122 }
123
124 Engine(const Engine &other) = delete;
125 Engine &operator=(const Engine &other) = delete;
126 Engine(Engine &&other) = delete;
127 Engine &operator=(Engine &&other) = delete;
128 virtual ~Engine() = default;
129
130 virtual void Render(QPainter *painter, const QRectF &rect) noexcept = 0;
131
132 virtual std::unique_ptr<Image> UpdateRenderTarget(const Image &image) noexcept = 0;
133
134 virtual void CopyImageData(const Image &image) noexcept = 0;
135
136 virtual Cvb::UI::RenderEngine RenderEngine() const noexcept = 0;
137
138 virtual QWidget *CreateViewport() = 0;
139
140 virtual void ViewPortSetup() {}
141
142 protected:
143 class ImageScene &ImageScene() const noexcept
144 {
145 return imageScene_;
146 }
147
148 private:
149 class ImageScene &imageScene_;
150 };
151
152 class RasterEngine : public Engine
153 {
154 public:
155 explicit RasterEngine(class ImageScene &imageScene) noexcept
156 : Engine(imageScene)
157 {
158 }
159
160 private:
161 void Render(QPainter *painter, const QRectF &rect) noexcept override;
162
163 std::unique_ptr<Image> UpdateRenderTarget(const Image &image) noexcept override;
164
165 void CopyImageData(const Image &image) noexcept override;
166
167 Cvb::UI::RenderEngine RenderEngine() const noexcept override
168 {
170 }
171
172 QWidget *CreateViewport() override
173 {
174 return new QWidget();
175 }
176
177 QImage screenImage_;
178 QRectF screenImageRect_;
179 };
180
181 class GLViewport;
182
183 class GLEngine
184 : public Engine
185 , protected QOpenGLFunctions
186 {
187 friend class ImageScene::GLViewport;
188
189 public:
190 GLEngine(class ImageScene &imageScene, Cvb::UI::RenderEngine renderEngine) noexcept
191 : Engine(imageScene)
192 , renderEngine_(renderEngine)
193 {
194 // get a clear color that looks like a standard widget background.
195 QWidget w;
196 clearColor_ = w.palette().color(w.backgroundRole());
197 }
198
199 private:
200 void Render(QPainter *painter, const QRectF &rect) noexcept override;
201
202 std::unique_ptr<Image> UpdateRenderTarget(const Image &image) noexcept override;
203
204 void CopyImageData(const Image &image) noexcept override;
205
206 Cvb::UI::RenderEngine RenderEngine() const noexcept override
207 {
208 return renderEngine_;
209 }
210
211 QWidget *CreateViewport() override;
212
213 void ViewPortSetup() override;
214
215 void MakeCurrent() noexcept;
216
217 Cvb::UI::RenderEngine renderEngine_;
218
219 std::unique_ptr<OpenGLImageRenderer> renderer_;
220
221 QColor clearColor_;
222 };
223
224 class GLViewport : public QOpenGLWidget
225 {
226 public:
227 explicit GLViewport(GLEngine &glEngine)
228 : QOpenGLWidget()
229 , glEngine_(glEngine)
230 {
231 }
232
233 private:
234 void initializeGL() override
235 {
236 // does not throw!
237 glEngine_.ViewPortSetup();
238 }
239
240 GLEngine &glEngine_;
241 };
242
243 void drawBackground(QPainter *painter, const QRectF &rect) override;
244
245 std::atomic<bool> syncUploadRequired_;
246
247 std::mutex renderMutex_;
248
249 std::unique_ptr<Engine> engine_;
250 };
251
252 } // namespace UI
253
254 CVB_END_INLINE_NS
255
256} // namespace Cvb
The Common Vision Blox image.
Definition decl_image.hpp:50
class ImageView * ImageView() noexcept
Return the image view associated with this scene.
Definition detail_image_scene.hpp:78
ImageScene(QObject *parent=nullptr)
Definition decl_image_scene.hpp:60
virtual void UploadImage(const Image &image) noexcept
Upload an image.
Definition detail_image_scene.hpp:65
View to display an image.
Definition decl_image_view.hpp:69
Namespace for user interface components.
Definition decl_image_scene.hpp:39
@ Image
Definition detail_ui.hpp:45
RenderEngine
Defines the render engine used for drawing.
Definition ui.hpp:108
@ Raster
Definition ui.hpp:114
Root namespace for the Image Manager interface.
Definition c_bayer_to_rgb.h:17