From 0c5d2e10b6c36c5af49062404738553ce4e27a96 Mon Sep 17 00:00:00 2001 From: xiphmont Date: Wed, 20 Dec 2006 05:21:57 +0000 Subject: [PATCH] API tweak to allow association of objectives/dimensions with multiple panels (needed by 1-d linking) but still have direct objective/dimension callbacks with panel association Also extend 'mappings' for solid colors in line plots. git-svn-id: http://svn.xiph.org/trunk@12229 0101bb08-14d6-0310-b084-bc0e0c8e3800 --- sushivision/Makefile | 2 +- sushivision/dimension.c | 1 - sushivision/mapping.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++ sushivision/mapping.h | 2 +- sushivision/objective.c | 1 - sushivision/panel-2d.c | 59 +++++++++++++++++++------------------ sushivision/panel.c | 17 +++-------- sushivision/sushivision.h | 16 +++++++--- 8 files changed, 124 insertions(+), 49 deletions(-) diff --git a/sushivision/Makefile b/sushivision/Makefile index a54be3cb2..9060d5f26 100644 --- a/sushivision/Makefile +++ b/sushivision/Makefile @@ -40,7 +40,7 @@ profile: $(MAKE) examples CFLAGS='-pg -g -O2 $(GCF) $(ADD_DEF)' LIBS='-lgprof-helper' clean: - rm -f $(OBJ) *.d *.d.* gmon.out $(TARGET) + rm -f *.o *.d *.d.* gmon.out $(TARGET) distclean: clean rm -f *~ diff --git a/sushivision/dimension.c b/sushivision/dimension.c index 460c9af18..b55ac31f9 100644 --- a/sushivision/dimension.c +++ b/sushivision/dimension.c @@ -98,6 +98,5 @@ int sushiv_new_dimension(sushiv_instance_t *s, d->flags = flags; d->sushi = s; d->callback = callback; - d->panel = NULL; return sushiv_dim_set_scale(d, scalevals, scaleval_list); } diff --git a/sushivision/mapping.c b/sushivision/mapping.c index 19035ff6b..c0981a7f8 100644 --- a/sushivision/mapping.c +++ b/sushivision/mapping.c @@ -299,6 +299,14 @@ void mapping_set_func(mapping *m, int funcnum){ m->mapfunc = mapfunc[funcnum]; } +double mapping_val(mapping *m, double in){ + if(m->i_range==0){ + return NAN; + }else{ + return (in - m->low) * m->i_range; + } +} + u_int32_t mapping_calc(mapping *m, double in, u_int32_t mix){ if(m->i_range==0){ if(in<=m->low) @@ -315,3 +323,70 @@ int mapping_inactive_p(mapping *m){ if(m->mapfunc == inactive)return 1; return 0; } + +static u_int32_t swhite(double val, u_int32_t mix){ + return 0xffffffU; +} +static u_int32_t sred(double val, u_int32_t mix){ + return 0xff0000U; +} +static u_int32_t sgreen(double val, u_int32_t mix){ + return 0x00ff00U; +} +static u_int32_t sblue(double val, u_int32_t mix){ + return 0x0000ffU; +} +static u_int32_t syellow(double val, u_int32_t mix){ + return 0xffff00U; +} +static u_int32_t scyan(double val, u_int32_t mix){ + return 0x00ffffU; +} +static u_int32_t spurple(double val, u_int32_t mix){ + return 0xff00ffU; +} +static u_int32_t sgray(double val, u_int32_t mix){ + return 0xa0a0a0aU; +} + +static u_int32_t (*solidfunc[])(double,u_int32_t)={ + swhite, + sred, + sgreen, + sblue, + syellow, + scyan, + spurple, + sgray, + inactive +}; + +static char *solidnames[]={ + "white", + "red", + "green", + "blue", + "yellow", + "cyan", + "purple", + "gray", + "inactive", + 0 +}; + +int num_solids(){ + int i=0; + while(solidnames[i])i++; + return i; +} + +char *solid_name(int i){ + return solidnames[i]; +} + +void solid_setup(mapping *m, double lo, double hi, int funcnum){ + m->low = lo; + m->high = hi; + m->i_range = 1./(hi-lo); + m->mapfunc = solidfunc[funcnum]; +} diff --git a/sushivision/mapping.h b/sushivision/mapping.h index b8e27abb8..bf8a7031b 100644 --- a/sushivision/mapping.h +++ b/sushivision/mapping.h @@ -26,7 +26,6 @@ typedef struct { double high; double i_range; u_int32_t (*mapfunc)(double val,u_int32_t mix); - } mapping; extern int num_mappings(); @@ -35,5 +34,6 @@ extern void mapping_setup(mapping *m, double lo, double hi, int funcnum); extern void mapping_set_lo(mapping *m, double lo); extern void mapping_set_hi(mapping *m, double hi); extern void mapping_set_func(mapping *m, int funcnum); +extern double mapping_val(mapping *m, double in); extern u_int32_t mapping_calc(mapping *m, double in, u_int32_t mix); extern int mapping_inactive_p(mapping *m); diff --git a/sushivision/objective.c b/sushivision/objective.c index 50ebbe4ff..fbb455e52 100644 --- a/sushivision/objective.c +++ b/sushivision/objective.c @@ -100,7 +100,6 @@ int sushiv_new_objective(sushiv_instance_t *s, o->name = strdup(name); o->flags = flags; o->sushi = s; - o->panel = NULL; o->callback = callback; sushiv_objective_set_scale(o, scalevals, scaleval_list); diff --git a/sushivision/panel-2d.c b/sushivision/panel-2d.c index 0ba15c519..0bd1ff0d6 100644 --- a/sushivision/panel-2d.c +++ b/sushivision/panel-2d.c @@ -148,12 +148,12 @@ static void update_legend(sushiv_panel_t *p){ // add each dimension to the legend for(i=0;idimensions;i++){ // display decimal precision relative to bracket - int depth = del_depth(p->dimension_list[i]->bracket[0], - p->dimension_list[i]->bracket[1]) + offset; + int depth = del_depth(p->dimension_list[i].d->bracket[0], + p->dimension_list[i].d->bracket[1]) + offset; snprintf(buffer,320,"%s = %.*f", - p->dimension_list[i]->name, + p->dimension_list[i].d->name, depth, - p->dimension_list[i]->val); + p->dimension_list[i].d->val); plot_legend_add(plot,buffer); } @@ -176,7 +176,7 @@ static void update_legend(sushiv_panel_t *p){ if(!isnan(val) && !mapping_inactive_p(p2->mappings+i)){ snprintf(buffer,320,"%s = %f", - p->objective_list[i]->name, + p->objective_list[i].o->name, val); plot_legend_add(plot,buffer); } @@ -190,9 +190,9 @@ static void update_legend(sushiv_panel_t *p){ } static void mapchange_callback_2d(GtkWidget *w,gpointer in){ - sushiv_objective_t **optr = (sushiv_objective_t **)in; - sushiv_objective_t *o = *optr; - sushiv_panel_t *p = o->panel; + sushiv_objective_list_t *optr = (sushiv_objective_list_t *)in; + //sushiv_objective_t *o = optr->o; + sushiv_panel_t *p = optr->p; sushiv_panel2d_t *p2 = (sushiv_panel2d_t *)p->internal; int onum = optr - p->objective_list; @@ -214,9 +214,9 @@ static void mapchange_callback_2d(GtkWidget *w,gpointer in){ } static void map_callback_2d(void *in,int buttonstate){ - sushiv_objective_t **optr = (sushiv_objective_t **)in; - sushiv_objective_t *o = *optr; - sushiv_panel_t *p = o->panel; + sushiv_objective_list_t *optr = (sushiv_objective_list_t *)in; + //sushiv_objective_t *o = optr->o; + sushiv_panel_t *p = optr->p; sushiv_panel2d_t *p2 = (sushiv_panel2d_t *)p->internal; int onum = optr - p->objective_list; @@ -250,7 +250,7 @@ static void update_xy_availability(sushiv_panel_t *p){ gtk_widget_set_sensitive_fixup(p2->dim_yb[i],FALSE); // set the x dim flag - p2->x_d = p->dimension_list[i]; + p2->x_d = p->dimension_list[i].d; p2->x_scale = p2->dim_scales[i]; p2->x_dnum = i; // set panel x scale to this dim @@ -271,7 +271,7 @@ static void update_xy_availability(sushiv_panel_t *p){ gtk_widget_set_sensitive_fixup(p2->dim_xb[i],FALSE); // set the y dim - p2->y_d = p->dimension_list[i]; + p2->y_d = p->dimension_list[i].d; p2->y_scale = p2->dim_scales[i]; p2->y_dnum = i; // set panel y scale to this dim @@ -319,7 +319,7 @@ static void compute_one_line_2d(sushiv_panel_t *p, /* by objective */ for(i=0;iobjectives;i++){ - sushiv_objective_t *o = p->objective_list[i]; + sushiv_objective_t *o = p->objective_list[i].o; double alpha = p2->alphadel[i]; gdk_threads_leave (); // misuse me as a global mutex @@ -599,7 +599,7 @@ void _mark_recompute_2d(sushiv_panel_t *p){ p2->data_rect[i][j]=NAN; _sushiv_panel2d_map_redraw(p); } - + _sushiv_wake_workers(); } } @@ -616,7 +616,7 @@ static void update_crosshairs(sushiv_panel_t *p){ int i; for(i=0;idimensions;i++){ - sushiv_dimension_t *d = p->dimension_list[i]; + sushiv_dimension_t *d = p->dimension_list[i].d; sushiv_panel2d_t *p2 = (sushiv_panel2d_t *)p->internal; if(d == p2->x_d) x = slider_get_value(p2->dim_scales[i],1); @@ -630,7 +630,7 @@ static void update_crosshairs(sushiv_panel_t *p){ // crosshairs snap to a pixel position; the cached dimension value // should be accurate with respect to the crosshairs for(i=0;idimensions;i++){ - sushiv_dimension_t *d = p->dimension_list[i]; + sushiv_dimension_t *d = p->dimension_list[i].d; sushiv_panel2d_t *p2 = (sushiv_panel2d_t *)p->internal; if(d == p2->x_d) d->val = scalespace_value(&plot->x,plot_get_crosshair_xpixel(plot)); @@ -641,9 +641,9 @@ static void update_crosshairs(sushiv_panel_t *p){ } static void dim_callback_2d(void *in, int buttonstate){ - sushiv_dimension_t **dptr = (sushiv_dimension_t **)in; - sushiv_dimension_t *d = *dptr; - sushiv_panel_t *p = d->panel; + sushiv_dimension_list_t *dptr = (sushiv_dimension_list_t *)in; + sushiv_dimension_t *d = dptr->d; + sushiv_panel_t *p = dptr->p; sushiv_panel2d_t *p2 = (sushiv_panel2d_t *)p->internal; //Plot *plot = PLOT(p2->graph); int dnum = dptr - p->dimension_list; @@ -669,9 +669,9 @@ static void dim_callback_2d(void *in, int buttonstate){ } static void bracket_callback_2d(void *in, int buttonstate){ - sushiv_dimension_t **dptr = (sushiv_dimension_t **)in; - sushiv_dimension_t *d = *dptr; - sushiv_panel_t *p = d->panel; + sushiv_dimension_list_t *dptr = (sushiv_dimension_list_t *)in; + sushiv_dimension_t *d = dptr->d; + sushiv_panel_t *p = dptr->p; sushiv_panel2d_t *p2 = (sushiv_panel2d_t *)p->internal; int dnum = dptr - p->dimension_list; double lo = slider_get_value(p2->dim_scales[dnum],0); @@ -737,7 +737,7 @@ static void crosshairs_callback(void *in){ panel2d_undo_suspend(p); for(i=0;idimensions;i++){ - sushiv_dimension_t *d = p->dimension_list[i]; + sushiv_dimension_t *d = p->dimension_list[i].d; sushiv_panel2d_t *p2 = (sushiv_panel2d_t *)p->internal; if(d == p2->x_d){ slider_set_value(p2->dim_scales[i],1,x); @@ -824,6 +824,7 @@ int _sushiv_panel_cooperative_compute_2d(sushiv_panel_t *p){ gdk_threads_leave (); plot_expose_request(plot); update_legend(p); + //_sushiv_panel1d_mark_recompute_linked(p); return 0; } @@ -843,7 +844,7 @@ int _sushiv_panel_cooperative_compute_2d(sushiv_panel_t *p){ /* which dim is our x? Our y? */ for(i=0;idimension_list[i]; + sushiv_dimension_t *dim = p->dimension_list[i].d; if(dim == p2->x_d){ x_min = scalespace_value(&sx,0); x_max = scalespace_value(&sx,w); @@ -853,7 +854,7 @@ int _sushiv_panel_cooperative_compute_2d(sushiv_panel_t *p){ } for(i=0;idimension_list[i]; + sushiv_dimension_t *dim = p->dimension_list[i].d; if(dim == p2->y_d){ y_min = scalespace_value(&sy,h); y_max = scalespace_value(&sy,0); @@ -1365,7 +1366,9 @@ void _sushiv_realize_panel2d(sushiv_panel_t *p){ p2->mappings = calloc(p->objectives,sizeof(*p2->mappings)); for(i=0;iobjectives;i++){ GtkWidget **sl = calloc(3,sizeof(*sl)); - sushiv_objective_t *o = p->objective_list[i]; + sushiv_objective_t *o = p->objective_list[i].o; + int lo = o->scale_val_list[0]; + int hi = o->scale_val_list[o->scale_vals-1]; int lo = o->scale_val_list[0]; int hi = o->scale_val_list[o->scale_vals-1]; @@ -1418,7 +1421,7 @@ void _sushiv_realize_panel2d(sushiv_panel_t *p){ for(i=0;idimensions;i++){ GtkWidget **sl = calloc(3,sizeof(*sl)); - sushiv_dimension_t *d = p->dimension_list[i]; + sushiv_dimension_t *d = p->dimension_list[i].d; /* label */ GtkWidget *label = gtk_label_new(d->name); diff --git a/sushivision/panel.c b/sushivision/panel.c index 529be0697..3ac22cc1e 100644 --- a/sushivision/panel.c +++ b/sushivision/panel.c @@ -164,13 +164,8 @@ int _sushiv_new_panel(sushiv_instance_t *s, p->objective_list = malloc(i*sizeof(*p->objective_list)); for(i=0;iobjectives;i++){ sushiv_objective_t *o = s->objective_list[objectives[i]]; - if(o->panel){ - fprintf(stderr,"Objective %d already in use with another panel\n",o->number); - return -EINVAL; - } - o->panel = p; - p->objective_list[i] = o; - + p->objective_list[i].o = o; + p->objective_list[i].p = p; } i=0; @@ -179,12 +174,8 @@ int _sushiv_new_panel(sushiv_instance_t *s, p->dimension_list = malloc(i*sizeof(*p->dimension_list)); for(i=0;idimensions;i++){ sushiv_dimension_t *d = s->dimension_list[dimensions[i]]; - if(d->panel){ - fprintf(stderr,"Dimension %d already in use with another panel\n",d->number); - return -EINVAL; - } - d->panel = p; - p->dimension_list[i] = d; + p->dimension_list[i].d = d; + p->dimension_list[i].p = p; } return number; diff --git a/sushivision/sushivision.h b/sushivision/sushivision.h index 4d52ce8b0..bcae388b5 100644 --- a/sushivision/sushivision.h +++ b/sushivision/sushivision.h @@ -54,7 +54,6 @@ struct sushiv_dimension{ unsigned flags; int (*callback)(sushiv_dimension_t *); - sushiv_panel_t *panel; sushiv_instance_t *sushi; void *internal; }; @@ -69,12 +68,21 @@ struct sushiv_objective { unsigned flags; double (*callback)(double[]); - sushiv_panel_t *panel; sushiv_instance_t *sushi; void *internal; }; enum sushiv_panel_type { SUSHIV_PANEL_1D, SUSHIV_PANEL_2D }; + +typedef struct { + sushiv_dimension_t *d; + sushiv_panel_t *p; +} sushiv_dimension_list_t; + +typedef struct { + sushiv_objective_t *o; + sushiv_panel_t *p; +} sushiv_objective_list_t; struct sushiv_panel { int number; @@ -85,9 +93,9 @@ struct sushiv_panel { int legend_dirty; int dimensions; - sushiv_dimension_t **dimension_list; + sushiv_dimension_list_t *dimension_list; int objectives; - sushiv_objective_t **objective_list; + sushiv_objective_list_t *objective_list; sushiv_instance_t *sushi; void *internal; -- 2.11.4.GIT