00001
00002 #include "bgui_image_tableau.h"
00003
00004
00005
00006
00007
00008 #include <vcl_cmath.h>
00009 #include <vcl_cstdio.h>
00010 #include <vgui/vgui_event.h>
00011 #include <vgui/vgui.h>
00012 #include <vgui/vgui_projection_inspector.h>
00013 #include <vil1/vil1_image.h>
00014 #include <vil1/vil1_rgba.h>
00015 #include <vil/vil_image_view.h>
00016 #include <vgui/vgui_range_map_params.h>
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 bgui_image_tableau::bgui_image_tableau()
00027 {
00028 handle_motion_ = true; locked_ = false; show_path_=false;
00029 tt_ = new vgui_text_tableau();
00030 }
00031
00032 bgui_image_tableau::bgui_image_tableau(vil_image_resource_sptr const & img,
00033 vgui_range_map_params_sptr const& rmp)
00034 : base(img, rmp) { handle_motion_ = true; locked_ = false; show_path_=false;
00035 tt_ = new vgui_text_tableau();}
00036
00037 bgui_image_tableau::bgui_image_tableau(vil_image_view_base const & img,
00038 vgui_range_map_params_sptr const& rmp)
00039 : base(img, rmp) { handle_motion_ = true; locked_ = false; show_path_=false;
00040 tt_ = new vgui_text_tableau();}
00041
00042 bgui_image_tableau::bgui_image_tableau(vil1_image const & img,
00043 vgui_range_map_params_sptr const& rmp)
00044 : base(img, rmp) { handle_motion_ = true; locked_ = false; show_path_=false;
00045 tt_ = new vgui_text_tableau();}
00046
00047 bgui_image_tableau::bgui_image_tableau(char const *f,
00048 vgui_range_map_params_sptr const& rmp)
00049 : base(f, rmp) { handle_motion_ = true; locked_ = false; show_path_=false;
00050 tt_ = new vgui_text_tableau();}
00051
00052
00053
00054 vil1_image bgui_image_tableau::get_image() const
00055 {
00056 return base::get_image();
00057 }
00058
00059 vil_image_resource_sptr bgui_image_tableau::get_image_resource() const
00060 {
00061 return base::get_image_resource();
00062 }
00063
00064 void bgui_image_tableau::get_pixel_info_from_frame_buffer(const int x, const int y, vgui_event const &e, char* msg)
00065 {
00066
00067
00068 glPixelZoom(1,1);
00069 glPixelTransferi(GL_MAP_COLOR,0);
00070 glPixelTransferi(GL_RED_SCALE,1); glPixelTransferi(GL_RED_BIAS,0);
00071 glPixelTransferi(GL_GREEN_SCALE,1); glPixelTransferi(GL_GREEN_BIAS,0);
00072 glPixelTransferi(GL_BLUE_SCALE,1); glPixelTransferi(GL_BLUE_BIAS,0);
00073
00074 glPixelStorei(GL_PACK_ALIGNMENT,1);
00075 glPixelStorei(GL_PACK_ROW_LENGTH,0);
00076 glPixelStorei(GL_PACK_SKIP_PIXELS,0);
00077 glPixelStorei(GL_PACK_SKIP_ROWS,0);
00078 vil1_rgba<GLubyte> pixel;
00079 glReadPixels(e.wx, e.wy,
00080 1, 1,
00081 GL_RGBA,
00082 GL_UNSIGNED_BYTE,
00083 &pixel);
00084 vcl_sprintf(msg, "(%d, %d) (ubyte)[ R=%d,G=%d,B=%d]", x, y,
00085 pixel.r, pixel.g, pixel.b);
00086 }
00087
00088 void bgui_image_tableau::
00089 get_pixel_info_from_image(const int x, const int y,
00090 vgui_event const &e, char* msg)
00091 {
00092
00093
00094 vil_image_resource_sptr r = this->get_image_resource();
00095 if (!r)
00096 if (!this->get_image())
00097 {
00098 vcl_sprintf(msg, "(%d, %d) ?", x, y);
00099 return;
00100 }
00101 else
00102 {
00103 this->get_pixel_info_from_frame_buffer(x, y, e, msg);
00104 return;
00105 }
00106
00107 unsigned w = r->ni(), h = r->nj(), n_p = r->nplanes();
00108 if (x<0||x>=int(w)||y<0||y>=int(h))
00109 {
00110 vcl_sprintf(msg, "(%d, %d) ?", 0, 0);
00111 return;
00112 }
00113 vil_pixel_format type = r->pixel_format();
00114 switch (type )
00115 {
00116 case VIL_PIXEL_FORMAT_BOOL: {
00117 vil_image_view<bool> v = r->get_view();
00118 if (!v)
00119 vcl_sprintf(msg, "Pixel Not Available");
00120 else
00121 vcl_sprintf(msg, "(%d, %d) (bool) %d", x, y, v(x,y));
00122 return; }
00123 case VIL_PIXEL_FORMAT_BYTE: {
00124 if (n_p==1)
00125 {
00126 vil_image_view<vxl_byte> v = r->get_view(x,1,y,1);
00127 if (!v)
00128 vcl_sprintf(msg, "Pixel Not Available");
00129 else
00130 vcl_sprintf(msg, "(%d, %d) (ubyte) %d", x, y, v(0,0));
00131 return;
00132 }
00133 else if (n_p==3)
00134 {
00135 vil_image_view<vxl_byte > v = r->get_view(x,1,y,1);
00136 if (!v)
00137 vcl_sprintf(msg, "Pixel Not Available");
00138 else
00139 vcl_sprintf(msg, "(%d, %d) (ubyte)[ R=%d,G=%d,B=%d]", x, y,
00140 v(0,0,0), v(0,0,1), v(0,0,2) );
00141 return;
00142 }
00143 return; }
00144 case VIL_PIXEL_FORMAT_SBYTE: {
00145 if (n_p==1)
00146 {
00147 vil_image_view<vxl_sbyte> v = r->get_view(x,1,y,1);
00148 if (!v)
00149 vcl_sprintf(msg, "Pixel Not Available");
00150 else
00151 vcl_sprintf(msg, "(%d, %d) (sbyte) %d", x, y, v(0,0));
00152 return;
00153 }
00154 else if (n_p==3)
00155 {
00156 vil_image_view<vil_rgb<vxl_sbyte> > v = r->get_view(x,1,y,1);
00157 if (!v)
00158 vcl_sprintf(msg, "Pixel Not Available");
00159 else
00160 vcl_sprintf(msg, "(%d, %d) (sbyte)[ R=%d,G=%d,B=%d]", x, y,
00161 v(0,0).R(), v(0,0).G(),v(0,0).B() );
00162 return;
00163 }
00164 return; }
00165 case VIL_PIXEL_FORMAT_UINT_16: {
00166 if (n_p==1)
00167 {
00168 vil_image_view<vxl_uint_16> v = r->get_view(x,1,y,1);
00169 if (!v)
00170 vcl_sprintf(msg, "Pixel Not Available");
00171 else
00172 vcl_sprintf(msg, "(%d, %d) (uint16) %d", x, y, v(0,0));
00173 return;
00174 }
00175 else if (n_p==3)
00176 {
00177 vil_image_view<vil_rgb<vxl_uint_16> > v = r->get_view(x,1,y,1);
00178 if (!v)
00179 vcl_sprintf(msg, "Pixel Not Available");
00180 else
00181 vcl_sprintf(msg, "(%d, %d) (uint16)[ R=%d,G=%d,B=%d]", x, y,
00182 v(0,0).R(), v(0,0).G(),v(0,0).B() );
00183 }
00184 else if (n_p==4)
00185 {
00186
00187 vil_image_view<vil_rgba<vxl_uint_16> > v = r->get_view(x,1,y,1);
00188 if (!v){
00189 vcl_sprintf(msg, "Pixel Not Available");
00190 return;
00191 }else{
00192 int band_map = 0;
00193 if(rmp_)
00194 band_map = rmp_->band_map_;
00195 switch(band_map){
00196 case vgui_range_map_params::RGB_m :
00197 {
00198 vcl_sprintf(msg, "(%d, %d) (RGB:uint16)[ R=%d,G=%d,B=%d,I=%d]",
00199 x, y, v(0,0).R(), v(0,0).G(),v(0,0).B(),v(0,0).A() );
00200 break;
00201 }
00202 case vgui_range_map_params::XRG_m :
00203 {
00204 vcl_sprintf(msg, "(%d, %d) (IRG:uint16)[ R=%d,G=%d,B=%d,I=%d]",
00205 x, y, v(0,0).R(), v(0,0).G(),v(0,0).B(),v(0,0).A() );
00206 break;
00207 }
00208 case vgui_range_map_params::RXB_m :
00209 {
00210 vcl_sprintf(msg, "(%d, %d) (RIB:uint16)[ R=%d,G=%d,B=%d,I=%d]",
00211 x, y, v(0,0).R(), v(0,0).G(),v(0,0).B(),v(0,0).A() );
00212 break;
00213 }
00214 case vgui_range_map_params::RGX_m :
00215 {
00216 vcl_sprintf(msg, "(%d, %d) (RGI:uint16)[ R=%d,G=%d,B=%d,I=%d]",
00217 x, y, v(0,0).R(), v(0,0).G(),v(0,0).B(),v(0,0).A() );
00218 break;
00219 }
00220 default:
00221 {
00222 vcl_sprintf(msg, "Pixel Not Available");
00223 return;
00224 }
00225 }
00226 }
00227 }
00228 }
00229 case VIL_PIXEL_FORMAT_INT_16: {
00230 if (n_p==1)
00231 {
00232 vil_image_view<vxl_int_16> v = r->get_view(x,1,y,1);
00233 if (!v)
00234 vcl_sprintf(msg, "Pixel Not Available");
00235 else
00236 vcl_sprintf(msg, "(%d, %d) (int16) %d", x, y, v(0,0));
00237 return;
00238 }
00239 else if (n_p==3)
00240 {
00241 vil_image_view<vil_rgb<vxl_int_16> > v = r->get_view(x,1,y,1);
00242 if (!v)
00243 vcl_sprintf(msg, "Pixel Not Available");
00244 else
00245 vcl_sprintf(msg, "(%d, %d) (int16)[ R=%d,G=%d,B=%d]", x, y,
00246 v(0,0).R(), v(0,0).G(),v(0,0).B() );
00247 return;
00248 }
00249 return; }
00250 case VIL_PIXEL_FORMAT_UINT_32: {
00251 if (n_p==1)
00252 {
00253 vil_image_view<vxl_uint_32> v = r->get_view(x,1,y,1);
00254 if (!v)
00255 vcl_sprintf(msg, "Pixel Not Available");
00256 else
00257 vcl_sprintf(msg, "(%d, %d) (uint32) %d", x, y, v(0,0));
00258 return;
00259 }
00260 else if (n_p==3)
00261 {
00262 vil_image_view<vil_rgb<vxl_uint_32> > v = r->get_view(x,1,y,1);
00263 if (!v)
00264 vcl_sprintf(msg, "Pixel Not Available");
00265 else
00266 vcl_sprintf(msg, "(%d, %d) (uint32)[ R=%d,G=%d,B=%d]", x, y,
00267 v(0,0).R(), v(0,0).G(),v(0,0).B() );
00268 return;
00269 }
00270 return; }
00271 case VIL_PIXEL_FORMAT_FLOAT: {
00272 vil_image_view<float> v = r->get_view(x,1,y,1);
00273 if (!v)
00274 vcl_sprintf(msg, "Pixel Not Available");
00275 else
00276 vcl_sprintf(msg, "(%d, %d) (float) %f", x, y, v(0,0));
00277 return; }
00278 case VIL_PIXEL_FORMAT_DOUBLE: {
00279 vil_image_view<double> v = r->get_view(x,1,y,1);
00280 if (!v)
00281 vcl_sprintf(msg, "Pixel Not Available");
00282 else
00283 vcl_sprintf(msg, "(%d, %d) (double) %g", x, y, v(0,0));
00284 return; }
00285 case VIL_PIXEL_FORMAT_RGB_BYTE: {
00286 vil_image_view<vil_rgb<vxl_byte> > v = r->get_view(x,1,y,1);
00287 if (!v)
00288 vcl_sprintf(msg, "Pixel Not Available");
00289 else
00290 vcl_sprintf(msg, "(%d, %d) (ubyte)[ R=%d,G=%d,B=%d]", x, y,
00291 v(0,0).R(), v(0,0).G(),v(0,0).B() );
00292 return; }
00293 case VIL_PIXEL_FORMAT_RGB_UINT_16: {
00294 vil_image_view<vil_rgb<vxl_uint_16> > v = r->get_view(x,1,y,1);
00295 if (!v)
00296 vcl_sprintf(msg, "Pixel Not Available");
00297 else
00298 vcl_sprintf(msg, "(%d, %d) (uint16)[ R=%d,G=%d,B=%d]", x, y,
00299 v(0,0).R(), v(0,0).G(),v(0,0).B() );
00300 return; }
00301 #if 0
00302 case VIL_PIXEL_FORMAT_UINT_32:
00303 case VIL_PIXEL_FORMAT_INT_32:
00304 case VIL_PIXEL_FORMAT_RGB_SBYTE:
00305 case VIL_PIXEL_FORMAT_RGB_INT_16:
00306 case VIL_PIXEL_FORMAT_RGB_UINT_32:
00307 case VIL_PIXEL_FORMAT_RGB_INT_32:
00308 case VIL_PIXEL_FORMAT_RGB_FLOAT:
00309 case VIL_PIXEL_FORMAT_RGB_DOUBLE:
00310 case VIL_PIXEL_FORMAT_RGBA_UINT_32:
00311 case VIL_PIXEL_FORMAT_RGBA_INT_32:
00312 case VIL_PIXEL_FORMAT_RGBA_UINT_16:
00313 case VIL_PIXEL_FORMAT_RGBA_INT_16:
00314 case VIL_PIXEL_FORMAT_RGBA_BYTE:
00315 case VIL_PIXEL_FORMAT_RGBA_SBYTE:
00316 case VIL_PIXEL_FORMAT_RGBA_FLOAT:
00317 case VIL_PIXEL_FORMAT_RGBA_DOUBLE:
00318 case VIL_PIXEL_FORMAT_COMPLEX_FLOAT:
00319 case VIL_PIXEL_FORMAT_COMPLEX_DOUBLE:
00320 #endif
00321 default:
00322 vcl_sprintf(msg, "Pixel Not Available");
00323 }
00324 }
00325
00326 double bgui_image_tableau::
00327 get_pixel_value(const unsigned c, const unsigned r)
00328 {
00329 vil_image_resource_sptr rs = this->get_image_resource();
00330 if (!rs)
00331 return 0;
00332 if (c<0||c>=rs->ni()||r<0||r>=rs->nj())
00333 return 0;
00334 unsigned n_p = rs->nplanes();
00335 vil_pixel_format type = rs->pixel_format();
00336 switch (type )
00337 {
00338 case VIL_PIXEL_FORMAT_BOOL: {
00339 vil_image_view<bool> v = rs->get_view();
00340 if (!v)
00341 return 0;
00342 else
00343 return static_cast<double>(v(0,0));
00344 }
00345 case VIL_PIXEL_FORMAT_BYTE: {
00346
00347 vil_image_view<vxl_byte> v = rs->get_view(c,1,r,1);
00348 if (!v)
00349 return 0;
00350 if (n_p==1)
00351 return static_cast<double>(v(0,0));
00352 else if (n_p==3)
00353 return static_cast<double>(v(0,0,0)+v(0,0,1)+v(0,0,2))/3;
00354 }
00355 case VIL_PIXEL_FORMAT_SBYTE: {
00356 vil_image_view<vxl_sbyte> v = rs->get_view(c,1,r,1);
00357 if (!v)
00358 return 0;
00359 else
00360 if (n_p==1)
00361 return static_cast<double>(v(0,0));
00362 else if (n_p==3)
00363 return static_cast<double>(v(0,0,0)+v(0,0,1)+v(0,0,2))/3;
00364 }
00365 case VIL_PIXEL_FORMAT_UINT_16: {
00366 vil_image_view<vxl_uint_16> v = rs->get_view(c,1,r,1);
00367 if (!v)
00368 return 0;
00369 else
00370 if (n_p==1)
00371 return static_cast<double>(v(0,0));
00372 else if (n_p==3)
00373 return static_cast<double>(v(0,0,0)+v(0,0,1)+v(0,0,2))/3;
00374 else if (n_p==4)
00375 return static_cast<double>(v(0,0,0)+v(0,0,1)+v(0,0,2)+v(0,0,3))/4;
00376 }
00377 case VIL_PIXEL_FORMAT_INT_16: {
00378 vil_image_view<vxl_int_16> v = rs->get_view(c,1,r,1);
00379 if (!v)
00380 return 0;
00381 else
00382 if (n_p==1)
00383 return static_cast<double>(v(0,0));
00384 else if (n_p==3)
00385 return static_cast<double>(v(0,0,0)+v(0,0,1)+v(0,0,2))/3;
00386 }
00387 case VIL_PIXEL_FORMAT_FLOAT: {
00388 vil_image_view<float> v = rs->get_view(c,1,r,1);
00389 if (!v)
00390 return 0;
00391 else
00392 return static_cast<double>(v(0,0));
00393 }
00394 case VIL_PIXEL_FORMAT_DOUBLE: {
00395 vil_image_view<double> v = rs->get_view(c,1,r,1);
00396 if (!v)
00397 return 0;
00398 else
00399 return v(0,0);
00400 }
00401 case VIL_PIXEL_FORMAT_RGB_BYTE: {
00402 vil_image_view<vil_rgb<vxl_byte> > v = rs->get_view(c,1,r,1);
00403 if (!v)
00404 return 0;
00405 else
00406 return static_cast<double>(v(0,0).R()+v(0,0).G()+v(0,0).B())/3;
00407 }
00408 case VIL_PIXEL_FORMAT_RGB_UINT_16: {
00409 vil_image_view<vil_rgb<vxl_uint_16> > v = rs->get_view(c,1,r,1);
00410 if (!v)
00411 return 0;
00412 else
00413 return static_cast<double>(v(0,0).R()+v(0,0).G()+v(0,0).B())/3;
00414 }
00415 default:
00416 return 0;
00417 }
00418 }
00419
00420
00421 vcl_vector<double> bgui_image_tableau::get_color_pixel_value(const unsigned c, const unsigned r)
00422 {
00423 vil_image_resource_sptr rs = this->get_image_resource();
00424 if (!rs)
00425 return vcl_vector<double>(0);
00426 if (c<0||c>=rs->ni()||r<0||r>=rs->nj())
00427 return vcl_vector<double>(0);
00428 unsigned n_p = rs->nplanes();
00429 vcl_vector<double> val(n_p, 0.0);
00430 if(n_p==1)
00431 {
00432 val[0]=this->get_pixel_value(c, r);
00433 return val;
00434 }
00435 vil_pixel_format type = rs->pixel_format();
00436 switch (type )
00437 {
00438 case VIL_PIXEL_FORMAT_BYTE: {
00439
00440 vil_image_view<vxl_byte> v = rs->get_view(c,1,r,1);
00441 if (!v)
00442 return val;
00443 for(unsigned p = 0; p<n_p; ++p)
00444 val[p]=static_cast<double>(v(0,0,p));
00445 return val;
00446 }
00447 case VIL_PIXEL_FORMAT_UINT_16: {
00448 vil_image_view<vxl_uint_16> v = rs->get_view(c,1,r,1);
00449 if (!v)
00450 return val;
00451 for(unsigned p = 0; p<n_p; ++p)
00452 val[p]=static_cast<double>(v(0,0,p));
00453 return val;
00454 }
00455 default:
00456 return val;
00457 }
00458 }
00459 void bgui_image_tableau::image_line(const float col_start,
00460 const float row_start,
00461 const float col_end,
00462 const float row_end,
00463 vcl_vector<double>& line_pos,
00464 vcl_vector<double>& vals)
00465 {
00466 line_pos.clear();vals.clear();
00467
00468
00469 float length = vcl_sqrt((col_end-col_start)*(col_end-col_start) +
00470 (row_end-row_start)*(row_end-row_start));
00471 if (length == 0)
00472 return;
00473
00474 float xstep = (col_end-col_start)/length;
00475 float ystep = (row_end-row_start)/length;
00476 float sinc = vcl_sqrt(xstep*xstep + ystep*ystep);
00477 float spos = 0;
00478 line_pos.push_back(spos);
00479 unsigned c = static_cast<unsigned>(col_start),
00480 r = static_cast<unsigned>(row_start);
00481 vals.push_back(get_pixel_value(c, r));
00482
00483
00484 float xpos = col_start, ypos = row_start;
00485 unsigned nsteps = static_cast<unsigned>(length);
00486 for (unsigned i = 0; i<nsteps; ++i)
00487 {
00488 xpos += xstep;
00489 ypos += ystep;
00490 spos += sinc;
00491 c = static_cast<unsigned>(xpos);
00492 r = static_cast<unsigned>(ypos);
00493 line_pos.push_back(spos);
00494 vals.push_back(get_pixel_value(c, r));
00495 }
00496 }
00497
00498 void bgui_image_tableau::image_line(const float col_start,
00499 const float row_start,
00500 const float col_end,
00501 const float row_end,
00502 vcl_vector<double>& line_pos,
00503 vcl_vector<vcl_vector<double> >& vals)
00504 {
00505 line_pos.clear();vals.clear();
00506
00507
00508 float length = vcl_sqrt((col_end-col_start)*(col_end-col_start) +
00509 (row_end-row_start)*(row_end-row_start));
00510 if (length == 0)
00511 return;
00512
00513 float xstep = (col_end-col_start)/length;
00514 float ystep = (row_end-row_start)/length;
00515 float sinc = vcl_sqrt(xstep*xstep + ystep*ystep);
00516 float spos = 0;
00517 line_pos.push_back(spos);
00518 unsigned c = static_cast<unsigned>(col_start),
00519 r = static_cast<unsigned>(row_start);
00520 vcl_vector<double> cv = get_color_pixel_value(c, r);
00521 unsigned n_bands = cv.size();
00522 vals.resize(n_bands);
00523 for(unsigned i = 0; i<n_bands; ++i)
00524 vals[i].push_back(cv[i]);
00525
00526
00527 float xpos = col_start, ypos = row_start;
00528 unsigned nsteps = static_cast<unsigned>(length);
00529 for (unsigned i = 0; i<nsteps; ++i)
00530 {
00531 xpos += xstep;
00532 ypos += ystep;
00533 spos += sinc;
00534 c = static_cast<unsigned>(xpos);
00535 r = static_cast<unsigned>(ypos);
00536 line_pos.push_back(spos);
00537 cv = get_color_pixel_value(c, r);
00538 for(unsigned i = 0; i<n_bands; ++i)
00539 vals[i].push_back(cv[i]);
00540 }
00541 }
00542
00543
00544
00545
00546
00547 bool bgui_image_tableau::handle(vgui_event const &e)
00548 {
00549 static bool button_down = false;
00550 if (e.type == vgui_DRAW)
00551 {
00552 base::handle(e);
00553 if(tt_) tt_->handle(e);
00554 return true;
00555 }
00556
00557 if (e.type == vgui_BUTTON_DOWN)
00558 {
00559 button_down = true;
00560 if (handle_motion_)
00561 vgui::out << ' ' << vcl_endl;
00562 }
00563 else if (e.type == vgui_BUTTON_UP)
00564 {
00565 button_down = false;
00566 }
00567 else if (e.type == vgui_MOTION && handle_motion_&&button_down == false)
00568 {
00569
00570 float pointx, pointy;
00571 vgui_projection_inspector p_insp;
00572 p_insp.window_to_image_coordinates(e.wx, e.wy, pointx, pointy);
00573 int intx = (int)vcl_floor(pointx), inty = (int)vcl_floor(pointy);
00574 char msg[100];
00575
00576 this->get_pixel_info_from_image(intx, inty,e, msg);
00577
00578
00579
00580
00581 bgui_image_tableau_vp_sc_snapshot snap;
00582
00583
00584 if (!locked_) {
00585 if(show_path_)
00586 vgui::out << msg << " " << this->file_name() << vcl_endl;
00587 else
00588 vgui::out << msg << vcl_endl;
00589 }
00590 }
00591 return base::handle(e);
00592 }
00593
00594