Main Page | Data Structures | Directories | File List | Data Fields | Globals

tclSadie_plot.c

Go to the documentation of this file.
00001 
00013 /* This file is part of tclSadie.
00014 
00015    tclSadie is free software; you can redistribute it and/or modify it
00016    under the terms of the GNU General Public License as published by
00017    the Free Software Foundation; either version 2 of the License, or
00018    (at your option) any later version.
00019 
00020    tclSadie is distributed in the hope that it will be useful, but
00021    WITHOUT ANY WARRANTY; without even the implied warranty of
00022    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00023    General Public License for more details.
00024 
00025    You should have received a copy of the GNU General Public License
00026    along with tclSadie; if not, write to the Free Software Foundation,
00027    Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.  */
00028 
00029 #if HAVE_CONFIG_H
00030 #include <config.h>
00031 #endif /* HAVE_CONFIG_H */
00032 #include <tcl.h>
00033 #include <tk.h>
00034 #include <sadie.h>
00035 #include "tclsadie.h"
00036 
00038 enum plot_pos
00039 {
00040   TOP_MARGIN = 15, 
00041   RIGHT_MARGIN = 100, 
00042   TOP_SPACING = 10, 
00043   LEFT_SPACING = 61,  
00044   Y_HEIGHT = 100, 
00045   AXIS_DEPTH = 1, 
00046   MINOR_DEPTH = 4,  
00047   MAJOR_DEPTH = 6,  
00048   CAPTION_DEPTH = 8,  
00049   PLOT_HEIGHT = 140, 
00050   TICK_SPACE = 16,  
00051   MAJOR_SPACE = 2  
00052 };
00053 
00055 enum label_index
00056 {
00057   LBL_XMIN, 
00058   LBL_XMAX, 
00059   LBL_YMIN, 
00060   LBL_YMAX, 
00061   max_label_index 
00062 };
00063 
00065 enum plot_obj_index
00066 {
00067   ANCHOR, AXISWIDTH, BLACK, BLUE, CREATE, E, FILL, GREEN, LINE, N, RED,
00068   TEXT, TEXTOPT, WIDTH, max_obj_index
00069 };
00070 
00072 enum axis_line_template_index
00073 {
00074   AXL_PATHNAME, 
00075   AXL_CREATE, 
00076   AXL_LINE, 
00077   AXL_X1, 
00078   AXL_Y1, 
00079   AXL_X2, 
00080   AXL_Y2, 
00081   AXL_WIDTH,  
00082   AXL_OUTLINEWIDTH,  
00083   max_axl_index  
00084 };
00085 
00087 enum bar_template_index
00088 {
00089   BAR_PATHNAME, 
00090   BAR_CREATE, 
00091   BAR_LINE, 
00092   BAR_X1, 
00093   BAR_Y1, 
00094   BAR_X2, 
00095   BAR_Y2, 
00096   BAR_FILL, 
00097   BAR_COLOR, 
00098   max_bar_index  
00099 };
00100 
00102 enum text_template_index
00103 {
00104   TXT_PATHNAME, 
00105   TXT_CREATE, 
00106   TXT_TEXT, 
00107   TXT_X, 
00108   TXT_Y, 
00109   TXT_ANCHOR, 
00110   TXT_ANCHORPOS, 
00111   TXT_FILL, 
00112   TXT_COLOR, 
00113   TXT_TEXTOPT, 
00114   TXT_STRING, 
00115   max_text_index  
00116 };
00117 
00119 enum y_preset_index
00120 {
00121   Y_TOP, 
00122   Y_BASE, 
00123   Y_MINOR, 
00124   Y_MAJOR, 
00125   Y_CAPTION, 
00126   max_y_preset_index  
00127 };
00128 
00130 enum x_preset_index
00131 {
00132   X_BASE, 
00133   X_MAJOR,  
00134   X_CAPTION,  
00135   X_RIGHT, 
00136   max_x_preset_index  
00137 };
00138 
00140 typedef const struct Line_value_range * line_value_rangep_t;
00141 
00143 struct Line_value_range
00144 {
00145   double min; 
00146   double max; 
00147 };
00148 
00150 typedef double (*bar_sizer_t) (double val, line_value_rangep_t range);
00151 
00153 static const double magic_scale = 83.3;
00154 
00162 static double
00163 unit_bar_size (double val, line_value_rangep_t range)
00164 {
00165   double size;
00166 
00167   size = (magic_scale * (val - range->min)) / (range->max - range->min);
00168   if (size < 0)
00169     size = 0;
00170   return (size > Y_HEIGHT) ? Y_HEIGHT : size;
00171 }
00172 
00180 static double
00181 norm_bar_size (double val, line_value_rangep_t range)
00182 {
00183   return Y_HEIGHT * (val - range->min) / (range->max - range->min);
00184 }
00185 
00193 static double
00194 log_bar_size (double val, line_value_rangep_t range)
00195 {
00196   return Y_HEIGHT * ((log10 (val + 1) - range->min)
00197                      / (range->max - range->min));
00198 }
00199 
00207 static void
00208 dispose_objs (Tcl_Obj * obj[], int max_index)
00209 {
00210   int i;
00211 
00212   for (i = 0; (i < max_index); i++)
00213     {
00214       if (obj[i])
00215         Tcl_DecrRefCount (obj[i]);
00216     }
00217 }
00218 
00227 static int
00228 prepare_objs (Tcl_Obj * obj[], int max_index)
00229 {
00230   int i;
00231   int err = TCL_OK;
00232 
00233   for (i = 0; ((err == TCL_OK) && (i < max_index)); i++)
00234     {
00235       if (obj[i] == NULL)
00236         err = TCL_ERROR;
00237       else
00238         Tcl_IncrRefCount (obj[i]);
00239     }
00240   if (err != TCL_OK)
00241     dispose_objs (obj, max_index);
00242   return err;
00243 }
00244 
00254 static int
00255 initialize_label_objs (Tcl_Obj * lobj[],
00256                        const char *minxlbl, const char *maxxlbl,
00257                        line_value_rangep_t range)
00258 {
00259   int i;
00260   char range_mintext[SLEN];
00261   char range_maxtext[SLEN];
00262 
00263   if ((!lobj) || (!minxlbl) || (!maxxlbl))
00264     return TCL_ERROR;
00265   for (i = 0; (i < max_label_index); i++)
00266     lobj[i] = NULL;
00267   snprintf (range_mintext, SLEN - 1, "%d", (int) range->min);
00268   snprintf (range_maxtext, SLEN - 1, "%d", (int) range->max);
00269   lobj[LBL_XMIN] = Tcl_NewStringObj (minxlbl, -1);
00270   lobj[LBL_XMAX] = Tcl_NewStringObj (maxxlbl, -1);
00271   lobj[LBL_YMIN] = Tcl_NewStringObj (range_mintext, -1);
00272   lobj[LBL_YMAX] = Tcl_NewStringObj (range_maxtext, -1);
00273   return prepare_objs (lobj, max_label_index);
00274 }
00275 
00284 static int
00285 initialize_plot_objs (Tcl_Obj * pobj[])
00286 {
00287   int i;
00288 
00289   if (pobj == NULL)
00290     return TCL_ERROR;
00291   for (i = 0; (i < max_obj_index); i++)
00292     pobj[i] = NULL;
00293   pobj[ANCHOR] = Tcl_NewStringObj ("-anchor", -1);
00294   pobj[AXISWIDTH] = Tcl_NewDoubleObj (1.5);
00295   pobj[BLACK] = Tcl_NewStringObj ("black", -1);
00296   pobj[BLUE] = Tcl_NewStringObj ("blue", -1);
00297   pobj[CREATE] = Tcl_NewStringObj ("create", -1);
00298   pobj[E] = Tcl_NewStringObj ("e", -1);
00299   pobj[FILL] = Tcl_NewStringObj ("-fill", -1);
00300   pobj[GREEN] = Tcl_NewStringObj ("green", -1);
00301   pobj[LINE] = Tcl_NewStringObj ("line", -1);
00302   pobj[N] = Tcl_NewStringObj ("n", -1);
00303   pobj[RED] = Tcl_NewStringObj ("red", -1);
00304   pobj[TEXT] = Tcl_NewStringObj ("text", -1);
00305   pobj[TEXTOPT] = Tcl_NewStringObj ("-text", -1);
00306   pobj[WIDTH] = Tcl_NewStringObj ("-width", -1);
00307   return prepare_objs (pobj, max_obj_index);
00308 }
00309 
00318 static int
00319 initialize_y_presets (Tcl_Obj * pos[], uint32_t offset, uint32_t * y_origin)
00320 {
00321   int i;
00322 
00323   if ((pos == NULL) || (y_origin == NULL))
00324     return TCL_ERROR;
00325   for (i = 0; (i < max_y_preset_index); i++)
00326     pos[i] = NULL;
00327   *y_origin = offset + TOP_SPACING + Y_HEIGHT;
00328   pos[Y_TOP] = Tcl_NewDoubleObj (offset + TOP_SPACING);
00329   pos[Y_BASE] = Tcl_NewDoubleObj (*y_origin + AXIS_DEPTH);
00330   pos[Y_MINOR] = Tcl_NewDoubleObj (*y_origin + MINOR_DEPTH);
00331   pos[Y_MAJOR] = Tcl_NewDoubleObj (*y_origin + MAJOR_DEPTH);
00332   pos[Y_CAPTION] = Tcl_NewDoubleObj (*y_origin + CAPTION_DEPTH);
00333   return prepare_objs (pos, max_y_preset_index);
00334 }
00335 
00345 static int
00346 initialize_x_presets (Tcl_Obj * pos[], uint32_t offset, uint32_t xlen,
00347                       uint32_t * x_origin)
00348 {
00349   int i;
00350 
00351   if ((pos == NULL) || (x_origin == NULL))
00352     return TCL_ERROR;
00353   for (i = 0; (i < max_x_preset_index); i++)
00354     pos[i] = NULL;
00355   *x_origin = offset + LEFT_SPACING;
00356   pos[X_BASE] = Tcl_NewDoubleObj (*x_origin - AXIS_DEPTH);
00357   pos[X_MAJOR] = Tcl_NewDoubleObj (*x_origin - MAJOR_DEPTH);
00358   pos[X_CAPTION] = Tcl_NewDoubleObj (*x_origin - CAPTION_DEPTH);
00359   pos[X_RIGHT] = Tcl_NewDoubleObj (*x_origin + xlen);
00360   return prepare_objs (pos, max_x_preset_index);
00361 }
00362 
00370 static void
00371 make_axis_line_template (Tcl_Obj * canvas, Tcl_Obj * cmd[], Tcl_Obj * pobj[])
00372 {
00373   cmd[AXL_PATHNAME] = canvas;
00374   cmd[AXL_CREATE] = pobj[CREATE];
00375   cmd[AXL_LINE] = pobj[LINE];
00376   cmd[AXL_X1] = NULL;
00377   cmd[AXL_Y1] = NULL;
00378   cmd[AXL_X2] = NULL;
00379   cmd[AXL_Y2] = NULL;
00380   cmd[AXL_WIDTH] = pobj[WIDTH];
00381   cmd[AXL_OUTLINEWIDTH] = pobj[AXISWIDTH];
00382 }
00383 
00391 static void
00392 make_bar_template (Tcl_Obj * canvas, Tcl_Obj * cmd[], Tcl_Obj * pobj[])
00393 {
00394   cmd[BAR_PATHNAME] = canvas;
00395   cmd[BAR_CREATE] = pobj[CREATE];
00396   cmd[BAR_LINE] = pobj[LINE];
00397   cmd[BAR_X1] = NULL;
00398   cmd[BAR_Y1] = NULL;
00399   cmd[BAR_X2] = NULL;
00400   cmd[BAR_Y2] = NULL;
00401   cmd[BAR_FILL] = pobj[FILL];
00402   cmd[BAR_COLOR] = NULL;
00403 }
00404 
00412 static void
00413 make_text_template (Tcl_Obj * canvas, Tcl_Obj * cmd[], Tcl_Obj * pobj[])
00414 {
00415   cmd[TXT_PATHNAME] = canvas;
00416   cmd[TXT_CREATE] = pobj[CREATE];
00417   cmd[TXT_TEXT] = pobj[TEXT];
00418   cmd[TXT_X] = NULL;
00419   cmd[TXT_Y] = NULL;
00420   cmd[TXT_ANCHOR] = pobj[ANCHOR];
00421   cmd[TXT_ANCHORPOS] = NULL;
00422   cmd[TXT_FILL] = pobj[FILL];
00423   cmd[TXT_COLOR] = pobj[BLACK];
00424   cmd[TXT_TEXTOPT] = pobj[TEXTOPT];
00425   cmd[TXT_STRING] = NULL;
00426 }
00427 
00437 static int
00438 draw_y_axis (Tcl_Interp * interp,
00439              Tcl_Obj * cmd[], Tcl_Obj * x_pos[], Tcl_Obj * y_pos[])
00440 {
00441   int err = TCL_OK;
00442 
00443   if ((!interp) || (!cmd) || (!x_pos) || (!y_pos))
00444     return TCL_ERROR;
00445   cmd[AXL_X1] = x_pos[X_MAJOR];
00446   cmd[AXL_Y2] = cmd[AXL_Y1] = y_pos[Y_TOP];
00447   cmd[AXL_X2] = x_pos[X_BASE];
00448   err = Tcl_EvalObjv (interp, max_axl_index, cmd, TCL_EVAL_GLOBAL);
00449   if (err != TCL_OK)
00450     return err;
00451   cmd[AXL_X1] = cmd[AXL_X2];
00452   cmd[AXL_Y1] = cmd[AXL_Y2];
00453   cmd[AXL_Y2] = y_pos[Y_MAJOR];
00454   return Tcl_EvalObjv (interp, max_axl_index, cmd, TCL_EVAL_GLOBAL);
00455 }
00456 
00469 static int
00470 draw_x_axis (Tcl_Interp * interp, Tcl_Obj * cmd[], Tcl_Obj * x_pos[],
00471              Tcl_Obj * y_pos[], uint32_t x_origin, uint32_t axlen)
00472 {
00473   uint32_t tick;
00474   int err = TCL_OK;
00475   Tcl_Obj *x_tick = NULL;
00476 
00477   if ((!interp) || (!cmd) || (!x_pos) || (!y_pos))
00478     return TCL_ERROR;
00479   cmd[AXL_X1] = x_pos[X_MAJOR];
00480   cmd[AXL_Y2] = cmd[AXL_Y1] = y_pos[Y_BASE];
00481   cmd[AXL_X2] = x_pos[X_RIGHT];
00482   err = Tcl_EvalObjv (interp, max_axl_index, cmd, TCL_EVAL_GLOBAL);
00483   for (tick = TICK_SPACE;
00484        (err == TCL_OK) && (tick < axlen); tick += TICK_SPACE)
00485     {
00486       x_tick = Tcl_NewDoubleObj (x_origin + tick);
00487       if (x_tick == NULL)
00488         return TCL_ERROR;
00489       else
00490         Tcl_IncrRefCount (x_tick);
00491       cmd[AXL_X1] = cmd[AXL_X2] = x_tick;
00492       cmd[AXL_Y2] = (tick % (TICK_SPACE * MAJOR_SPACE))
00493         ? y_pos[Y_MINOR] : y_pos[Y_MAJOR];
00494       err = Tcl_EvalObjv (interp, max_axl_index, cmd, TCL_EVAL_GLOBAL);
00495       Tcl_DecrRefCount (x_tick);
00496     }
00497   return err;
00498 }
00499 
00511 static int
00512 label_y_axis (Tcl_Interp * interp, Tcl_Obj * cmd[], Tcl_Obj * pobj[],
00513               Tcl_Obj * x_pos[], Tcl_Obj * y_pos[], Tcl_Obj * axlabel[])
00514 {
00515   int err = TCL_OK;
00516 
00517   if ((!interp) || (!cmd) || (!pobj) || (!x_pos) || (!y_pos) || (!axlabel))
00518     return TCL_ERROR;
00519   cmd[TXT_X] = x_pos[X_CAPTION];
00520   cmd[TXT_Y] = y_pos[Y_TOP];
00521   cmd[TXT_ANCHORPOS] = pobj[E];
00522   cmd[TXT_STRING] = axlabel[LBL_YMAX];
00523   err = Tcl_EvalObjv (interp, max_text_index, cmd, TCL_EVAL_GLOBAL);
00524   if (err != TCL_OK)
00525     return err;
00526   cmd[TXT_Y] = y_pos[Y_BASE];
00527   cmd[TXT_STRING] = axlabel[LBL_YMIN];
00528   return Tcl_EvalObjv (interp, max_text_index, cmd, TCL_EVAL_GLOBAL);
00529 }
00530 
00542 static int
00543 label_x_axis (Tcl_Interp * interp, Tcl_Obj * cmd[], Tcl_Obj * pobj[],
00544               Tcl_Obj * x_pos[], Tcl_Obj * y_pos[], Tcl_Obj * axlabel[])
00545 {
00546   int err = TCL_OK;
00547 
00548   if ((!interp) || (!cmd) || (!pobj) || (!x_pos) || (!y_pos) || (!axlabel))
00549     return TCL_ERROR;
00550   cmd[TXT_X] = x_pos[X_BASE];
00551   cmd[TXT_Y] = y_pos[Y_CAPTION];
00552   cmd[TXT_ANCHORPOS] = pobj[N];
00553   cmd[TXT_STRING] = axlabel[LBL_XMIN];
00554   err = Tcl_EvalObjv (interp, max_text_index, cmd, TCL_EVAL_GLOBAL);
00555   if (err != TCL_OK)
00556     return err;
00557   cmd[TXT_X] = x_pos[X_RIGHT];
00558   cmd[TXT_STRING] = axlabel[LBL_XMAX];
00559   return Tcl_EvalObjv (interp, max_text_index, cmd, TCL_EVAL_GLOBAL);
00560 }
00561 
00578 static int
00579 draw_bars (Tcl_Interp * interp, Tcl_Obj * cmd[],
00580            Tcl_Obj * y_pos[], line_value_rangep_t range, double x_origin,
00581            double y_origin, uint32_t npix, PIXEL * bline,
00582            bar_sizer_t find_bar_size)
00583 {
00584   int err = TCL_OK;
00585   uint32_t x;
00586   Tcl_Obj *bar_x = NULL;
00587   Tcl_Obj *bar_len = NULL;
00588   PIXEL *val = NULL;
00589 
00590   if ((!interp) || (!cmd) || (!y_pos) || (!range) || (!bline)
00591       || (!find_bar_size))
00592     return TCL_ERROR;
00593   for (x = 0, val = bline; ((err == TCL_OK) && (x < npix)); x++, val++)
00594     {
00595       bar_x = Tcl_NewDoubleObj (x_origin + x);
00596       if (bar_x != NULL)
00597         {
00598           Tcl_IncrRefCount (bar_x);
00599           bar_len = Tcl_NewDoubleObj (y_origin
00600                                       - (*find_bar_size) (*val, range));
00601           if (bar_len == NULL)
00602             {
00603               Tcl_DecrRefCount (bar_x);
00604             }
00605           else
00606             {
00607               Tcl_IncrRefCount (bar_len);
00608             }
00609         }
00610       if (bar_len == NULL)
00611         err = TCL_ERROR;
00612       else
00613         {
00614           cmd[BAR_X1] = cmd[BAR_X2] = bar_x;
00615           cmd[BAR_Y1] = y_pos[Y_BASE];
00616           cmd[BAR_Y2] = bar_len;
00617           err = Tcl_EvalObjv (interp, max_bar_index, cmd, TCL_EVAL_GLOBAL);
00618           Tcl_DecrRefCount (bar_len);
00619           Tcl_DecrRefCount (bar_x);
00620         }
00621     }
00622   return err;
00623 }
00624 
00638 static int
00639 update_log_view (Tcl_Interp * interp, tclsadie_cmd_skelp_t refresh,
00640                  Tcl_Obj * sadievar, uint32_t * y_offset)
00641 {
00642   Tcl_Obj *index = NULL;
00643   Tcl_Obj *offset = NULL;
00644   int err = TCL_OK;
00645 
00646   if ((!interp) || (!refresh) || (!refresh->cmd) || (!sadievar))
00647     return TCL_ERROR;
00648   err = Tcl_EvalObjv (interp, refresh->len, refresh->cmd, TCL_EVAL_GLOBAL);
00649   if (err != TCL_OK)
00650     return err;
00651   (*y_offset) += PLOT_HEIGHT;
00652   offset = Tcl_NewLongObj ((long) *y_offset);
00653   if (offset == NULL)
00654     err = TCL_ERROR;
00655   else
00656     {
00657       Tcl_IncrRefCount (offset);
00658       index = Tcl_NewStringObj (DEFAULT_SESSION_LOG_POS_INDEX, -1);
00659       if (index == NULL)
00660         err = TCL_ERROR;
00661       else
00662         {
00663           Tcl_IncrRefCount (index);
00664           if (Tcl_ObjSetVar2
00665               (interp, sadievar, index, offset, TCL_GLOBAL_ONLY) == NULL)
00666             err = TCL_ERROR;
00667           Tcl_DecrRefCount (index);
00668         }
00669       Tcl_DecrRefCount (offset);
00670     }
00671   return err;
00672 }
00673 
00701 int
00702 tclsadie_plotter (PIXEL * line, uint32_t nbnd, uint32_t npix,
00703                   const char *minxlbl, const char *maxxlbl,
00704                   int option, PIXEL gmin, PIXEL gmax, void *data)
00705 {
00706   tclsadie_app_datap_t tclsadie_private = NULL;
00707   Tcl_Interp *interp = NULL;
00708   Tcl_Obj *canvas = NULL;
00709   Tcl_Obj *sadievar = NULL;
00710   Tcl_Obj *y_pos[max_y_preset_index];
00711   Tcl_Obj *x_pos[max_x_preset_index];
00712   Tcl_Obj *axlabel[max_label_index];
00713   Tcl_Obj *labelcmd[max_text_index];
00714   Tcl_Obj *pobj[max_obj_index];
00715   Tcl_Obj *axlcmd[max_axl_index];
00716   Tcl_Obj *barcmd[max_bar_index];
00717   tclsadie_cmd_skelp_t refresh;
00718   uint32_t x_offset, y_offset, x_origin, y_origin, band;
00719   struct Line_value_range full_range;
00720   bar_sizer_t find_bar_size;
00721   int err = TCL_OK;
00722 
00723   if ((!line) || (!minxlbl) || (!maxxlbl) || (!data))
00724     return TCL_ERROR;
00725   tclsadie_private = data;
00726   interp = tclsadie_private->main_interp;
00727   canvas = tclsadie_private->sessionlog_canvas;
00728   sadievar = tclsadie_private->sadievar;
00729   refresh = tclsadie_private->log_refresh;
00730   if ((!interp) || (!canvas) || (!sadievar) || (!refresh))
00731     return TCL_ERROR;
00732   switch (option)
00733     {
00734     case UNIT:
00735       find_bar_size = unit_bar_size;
00736       break;
00737     case NORM:
00738       find_bar_size = norm_bar_size;
00739       break;
00740     case LOG:
00741       find_bar_size = log_bar_size;
00742       break;
00743     default:
00744       return TCL_ERROR;
00745     }
00746   err = GetSadieUintFromObj2 (interp, sadievar, DEFAULT_SESSION_LOG_POS_INDEX,
00747                               &y_offset);
00748   if (err != TCL_OK)
00749     {
00750       Tcl_BackgroundError (interp);
00751       return err;
00752     }
00753   full_range.min = gmin;
00754   full_range.max = gmax;
00755   y_offset += TOP_MARGIN;
00756   err = initialize_plot_objs (pobj);
00757   if (err == TCL_OK)
00758     {
00759       err = initialize_label_objs (axlabel, minxlbl, maxxlbl, &full_range);
00760       if (err == TCL_OK)
00761         {
00762           err = initialize_y_presets (y_pos, y_offset, &y_origin);
00763           if (err != TCL_OK)
00764             dispose_objs (axlabel, max_label_index);
00765         }
00766       if (err != TCL_OK)
00767         dispose_objs (pobj, max_obj_index);
00768     }
00769   if (err != TCL_OK)
00770     {
00771       Tcl_BackgroundError (interp);
00772       return err;
00773     }
00774   make_axis_line_template (canvas, axlcmd, pobj);
00775   make_text_template (canvas, labelcmd, pobj);
00776   make_bar_template (canvas, barcmd, pobj);
00777   for (band = 0; ((err == TCL_OK) && (band < nbnd)); band++)
00778     {
00779       x_offset = (band * (npix + RIGHT_MARGIN));
00780       if ((nbnd == 1) || (band > 2))
00781         barcmd[BAR_COLOR] = pobj[BLACK];
00782       else if (band == 0)
00783         barcmd[BAR_COLOR] = pobj[RED];
00784       else if (band == 1)
00785         barcmd[BAR_COLOR] = pobj[GREEN];
00786       else
00787         barcmd[BAR_COLOR] = pobj[BLUE];
00788       if ((initialize_x_presets (x_pos, x_offset, npix, &x_origin) != TCL_OK)
00789           || (draw_y_axis (interp, axlcmd, x_pos, y_pos) != TCL_OK)
00790           || (draw_x_axis (interp, axlcmd, x_pos, y_pos, x_origin, npix)
00791               != TCL_OK)
00792           || (label_y_axis (interp, labelcmd, pobj, x_pos, y_pos, axlabel)
00793               != TCL_OK)
00794           || (label_x_axis (interp, labelcmd, pobj, x_pos, y_pos, axlabel)
00795               != TCL_OK)
00796           || (draw_bars (interp, barcmd, y_pos, &full_range, x_origin,
00797                          y_origin, npix, (line + (band * npix)),
00798                          find_bar_size) != TCL_OK))
00799         {
00800           err = TCL_ERROR;
00801           Tcl_BackgroundError (interp);
00802         }
00803       dispose_objs (x_pos, max_x_preset_index);
00804     }
00805   dispose_objs (y_pos, max_y_preset_index);
00806   dispose_objs (axlabel, max_label_index);
00807   dispose_objs (pobj, max_obj_index);
00808   if (err == TCL_OK)
00809     {
00810       err = update_log_view (interp, refresh, sadievar, &y_offset);
00811       if (err != TCL_OK)
00812         Tcl_BackgroundError (interp);
00813     }
00814   return err;
00815 }

Generated on Fri Jul 8 14:55:01 2005 for tclSadie by  doxygen 1.4.2