limit max size of embedded graph bitmaps in svg export. added deriv0() graph function, does derivative w.r.t. index 0 (sweep) variable, regardless of graph sweep (x axis) variable.

This commit is contained in:
Stefan Frederik 2022-09-16 12:16:26 +02:00
parent 5305e593ff
commit 7d6b33cda8
3 changed files with 37 additions and 11 deletions

View File

@ -3133,20 +3133,28 @@ void svg_embedded_graph(FILE *fd, xRect *r, double rx1, double ry1, double rx2,
{
#if defined(__unix__) && defined(HAS_CAIRO)
char *ptr = NULL;
double x1, y1, x2, y2, w, h;
int rw, rh;
double x1, y1, x2, y2, w, h, rw, rh, scale;
char transform[150];
png_to_byte_closure_t closure;
cairo_surface_t *png_sfc;
int save_draw_window, save_draw_grid;
int save_draw_window, save_draw_grid, rwi, rhi;
size_t olength;
const double max_size = 2000.0;
rw = (int) fabs(rx2 -rx1);
rh = (int) fabs(ry2 - ry1);
rw = fabs(rx2 -rx1);
rh = fabs(ry2 - ry1);
scale = 1.0;
if(rw > rh && rw > max_size) {
scale = max_size / rw;
} else if(rh > max_size) {
scale = max_size / rh;
}
rwi = (int) (rw * scale + 1.0);
rhi = (int) (rh * scale + 1.0);
save_restore_zoom(1);
set_viewport_size(rw, rh, 0.8);
set_viewport_size(rwi, rhi, 1.0);
zoom_box(rx1, ry1, rx2, ry2, 1.0);
resetwin(1, 1, 1, rw, rh);
resetwin(1, 1, 1, rwi, rhi);
save_draw_grid = tclgetboolvar("draw_grid");
tclsetvar("draw_grid", "0");
save_draw_window = xctx->draw_window;

View File

@ -627,6 +627,7 @@ static double ravg_store(int what , int i, int p, int last, double integ)
#define DUP -38
#define RAVG -39 /* running average */
#define DB20 -40
#define DERIV0 -41 /* derivative to first sweep variable, regardless of specified sweep_idx */
#define NUMBER -60
typedef struct {
@ -647,6 +648,7 @@ int plot_raw_custom_data(int sweep_idx, int first, int last, const char *expr)
int stackptr1 = 0, stackptr2 = 0;
SPICE_DATA *y = xctx->graph_values[xctx->graph_nvars]; /* custom plot data column */
SPICE_DATA *x = xctx->graph_values[sweep_idx];
SPICE_DATA *sweepx = xctx->graph_values[0];
my_strdup2(574, &ntok_copy, expr);
ntok_ptr = ntok_copy;
@ -678,6 +680,7 @@ int plot_raw_custom_data(int sweep_idx, int first, int last, const char *expr)
else if(!strcmp(n, "ravg()")) stack1[stackptr1++].i = RAVG;
else if(!strcmp(n, "db20()")) stack1[stackptr1++].i = DB20;
else if(!strcmp(n, "deriv()")) stack1[stackptr1++].i = DERIV;
else if(!strcmp(n, "deriv0()")) stack1[stackptr1++].i = DERIV0;
else if(!strcmp(n, "exch()")) stack1[stackptr1++].i = EXCH;
else if(!strcmp(n, "dup()")) stack1[stackptr1++].i = DUP;
else if( (v = strtod(n, &endptr)), !*endptr) {
@ -814,6 +817,21 @@ int plot_raw_custom_data(int sweep_idx, int first, int last, const char *expr)
}
stack2[stackptr2 - 1] = deriv;
break;
case DERIV0:
if( p == first ) {
deriv = 0;
stack1[i].prevy = stack2[stackptr2 - 1];
stack1[i].prev = 0;
} else {
if((sweepx[p] != sweepx[p - 1]))
deriv = (stack2[stackptr2 - 1] - stack1[i].prevy) / (sweepx[p] - sweepx[p - 1]);
else
deriv = stack1[i].prev;
stack1[i].prevy = stack2[stackptr2 - 1] ;
stack1[i].prev = deriv;
}
stack2[stackptr2 - 1] = deriv;
break;
case SQRT:
stack2[stackptr2 - 1] = sqrt(stack2[stackptr2 - 1]);
break;

View File

@ -1993,7 +1993,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
if(w == 0) w = xctx->xrect[0].width;
if(h == 0) h = xctx->xrect[0].height;
save_restore_zoom(1);
set_viewport_size(w, h, 0.8);
set_viewport_size(w, h, 1.0);
zoom_full(0, 0, 2, 0.97);
resetwin(1, 1, 1, w, h);
print_image();
@ -2010,7 +2010,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
if(w == 0) w = (int) fabs(x2 - x1);
if(h == 0) h = (int) fabs(y2 - y1);
save_restore_zoom(1);
set_viewport_size(w, h, 0.8);
set_viewport_size(w, h, 1.0);
zoom_box(x1, y1, x2, y2, 1.0);
resetwin(1, 1, 1, w, h);
print_image();
@ -2028,7 +2028,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
w = atoi(argv[4]);
h = atoi(argv[5]);
save_restore_zoom(1);
set_viewport_size(w, h, 0.8);
set_viewport_size(w, h, 1.0);
zoom_full(0, 0, 2, 0.97);
svg_draw();
save_restore_zoom(0);
@ -2040,7 +2040,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
x2 = atof(argv[8]);
y2 = atof(argv[9]);
save_restore_zoom(1);
set_viewport_size(w, h, 0.8);
set_viewport_size(w, h, 1.0);
zoom_box(x1, y1, x2, y2, 1.0);
svg_draw();
save_restore_zoom(0);