blob: dcbc5f7f327d7ef49e7a1591013da84a0513e1ad [file] [log] [blame]
Parker Schuhef47dbf2017-03-04 16:59:30 -08001#ifndef AOS_VISION_DEBUG_DEBUG_WINDOW_H_
2#define AOS_VISION_DEBUG_DEBUG_WINDOW_H_
Parker Schuh2cd173d2017-01-28 00:12:01 -08003
4#include <cairo.h>
Austin Schuh60e77942022-05-16 17:48:24 -07005
Parker Schuh2cd173d2017-01-28 00:12:01 -08006#include <functional>
Austin Schuh60e77942022-05-16 17:48:24 -07007
Parker Schuh2cd173d2017-01-28 00:12:01 -08008#include "aos/vision/debug/overlay.h"
9#include "aos/vision/image/image_types.h"
10
Stephan Pleinesd99b1ee2024-02-02 20:56:44 -080011namespace aos::vision {
Parker Schuh2cd173d2017-01-28 00:12:01 -080012
13// Implement Cairo version of RenderInterface.
14class CairoRender : public RenderInterface {
15 public:
Parker Schuhcd258b82017-04-09 16:28:29 -070016 explicit CairoRender(cairo_t *cr, double text_scale)
17 : cr_(cr), text_scale_(text_scale) {}
Parker Schuh2cd173d2017-01-28 00:12:01 -080018 virtual ~CairoRender() {}
19
20 void Translate(double x, double y) override { cairo_translate(cr_, x, y); }
21
22 void SetSourceRGB(double r, double g, double b) override {
23 cairo_set_source_rgb(cr_, r, g, b);
24 }
25
26 void MoveTo(double x, double y) override { cairo_move_to(cr_, x, y); }
27
28 void LineTo(double x, double y) override { cairo_line_to(cr_, x, y); }
29
30 void Circle(double x, double y, double r) override {
31 cairo_arc(cr_, x, y, r, 0.0, 2 * M_PI);
32 }
33
34 void Stroke() override { cairo_stroke(cr_); }
35
36 void Text(int x, int y, int text_x, int text_y,
37 const std::string &text) override;
38
39 private:
40 cairo_t *cr_;
Parker Schuhcd258b82017-04-09 16:28:29 -070041 double text_scale_ = 1.0;
Parker Schuh2cd173d2017-01-28 00:12:01 -080042};
43
44// Simple debug view window.
Parker Schuhef47dbf2017-03-04 16:59:30 -080045class DebugWindow {
Parker Schuh2cd173d2017-01-28 00:12:01 -080046 public:
47 struct Internals;
Parker Schuhef47dbf2017-03-04 16:59:30 -080048 explicit DebugWindow(bool flip);
49 ~DebugWindow();
Parker Schuh2cd173d2017-01-28 00:12:01 -080050 // Explicit redraw queuing (Will not double-queue).
51 void Redraw();
52
53 // This will resize the window as well as updating to draw from the
54 // (not owned) ptr. When you change ptr, you should call Redraw();
55 void UpdateImage(ImagePtr ptr);
56
57 // Sets up the window to draw a list of overlays.
58 // See overlay.h for more info.
59 void SetOverlays(std::vector<OverlayBase *> *overlay);
60
Parker Schuhcd258b82017-04-09 16:28:29 -070061 void AddOverlay(OverlayBase *overlay);
62 void AddOverlays(const std::vector<OverlayBase *> &overlays) {
63 for (auto *overlay : overlays) {
64 AddOverlay(overlay);
65 }
66 }
67
Parker Schuh2cd173d2017-01-28 00:12:01 -080068 // Resizes the window.
69 void SetScale(double scale_factor);
70
71 // Move window.
72 void MoveTo(int x, int y);
73
74 // Set to change the key_press behaviour.
75 // The argument type is a constant that looks like: GDK_KEY_#{key_val_name}
76 std::function<void(uint32_t)> key_press_event;
77
78 private:
Parker Schuh309dd722017-02-25 11:31:18 -080079 bool shown_yet_ = false;
Parker Schuh2cd173d2017-01-28 00:12:01 -080080 double scale_factor = 1.0;
81 int window_width_ = 100;
82 int window_height_ = 100;
83 std::unique_ptr<Internals> self;
84};
85
Stephan Pleinesd99b1ee2024-02-02 20:56:44 -080086} // namespace aos::vision
Parker Schuh2cd173d2017-01-28 00:12:01 -080087
Parker Schuhef47dbf2017-03-04 16:59:30 -080088#endif // AOS_VISION_DEBUG_DEBUG_WINDOW_H_