#!perl -w
-print "1..72\n";
+print "1..74\n";
use Imager qw(:all);
$^W=1; # warnings during command-line tests
$|=1; # give us some progress in the test harness
my $test_num;
if (!i_has_format("tiff")) {
- for (1..72) {
+ for (1..74) {
print "ok $_ # skip no tiff support\n";
}
} else {
my ($format) = $imgs[0]->tags(name=>'i_format');
ok(defined $format && $format eq 'tiff', "check i_format tag");
+
+ my $warned = Imager->new;
+ ok($warned->read(file=>"testimg/tiffwarn.tif"), "read tiffwarn.tif");
+ my ($warning) = $warned->tags(name=>'i_warning');
+ ok(defined $warning && $warning =~ /unknown field with tag 28712/,
+ "check that warning tag set and correct");
}
sub ok {
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);
}
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 */