From af0ddb76f042f5307b3a923acdfce1adbf025eee Mon Sep 17 00:00:00 2001 From: stefan schippers Date: Tue, 17 Jan 2023 01:23:34 +0100 Subject: [PATCH] cleanups, remove redundant png_reader() definition --- src/cairo_jpg.c:Zone.Identifier | 3 --- src/cairo_jpg.h:Zone.Identifier | 3 --- src/draw.c | 3 ++- src/psprint.c | 35 ++++++++++++++------------------- src/save.c | 10 ++++++++++ src/track_memory.awk | 2 +- src/xschem.h | 1 + 7 files changed, 29 insertions(+), 28 deletions(-) delete mode 100644 src/cairo_jpg.c:Zone.Identifier delete mode 100644 src/cairo_jpg.h:Zone.Identifier diff --git a/src/cairo_jpg.c:Zone.Identifier b/src/cairo_jpg.c:Zone.Identifier deleted file mode 100644 index f03a667c..00000000 --- a/src/cairo_jpg.c:Zone.Identifier +++ /dev/null @@ -1,3 +0,0 @@ -[ZoneTransfer] -ZoneId=3 -HostUrl=https://raw.githubusercontent.com/rahra/cairo_jpg/master/src/cairo_jpg.c diff --git a/src/cairo_jpg.h:Zone.Identifier b/src/cairo_jpg.h:Zone.Identifier deleted file mode 100644 index 96af666e..00000000 --- a/src/cairo_jpg.h:Zone.Identifier +++ /dev/null @@ -1,3 +0,0 @@ -[ZoneTransfer] -ZoneId=3 -HostUrl=https://raw.githubusercontent.com/rahra/cairo_jpg/master/src/cairo_jpg.h diff --git a/src/draw.c b/src/draw.c index 9b93252f..24cb5e06 100644 --- a/src/draw.c +++ b/src/draw.c @@ -3061,7 +3061,7 @@ typedef struct size_t size; } png_to_byte_closure_t; -static cairo_status_t png_reader(void *in_closure, unsigned char *out_data, unsigned int length) +cairo_status_t png_reader(void *in_closure, unsigned char *out_data, unsigned int length) { png_to_byte_closure_t *closure = (png_to_byte_closure_t *) in_closure; if(!closure->buffer) return CAIRO_STATUS_READ_ERROR; @@ -3133,6 +3133,7 @@ void draw_image(int dr, xRect *r, double *x1, double *y1, double *x2, double *y2 if(filter) { size_t filtersize = 0; char *filterdata = NULL; + dbg(1, "draw_image(): filter=%s, image_data=%s\n", filter, attr); closure.buffer = NULL; filterdata = (char *)base64_decode(attr, strlen(attr), &filtersize); filter_data(filterdata, filtersize, (char **)&closure.buffer, &data_size, filter); diff --git a/src/psprint.c b/src/psprint.c index 1d525868..73a84363 100644 --- a/src/psprint.c +++ b/src/psprint.c @@ -25,7 +25,7 @@ #define Y_TO_PS(y) ( (y+xctx->yorigin)* xctx->mooz ) /* FIXME This must be investigated, without some fflushes the ps file is corrupted */ -//#define FFLUSH_PS +#define FFLUSH_PS #if 0 * /* FIXME: overflow check. Not used, BTW */ @@ -108,15 +108,6 @@ typedef struct size_t size; } png_to_byte_closure_t; -cairo_status_t png_reader(void* in_closure, unsigned char* out_data, unsigned int length) -{ - png_to_byte_closure_t* closure = (png_to_byte_closure_t*)in_closure; - if (!closure->buffer) return CAIRO_STATUS_READ_ERROR; - memcpy(out_data, closure->buffer + closure->pos, length); - closure->pos += length; - return CAIRO_STATUS_SUCCESS; -} - unsigned char* bin2hex(const unsigned char* bin, size_t len) { unsigned char* out; @@ -167,16 +158,16 @@ void ps_drawPNG(xRect* r, double x1, double y1, double x2, double y2, int rot, i else { closure.buffer = base64_decode(image_data64_ptr, strlen(image_data64_ptr), &data_size); } - my_free(1663, &filter); + my_free(1664, &filter); my_free(1184, &image_data64_ptr); closure.pos = 0; closure.size = data_size; /* should not be necessary */ surface = cairo_image_surface_create_from_png_stream(png_reader, &closure); - my_free(1666, &closure.buffer); png_size_x = cairo_image_surface_get_width(surface); png_size_y = cairo_image_surface_get_height(surface); cairo_surface_flush(surface); + my_free(1667, &closure.buffer); png_data = cairo_image_surface_get_data(surface); invertImage = !strcmp(get_tok_value(r->prop_ptr, "InvertOnExport", 0), "true"); @@ -192,9 +183,9 @@ void ps_drawPNG(xRect* r, double x1, double y1, double x2, double y2, int rot, i if(invertImage) { - png_data[i + 0] = (0xFF-png_r) + (unsigned char)((double)BG_r * ainv); - png_data[i + 1] = (0xFF-png_g) + (unsigned char)((double)BG_g * ainv); - png_data[i + 2] = (0xFF-png_b) + (unsigned char)((double)BG_b * ainv); + png_data[i + 0] = (unsigned char)(0xFF-png_r) + (unsigned char)((double)BG_r * ainv); + png_data[i + 1] = (unsigned char)(0xFF-png_g) + (unsigned char)((double)BG_g * ainv); + png_data[i + 2] = (unsigned char)(0xFF-png_b) + (unsigned char)((double)BG_b * ainv); png_data[i + 3] = 0xFF; }else { @@ -218,6 +209,7 @@ void ps_drawPNG(xRect* r, double x1, double y1, double x2, double y2, int rot, i * fclose(fp); */ hexEncodedJPG = bin2hex(jpgData, fileSize); + free(jpgData); fprintf(fd, "gsave\n"); fprintf(fd, "%g %g translate\n", X_TO_PS(x1), Y_TO_PS(y1)); if(rot==1) fprintf(fd, "90 rotate\n"); @@ -254,10 +246,11 @@ void ps_drawPNG(xRect* r, double x1, double y1, double x2, double y2, int rot, i fprintf(fd, "3\n"); fprintf(fd, "colorimage\n"); fprintf(fd, "grestore\n"); - - my_free(1663, &hexEncodedJPG); - free(jpgData); + #ifdef FFLUSH_PS /* FIXME: why is this needed? */ fflush(fd); + #endif + cairo_surface_destroy(surface); + my_free(1663, &hexEncodedJPG); } @@ -336,6 +329,7 @@ void ps_embedded_graph(xRect* r, double rx1, double ry1, double rx2, double ry2) */ hexEncodedJPG = bin2hex(jpgData, fileSize); + free(jpgData); cairo_surface_destroy(png_sfc); xctx->draw_pixmap = 1; @@ -365,10 +359,11 @@ void ps_embedded_graph(xRect* r, double rx1, double ry1, double rx2, double ry2) fprintf(fd, "3\n"); fprintf(fd, "colorimage\n"); fprintf(fd, "grestore\n"); - my_free(1666, &hexEncodedJPG); - free(jpgData); + #ifdef FFLUSH_PS /* FIXME: why is this needed? */ fflush(fd); #endif + my_free(1666, &hexEncodedJPG); + #endif } static void set_lw(void) diff --git a/src/save.c b/src/save.c index 69fc40ce..7c15b716 100644 --- a/src/save.c +++ b/src/save.c @@ -54,10 +54,18 @@ int filter_data(const char *din, const size_t ilen, /* child */ close(p1[1]); /* only read from p1 */ close(p2[0]); /* only write to p2 */ + #if 0 + dup2(p1[0],0); /* some systems lack this function */ + #else close(0); /* dup2(p1[0],0); */ /* connect read side of read pipe to stdin */ dup(p1[0]); + #endif + #if 0 + dup2(p2[1],1); /* some systems lack this function */ + #else close(1); /* dup2(p2[1],1); */ /* connect write side of write pipe to stdout */ dup(p2[1]); + #endif /* execlp("gm", "gm", "convert", "-", "-quality", "50", "jpg:-", NULL); */ if(system(cmd)) { fprintf(stderr, "error: conversion failed\n"); @@ -74,6 +82,7 @@ int filter_data(const char *din, const size_t ilen, fprintf(stderr, "filter_data() write to pipe failed or not completed\n"); ret = 1; } + fsync(p1[1]); close(p1[1]); if(!ret) { oalloc = bufsize + 1; /* add extra space for final '\0' */ @@ -81,6 +90,7 @@ int filter_data(const char *din, const size_t ilen, *olen = 0; while( (n = read(p2[0], *dout + *olen, bufsize)) > 0) { *olen += n; + dbg(1, "filter_data(): olen=%d, oalloc=%d\n", *olen, oalloc); if(*olen + bufsize + 1 >= oalloc) { /* allocate for next read */ oalloc = *olen + bufsize + 1; /* add extra space for final '\0' */ oalloc = ((oalloc << 2) + oalloc) >> 2; /* size up 1.25x */ diff --git a/src/track_memory.awk b/src/track_memory.awk index c6643b58..238bae82 100755 --- a/src/track_memory.awk +++ b/src/track_memory.awk @@ -75,7 +75,7 @@ END{ leak+= address[i] print " address[ " i ", " idx[i] " ]= " address[i] if(show_source) { - pipe = "egrep -n 'my_(malloc|calloc|realloc|free|strdup|strdup2)\\(" idx[i] ",' *.c xschem.h" + pipe = "egrep -n '^my_(malloc|calloc|realloc|free|strdup|strdup2)\\(" idx[i] ",' *.c xschem.h" while( pipe | getline a) print " " a close(pipe) } diff --git a/src/xschem.h b/src/xschem.h index b5098626..cdcb4519 100644 --- a/src/xschem.h +++ b/src/xschem.h @@ -1077,6 +1077,7 @@ extern Xschem_ctx *xctx; extern void draw_image(int dr, xRect *r, double *x1, double *y1, double *x2, double *y2, int rot, int flip); extern int filter_data(const char *din, const size_t ilen, char **dout, size_t *olen, const char *cmd); +extern cairo_status_t png_reader(void* in_closure, unsigned char* out_data, unsigned int length); extern int embed_rawfile(const char *rawfile); extern int read_rawfile_from_attr(const char *b64s, size_t length, const char *type); extern int raw_read_from_attr(const char *type);