00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include <gtk/gtk.h>
00030 #include "gxsm/glbvars.h"
00031 #include "gxsm/util.h"
00032 #include "gxsm/pcs.h"
00033 #include "gxsm/unit.h"
00034
00035 #include <math.h>
00036
00037 #include "app_peakfind.h"
00038
00039 #include <gtkdatabox.h>
00040 #include "gtkled.h"
00041 #include "gtkledbar.h"
00042
00043
00044
00045
00046 #define DATAAQREP 200
00047
00048 #define DEFAULTLEN 5
00049 #define DEFAULTGATE 0.2
00050 #define DEFAULTNXY 40
00051 #define MAXNXY 42
00052
00053 #define FOCUSICONSIZE 200
00054 #define FOCUSSCROLLSZ 220
00055
00056
00057
00058 Focus::Focus
00059 ( DSPPeakFindControl *Pfc, SPA_PeakFind_p *Pfp, GtkWidget *Vbox, GtkWidget *Hbox
00060 ) : DataBox(Vbox){
00061 double xyl[4];
00062 GnomeCanvasPoints pnl = { xyl, 2, 0 };
00063 Gtk_EntryControl *ec;
00064 GtkWidget *hbox, *entry, *sw;
00065
00066 PI_DEBUG (DBG_L2, "Focus::Focus" );
00067
00068 pfp = Pfp;
00069 pfc = Pfc;
00070
00071 cps = 0.;
00072 cpshi = 1e6;
00073 cpslo = 0.;
00074
00075 nnx=nnx2d=0;
00076 yn=xn=xx=yy=NULL;
00077
00078 delay = 300.;
00079
00080 xymode = TRUE;
00081 autoskl = FALSE;
00082 invers = FALSE;
00083 linlog = SKL_LOG;
00084 mode = 0;
00085
00086 xbox = this;
00087 ybox = new DataBox(Vbox);
00088
00089
00090
00091 GtkWidget *rmframe = gtk_frame_new (NULL);
00092 gtk_frame_set_shadow_type (GTK_FRAME (rmframe), GTK_SHADOW_IN);
00093 gtk_container_border_width (GTK_CONTAINER (rmframe), 4);
00094 gtk_container_add (GTK_CONTAINER (Hbox), rmframe);
00095
00096 hbox = gtk_hbox_new (FALSE, 5);
00097 gtk_container_border_width (GTK_CONTAINER (hbox), 5);
00098 gtk_container_add (GTK_CONTAINER (rmframe), hbox);
00099
00100 rateleds = 45;
00101 ratedecades = 6;
00102 firstdecade = 0;
00103 RateMeter[0] = NULL;
00104 gtk_widget_show (hbox);
00105 gtk_widget_show (rmframe);
00106 gtk_object_set_data (GTK_OBJECT (vbox), "RateMeterBox", hbox);
00107 ratemeter_changed();
00108
00109
00110
00111 GtkWidget *vb1 = gtk_vbox_new (FALSE, 0);
00112 gtk_box_pack_start (GTK_BOX (Hbox), vb1, FALSE, FALSE, GNOME_PAD);
00113 gtk_widget_show (vb1);
00114
00115
00116
00117 GtkWidget* vb2 = gtk_vbox_new (FALSE, 0);
00118 gtk_box_pack_start (GTK_BOX (vb1), vb2, TRUE, TRUE, GNOME_PAD);
00119 gtk_widget_show (vb2);
00120
00121
00122
00123 GtkWidget *vvbox = gtk_vbox_new (FALSE, 0);
00124 gtk_box_pack_start (GTK_BOX (vb1), vvbox, TRUE, FALSE, GNOME_PAD);
00125 gtk_widget_show (vvbox);
00126
00127
00128
00129 sw = gtk_scrolled_window_new(NULL, NULL);
00130 gtk_widget_show(sw);
00131 gtk_widget_set_usize(sw, FOCUSSCROLLSZ, FOCUSSCROLLSZ );
00132 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw),
00133 GTK_POLICY_AUTOMATIC,
00134 GTK_POLICY_AUTOMATIC);
00135
00136 gtk_widget_push_visual(gdk_rgb_get_visual());
00137 gtk_widget_push_colormap(gdk_rgb_get_cmap());
00138 canvas = gnome_canvas_new_aa();
00139 gtk_widget_pop_colormap();
00140 gtk_widget_pop_visual();
00141
00142
00143
00144
00145
00146
00147
00148
00149 gtk_container_add(GTK_CONTAINER(sw), canvas);
00150 gtk_box_pack_start (GTK_BOX (vb2), sw, FALSE, FALSE, 0);
00151 gtk_widget_show(canvas);
00152
00153 focuspixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, pfp->npkte2d, pfp->npkte2d);
00154 bpp = gdk_pixbuf_get_bits_per_sample ( focuspixbuf )
00155 * gdk_pixbuf_get_n_channels ( focuspixbuf ) / 8;
00156 rowstride = gdk_pixbuf_get_rowstride ( focuspixbuf );
00157 pixels = gdk_pixbuf_get_pixels ( focuspixbuf );
00158
00159 memset(pixels, 0, pfp->npkte2d*rowstride*sizeof(guchar));
00160
00161 focuspixbufitem = gnome_canvas_item_new ( gnome_canvas_root ( GNOME_CANVAS (canvas) ),
00162 gnome_canvas_pixbuf_get_type(),
00163 "pixbuf", focuspixbuf,
00164 "width",(double)FOCUSICONSIZE,
00165 "width_set",TRUE,
00166 "height",(double)FOCUSICONSIZE,
00167 "height_set",TRUE,
00168 NULL);
00169
00170 gtk_signal_connect(GTK_OBJECT(focuspixbufitem), "event",
00171 (GtkSignalFunc) item_event,
00172 this);
00173
00174 xyl[0]=0.; xyl[2]=FOCUSICONSIZE;
00175 xyl[1]=xyl[3]=FOCUSICONSIZE/2;
00176 hline = gnome_canvas_item_new(gnome_canvas_root( GNOME_CANVAS(canvas)),
00177 gnome_canvas_line_get_type(),
00178 "points",&pnl,
00179 "fill_color","red",
00180 "width_pixels",1,
00181 NULL);
00182 xyl[0]=xyl[2]=FOCUSICONSIZE/2;
00183 xyl[1]=0.; xyl[3]=FOCUSICONSIZE;
00184 vline = gnome_canvas_item_new(gnome_canvas_root( GNOME_CANVAS(canvas)),
00185 gnome_canvas_line_get_type(),
00186 "points",&pnl,
00187 "fill_color","red",
00188 "width_pixels",1,
00189 NULL);
00190
00191 gnome_canvas_set_scroll_region(GNOME_CANVAS (canvas), 0, 0, FOCUSICONSIZE, FOCUSICONSIZE);
00192 gnome_canvas_set_pixels_per_unit(GNOME_CANVAS (canvas), 1.);
00193
00194
00195
00196 gtk_object_set_data (GTK_OBJECT (vbox), "cps00",
00197 entry=gapp->mygtk_create_input("Cps00", vvbox, hbox));
00198 ec = new Gtk_EntryControl(pfc->CPSUnit, "invalid range", &cps, 0, 1e7, ".0f", entry);
00199 gtk_object_set_data (GTK_OBJECT (vbox), "eccps00", ec);
00200 ec->Set_ChangeNoticeFkt(on_cps_changed, this);
00201
00202 GtkObject *adj = gtk_adjustment_new (6, 2, 6, 1, 1, 1);
00203 GtkWidget *spinb = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
00204 gtk_widget_show (spinb);
00205 gtk_box_pack_start (GTK_BOX (hbox), spinb, FALSE, FALSE, 0);
00206 gtk_signal_connect (GTK_OBJECT (spinb), "changed",
00207 GTK_SIGNAL_FUNC (on_rdecads_changed),
00208 this);
00209 adj = gtk_adjustment_new (0, 0, 4, 1, 1, 1);
00210 spinb = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 1, 0);
00211 gtk_widget_show (spinb);
00212 gtk_box_pack_start (GTK_BOX (hbox), spinb, FALSE, FALSE, 0);
00213 gtk_signal_connect (GTK_OBJECT (spinb), "changed",
00214 GTK_SIGNAL_FUNC (on_rfirstdecad_changed),
00215 this);
00216
00217
00218
00219 gtk_object_set_data (GTK_OBJECT (vbox), "cpshi",
00220 entry=gapp->mygtk_create_input("Cps hi", vvbox, hbox));
00221 ec = new Gtk_EntryControl(pfc->CPSUnit, "invalid range", &cpshi, 1, 1e7, ".0f", entry);
00222 gtk_object_set_data (GTK_OBJECT (vbox), "eccpshi", ec);
00223
00224 gtk_object_set_data (GTK_OBJECT (vbox), "cpslow",
00225 entry=gapp->mygtk_create_input("Cps low", vvbox, hbox));
00226 ec = new Gtk_EntryControl(pfc->CPSUnit, "invalid range", &cpslo, 0, 1e7, ".0f", entry);
00227 gtk_object_set_data (GTK_OBJECT (vbox), "eccpslo", ec);
00228
00229
00230 hbox = gtk_hbox_new (FALSE, 0);
00231 gtk_box_pack_start (GTK_BOX (vvbox), hbox, FALSE, FALSE, GNOME_PAD);
00232 gtk_widget_show (hbox);
00233
00234 GtkWidget *SetAuto = gtk_check_button_new_with_label ("AutoSkl");
00235 gtk_widget_show (SetAuto);
00236 gtk_box_pack_start (GTK_BOX (hbox), SetAuto, FALSE, FALSE, 0);
00237 gtk_signal_connect (GTK_OBJECT (SetAuto), "clicked",
00238 GTK_SIGNAL_FUNC (on_SetAuto_clicked),
00239 this);
00240
00241 GtkWidget *LinLog = gtk_check_button_new_with_label ("Lin.");
00242 gtk_widget_show (LinLog);
00243 gtk_box_pack_start (GTK_BOX (hbox), LinLog, FALSE, FALSE, 0);
00244 gtk_signal_connect (GTK_OBJECT (LinLog), "clicked",
00245 GTK_SIGNAL_FUNC (on_LinLog_clicked),
00246 this);
00247
00248 GtkWidget *SetInvers = gtk_check_button_new_with_label ("Inv.");
00249 gtk_widget_show (SetInvers);
00250 gtk_box_pack_start (GTK_BOX (hbox), SetInvers, FALSE, FALSE, 0);
00251 gtk_signal_connect (GTK_OBJECT (SetInvers), "clicked",
00252 GTK_SIGNAL_FUNC (on_Invers_clicked),
00253 this);
00254
00255 GtkWidget *Set = gtk_check_button_new_with_label ("0D");
00256 gtk_widget_show (Set);
00257 gtk_box_pack_start (GTK_BOX (hbox), Set, FALSE, FALSE, 0);
00258 gtk_signal_connect (GTK_OBJECT (Set), "clicked",
00259 GTK_SIGNAL_FUNC (on_0d_clicked),
00260 this);
00261 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (Set), mode & FOCUS_MODE_0D);
00262
00263 Set = gtk_check_button_new_with_label ("1D");
00264 gtk_widget_show (Set);
00265 gtk_box_pack_start (GTK_BOX (hbox), Set, FALSE, FALSE, 0);
00266 gtk_signal_connect (GTK_OBJECT (Set), "clicked",
00267 GTK_SIGNAL_FUNC (on_1d_clicked),
00268 this);
00269 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (Set), mode & FOCUS_MODE_1D);
00270
00271 Set = gtk_check_button_new_with_label ("2D");
00272 gtk_widget_show (Set);
00273 gtk_box_pack_start (GTK_BOX (hbox), Set, FALSE, FALSE, 0);
00274 gtk_signal_connect (GTK_OBJECT (Set), "clicked",
00275 GTK_SIGNAL_FUNC (on_2d_clicked),
00276 this);
00277 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (Set), mode & FOCUS_MODE_2D);
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290 hbox = gtk_hbox_new (TRUE, 0);
00291 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, GNOME_PAD);
00292 gtk_widget_show (hbox);
00293
00294
00295
00296 PI_DEBUG (DBG_L2, "Focus::Focus init done." );
00297 }
00298
00299
00300 Focus::~Focus () {
00301 PI_DEBUG (DBG_L2, "Focus::~Focus" );
00302
00303 stop();
00304
00305 delete ybox;
00306
00307 if(yn) g_free(yn);
00308 if(xn) g_free(xn);
00309 if(xx) g_free(xx);
00310 if(yy) g_free(yy);
00311 }
00312
00313 void Focus::on_rdecads_changed (GtkEditable *spin, Focus *foc){
00314 gint n = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin));
00315 if( n != foc->ratedecades ){
00316 foc->ratedecades = n;
00317 foc->ratemeter_changed();
00318 }
00319 }
00320
00321 void Focus::on_rfirstdecad_changed (GtkEditable *spin, Focus *foc){
00322 gint n = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin));
00323 if( n != foc->firstdecade ){
00324 foc->firstdecade = n;
00325 foc->ratemeter_changed();
00326 }
00327 }
00328
00329
00330 void Focus::on_SetAuto_clicked (GtkButton *button, Focus *foc){
00331 if (GTK_TOGGLE_BUTTON (button)->active)
00332 foc->autoskl=TRUE;
00333 else
00334 foc->autoskl=FALSE;
00335 }
00336
00337 void Focus::on_LinLog_clicked (GtkButton *button, Focus *foc){
00338 if (GTK_TOGGLE_BUTTON (button)->active)
00339 foc->linlog=SKL_LIN;
00340 else
00341 foc->linlog=SKL_LOG;
00342 }
00343
00344 void Focus::on_Invers_clicked (GtkButton *button, Focus *foc){
00345 if (GTK_TOGGLE_BUTTON (button)->active)
00346 foc->invers=TRUE;
00347 else
00348 foc->invers=FALSE;
00349 }
00350
00351 void Focus::ratemeter_changed(){
00352 GtkWidget *OldMeter = RateMeter[0];
00353 RateMeter[0]=NULL;
00354
00355 if(OldMeter)
00356 gtk_widget_hide(OldMeter);
00357
00358 leds_decade = (double)rateleds/(double)ratedecades;
00359 RateMeter[0] = led_bar_new_with_decades (rateleds, ratedecades, firstdecade, TRUE);
00360 l10minrate = firstdecade;
00361 l10maxrate = ratedecades + firstdecade + leds_decade-floor(leds_decade);
00362 gtk_container_add (GTK_CONTAINER( (GtkWidget*) gtk_object_get_data
00363 (GTK_OBJECT (vbox), "RateMeterBox")),
00364 RateMeter[0] );
00365 gtk_widget_show (RateMeter[0]);
00366
00367
00368 if(OldMeter){
00369 while(gtk_events_pending()) gtk_main_iteration();
00370 gtk_widget_destroy(OldMeter);
00371 }
00372 }
00373
00374 void Focus::on_cps_changed(Param_Control* pcs, gpointer data){
00375 Focus *foc = (Focus*)data;
00376 if(!foc->RateMeter[0]) return;
00377 if(foc->cps < 1.)
00378 led_bar_light_percent( foc->RateMeter[0], 0. );
00379 else
00380 if( foc->linlog == SKL_LOG )
00381 led_bar_light_percent( foc->RateMeter[0],
00382 1. - (1.-(log(foc->cps)/log(10.)/foc->l10maxrate))
00383 * foc->l10maxrate / (foc->l10maxrate - foc->l10minrate)
00384 + 0.5/foc->leds_decade
00385 );
00386 else
00387 led_bar_light_percent( foc->RateMeter[0],
00388 (foc->cps-foc->cpslo)/(foc->cpshi-foc->cpslo)
00389 );
00390 }
00391
00392 void Focus::on_0d_clicked (GtkButton *button, Focus *foc){
00393 foc->setmode (FOCUS_MODE_0D, GTK_TOGGLE_BUTTON (button)->active);
00394 }
00395
00396 void Focus::on_1d_clicked (GtkButton *button, Focus *foc){
00397 foc->setmode (FOCUS_MODE_1D, GTK_TOGGLE_BUTTON (button)->active);
00398 }
00399
00400 void Focus::on_2d_clicked (GtkButton *button, Focus *foc){
00401 foc->setmode (FOCUS_MODE_2D, GTK_TOGGLE_BUTTON (button)->active);
00402 }
00403
00404
00405 void Focus::on_EXYprint_clicked (GtkButton *button, Focus *foc){
00406
00407
00408
00409
00410
00411
00412
00413
00414 }
00415
00416
00417 gint Focus::item_event(GnomeCanvasItem *item, GdkEvent *event, Focus *foc){
00418 double item_x, item_y;
00419 item_x = event->button.x;
00420 item_y = event->button.y;
00421 gnome_canvas_item_w2i(item->parent, &item_x, &item_y);
00422
00423 switch (event->type)
00424 {
00425 case GDK_BUTTON_PRESS:
00426 switch(event->button.button)
00427 {
00428 case 1:
00429 foc->pfp->xorg += (item_x/FOCUSICONSIZE-0.5)*2.*foc->pfp->radius;
00430 foc->pfp->yorg -= (item_y/FOCUSICONSIZE-0.5)*2.*foc->pfp->radius;
00431 foc->pfc->update();
00432 break;
00433 default:
00434 break;
00435 }
00436 break;
00437 default:
00438 break;
00439 }
00440 return FALSE;
00441 }
00442
00443
00444 gint Focus::atrun(){
00445 return 1;
00446 }
00447
00448
00449 void Focus::getdata(){
00450 #define GETFPIX(X,Y) (*(pfp->buffer + (Y)*n + (X)))
00451 int n=0;
00452 int n2=0;
00453 GtkDataboxValue XYmin, XYmax;
00454 int i, j;
00455
00456 if(mode & FOCUS_MODE_0D){
00457 cps = (double)pfc->pfscan->PFget0d(pfc->hard, pfp)/pfp->gate;
00458 on_cps_changed(NULL, this);
00459 ((Gtk_EntryControl*) gtk_object_get_data (GTK_OBJECT (vbox), "eccps00") ) -> Put_Value();
00460 if(autoskl && mode == FOCUS_MODE_0D){
00461 cpshi=cps;
00462 cnthi=cpshi*pfp->gate;
00463 ((Gtk_EntryControl*) gtk_object_get_data (GTK_OBJECT (vbox), "eccpshi") ) -> Put_Value();
00464 }
00465 }
00466 if(mode & FOCUS_MODE_1D){
00467 n = pfp->npkte;
00468 n2 = pfp->npkte/2;
00469 pfc->pfscan->PFhwrun(pfc->hard, pfp);
00470 pfc->update();
00471
00472 if(autoskl){
00473 pfp->xyscans->HiLo(&cnthi, &cntlo);
00474 cpshi=cnthi/pfp->gate;
00475 cpslo=0.;
00476 cntlo=cpslo*pfp->gate;
00477 ((Gtk_EntryControl*) gtk_object_get_data (GTK_OBJECT (vbox), "eccpshi") ) -> Put_Value();
00478 ((Gtk_EntryControl*) gtk_object_get_data (GTK_OBJECT (vbox), "eccpslo") ) -> Put_Value();
00479 }else{
00480 cnthi=cpshi*pfp->gate;
00481 cntlo=cpslo*pfp->gate;
00482 }
00483 CalcLookUp(linlog);
00484
00485 if( nnx != n ){
00486 nnx = n;
00487 if(xn) g_free(xn);
00488 if(xx) g_free(xx);
00489 xn = g_new ( PLOTTYP, n );
00490 xx = g_new ( PLOTTYP, n );
00491 for(i=0; i<n; i++){ xn[i]=i-n2; xx[i]=LookUp( (long)pfp->xyscans->GetDataPkt(i,0)); }
00492 xbox -> setxyData(xn, xx, n, FALSE);
00493
00494 if(yn) g_free(yn);
00495 if(yy) g_free(yy);
00496 yn = g_new ( PLOTTYP, n );
00497 yy = g_new ( PLOTTYP, n );
00498 for(i=0; i<n; i++){ yn[i]=i-n2; yy[i]=LookUp( (long)pfp->xyscans->GetDataPkt(i,1)); }
00499 ybox -> setxyData(yn, yy, n, FALSE);
00500 }else{
00501 for(i=0; i<n; i++){ xn[i]=i-n2; xx[i]=LookUp( (long)pfp->xyscans->GetDataPkt(i,0)); }
00502 for(i=0; i<n; i++){ yn[i]=i-n2; yy[i]=LookUp( (long)pfp->xyscans->GetDataPkt(i,1)); }
00503 }
00504
00505 XYmin.x = -n2; XYmax.x = n2;
00506 XYmin.y = 0; XYmax.y = FCOLMAX;
00507 xbox -> draw(FALSE, &XYmin, &XYmax);
00508 XYmin.x = -n2; XYmax.x = n2;
00509 XYmin.y = 0; XYmax.y = FCOLMAX;
00510 ybox -> draw(FALSE, &XYmin, &XYmax);
00511 }
00512 if(mode & FOCUS_MODE_2D){
00513 n = pfp->npkte2d;
00514 n2 = pfp->npkte2d/2;
00515 pfc->pfscan->PFget2d(pfc->hard, pfp);
00516 if(autoskl){
00517 AutoHiLo();
00518 cpslo=0.;
00519 cntlo=cpslo*pfp->gate2d;
00520 ((Gtk_EntryControl*) gtk_object_get_data (GTK_OBJECT (vbox), "eccpshi") ) -> Put_Value();
00521 ((Gtk_EntryControl*) gtk_object_get_data (GTK_OBJECT (vbox), "eccpslo") ) -> Put_Value();
00522 }else{
00523 cnthi=cpshi*pfp->gate2d;
00524 cntlo=cpslo*pfp->gate2d;
00525 }
00526 CalcLookUp(linlog);
00527
00528 GdkPixbuf *oldpixbuf = focuspixbuf;
00529
00530 if(!(mode & FOCUS_MODE_1D)){
00531 if( nnx != n ){
00532 nnx = n;
00533 if(xn) g_free(xn);
00534 if(xx) g_free(xx);
00535 xn = g_new ( PLOTTYP, n );
00536 xx = g_new ( PLOTTYP, n );
00537 for(i=0; i<n; i++){ xn[i]=i-n2; xx[i]=LookUp((GETFPIX(i,n2-1)+GETFPIX(i,n2)+GETFPIX(i,n2+1))/3); }
00538 xbox -> setxyData(xn, xx, n, FALSE);
00539
00540 if(yn) g_free(yn);
00541 if(yy) g_free(yy);
00542 yn = g_new ( PLOTTYP, n );
00543 yy = g_new ( PLOTTYP, n );
00544 for(i=0; i<n; i++){ yn[i]=i-n2; yy[i]=LookUp((GETFPIX(n2-1,i)+GETFPIX(n2,i)+GETFPIX(n2+1,i))/3); }
00545 ybox -> setxyData(yn, yy, n, FALSE);
00546 }else{
00547 for(i=0; i<n; i++){ xn[i]=i-n2; xx[i]=LookUp((GETFPIX(i,n2-1)+GETFPIX(i,n2)+GETFPIX(i,n2+1))/3); }
00548 for(i=0; i<n; i++){ yn[i]=i-n2; yy[i]=LookUp((GETFPIX(n2-1,i)+GETFPIX(n2,i)+GETFPIX(n2+1,i))/3); }
00549 }
00550 XYmin.x = -n2; XYmax.x = n2;
00551 XYmin.y = 0; XYmax.y = FCOLMAX;
00552 xbox -> draw(FALSE, &XYmin, &XYmax);
00553 XYmin.x = -n2; XYmax.x = n2;
00554 XYmin.y = 0; XYmax.y = FCOLMAX;
00555 ybox -> draw(FALSE, &XYmin, &XYmax);
00556 }
00557 if( nnx2d != n ){
00558 nnx2d = n;
00559 focuspixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, n, n);
00560 bpp = gdk_pixbuf_get_bits_per_sample ( focuspixbuf )
00561 * gdk_pixbuf_get_n_channels ( focuspixbuf ) / 8;
00562 rowstride = gdk_pixbuf_get_rowstride ( focuspixbuf );
00563 pixels = gdk_pixbuf_get_pixels ( focuspixbuf );
00564 }
00565
00566 guchar *p, v;
00567 for(i=0; i<n; i++)
00568 for(j=0, p=pixels+i*rowstride; j<n; j++){
00569 v = invers ?
00570 FCOLMAX-1-LookUp(GETFPIX(j,i)) : LookUp(GETFPIX(j,i));
00571 *p++ = v;
00572 *p++ = v;
00573 *p++ = v;
00574 }
00575
00576 gnome_canvas_item_set (focuspixbufitem,
00577 "pixbuf", focuspixbuf,
00578 NULL);
00579
00580 if ( oldpixbuf != focuspixbuf )
00581 gdk_pixbuf_unref(oldpixbuf);
00582 }
00583 }
00584
00585
00586 void Focus::AutoHiLo(){
00587 FPIXTYP Hi, Lo;
00588 FPIXTYP *cnt, *cntend;
00589 FPIXTYP *cnt_buffer = pfp->buffer;
00590 Hi=Lo=*cnt_buffer;
00591 for(cnt = cnt_buffer, cntend = cnt_buffer+pfp->npkte2d*pfp->npkte2d;
00592 cnt < cntend; ++cnt){
00593 if(Hi < *cnt) Hi = *cnt;
00594 if(Lo > *cnt) Lo = *cnt;
00595 }
00596 if(Hi < 1){ Lo = 0; Hi = 1; }
00597 cnthi=Hi; cntlo=Lo;
00598 cpshi=cnthi/pfp->gate2d;
00599 cpslo=cntlo/pfp->gate2d;
00600 }
00601
00602
00603 void Focus::CalcLookUp(int SklMode){
00604 double fac, logi;
00605 int i;
00606 double range = cnthi - cntlo;
00607 switch(SklMode){
00608 case SKL_LIN:
00609 fac = (double)range/(FCOLMAX-1);
00610 for(i=0; i<FCOLMAX; i++){
00611 LookupTbl[i] = (CNT)(i*fac + cpslo);
00612 }
00613 break;
00614 case SKL_LOG:
00615 logi = log(1./(double)FCOLMAX);
00616 fac = (double)range/logi;
00617 for(i=0; i<FCOLMAX; i++){
00618 logi = log((double)(FCOLMAX-i)/FCOLMAX);
00619 LookupTbl[i] = (CNT)(fac*logi + cpslo);
00620 }
00621 break;
00622 case SKL_SQRT:
00623 logi=sqrt(FCOLMAX);
00624 fac = (double)range/logi;
00625 for(i=0; i<FCOLMAX; i++){
00626 logi = sqrt((double)(i+1));
00627 LookupTbl[i] = (CNT)(fac*logi + cpslo);
00628 }
00629 break;
00630 }
00631 }