Start introducing some meaningful TIFF/FX stuff

This commit is contained in:
Steve Underwood 2012-09-02 22:10:04 +08:00
parent 01646651ab
commit cbb28e2ae0

View File

@ -81,6 +81,10 @@
/*! The number of centimetres in one inch */ /*! The number of centimetres in one inch */
#define CM_PER_INCH 2.54f #define CM_PER_INCH 2.54f
#if defined(SPANDSP_SUPPORT_TIFF_FX)
extern TIFFFieldArray tiff_fx_field_array;
#endif
SPAN_DECLARE(const char *) t4_encoding_to_str(int encoding) SPAN_DECLARE(const char *) t4_encoding_to_str(int encoding)
{ {
switch (encoding) switch (encoding)
@ -126,17 +130,20 @@ static int set_tiff_directory_info(t4_rx_state_t *s)
/* Prepare the directory entry fully before writing the image, or libtiff complains */ /* Prepare the directory entry fully before writing the image, or libtiff complains */
switch (t->output_encoding) switch (t->output_encoding)
{ {
case T4_COMPRESSION_ITU_T6: case T4_COMPRESSION_ITU_T4_1D:
output_compression = COMPRESSION_CCITT_T6; default:
output_t4_options = 0; output_compression = COMPRESSION_CCITT_T4;
output_t4_options = GROUP3OPT_FILLBITS;
break; break;
case T4_COMPRESSION_ITU_T4_2D: case T4_COMPRESSION_ITU_T4_2D:
output_compression = COMPRESSION_CCITT_T4; output_compression = COMPRESSION_CCITT_T4;
output_t4_options = GROUP3OPT_FILLBITS | GROUP3OPT_2DENCODING; output_t4_options = GROUP3OPT_FILLBITS | GROUP3OPT_2DENCODING;
break; break;
default: case T4_COMPRESSION_ITU_T6:
output_compression = COMPRESSION_CCITT_T4; output_compression = COMPRESSION_CCITT_T6;
output_t4_options = GROUP3OPT_FILLBITS; break;
case T4_COMPRESSION_ITU_T85:
output_compression = COMPRESSION_T85;
break; break;
} }
@ -146,10 +153,21 @@ static int set_tiff_directory_info(t4_rx_state_t *s)
case COMPRESSION_CCITT_T4: case COMPRESSION_CCITT_T4:
TIFFSetField(t->tiff_file, TIFFTAG_T4OPTIONS, output_t4_options); TIFFSetField(t->tiff_file, TIFFTAG_T4OPTIONS, output_t4_options);
TIFFSetField(t->tiff_file, TIFFTAG_FAXMODE, FAXMODE_CLASSF); TIFFSetField(t->tiff_file, TIFFTAG_FAXMODE, FAXMODE_CLASSF);
TIFFSetField(t->tiff_file, TIFFTAG_ROWSPERSTRIP, -1L);
break; break;
case COMPRESSION_CCITT_T6: case COMPRESSION_CCITT_T6:
TIFFSetField(t->tiff_file, TIFFTAG_T6OPTIONS, 0); TIFFSetField(t->tiff_file, TIFFTAG_T6OPTIONS, 0);
TIFFSetField(t->tiff_file, TIFFTAG_FAXMODE, FAXMODE_CLASSF); TIFFSetField(t->tiff_file, TIFFTAG_FAXMODE, FAXMODE_CLASSF);
TIFFSetField(t->tiff_file, TIFFTAG_ROWSPERSTRIP, -1L);
break;
case COMPRESSION_T85:
TIFFSetField(t->tiff_file, TIFFTAG_FAXMODE, FAXMODE_CLASSF);
TIFFSetField(t->tiff_file, TIFFTAG_ROWSPERSTRIP, -1L);
break;
default:
TIFFSetField(t->tiff_file,
TIFFTAG_ROWSPERSTRIP,
TIFFDefaultStripSize(t->tiff_file, 0));
break; break;
} }
#if defined(SPANDSP_SUPPORT_TIFF_FX) #if defined(SPANDSP_SUPPORT_TIFF_FX)
@ -162,21 +180,10 @@ static int set_tiff_directory_info(t4_rx_state_t *s)
TIFFSetField(t->tiff_file, TIFFTAG_BITSPERSAMPLE, 1); TIFFSetField(t->tiff_file, TIFFTAG_BITSPERSAMPLE, 1);
TIFFSetField(t->tiff_file, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); TIFFSetField(t->tiff_file, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
TIFFSetField(t->tiff_file, TIFFTAG_SAMPLESPERPIXEL, 1); TIFFSetField(t->tiff_file, TIFFTAG_SAMPLESPERPIXEL, 1);
if (output_compression == COMPRESSION_CCITT_T4
||
output_compression == COMPRESSION_CCITT_T6)
{
TIFFSetField(t->tiff_file, TIFFTAG_ROWSPERSTRIP, -1L);
}
else
{
TIFFSetField(t->tiff_file,
TIFFTAG_ROWSPERSTRIP,
TIFFDefaultStripSize(t->tiff_file, 0));
}
TIFFSetField(t->tiff_file, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(t->tiff_file, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
TIFFSetField(t->tiff_file, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISWHITE); TIFFSetField(t->tiff_file, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISWHITE);
TIFFSetField(t->tiff_file, TIFFTAG_FILLORDER, FILLORDER_LSB2MSB); TIFFSetField(t->tiff_file, TIFFTAG_FILLORDER, FILLORDER_LSB2MSB);
/* TIFFTAG_STRIPBYTECOUNTS and TIFFTAG_STRIPOFFSETS are added automatically */
x_resolution = s->metadata.x_resolution/100.0f; x_resolution = s->metadata.x_resolution/100.0f;
y_resolution = s->metadata.y_resolution/100.0f; y_resolution = s->metadata.y_resolution/100.0f;
@ -266,6 +273,13 @@ static int set_tiff_directory_info(t4_rx_state_t *s)
TIFFSetField(t->tiff_file, TIFFTAG_IMAGELENGTH, t85_decode_get_image_length(&s->decoder.t85)); TIFFSetField(t->tiff_file, TIFFTAG_IMAGELENGTH, t85_decode_get_image_length(&s->decoder.t85));
break; break;
} }
#if defined(SPANDSP_SUPPORT_TIFF_FX)
if (s->current_page == 0)
{
/* Create a placeholder for the global parameters IFD, to be filled in later */
TIFFSetField(t->tiff_file, TIFFTAG_GLOBALPARAMETERSIFD, 0);
}
#endif
return 0; return 0;
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
@ -280,15 +294,45 @@ static int open_tiff_output_file(t4_rx_state_t *s, const char *file)
static int write_tiff_image(t4_rx_state_t *s) static int write_tiff_image(t4_rx_state_t *s)
{ {
if (s->tiff.image_buffer == NULL || s->tiff.image_size <= 0) t4_rx_tiff_state_t *t;
#if defined(SPANDSP_SUPPORT_TIFF_FX)
uint64_t offset;
#endif
t = &s->tiff;
if (t->image_buffer == NULL || t->image_size <= 0)
return -1; return -1;
/* Set up the TIFF directory info... */ /* Set up the TIFF directory info... */
set_tiff_directory_info(s); set_tiff_directory_info(s);
/* ...and then write the image... */ /* ...and then write the image... */
if (TIFFWriteEncodedStrip(s->tiff.tiff_file, 0, s->tiff.image_buffer, s->tiff.image_size) < 0) if (TIFFWriteEncodedStrip(t->tiff_file, 0, t->image_buffer, t->image_size) < 0)
span_log(&s->logging, SPAN_LOG_WARNING, "%s: Error writing TIFF strip.\n", s->tiff.file); span_log(&s->logging, SPAN_LOG_WARNING, "%s: Error writing TIFF strip.\n", t->file);
/* ...then the directory entry, and libtiff is happy. */ /* ...then the directory entry, and libtiff is happy. */
TIFFWriteDirectory(s->tiff.tiff_file); if (!TIFFWriteDirectory(t->tiff_file))
span_log(&s->logging, SPAN_LOG_WARNING, "%s: Failed to write directory for page %d.\n", t->file, s->current_page);
#if defined(SPANDSP_SUPPORT_TIFF_FX)
if (s->current_page == 0)
{
if (!TIFFCreateCustomDirectory(t->tiff_file, &tiff_fx_field_array))
{
TIFFSetField(t->tiff_file, TIFFTAG_FAXPROFILE, PROFILETYPE_G3_FAX);
TIFFSetField(t->tiff_file, TIFFTAG_PROFILETYPE, FAXPROFILE_S);
TIFFSetField(t->tiff_file, TIFFTAG_VERSIONYEAR, "1998");
offset = 0;
if (!TIFFWriteCustomDirectory(t->tiff_file, &offset))
printf("Failed to write custom directory.\n");
/* Now go back and patch in the pointer to the new IFD */
if (!TIFFSetDirectory(t->tiff_file, s->current_page))
printf("Failed to set directory.\n");
if (!TIFFSetField(t->tiff_file, TIFFTAG_GLOBALPARAMETERSIFD, offset))
printf("Failed to set field.\n");
if (!TIFFWriteDirectory(t->tiff_file))
span_log(&s->logging, SPAN_LOG_WARNING, "%s: Failed to write directory for page %d.\n", t->file, s->current_page);
}
}
#endif
return 0; return 0;
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
@ -308,9 +352,11 @@ static int close_tiff_output_file(t4_rx_state_t *s)
need to set the correct total page count associated with each page. */ need to set the correct total page count associated with each page. */
for (i = 0; i < s->current_page; i++) for (i = 0; i < s->current_page; i++)
{ {
TIFFSetDirectory(t->tiff_file, (tdir_t) i); if (!TIFFSetDirectory(t->tiff_file, (tdir_t) i))
span_log(&s->logging, SPAN_LOG_WARNING, "%s: Failed to set directory to page %d.\n", s->tiff.file, i);
TIFFSetField(t->tiff_file, TIFFTAG_PAGENUMBER, i, s->current_page); TIFFSetField(t->tiff_file, TIFFTAG_PAGENUMBER, i, s->current_page);
TIFFWriteDirectory(t->tiff_file); if (!TIFFWriteDirectory(t->tiff_file))
span_log(&s->logging, SPAN_LOG_WARNING, "%s: Failed to write directory for page %d.\n", s->tiff.file, i);
} }
} }
TIFFClose(t->tiff_file); TIFFClose(t->tiff_file);