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) 48 const Glib::RefPtr<Gtk::Builder> builder)
49 : Gtk::Window(cobject)
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));
62 __cur_widget = Gtk::manage(
new ImageWidget( 60, 40));
63 __seg_widget = Gtk::manage(
new ImageWidget(256, 256));
65 __y_scale->signal_value_changed().connect(sigc::mem_fun(*
this, &YuvViewerGtkWindow::on_y_value_changed));
66 __y_res->signal_value_changed().connect(sigc::mem_fun(*
this, &YuvViewerGtkWindow::on_y_res_changed));
67 __u_res->signal_value_changed().connect(sigc::mem_fun(*
this, &YuvViewerGtkWindow::on_uv_res_changed));
68 __v_res->signal_value_changed().connect(sigc::mem_fun(*
this, &YuvViewerGtkWindow::on_uv_res_changed));
70 __yuv_vp->signal_button_press_event().connect(sigc::mem_fun(*
this, &YuvViewerGtkWindow::on_click_on_yuv));
71 __yuv_vp->signal_motion_notify_event().connect(sigc::mem_fun(*
this, &YuvViewerGtkWindow::on_mouse_over_yuv));
72 __yuv_vp->add(*__yuv_widget);
73 __cur_vp->add(*__cur_widget);
74 __seg_vp->add(*__seg_widget);
77 memset(__cur_buffer + 60 * 40, 128, 60 * 40);
78 memset(__seg_buffer, 128, 256 * 256);
95 YuvViewerGtkWindow::on_click_on_yuv(GdkEventButton *event)
100 return on_mouse_over_yuv(&mot);
108 YuvViewerGtkWindow::on_mouse_over_yuv(GdkEventMotion *event)
110 unsigned int u = std::max(0, std::min(255, (
int)event->x));
111 unsigned int v = 255 - std::max(0, std::min(255, (
int)event->y));
113 __u_value->set_text(convert_float2str(u, 0));
114 __v_value->set_text(convert_float2str(v, 0));
115 memset(__cur_buffer + 60 * 40, u, 60 * 20);
116 memset(__cur_buffer + 60 * 60, v, 60 * 20);
117 __cur_widget->
show(YUV422_PLANAR, __cur_buffer);
124 YuvViewerGtkWindow::on_y_value_changed()
126 unsigned int y = round(__y_scale->get_value());
127 memset(__yuv_buffer, y, 256 * 256);
128 memset(__cur_buffer, y, 60 * 40);
145 __yuv_widget->
show(YUV422_PLANAR, __yuv_buffer);
146 __cur_widget->
show(YUV422_PLANAR, __cur_buffer);
151 YuvViewerGtkWindow::on_y_res_changed()
153 unsigned int r = round(__y_res->get_value());
156 __y_scale->set_value(127);
157 __y_scale->set_range(127, 128);
160 __y_scale->set_range(0, 255);
161 __y_scale->set_increments(255.f / (pow(2, r) - 1), 0);
166 YuvViewerGtkWindow::on_uv_res_changed()
168 unsigned char *yuv_u = __yuv_buffer + 256 * 256;
169 unsigned char *yuv_v = yuv_u + 256 * 256 / 2;
170 unsigned int u_div = 256 / (int)pow(2, __u_res->get_value());
171 unsigned int v_div = 256 / (int)pow(2, __v_res->get_value());
173 for (
unsigned int v = 0; v < 256; ++v) {
174 memset((yuv_v + v * 128), ((255 - v) / v_div) * v_div, 128);
176 for (
unsigned int u = 0; u < 128; ++u) {
177 yuv_u[v * 128 + u] = (u * 2 / u_div) * u_div;
181 on_y_value_changed();
191 YuvViewerGtkWindow::convert_float2str(
float f,
unsigned int width)
193 #if GLIBMM_MAJOR_VERSION > 2 || ( GLIBMM_MAJOR_VERSION == 2 && GLIBMM_MINOR_VERSION >= 16 ) 194 return Glib::ustring::format(std::fixed, std::setprecision(width), f);
196 std::ostringstream ss;
197 ss << std::fixed << std::setprecision(width);
200 return Glib::locale_to_utf8(ss.str());
206 YuvViewerGtkWindow::calc_seg()
209 unsigned char *seg_u = __seg_buffer + 256 * 256;
210 unsigned char *seg_v = seg_u + 256 * 256 / 2;
212 float a1 = atan2f(64, 128);
213 float a2 = atan2f(128, 64);
214 float a3 = atan2f(128, -64);
215 float a4 = atan2f(64, -128);
216 float a5 = atan2f(-64, -128) + M_2xPI;
217 float a6 = atan2f(-128, -64) + M_2xPI;
218 float a7 = atan2f(-128, 64) + M_2xPI;
219 float a8 = atan2f(-64, 128) + M_2xPI;
221 for (
int u = 0; u < 256; ++u) {
224 for (
int v = 255; v >= 0; --v) {
228 if (dv > 0) YUV_t::red();
229 else c = YUV_t::gray();
232 float a = atan2f(dv, du);
233 if (a < 0) a += M_2xPI;
235 if (a >= a1 && a < a2) c = YUV_t::magenta();
236 else if (a >= a2 && a < a3) c = YUV_t::red();
237 else if (a >= a3 && a < a4) c = YUV_t::orange();
238 else if (a >= a4 && a < a5) c = YUV_t::yellow();
239 else if (a >= a5 && a < a6) c = YUV_t::green();
240 else if (a >= a6 && a < a7) c = YUV_t::gray();
241 else if (a >= a7 && a < a8) c = YUV_t::cyan();
242 else c = YUV_t::blue();
245 unsigned int addr = ((255 - v) * 256 + u) / 2;
251 __seg_widget->
show(YUV422_PLANAR, __seg_buffer);
unsigned char V
V component.
Fawkes library namespace.
virtual ~YuvViewerGtkWindow()
Destructor.
void draw_line(unsigned int x_start, unsigned int y_start, unsigned int x_end, unsigned int y_end)
Draw line.
YuvViewerGtkWindow(BaseObjectType *cobject, const Glib::RefPtr< Gtk::Builder > builder)
Constructor.
void set_buffer(unsigned char *buffer, unsigned int width, unsigned int height)
Set the buffer to draw to.
unsigned char U
U component.
void set_color(unsigned char y, unsigned char u, unsigned char v)
Set drawing color.