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:
parent
5305e593ff
commit
7d6b33cda8
22
src/draw.c
22
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;
|
||||
|
|
|
|||
18
src/save.c
18
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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue