double new_log10_range = factor * log10_range;
double new_ymax_log10 = log10(im->minval) + new_log10_range;
im->maxval = pow(10, new_ymax_log10);
- ytr(im, DNAN); /* reset precalc */
+ ytr(im,DNAN); /* reset precalc */
log10_range = log10(im->maxval) - log10(im->minval);
}
/* make sure first y=10^x gridline is located on
double yfrac = ypixfrac / im->ysize;
im->minval = pow(10, log10(im->minval) - yfrac * log10_range);
im->maxval = pow(10, log10(im->maxval) - yfrac * log10_range);
- ytr(im, DNAN); /* reset precalc */
+ ytr(im,DNAN); /* reset precalc */
}
} else {
/* Make sure we have an integer pixel distance between
double gridstep = im->ygrid_scale.gridstep;
double minor_y, minor_y_px, minor_y_px_frac;
im->maxval = im->minval + new_range;
- ytr(im, DNAN); /* reset precalc */
+ ytr(im,DNAN); /* reset precalc */
/* make sure first minor gridline is on integer pixel y coord */
minor_y = gridstep * floor(im->minval / gridstep);
while (minor_y < im->minval)
double range = im->maxval - im->minval;
im->minval = im->minval - yfrac * range;
im->maxval = im->maxval - yfrac * range;
- ytr(im, DNAN); /* reset precalc */
+ ytr(im,DNAN); /* reset precalc */
}
calc_horizontal_grid(im); /* recalc with changed im->maxval */
}
im->ximg = im->xsize;
im->yimg = im->ysize;
im->yorigin = im->ysize;
+ ytr(im,DNAN);
return 0;
}
/* reserve space for main and/or pie */
im->yimg = Ymain + Yxlabel;
-
+
#ifdef WITH_PIECHART
if (im->yimg < Ypie) im->yimg = Ypie;
#endif
}
/* reserve space for padding below the graph */
im->yimg += Yspacing;
- ytr(im,DNAN);
-
+
/* Determine where to place the legends onto the image.
** Adjust im->yimg to match the space requirements.
*/
}
#endif
+ ytr(im,DNAN);
return 0;
}
}
} else {
- double ybase0 = DNAN,ytop0=DNAN;
- for(ii=0;ii<im->xsize;ii++){
+ int idxI=-1;
+ double *foreY=malloc(sizeof(double)*im->xsize*2);
+ double *foreX=malloc(sizeof(double)*im->xsize*2);
+ double *backY=malloc(sizeof(double)*im->xsize*2);
+ double *backX=malloc(sizeof(double)*im->xsize*2);
+ int drawem = 0;
+ for(ii=0;ii<=im->xsize;ii++){
+ double ybase,ytop;
+ if ( idxI > 0 && ( drawem != 0 || ii==im->xsize)){
+ int cntI=1;
+ int lastI=0;
+ while (cntI < idxI && foreY[lastI] == foreY[cntI] && foreY[lastI] == foreY[cntI+1]){cntI++;}
+ node = gfx_new_area(im->canvas,
+ backX[0],backY[0],
+ foreX[0],foreY[0],
+ foreX[cntI],foreY[cntI], im->gdes[i].col);
+ while (cntI < idxI) {
+ lastI = cntI;
+ cntI++;
+ while ( cntI < idxI && foreY[lastI] == foreY[cntI] && foreY[lastI] == foreY[cntI+1]){cntI++;}
+ gfx_add_point(node,foreX[cntI],foreY[cntI]);
+ }
+ gfx_add_point(node,backX[idxI],backY[idxI]);
+ while (idxI > 1){
+ lastI = idxI;
+ idxI--;
+ while ( idxI > 1 && backY[lastI] == backY[idxI] && backY[lastI] == backY[idxI-1]){idxI--;}
+ gfx_add_point(node,backX[idxI],backY[idxI]);
+ }
+ idxI=-1;
+ drawem = 0;
+ }
+ if (drawem != 0){
+ drawem = 0;
+ idxI=-1;
+ }
+ if (ii == im->xsize) break;
+
/* keep things simple for now, just draw these bars
do not try to build a big and complex area */
- double ybase,ytop;
+
+
if ( im->slopemode == 0 && ii==0){
continue;
}
if ( isnan(im->gdes[i].p_data[ii]) ) {
- ybase0 = DNAN;
+ drawem = 1;
continue;
}
ytop = ytr(im,im->gdes[i].p_data[ii]);
ybase = ytr(im,areazero);
}
if ( ybase == ytop ){
- ybase0 = DNAN;
+ drawem = 1;
continue;
}
/* every area has to be wound clock-wise,
ytop = ybase;
ybase = extra;
}
- if ( im->slopemode == 0){
- ybase0 = ybase;
- ytop0 = ytop;
- }
- if ( !isnan(ybase0) ){
- node = gfx_new_area(im->canvas,
- (double)ii-1.2+(double)im->xorigin,ybase0-0.2,
- (double)ii-1.2+(double)im->xorigin,ytop0+0.2,
- (double)ii+0.2+(double)im->xorigin,ytop+0.2,
- im->gdes[i].col
- );
- gfx_add_point(node,
- (double)ii+0.02+im->xorigin,ybase-0.2
- );
+ if ( im->slopemode == 0 ){
+ backY[++idxI] = ybase-0.2;
+ backX[idxI] = ii+im->xorigin-1;
+ foreY[idxI] = ytop+0.2;
+ foreX[idxI] = ii+im->xorigin-1;
}
- ybase0=ybase;
- ytop0=ytop;
- }
+ backY[++idxI] = ybase-0.2;
+ backX[idxI] = ii+im->xorigin;
+ foreY[idxI] = ytop+0.2;
+ foreX[idxI] = ii+im->xorigin;
+ }
+ /* close up any remaining area */
+ free(foreY);
+ free(foreX);
+ free(backY);
+ free(backX);
} /* else GF_LINE */
} /* if color != 0x0 */
/* make sure we do not run into trouble when stacking on NaN */
if (lastgdes && (im->gdes[i].stack)) {
im->gdes[i].p_data[ii] = lastgdes->p_data[ii];
} else {
- im->gdes[i].p_data[ii] = ytr(im,areazero);
+ im->gdes[i].p_data[ii] = areazero;
}
}
}