app_focus.C

Go to the documentation of this file.
00001 /* Gnome gxsm - Gnome X Scanning Microscopy
00002  * universal STM/AFM/SARLS/SPALEED/... controlling and
00003  * data analysis software
00004  * 
00005  * Copyright (C) 1999 The Free Software Foundation
00006  *
00007  * Authors: Percy Zahl <zahl@fkp.uni-hannover.de>
00008  * additional features: Andreas Klust <klust@fkp.uni-hannover.de>
00009  *
00010  * This program is free software; you can redistribute it and/or modify
00011  * it under the terms of the GNU General Public License as published by
00012  * the Free Software Foundation; either version 2 of the License, or
00013  * (at your option) any later version.
00014  *
00015  * This program is distributed in the hope that it will be useful,
00016  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00017  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00018  * GNU General Public License for more details.
00019  *
00020  * You should have received a copy of the GNU General Public License
00021  * along with this program; if not, write to the Free Software
00022  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
00023  */
00024 
00025 /* ignore tag evaluated by for docuscangxsmplugins.pl -- this is no main plugin file
00026 % PlugInModuleIgnore
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 // using old gdk_pixbuf ?? than use:
00044 //#define GDK_PIXBUF_OLD
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 //template <class FPIXTYP> 
00057 //Focus<FPIXTYP>::Focus 
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   // RateMeter Frame, note: uses gtkled, gtkledbar from vumeter of gnome-media package
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   // Focus-Icon Box
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   // HiLo Setiings, ... Box
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   gtk_widget_push_visual(gdk_imlib_get_visual());
00143   gtk_widget_push_colormap(gdk_imlib_get_colormap());
00144   canvas = gnome_canvas_new();
00145   gtk_widget_pop_visual();
00146   gtk_widget_pop_colormap();
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   GtkWidget *EXYprint = gtk_button_new_with_label ("Print");
00281   gtk_widget_show (EXYprint);
00282   gtk_box_pack_start (GTK_BOX (hbox), EXYprint, FALSE, FALSE, 0);
00283   gtk_signal_connect (GTK_OBJECT (EXYprint), "clicked",
00284                       GTK_SIGNAL_FUNC (on_EXYprint_clicked),
00285                       this);
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 //template <class FPIXTYP> 
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 //template <class FPIXTYP>
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 //template <class FPIXTYP>
00405 void Focus::on_EXYprint_clicked (GtkButton *button, Focus *foc){
00406     //  double S;
00407     //  S = res.SampleLayerDist * cos(res.ThetaChGunInt * M_PI/180.) *  sqrt(foc->energy/37.6);
00408     //  PI_DEBUG (DBG_L2, S
00409     //       << " " << foc->energy
00410     //       << " " << foc->x0
00411     //       << " " << foc->y0
00412     //       << " " << foc->cpshi
00413     //       );
00414 }
00415 
00416 //template <class FPIXTYP>
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 //template <class FPIXTYP>
00444 gint Focus::atrun(){
00445     return 1;
00446 }
00447 
00448 //template <class FPIXTYP>
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)){ // use same data for 1D if not 1D explicit requested
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 //template <class FPIXTYP>
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; } // Div Zero prevent....
00597     cnthi=Hi; cntlo=Lo;
00598     cpshi=cnthi/pfp->gate2d; 
00599     cpslo=cntlo/pfp->gate2d;
00600 }
00601 
00602 //template <class FPIXTYP>
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 }

Generated on Sat Apr 1 09:04:11 2006 for GXSM by  doxygen 1.4.6