From 7d6b33cda893e3ed811f5b37ab5a023b535a25d7 Mon Sep 17 00:00:00 2001 From: Stefan Frederik Date: Fri, 16 Sep 2022 12:16:26 +0200 Subject: [PATCH] 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. --- src/draw.c | 22 +++++++++++++++------- src/save.c | 18 ++++++++++++++++++ src/scheduler.c | 8 ++++---- 3 files changed, 37 insertions(+), 11 deletions(-) diff --git a/src/draw.c b/src/draw.c index a9131c62..72a6b4ed 100644 --- a/src/draw.c +++ b/src/draw.c @@ -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; diff --git a/src/save.c b/src/save.c index c2e17948..5e7aca7b 100644 --- a/src/save.c +++ b/src/save.c @@ -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; diff --git a/src/scheduler.c b/src/scheduler.c index 5dca42b6..998ade53 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -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);