use cairo_image_surface_write_to_jpeg_mem() instead of cairo_image_surface_write_to_jpeg(), avoid temp files

This commit is contained in:
stefan schippers 2023-01-16 16:31:18 +01:00
parent 2ea5c7af04
commit 9a59679dcf
1 changed files with 41 additions and 32 deletions

View File

@ -141,13 +141,15 @@ void ps_drawPNG(xRect* r, double x1, double y1, double x2, double y2)
int png_size_x, png_size_y; int png_size_x, png_size_y;
unsigned char *png_data, BG_r, BG_g, BG_b; unsigned char *png_data, BG_r, BG_g, BG_b;
const char *invertImage; const char *invertImage;
static char str[PATH_MAX]; /* static char str[PATH_MAX];
unsigned char* jpgData; * FILE* fp;
FILE* fp; */
unsigned char* hexEncodedJPG; unsigned char* hexEncodedJPG;
long fileSize;
const char* image_data64_ptr; const char* image_data64_ptr;
cairo_surface_t* surface; cairo_surface_t* surface;
unsigned char* jpgData = NULL;
size_t fileSize = 0;
my_strdup(59, &filter, get_tok_value(r->prop_ptr, "filter", 0)); my_strdup(59, &filter, get_tok_value(r->prop_ptr, "filter", 0));
image_data64_ptr = get_tok_value(r->prop_ptr, "image_data", 0); image_data64_ptr = get_tok_value(r->prop_ptr, "image_data", 0);
@ -166,7 +168,7 @@ void ps_drawPNG(xRect* r, double x1, double y1, double x2, double y2)
closure.pos = 0; closure.pos = 0;
closure.size = data_size; /* should not be necessary */ closure.size = data_size; /* should not be necessary */
surface = cairo_image_surface_create_from_png_stream(png_reader, &closure); 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_x = cairo_image_surface_get_width(surface);
png_size_y = cairo_image_surface_get_height(surface); png_size_y = cairo_image_surface_get_height(surface);
@ -202,18 +204,19 @@ void ps_drawPNG(xRect* r, double x1, double y1, double x2, double y2)
} }
} }
cairo_surface_mark_dirty(surface); cairo_surface_mark_dirty(surface);
my_snprintf(str, S(str), "%s%s", tclgetvar("XSCHEM_TMP_DIR"), "/temp.jpg"); cairo_image_surface_write_to_jpeg_mem(surface, &jpgData, &fileSize, 100);
cairo_image_surface_write_to_jpeg(surface, str, 100); /*
fp = fopen(str, "rb"); /* Open the file for reading */ * my_snprintf(str, S(str), "%s%s", tclgetvar("XSCHEM_TMP_DIR"), "/temp.jpg");
fseek(fp, 0L, SEEK_END); * cairo_image_surface_write_to_jpeg(surface, str, 100);
fileSize = ftell(fp); * fp = fopen(str, "rb");
rewind(fp); * fseek(fp, 0L, SEEK_END);
jpgData = my_malloc(1662, fileSize); * fileSize = ftell(fp);
fread(jpgData, sizeof(jpgData[0]), fileSize, fp); * rewind(fp);
fclose(fp); * jpgData = my_malloc(1662, fileSize);
* fread(jpgData, sizeof(jpgData[0]), fileSize, fp);
* fclose(fp);
*/
hexEncodedJPG = bin2hex(jpgData, fileSize); hexEncodedJPG = bin2hex(jpgData, fileSize);
fprintf(fd, "gsave\n"); fprintf(fd, "gsave\n");
fprintf(fd, "%g %g translate\n", X_TO_PS(x1), Y_TO_PS(y1)); fprintf(fd, "%g %g translate\n", X_TO_PS(x1), Y_TO_PS(y1));
fprintf(fd, "%g %g scale\n", X_TO_PS(x2) - X_TO_PS(x1), Y_TO_PS(y2) - Y_TO_PS(y1)); fprintf(fd, "%g %g scale\n", X_TO_PS(x2) - X_TO_PS(x1), Y_TO_PS(y2) - Y_TO_PS(y1));
@ -231,7 +234,8 @@ void ps_drawPNG(xRect* r, double x1, double y1, double x2, double y2)
fprintf(fd, "3\n"); fprintf(fd, "3\n");
fprintf(fd, "colorimage\n"); fprintf(fd, "colorimage\n");
fprintf(fd, "grestore\n"); fprintf(fd, "grestore\n");
my_free(1663, &hexEncodedJPG); my_free(1664, &jpgData); my_free(1663, &hexEncodedJPG);
free(jpgData);
} }
@ -243,10 +247,12 @@ void ps_embedded_graph(xRect* r, double rx1, double ry1, double rx2, double ry2)
int save_draw_window, save_draw_grid, rwi, rhi; int save_draw_window, save_draw_grid, rwi, rhi;
const double max_size = 2000.0; const double max_size = 2000.0;
int d_c; int d_c;
static char str[PATH_MAX]; unsigned char* jpgData = NULL;
unsigned char* jpgData; size_t fileSize = 0;
FILE* fp; /*
long fileSize; * FILE* fp;
* static char str[PATH_MAX];
*/
unsigned char *hexEncodedJPG; unsigned char *hexEncodedJPG;
if (!has_x) return; if (!has_x) return;
rw = fabs(rx2 - rx1); rw = fabs(rx2 - rx1);
@ -294,16 +300,18 @@ void ps_embedded_graph(xRect* r, double rx1, double ry1, double rx2, double ry2)
} }
} }
#endif #endif
my_snprintf(str, S(str), "%s%s", tclgetvar("XSCHEM_TMP_DIR"), "/temp.jpg"); cairo_image_surface_write_to_jpeg_mem(png_sfc, &jpgData, &fileSize, 100);
cairo_image_surface_write_to_jpeg(png_sfc, str, 100); /*
* my_snprintf(str, S(str), "%s%s", tclgetvar("XSCHEM_TMP_DIR"), "/temp.jpg");
fp = fopen(str, "rb"); * cairo_image_surface_write_to_jpeg(png_sfc, str, 100);
fseek(fp, 0L, SEEK_END); * fp = fopen(str, "rb");
fileSize = ftell(fp); * fseek(fp, 0L, SEEK_END);
rewind(fp); * fileSize = ftell(fp);
jpgData = my_malloc(1668, fileSize); * rewind(fp);
fread(jpgData, sizeof(jpgData[0]), fileSize, fp); * jpgData = my_malloc(1668, fileSize);
fclose(fp); * fread(jpgData, sizeof(jpgData[0]), fileSize, fp);
* fclose(fp);
*/
hexEncodedJPG = bin2hex(jpgData, fileSize); hexEncodedJPG = bin2hex(jpgData, fileSize);
@ -335,7 +343,8 @@ void ps_embedded_graph(xRect* r, double rx1, double ry1, double rx2, double ry2)
fprintf(fd, "3\n"); fprintf(fd, "3\n");
fprintf(fd, "colorimage\n"); fprintf(fd, "colorimage\n");
fprintf(fd, "grestore\n"); fprintf(fd, "grestore\n");
my_free(1666, &hexEncodedJPG); my_free(1667, &jpgData); my_free(1666, &hexEncodedJPG);
free(jpgData);
#endif #endif
} }
static void set_lw(void) static void set_lw(void)