23#include "yuv_viewer_gui.h"
25#include <fvutils/color/colorspaces.h>
26#include <fvutils/draw/drawer.h>
33#define M_2xPI (2 * M_PI)
35using namespace firevision;
48 const Glib::RefPtr<Gtk::Builder> builder)
51 builder->get_widget(
"yuv_vp", yuv_vp_);
52 builder->get_widget(
"cur_vp", cur_vp_);
53 builder->get_widget(
"seg_vp", seg_vp_);
54 builder->get_widget(
"y_scale", y_scale_);
55 builder->get_widget(
"u_value", u_value_);
56 builder->get_widget(
"v_value", v_value_);
57 builder->get_widget(
"y_res", y_res_);
58 builder->get_widget(
"u_res", u_res_);
59 builder->get_widget(
"v_res", v_res_);
61 yuv_widget_ = Gtk::manage(
new ImageWidget(256, 256));
63 seg_widget_ = Gtk::manage(
new ImageWidget(256, 256));
65 y_scale_->signal_value_changed().connect(
66 sigc::mem_fun(*
this, &YuvViewerGtkWindow::on_y_value_changed));
67 y_res_->signal_value_changed().connect(
68 sigc::mem_fun(*
this, &YuvViewerGtkWindow::on_y_res_changed));
69 u_res_->signal_value_changed().connect(
70 sigc::mem_fun(*
this, &YuvViewerGtkWindow::on_uv_res_changed));
71 v_res_->signal_value_changed().connect(
72 sigc::mem_fun(*
this, &YuvViewerGtkWindow::on_uv_res_changed));
74 yuv_vp_->signal_button_press_event().connect(
75 sigc::mem_fun(*
this, &YuvViewerGtkWindow::on_click_on_yuv));
76 yuv_vp_->signal_motion_notify_event().connect(
77 sigc::mem_fun(*
this, &YuvViewerGtkWindow::on_mouse_over_yuv));
78 yuv_vp_->add(*yuv_widget_);
79 cur_vp_->add(*cur_widget_);
80 seg_vp_->add(*seg_widget_);
82 memset(cur_buffer_ + 60 * 40, 128, 60 * 40);
83 memset(seg_buffer_, 128, 256 * 256);
100YuvViewerGtkWindow::on_click_on_yuv(GdkEventButton *event)
105 return on_mouse_over_yuv(&mot);
113YuvViewerGtkWindow::on_mouse_over_yuv(GdkEventMotion *event)
115 unsigned int u = std::max(0, std::min(255, (
int)event->x));
116 unsigned int v = 255 - std::max(0, std::min(255, (
int)event->y));
118 u_value_->set_text(convert_float2str(u, 0));
119 v_value_->set_text(convert_float2str(v, 0));
120 memset(cur_buffer_ + 60 * 40, u, 60 * 20);
121 memset(cur_buffer_ + 60 * 60, v, 60 * 20);
122 cur_widget_->
show(YUV422_PLANAR, cur_buffer_);
129YuvViewerGtkWindow::on_y_value_changed()
131 unsigned int y = round(y_scale_->get_value());
132 memset(yuv_buffer_, y, 256 * 256);
133 memset(cur_buffer_, y, 60 * 40);
150 yuv_widget_->
show(YUV422_PLANAR, yuv_buffer_);
151 cur_widget_->
show(YUV422_PLANAR, cur_buffer_);
155YuvViewerGtkWindow::on_y_res_changed()
157 unsigned int r = round(y_res_->get_value());
160 y_scale_->set_value(127);
161 y_scale_->set_range(127, 128);
163 y_scale_->set_range(0, 255);
164 y_scale_->set_increments(255.f / (pow(2, r) - 1), 0);
169YuvViewerGtkWindow::on_uv_res_changed()
171 unsigned char *yuv_u = yuv_buffer_ + 256 * 256;
172 unsigned char *yuv_v = yuv_u + 256 * 256 / 2;
173 unsigned int u_div = 256 / (int)pow(2, u_res_->get_value());
174 unsigned int v_div = 256 / (int)pow(2, v_res_->get_value());
176 for (
unsigned int v = 0; v < 256; ++v) {
177 memset((yuv_v + v * 128), ((255 - v) / v_div) * v_div, 128);
179 for (
unsigned int u = 0; u < 128; ++u) {
180 yuv_u[v * 128 + u] = (u * 2 / u_div) * u_div;
184 on_y_value_changed();
194YuvViewerGtkWindow::convert_float2str(
float f,
unsigned int width)
196#if GLIBMM_MAJOR_VERSION > 2 || (GLIBMM_MAJOR_VERSION == 2 && GLIBMM_MINOR_VERSION >= 16)
197 return Glib::ustring::format(std::fixed, std::setprecision(width), f);
199 std::ostringstream ss;
200 ss << std::fixed << std::setprecision(width);
203 return Glib::locale_to_utf8(ss.str());
209YuvViewerGtkWindow::calc_seg()
212 unsigned char *seg_u = seg_buffer_ + 256 * 256;
213 unsigned char *seg_v = seg_u + 256 * 256 / 2;
215 float a1 = atan2f(64, 128);
216 float a2 = atan2f(128, 64);
217 float a3 = atan2f(128, -64);
218 float a4 = atan2f(64, -128);
219 float a5 = atan2f(-64, -128) + M_2xPI;
220 float a6 = atan2f(-128, -64) + M_2xPI;
221 float a7 = atan2f(-128, 64) + M_2xPI;
222 float a8 = atan2f(-64, 128) + M_2xPI;
224 for (
int u = 0; u < 256; ++u) {
227 for (
int v = 255; v >= 0; --v) {
236 float a = atan2f(dv, du);
240 if (a >= a1 && a < a2)
241 c = YUV_t::magenta();
242 else if (a >= a2 && a < a3)
244 else if (a >= a3 && a < a4)
246 else if (a >= a4 && a < a5)
248 else if (a >= a5 && a < a6)
250 else if (a >= a6 && a < a7)
252 else if (a >= a7 && a < a8)
258 unsigned int addr = ((255 - v) * 256 + u) / 2;
264 seg_widget_->
show(YUV422_PLANAR, seg_buffer_);
YuvViewerGtkWindow(BaseObjectType *cobject, const Glib::RefPtr< Gtk::Builder > builder)
Constructor.
virtual ~YuvViewerGtkWindow()
Destructor.
void set_color(unsigned char y, unsigned char u, unsigned char v)
Set drawing color.
void draw_line(unsigned int x_start, unsigned int y_start, unsigned int x_end, unsigned int y_end)
Draw line.
void set_buffer(unsigned char *buffer, unsigned int width, unsigned int height)
Set the buffer to draw to.
Fawkes library namespace.
unsigned char V
V component.
unsigned char U
U component.