Check for errors when loading or saving an image with Imlib2.
This relies on the definition of enum _imlib_load_error in Imlib2.h and might break on different versions of Imlib2, but should be better than the total lack of error reporting before. Developed with Imlib2 version 1.4.5 from Debian/Sid: $ dpkg -l libimlib2-dev Desired=Unknown/Install/Remove/Purge/Hold | Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend |/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad) ||/ Name Version Architecture Description +++-==============-============-============-================================= ii libimlib2-dev 1.4.5-1 i386 Imlib2 development files
This commit is contained in:
@@ -1017,6 +1017,7 @@ void save_image(const char *image_type, Imlib_Image *image, const char *fmt,
|
||||
{
|
||||
const char *tmp;
|
||||
Imlib_Image *current_image;
|
||||
Imlib_Load_Error save_error=0;
|
||||
const char *const stdout_file = "/proc/self/fd/1";
|
||||
|
||||
current_image = imlib_context_get_image();
|
||||
@@ -1045,7 +1046,11 @@ void save_image(const char *image_type, Imlib_Image *image, const char *fmt,
|
||||
/* write image to disk */
|
||||
if(flags & VERBOSE)
|
||||
fprintf(stderr, "writing %s image to file %s\n", image_type, filename);
|
||||
imlib_save_image(filename);
|
||||
imlib_save_image_with_error_return(filename, &save_error);
|
||||
if(save_error && save_error != IMLIB_LOAD_ERROR_NONE) {
|
||||
fprintf(stderr, "error saving image file %s\n", filename);
|
||||
report_imlib_error(save_error);
|
||||
}
|
||||
imlib_context_set_image(current_image);
|
||||
}
|
||||
|
||||
@@ -1075,3 +1080,59 @@ luminance_t parse_lum(char *keyword)
|
||||
return DEFAULT_LUM_FORMULA;
|
||||
}
|
||||
}
|
||||
|
||||
/* report Imlib2 load/save error to stderr */
|
||||
void report_imlib_error(Imlib_Load_Error error)
|
||||
{
|
||||
fputs(" Imlib2 error code: ",stderr);
|
||||
switch (error) {
|
||||
case IMLIB_LOAD_ERROR_NONE:
|
||||
fputs("IMLIB_LOAD_ERROR_NONE\n", stderr);
|
||||
break;
|
||||
case IMLIB_LOAD_ERROR_FILE_DOES_NOT_EXIST:
|
||||
fputs("IMLIB_LOAD_ERROR_FILE_DOES_NOT_EXIST\n", stderr);
|
||||
break;
|
||||
case IMLIB_LOAD_ERROR_FILE_IS_DIRECTORY:
|
||||
fputs("IMLIB_LOAD_ERROR_FILE_IS_DIRECTORY\n", stderr);
|
||||
break;
|
||||
case IMLIB_LOAD_ERROR_PERMISSION_DENIED_TO_READ:
|
||||
fputs("IMLIB_LOAD_ERROR_PERMISSION_DENIED_TO_READ\n", stderr);
|
||||
break;
|
||||
case IMLIB_LOAD_ERROR_NO_LOADER_FOR_FILE_FORMAT:
|
||||
fputs("IMLIB_LOAD_ERROR_NO_LOADER_FOR_FILE_FORMAT\n", stderr);
|
||||
break;
|
||||
case IMLIB_LOAD_ERROR_PATH_TOO_LONG:
|
||||
fputs("IMLIB_LOAD_ERROR_PATH_TOO_LONG\n", stderr);
|
||||
break;
|
||||
case IMLIB_LOAD_ERROR_PATH_COMPONENT_NON_EXISTANT:
|
||||
fputs("IMLIB_LOAD_ERROR_PATH_COMPONENT_NON_EXISTANT\n", stderr);
|
||||
break;
|
||||
case IMLIB_LOAD_ERROR_PATH_COMPONENT_NOT_DIRECTORY:
|
||||
fputs("IMLIB_LOAD_ERROR_PATH_COMPONENT_NOT_DIRECTORY\n", stderr);
|
||||
break;
|
||||
case IMLIB_LOAD_ERROR_PATH_POINTS_OUTSIDE_ADDRESS_SPACE:
|
||||
fputs("IMLIB_LOAD_ERROR_PATH_POINTS_OUTSIDE_ADDRESS_SPACE\n", stderr);
|
||||
break;
|
||||
case IMLIB_LOAD_ERROR_TOO_MANY_SYMBOLIC_LINKS:
|
||||
fputs("IMLIB_LOAD_ERROR_TOO_MANY_SYMBOLIC_LINKS\n", stderr);
|
||||
break;
|
||||
case IMLIB_LOAD_ERROR_OUT_OF_MEMORY:
|
||||
fputs("IMLIB_LOAD_ERROR_OUT_OF_MEMORY\n", stderr);
|
||||
break;
|
||||
case IMLIB_LOAD_ERROR_OUT_OF_FILE_DESCRIPTORS:
|
||||
fputs("IMLIB_LOAD_ERROR_OUT_OF_FILE_DESCRIPTORS\n", stderr);
|
||||
break;
|
||||
case IMLIB_LOAD_ERROR_PERMISSION_DENIED_TO_WRITE:
|
||||
fputs("IMLIB_LOAD_ERROR_PERMISSION_DENIED_TO_WRITE\n", stderr);
|
||||
break;
|
||||
case IMLIB_LOAD_ERROR_OUT_OF_DISK_SPACE:
|
||||
fputs("IMLIB_LOAD_ERROR_OUT_OF_DISK_SPACE\n", stderr);
|
||||
break;
|
||||
case IMLIB_LOAD_ERROR_UNKNOWN:
|
||||
fputs("IMLIB_LOAD_ERROR_UNKNOWN\n", stderr);
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "unknown error code %d, please report\n", error);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -171,4 +171,7 @@ int clip(int value, int min, int max);
|
||||
void save_image(const char *image_type, Imlib_Image *image, const char *fmt,
|
||||
const char *filename, int flags);
|
||||
|
||||
/* report Imlib2 load/save error to stderr */
|
||||
void report_imlib_error(Imlib_Load_Error error);
|
||||
|
||||
#endif /* SSOCR2_IMGPROC_H */
|
||||
|
||||
@@ -113,6 +113,7 @@ int main(int argc, char **argv)
|
||||
Imlib_Image image=NULL; /* an image handle */
|
||||
Imlib_Image new_image=NULL; /* a temporary image handle */
|
||||
Imlib_Image debug_image=NULL; /* DEBUG */
|
||||
Imlib_Load_Error load_error=0; /* save Imlib2 error code on image I/O*/
|
||||
char *imgfile=NULL; /* filename of image file */
|
||||
int use_tmpfile=0; /* flag to know if temporary image file is used */
|
||||
|
||||
@@ -379,7 +380,7 @@ int main(int argc, char **argv)
|
||||
if(flags & VERBOSE) {
|
||||
fprintf(stderr, "loading image %s\n", imgfile);
|
||||
}
|
||||
image = imlib_load_image_immediately_without_cache(imgfile);
|
||||
image = imlib_load_image_with_error_return(imgfile, &load_error);
|
||||
if(use_tmpfile) {
|
||||
if(flags & VERBOSE)
|
||||
fprintf(stderr, "removing temporary image file %s\n", imgfile);
|
||||
@@ -389,6 +390,7 @@ int main(int argc, char **argv)
|
||||
}
|
||||
if(!image) {
|
||||
fprintf(stderr, "could not load image %s\n", imgfile);
|
||||
report_imlib_error(load_error);
|
||||
exit(99);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user