i_push_errorvf(0, fmt, ap);
}
+#define WARN_BUFFER_LIMIT 10000
+static char *warn_buffer = NULL;
+static int warn_buffer_size = 0;
+
static void warn_handler(char const *module, char const *fmt, va_list ap) {
- /* for now do nothing, perhaps we could warn(), though that should be
- done in the XS code, not in the code which isn't mean to know perl
- exists ;) */
+ char buf[1000];
+
+ buf[0] = '\0';
+#ifdef HAVE_SNPRINTF
+ vsnprintf(buf, sizeof(buf), fmt, ap);
+#else
+ vsprintf(buf, fmt, ap);
+#endif
+ if (!warn_buffer || strlen(warn_buffer)+strlen(buf)+2 > warn_buffer_size) {
+ int new_size = warn_buffer_size + strlen(buf) + 2;
+ char *old_buffer = warn_buffer;
+ if (new_size > WARN_BUFFER_LIMIT) {
+ new_size = WARN_BUFFER_LIMIT;
+ }
+ warn_buffer = myrealloc(warn_buffer, new_size);
+ if (!old_buffer) *warn_buffer = '\0';
+ warn_buffer_size = new_size;
+ }
+ if (strlen(warn_buffer)+strlen(buf)+2 <= warn_buffer_size) {
+ strcat(warn_buffer, buf);
+ strcat(warn_buffer, "\n");
+ }
}
static int save_tiff_tags(TIFF *tif, i_img *im);
xres = yres;
else if (!gotYres)
yres = xres;
+ i_tags_addn(&im->tags, "tiff_resolutionunit", 0, resunit);
if (resunit == RESUNIT_CENTIMETER) {
/* from dots per cm to dpi */
xres *= 2.54;
yres *= 2.54;
+ i_tags_add(&im->tags, "tiff_resolutionunit_name", 0, "centimeter", -1, 0);
}
- i_tags_addn(&im->tags, "tiff_resolutionunit", 0, resunit);
- if (resunit == RESUNIT_NONE)
+ else if (resunit == RESUNIT_NONE) {
i_tags_addn(&im->tags, "i_aspect_only", 0, 1);
- i_tags_set_float(&im->tags, "i_xres", 0, xres);
- i_tags_set_float(&im->tags, "i_yres", 0, yres);
+ i_tags_add(&im->tags, "tiff_resolutionunit_name", 0, "none", -1, 0);
+ }
+ else if (resunit == RESUNIT_INCH) {
+ i_tags_add(&im->tags, "tiff_resolutionunit_name", 0, "inch", -1, 0);
+ }
+ else {
+ i_tags_add(&im->tags, "tiff_resolutionunit_name", 0, "unknown", -1, 0);
+ }
+ /* tifflib doesn't seem to provide a way to get to the original rational
+ value of these, which would let me provide a more reasonable
+ precision. So make up a number. */
+ i_tags_set_float2(&im->tags, "i_xres", 0, xres, 6);
+ i_tags_set_float2(&im->tags, "i_yres", 0, yres, 6);
}
/* Text tags */
}
i_tags_add(&im->tags, "i_format", 0, "tiff", -1, 0);
+ if (warn_buffer && *warn_buffer) {
+ i_tags_add(&im->tags, "i_warning", 0, warn_buffer, -1, 0);
+ *warn_buffer = '\0';
+ }
/* TIFFPrintDirectory(tif, stdout, 0); good for debugging */
i_clear_error();
old_handler = TIFFSetErrorHandler(error_handler);
old_warn_handler = TIFFSetWarningHandler(warn_handler);
+ if (warn_buffer)
+ *warn_buffer = '\0';
/* Add code to get the filename info from the iolayer */
/* Also add code to check for mmapped code */
i_clear_error();
old_handler = TIFFSetErrorHandler(error_handler);
old_warn_handler = TIFFSetWarningHandler(warn_handler);
+ if (warn_buffer)
+ *warn_buffer = '\0';
/* Add code to get the filename info from the iolayer */
/* Also add code to check for mmapped code */