diff --git a/doc/xschem_man/install_xschem.html b/doc/xschem_man/install_xschem.html index d0cf6ab7..89ffc4ec 100644 --- a/doc/xschem_man/install_xschem.html +++ b/doc/xschem_man/install_xschem.html @@ -65,15 +65,18 @@ p{padding: 15px 30px 10px;} Tck/Tk versions may vary on different systems, 8.4, 8.5, 8.6 versions are all good.
- libx11-6 libx11-dev
- libxrender1 libxrender-dev
- libxcb1 libx11-xcb-dev
- libcairo2 libcairo2-dev
- tcl8.6 tcl8.6-dev
- tk8.6 tk8.6-dev
- flex bison
- libxpm4 libxpm-dev
- libjpeg-dev
+ LIBRARIES DEVELOPMENT FILES
+-----------------------------------------------------------
+ libx11-6 libx11-dev
+ libxrender1 libxrender-dev
+ libxcb1 libx11-xcb-dev
+ libcairo2 libcairo2-dev
+ tcl8.6 tcl8.6-dev
+ tk8.6 tk8.6-dev
+ flex bison
+ libxpm4 libxpm-dev
+ libjpeg62-turbo or libjpeg libjpeg-dev
+
# terminal program and editor used by default by xschem:
# alternative programs can be specified in xschemrc by
# setting tcl variables 'terminal' and 'editor', respectively.
diff --git a/src/draw.c b/src/draw.c
index 02dc9386..4f7c20cb 100644
--- a/src/draw.c
+++ b/src/draw.c
@@ -3910,8 +3910,10 @@ void inspect_image(cairo_surface_t* surface)
*/
void draw_image(int dr, xRect *r, double *x1, double *y1, double *x2, double *y2, int rot, int flip)
{
- #if HAS_CAIRO == 1
+ #if HAS_CAIRO==1
+ #if defined(HAS_LIBJPEG)
int jpeg_quality=75;
+ #endif
const char *ptr;
int w,h;
double x, y, rw, rh;
@@ -3944,9 +3946,11 @@ void draw_image(int dr, xRect *r, double *x1, double *y1, double *x2, double *y2
}
my_strncpy(filename, get_tok_value(r->prop_ptr, "image", 0), S(filename));
my_strdup(_ALLOC_ID_, &filter, get_tok_value(r->prop_ptr, "filter", 0));
+ #if defined(HAS_LIBJPEG)
ptr = get_tok_value(r->prop_ptr, "quality", 0);
jpeg_quality = 75;
if(ptr[0]) jpeg_quality = atoi(ptr);
+ #endif
/* read image from in-memory buffer ... */
if(emb_ptr && emb_ptr->image) {
; /* nothing to do, image is already created */
@@ -3962,7 +3966,9 @@ void draw_image(int dr, xRect *r, double *x1, double *y1, double *x2, double *y2
if(jpg == 0) {
emb_ptr->image = cairo_image_surface_create_from_png_stream(png_reader, &closure);
} else if(jpg == 1) {
+ #if defined(HAS_LIBJPEG)
emb_ptr->image = cairo_image_surface_create_from_jpeg_mem(closure.buffer, closure.size);
+ #endif
}
if(! emb_ptr->image || cairo_surface_status(emb_ptr->image) != CAIRO_STATUS_SUCCESS) {
dbg(0, "draw_image(): failure creating image surface from \"image_data\" attribute\n");
@@ -3988,8 +3994,12 @@ void draw_image(int dr, xRect *r, double *x1, double *y1, double *x2, double *y2
if(filesize) {
fd = fopen(filename, "r");
if(fd) {
+ size_t bytes_read;
filedata = my_malloc(_ALLOC_ID_, filesize);
- fread(filedata, filesize, 1, fd);
+ if((bytes_read = fread(filedata, filesize, 1, fd)) < filesize) {
+ filesize = bytes_read;
+ dbg(0, "draw_image(): less bytes read than expected from %s, got %ld bytes\n", filename, bytes_read);
+ }
fclose(fd);
}
}
@@ -4003,7 +4013,9 @@ void draw_image(int dr, xRect *r, double *x1, double *y1, double *x2, double *y2
if(jpg == 0) {
emb_ptr->image = cairo_image_surface_create_from_png_stream(png_reader, &closure);
} else if(jpg == 1) {
+ #if defined(HAS_LIBJPEG)
emb_ptr->image = cairo_image_surface_create_from_jpeg_mem(closure.buffer, closure.size);
+ #endif
}
if(! emb_ptr->image || cairo_surface_status(emb_ptr->image) != CAIRO_STATUS_SUCCESS) {
dbg(0, "draw_image(): failure creating image surface with filtered data from %s\n", filename);
@@ -4022,7 +4034,12 @@ void draw_image(int dr, xRect *r, double *x1, double *y1, double *x2, double *y2
header[0] = '\0';
fd = fopen(filename, "r");
if(fd) {
- fread(header, size, 1, fd);
+ size_t bytes_read;
+ if((bytes_read = fread(header, size, 1, fd)) < size) {
+ size = bytes_read;
+ dbg(0, "draw_image(): less bytes read than expected from %s, got %ld bytes\n", filename, bytes_read);
+ }
+
fclose(fd);
}
if(!strncmp(header, "\x89PNG", 4)) jpg = 0;
@@ -4034,7 +4051,9 @@ void draw_image(int dr, xRect *r, double *x1, double *y1, double *x2, double *y2
if(jpg == 0) {
emb_ptr->image = cairo_image_surface_create_from_png(filename);
} else if(jpg == 1) {
+ #if defined(HAS_LIBJPEG)
emb_ptr->image = cairo_image_surface_create_from_jpeg(filename);
+ #endif
}
if(! emb_ptr->image || cairo_surface_status(emb_ptr->image) != CAIRO_STATUS_SUCCESS) {
dbg(0, "draw_image(): failure creating image surface from %s\n", filename);
@@ -4046,7 +4065,9 @@ void draw_image(int dr, xRect *r, double *x1, double *y1, double *x2, double *y2
cairo_surface_write_to_png_stream(emb_ptr->image, png_writer, &closure);
} else if(jpg == 1) {
/* write JPG to in-memory buffer */
+ #if defined(HAS_LIBJPEG)
cairo_image_surface_write_to_jpeg_mem(emb_ptr->image, &closure.buffer, &closure.pos, jpeg_quality);
+ #endif
}
encoded_data = base64_encode(closure.buffer, closure.pos, &olength, 0);
my_free(_ALLOC_ID_, &closure.buffer);
diff --git a/src/main.c b/src/main.c
index 3f284a7c..f89c116f 100644
--- a/src/main.c
+++ b/src/main.c
@@ -73,6 +73,7 @@ static void child_handler(int signum)
int main(int argc, char **argv)
{
int i;
+ FILE *retval = 0;
#ifdef __unix__
int stdin_is_a_fifo = 0;
struct stat statbuf;
@@ -137,8 +138,10 @@ int main(int argc, char **argv)
if(cli_opt_detach) {
fclose(stdin);
#ifdef __unix__
- freopen("/dev/null", "w", stdout);
- freopen("/dev/null", "w", stderr);
+ retval = freopen("/dev/null", "w", stdout);
+ if(!retval) fprintf(stderr, "main(): freopen stdout to /dev/null failed\n");
+ retval = freopen("/dev/null", "w", stderr);
+ if(!retval) fprintf(stderr, "main(): freopen stderr to /dev/null failed\n");
#else
freopen("nul", "w", stdout);
freopen("nul", "w", stderr);
diff --git a/src/save.c b/src/save.c
index 14439e35..c25f0de5 100644
--- a/src/save.c
+++ b/src/save.c
@@ -76,8 +76,8 @@ int filter_data(const char *din, const size_t ilen,
}
dbg(1, "filter_data(): ilen=%ld, cmd=%s\n", ilen, cmd);
- pipe(p1);
- pipe(p2);
+ if(pipe(p1) == -1) dbg(0, "filter_data(): pipe creation failed\n");
+ if(pipe(p2) == -1) dbg(0, "filter_data(): pipe creation failed\n");
dbg(1, "p1[0] = %d\n", p1[0]);
dbg(1, "p1[1] = %d\n", p1[1]);
@@ -104,10 +104,10 @@ int filter_data(const char *din, const size_t ilen,
close(p1[1]); /* only read from p1 */
close(p2[0]); /* only write to p2 */
close(0); /* dup2(p1[0],0); */ /* connect read side of read pipe to stdin */
- dup(p1[0]);
+ if(dup(p1[0]) == -1) dbg(0, "filter_data(): dup() call failed\n");
close(p1[0]);
close(1); /* dup2(p2[1],1); */ /* connect write side of write pipe to stdout */
- dup(p2[1]);
+ if(dup(p2[1]) == -1) dbg(0, "filter_data(): dup() call failed\n");
close(p2[1]);
#if 1
@@ -775,8 +775,11 @@ char *base64_from_file(const char *f, size_t *length)
len = st.st_size;
fd = fopen(f, fopen_read_mode);
if(fd) {
+ size_t bytes_read;
s = my_malloc(_ALLOC_ID_, len);
- fread(s, len, 1, fd);
+ if((bytes_read = fread(s, len, 1, fd)) < len) {
+ dbg(0, "base64_from_file(): less bytes FROM %S, got %ld bytes\n", f, bytes_read);
+ }
fclose(fd);
b64s = base64_encode(s, len, length, 1);
my_free(_ALLOC_ID_, &s);