mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
197 lines
8 KiB
C
197 lines
8 KiB
C
/*
|
|
* CDE - Common Desktop Environment
|
|
*
|
|
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
|
|
*
|
|
* These libraries and programs are free software; you can
|
|
* redistribute them and/or modify them under the terms of the GNU
|
|
* Lesser General Public License as published by the Free Software
|
|
* Foundation; either version 2 of the License, or (at your option)
|
|
* any later version.
|
|
*
|
|
* These libraries and programs are distributed in the hope that
|
|
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
|
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
* PURPOSE. See the GNU Lesser General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with these libraries and programs; if not, write
|
|
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
|
* Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
/* $XConsortium: iltiffint.h /main/4 1995/12/19 16:55:04 cde-dec $ */
|
|
#ifndef ILTIFFINT_H
|
|
#define ILTIFFINT_H
|
|
|
|
/* PRIVATE definitions shared between /ilc/iltiff*.c files.
|
|
NO OTHER CODE SHOULD INCLUDE THIS FILE !
|
|
*/
|
|
#ifndef ILINT_H
|
|
#include "ilint.h"
|
|
#endif
|
|
#ifndef ILFILE_H
|
|
#include "ilfile.h"
|
|
#endif
|
|
|
|
#ifdef DTLIB
|
|
/* Used when this header is compiled into the DtHelp library */
|
|
#include "GraphicsP.h"
|
|
#endif /* DTLIB */
|
|
|
|
/* Defines for values of tag IL_TAG_PRIVATE_0 (34209). This is a private tag
|
|
read and (sometimes) written by the IL. The tag is extensible; it is variable
|
|
length, and the data in the tag depends on the flags. The values are always
|
|
an array of shorts, as follows:
|
|
IL_TAG_P0_FLAGS array of 16 bits. Only bit 0 is defined as follows;
|
|
all other bits must be zero:
|
|
IL_TAG_P0_FLAG_DITHER_LEVELS ignored if the image is not a palette image; else
|
|
image was dithered / error diffused. The red/green/blue
|
|
levels are stored in offsets 1..3; tag must be at least
|
|
IL_TAG_P0_DITHER_LEVELS_LENGTH shorts long.
|
|
*/
|
|
#define IL_TAG_P0_FLAGS 0
|
|
#define IL_TAG_P0_FLAG_DITHER_LEVELS (1<<0)
|
|
#define IL_TAG_P0_DITHER_LEVELS_LENGTH 4
|
|
|
|
/* Size in bytes of one item (# items = TIFF "length"), for each TIFF tag type.
|
|
Also, # of entries of that type which fit in one long.
|
|
Indexed by tag type = 1..IL_MAX_TAG_TYPE (0 entry unused).
|
|
*/
|
|
IL_EXTERN int _ilTagTypeItemSizes [];
|
|
|
|
IL_EXTERN int _ilTagTypeItemsThatFit [];
|
|
|
|
/* How a file image relates to its brethren. */
|
|
typedef enum {mainImage, childImage, maskImage} ilFileImageRelation;
|
|
|
|
/* One TIFF file tag, as it appears in a TIFF file. */
|
|
typedef struct {
|
|
unsigned short number;
|
|
unsigned short type;
|
|
/* compatibility problem with long and unsigned long data fields */
|
|
CARD32 length;
|
|
union {
|
|
char chars[4];
|
|
unsigned short shorts[2];
|
|
/* compatibility problem with long and unsigned long data fields */
|
|
INT32 aLong;
|
|
CARD32 offset;
|
|
} data;
|
|
} ilTIFFTagRec, *ilTIFFTagPtr;
|
|
|
|
#define IL_TAG_SIZE (sizeof (ilTIFFTagRec))
|
|
|
|
|
|
typedef CARD32 ilFileOffset; /* a file offset, i.e. byte location */
|
|
|
|
/* Private definition of object ilFileImage.
|
|
This identifies one "IFD" = Image File Directory - not a directory at all,
|
|
it is the header for a file image: # of tags, list of tags, offset to next IFD.
|
|
*/
|
|
typedef struct {
|
|
ilFileImagePublicRec p; /* public part: MUST BE FIRST */
|
|
ilContext context; /* context for this file image */
|
|
ilFileImageRelation imageType; /* main/child/maskImage */
|
|
short tagCount; /* # of tags for this image */
|
|
ilFileOffset tagOffset; /* file offset to first tag */
|
|
} ilFileImageRec, *ilFileImagePtr;
|
|
|
|
/* Private definition of object ilFile.
|
|
The file exists at byte offset "offset" within "*file".
|
|
See the TIFF spec for a description of TIFF tiles.
|
|
"haveImageList" is true iff there is a *valid* image list;
|
|
there may be a non-null list if false. The list is invalidated
|
|
when a write to the file is done.
|
|
*/
|
|
typedef struct _ilFileRec {
|
|
ilObjectRec o; /* std header: MUST BE FIRST */
|
|
#ifdef DTLIB
|
|
/* Used when this header is compiled into the DtHelp library */
|
|
_DtGrStream *stream; /* stream handle */
|
|
#else
|
|
FILE *stream; /* stdio file handle */
|
|
#endif /* DTLIB */
|
|
ilFileOffset offset; /* offset to start of TIFF data within file */
|
|
ilBool bigEndian; /* true: "MM" file; false: "II" file */
|
|
ilFileOffset IFDTailPtrOffset; /* offset of last IFD ptr */
|
|
ilBool haveImageList; /* see above */
|
|
ilFileImagePtr pFileImageHead,
|
|
pFileImageTail; /* ptr to head/tail of file image list */
|
|
} ilFileRec, *ilFilePtr;
|
|
|
|
|
|
/* Converts the 4 TIFF bytes at "_4b" to a long, returned to the long "_long",
|
|
based on the byte order specified by "_bigEndian" (TRUE == Motorola order).
|
|
Note that the 4 bytes are not necessarily on a long boundary,
|
|
so they must be shifted up in case long alignment is required.
|
|
*/
|
|
/* compatibility problem with long and unsigned long data fields */
|
|
#define IL_FLIP_LONG(_bigEndian, _4b, _long) { \
|
|
CARD32 _l; \
|
|
if (_bigEndian) { \
|
|
_l = *((ilPtr)(_4b)+0); _l <<= 8; \
|
|
_l |= *((ilPtr)(_4b)+1); _l <<= 8; \
|
|
_l |= *((ilPtr)(_4b)+2); _l <<= 8; \
|
|
_l |= *((ilPtr)(_4b)+3); \
|
|
} \
|
|
else { \
|
|
_l = *((ilPtr)(_4b)+3); _l <<= 8; \
|
|
_l |= *((ilPtr)(_4b)+2); _l <<= 8; \
|
|
_l |= *((ilPtr)(_4b)+1); _l <<= 8; \
|
|
_l |= *((ilPtr)(_4b)+0); \
|
|
} \
|
|
(_long) = _l; \
|
|
}
|
|
|
|
/* Same for a short.
|
|
*/
|
|
#define IL_FLIP_SHORT(_bigEndian, _2b, _short) {\
|
|
unsigned short _s; \
|
|
if (_bigEndian) { \
|
|
_s = *((ilPtr)(_2b)+0); _s <<= 8; \
|
|
_s |= *((ilPtr)(_2b)+1); \
|
|
} \
|
|
else { \
|
|
_s = *((ilPtr)(_2b)+1); _s <<= 8; \
|
|
_s |= *((ilPtr)(_2b)+0); \
|
|
} \
|
|
(_short) = _s; \
|
|
}
|
|
|
|
/* Seek to the given offset within the given file, taking into
|
|
account the offset at which the logical file begins.
|
|
Returns true if seek successful, else false.
|
|
*/
|
|
#ifdef DTLIB
|
|
/* Used when this header is compiled into the DtHelp library */
|
|
#define IL_SEEK(_pFile, _offset) \
|
|
( _DtGrSeek ((_pFile)->stream, (_pFile)->offset + (_offset), 0) == 0 )
|
|
#else
|
|
#define IL_SEEK(_pFile, _offset) \
|
|
( fseek ((_pFile)->stream, (_pFile)->offset + (_offset), 0) == 0 )
|
|
#endif /* DTLIB */
|
|
|
|
/* Read the given number of bytes into the given buffer.
|
|
All read macros return true if read successful, else false.
|
|
*/
|
|
#ifdef DTLIB
|
|
/* Used when this header is compiled into the DtHelp library */
|
|
#define IL_READ(_pFile, _nBytes, _pBuffer) \
|
|
( (_DtGrRead ((char *)(_pBuffer), _nBytes, 1, (_pFile)->stream) == 1) ? \
|
|
TRUE : FALSE )
|
|
#else
|
|
#define IL_READ(_pFile, _nBytes, _pBuffer) \
|
|
( (_DtGrRead ((char *)(_pBuffer), _nBytes, 1, (_pFile)->stream) == 1) ? \
|
|
TRUE : FALSE )
|
|
#endif /* DTLIB */
|
|
|
|
/* Write the given number of bytes into the given buffer.
|
|
Returns true if read successful, else false.
|
|
*/
|
|
#define IL_WRITE(_pFile, _nBytes, _pBuffer) \
|
|
( (fwrite ((char *)(_pBuffer), _nBytes, 1, (_pFile)->stream) == 1) ? \
|
|
TRUE : FALSE )
|
|
|
|
|
|
#endif
|