TIFF: add support for our private tag
This commit is contained in:
parent
2dfb5cafe1
commit
75a22eeced
@ -40,6 +40,26 @@
|
|||||||
#include "loadsave.h"
|
#include "loadsave.h"
|
||||||
#include "gfx2log.h"
|
#include "gfx2log.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup TIFF TIFF
|
||||||
|
* @ingroup loadsaveformats
|
||||||
|
* Tagged Image File Format
|
||||||
|
*
|
||||||
|
* Uses libtiff http://www.simplesystems.org/libtiff/
|
||||||
|
*
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/// GrafX2 private TIFF tag : 4 bytes
|
||||||
|
///
|
||||||
|
/// - bkg/transp color
|
||||||
|
/// - background transparent
|
||||||
|
/// - image mode
|
||||||
|
/// - reserved (0)
|
||||||
|
///
|
||||||
|
/// This TAG is read only if the Software tag begins with "GrafX2"
|
||||||
|
#define TIFFTAG_GRAFX2 65500
|
||||||
|
|
||||||
extern char Program_version[]; // generated in pversion.c
|
extern char Program_version[]; // generated in pversion.c
|
||||||
extern const char SVN_revision[]; // generated in version.c
|
extern const char SVN_revision[]; // generated in version.c
|
||||||
|
|
||||||
@ -58,6 +78,23 @@ static void TIFF_LogWarning(const char* module, const char* fmt, va_list ap)
|
|||||||
GFX2_LogV(GFX2_WARNING, format, ap);
|
GFX2_LogV(GFX2_WARNING, format, ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// old TIFF extender procedure to be recursively called
|
||||||
|
static TIFFExtendProc TIFFParentExtender = NULL;
|
||||||
|
|
||||||
|
/// Our TIFF Tag Extender procedure
|
||||||
|
///
|
||||||
|
/// Used to add ::TIFFTAG_GRAFX2 handling
|
||||||
|
static void GFX2_TIFFTagExtender(TIFF *tif)
|
||||||
|
{
|
||||||
|
static const TIFFFieldInfo gfx2_fields[] = {
|
||||||
|
// 4 bytes
|
||||||
|
{TIFFTAG_GRAFX2, 4, 4, TIFF_BYTE, FIELD_CUSTOM, 1, 0, "GrafX2Private"}
|
||||||
|
};
|
||||||
|
TIFFMergeFieldInfo(tif, gfx2_fields, 1);
|
||||||
|
if (TIFFParentExtender != NULL)
|
||||||
|
(*TIFFParentExtender)(tif);
|
||||||
|
}
|
||||||
|
|
||||||
/// Initialisation for using the TIFF library
|
/// Initialisation for using the TIFF library
|
||||||
static void TIFF_Init(void)
|
static void TIFF_Init(void)
|
||||||
{
|
{
|
||||||
@ -70,6 +107,8 @@ static void TIFF_Init(void)
|
|||||||
/// redirect warning/error output to our own functions
|
/// redirect warning/error output to our own functions
|
||||||
TIFFSetErrorHandler(TIFF_LogError);
|
TIFFSetErrorHandler(TIFF_LogError);
|
||||||
TIFFSetWarningHandler(TIFF_LogWarning);
|
TIFFSetWarningHandler(TIFF_LogWarning);
|
||||||
|
TIFFParentExtender = TIFFSetTagExtender(GFX2_TIFFTagExtender);
|
||||||
|
GFX2_Log(GFX2_DEBUG, "TIFF_Init() TIFFParentExtender=%p\n", TIFFParentExtender);
|
||||||
|
|
||||||
init_done = 1;
|
init_done = 1;
|
||||||
}
|
}
|
||||||
@ -216,7 +255,6 @@ static void Load_TIFF_image(T_IO_Context * context, TIFF * tif, word spp, word b
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
free(buffer);
|
free(buffer);
|
||||||
return; // ignore next image for now...
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -297,15 +335,19 @@ static void Load_TIFF_image(T_IO_Context * context, TIFF * tif, word spp, word b
|
|||||||
/// Load TIFF
|
/// Load TIFF
|
||||||
void Load_TIFF_Sub(T_IO_Context * context, TIFF * tif, unsigned long file_size)
|
void Load_TIFF_Sub(T_IO_Context * context, TIFF * tif, unsigned long file_size)
|
||||||
{
|
{
|
||||||
|
enum IMAGE_MODES mode = IMAGE_MODE_LAYERED;
|
||||||
int layer = 0;
|
int layer = 0;
|
||||||
enum PIXEL_RATIO ratio = PIXEL_SIMPLE;
|
enum PIXEL_RATIO ratio = PIXEL_SIMPLE;
|
||||||
dword width, height;
|
dword width, height;
|
||||||
word bps, spp;
|
word bps, spp;
|
||||||
word photometric = PHOTOMETRIC_RGB;
|
word photometric = PHOTOMETRIC_RGB;
|
||||||
char * desc;
|
char * desc;
|
||||||
|
char * software = NULL;
|
||||||
float xresol, yresol;
|
float xresol, yresol;
|
||||||
|
|
||||||
|
#ifdef _DEBUG
|
||||||
TIFFPrintDirectory(tif, stdout, TIFFPRINT_NONE);
|
TIFFPrintDirectory(tif, stdout, TIFFPRINT_NONE);
|
||||||
|
#endif
|
||||||
if (!TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &width) || !TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &height))
|
if (!TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &width) || !TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &height))
|
||||||
return;
|
return;
|
||||||
if (!TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, &bps) || !TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &spp))
|
if (!TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, &bps) || !TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &spp))
|
||||||
@ -338,6 +380,23 @@ void Load_TIFF_Sub(T_IO_Context * context, TIFF * tif, unsigned long file_size)
|
|||||||
Pre_load(context, width, height, file_size, FORMAT_TIFF, ratio, bps * spp);
|
Pre_load(context, width, height, file_size, FORMAT_TIFF, ratio, bps * spp);
|
||||||
if (File_error != 0)
|
if (File_error != 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (TIFFGetField(tif, TIFFTAG_SOFTWARE, &software))
|
||||||
|
{
|
||||||
|
if (0 == memcmp(software, "GrafX2", 6)) // Check if the file was written by GrafX2
|
||||||
|
{
|
||||||
|
byte * grafx2_private; // bkg/transp color, background transparent, image mode, reserved (0)
|
||||||
|
if (TIFFGetField(tif, TIFFTAG_GRAFX2, &grafx2_private))
|
||||||
|
{
|
||||||
|
GFX2_Log(GFX2_DEBUG, "bkg/transp color #%u, bkg transp %u, mode %u, reserved %u\n",
|
||||||
|
grafx2_private[0], grafx2_private[1], grafx2_private[2], grafx2_private[3]);
|
||||||
|
context->Transparent_color = grafx2_private[0]; // need to be set after calling Pre_load()
|
||||||
|
context->Background_transparent = grafx2_private[1];
|
||||||
|
mode = grafx2_private[2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Set_image_mode(context, (mode == IMAGE_MODE_ANIMATION) ? mode : IMAGE_MODE_LAYERED);
|
||||||
if (spp == 1)
|
if (spp == 1)
|
||||||
{
|
{
|
||||||
struct {
|
struct {
|
||||||
@ -399,8 +458,12 @@ void Load_TIFF_Sub(T_IO_Context * context, TIFF * tif, unsigned long file_size)
|
|||||||
if (context->bpp != (spp * bps))
|
if (context->bpp != (spp * bps))
|
||||||
return;
|
return;
|
||||||
Set_loading_layer(context, layer);
|
Set_loading_layer(context, layer);
|
||||||
|
#ifdef _DEBUG
|
||||||
TIFFPrintDirectory(tif, stdout, TIFFPRINT_NONE);
|
TIFFPrintDirectory(tif, stdout, TIFFPRINT_NONE);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
if (mode > IMAGE_MODE_ANIMATION)
|
||||||
|
Set_image_mode(context, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct memory_buffer
|
struct memory_buffer
|
||||||
@ -569,6 +632,7 @@ void Load_TIFF(T_IO_Context * context)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// Save (already open) TIFF
|
||||||
void Save_TIFF_Sub(T_IO_Context * context, TIFF * tif)
|
void Save_TIFF_Sub(T_IO_Context * context, TIFF * tif)
|
||||||
{
|
{
|
||||||
char version[64];
|
char version[64];
|
||||||
@ -587,6 +651,11 @@ void Save_TIFF_Sub(T_IO_Context * context, TIFF * tif)
|
|||||||
const dword rowsperstrip = 64;
|
const dword rowsperstrip = 64;
|
||||||
const word photometric = PHOTOMETRIC_PALETTE;
|
const word photometric = PHOTOMETRIC_PALETTE;
|
||||||
float xresol = 1.0f, yresol = 1.0f;
|
float xresol = 1.0f, yresol = 1.0f;
|
||||||
|
// bkg/transp color, background transparent, image mode, reserved (0)
|
||||||
|
byte grafx2_private[4] = { context->Transparent_color, context->Background_transparent, 0, 0 };
|
||||||
|
|
||||||
|
if (context->Type == CONTEXT_MAIN_IMAGE)
|
||||||
|
grafx2_private[2] = Main.backups->Pages->Image_mode;
|
||||||
|
|
||||||
switch (context->Ratio)
|
switch (context->Ratio)
|
||||||
{
|
{
|
||||||
@ -642,11 +711,10 @@ void Save_TIFF_Sub(T_IO_Context * context, TIFF * tif)
|
|||||||
|
|
||||||
// TIFFTAG_SUBIFD // point to thumbnail, etc.
|
// TIFFTAG_SUBIFD // point to thumbnail, etc.
|
||||||
// TIFFSetField(tif, TIFFTAG_PAGENUMBER, current_page, page_count);
|
// TIFFSetField(tif, TIFFTAG_PAGENUMBER, current_page, page_count);
|
||||||
|
|
||||||
// extensions :
|
// extensions :
|
||||||
// TIFFTAG_IT8BKGCOLORINDICATOR
|
TIFFSetField(tif, TIFFTAG_GRAFX2, grafx2_private);
|
||||||
TIFFSetField(tif, TIFFTAG_IT8BKGCOLORVALUE, (word)context->Transparent_color);
|
|
||||||
// TIFFSetField: test.tif: Unknown tag 34026.
|
|
||||||
// custom : https://stackoverflow.com/questions/24059421/adding-custom-tags-to-a-tiff-file
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
for (y = 0; y < height; y++)
|
for (y = 0; y < height; y++)
|
||||||
@ -721,4 +789,6 @@ void Save_TIFF(T_IO_Context * context)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user