+ if(based_on!=NULL &&
+ gr_stylespec_equals(&based_on->spec, &style->spec)){
+
+ /* The new style replaces based_on, so it may be dumped. */
+ if(!based_on->is_fallback)
+ destyle_dump(based_on);
+
+ if(based_on->usecount==1){
+ uint nb=based_on->n_extra_cgrps;
+ uint ns=style->n_extra_cgrps;
+ /* Nothing else is using based_on: optimise and move
+ * extra colour groups here, so that based_on can be freed.
+ */
+
+ if(nb>0){
+ DEColourGroup *cgs=ALLOC_N(DEColourGroup, nb+ns);
+
+ if(cgs!=NULL){
+ memcpy(cgs, based_on->extra_cgrps, sizeof(DEColourGroup)*nb);
+ memcpy(cgs+nb, style->extra_cgrps, sizeof(DEColourGroup)*ns);
+
+ free(style->extra_cgrps);
+ style->extra_cgrps=cgs;
+ style->n_extra_cgrps=nb+ns;
+
+ free(based_on->extra_cgrps);
+ based_on->extra_cgrps=NULL;
+ based_on->n_extra_cgrps=0;
+
+ }
+ }
+
+ /* style->extras_table should be none still */
+ style->extras_table=based_on->extras_table;
+ based_on->extras_table=extl_table_none();
+
+ style->based_on=based_on->based_on;
+ based_on->based_on=NULL;
+
+ destyle_unref(based_on);
+ }
+
+ }
+
+ filter_extras(&style->extras_table, tab);
+
+ destyle_add(style);
+