summaryrefslogtreecommitdiffstats
path: root/hl/tools/gif2h5/gif.h
blob: 62f09a5b2eef1294a39a336e416ea763640f431b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * Copyright by The HDF Group.                                               *
 * All rights reserved.                                                      *
 *                                                                           *
 * This file is part of HDF5.  The full HDF5 copyright notice, including     *
 * terms governing use, modification, and redistribution, is contained in    *
 * the COPYING file, which can be found at the root of the source code       *
 * distribution tree, or in https://www.hdfgroup.org/licenses.               *
 * If you do not have access to either file, you may request a copy from     *
 * help@hdfgroup.org.                                                        *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

/*
 *  Title:       GIF.H
 *  Purpose:     GIF Header file
 */
#ifndef GIF_H_
#define GIF_H_ 1

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "hdf5.h"

#define MAX_PAL 768

/* typedef H5T_NATIVE_UINT8  GIFBYTE; */
typedef unsigned char GIFBYTE;

/* typedef H5T_NATIVE_UINT16  GIFWORD; */
typedef unsigned long GIFWORD;

typedef char GIFCHAR;

#ifndef boolean
typedef unsigned char boolean;
#endif

#ifndef false
#define false 0
#endif
#ifndef true
#define true 1
#endif

/* Set the EndianOrder.
** The GIF Reader file should do this.
** Set EndianOrder = 0 if machine is little endian
**     EndianOrder = 1 if machine is big endian.
*/
extern int EndianOrder;

/*
**  The GIF header format.
**
**  This structure actually contains the header, logical screen
**  descriptor, and the global color table for the GIF image.
*/
typedef struct _GifHeader { /* Offset   Description                         */
    GIFBYTE PackedField;    /*  0Ah     Color Information                   */
    GIFWORD TableSize;
    GIFBYTE ImageCount; /* Keep a count of the number of images         */
    GIFBYTE CommentCount;
    GIFBYTE ApplicationCount;
    GIFBYTE PlainTextCount;
    GIFBYTE HDFPalette[256][3];
    GIFBYTE HeaderDump[6]; /* GIFBYTE array to dump header contents           */
    GIFBYTE LSDDump[7];    /* Logical Screen Descriptor dump               */
} GIFHEAD;

/*
**  The GIF Image Descriptor.
*/
typedef struct _GifImageDescriptor {
    GIFWORD ImageWidth;  /* Width of the image in pixels             */
    GIFWORD ImageHeight; /* Height of the image in pixels            */
    GIFBYTE PackedField; /* Image and Color Table Data Information   */
    GIFWORD TableSize;
    GIFWORD CodeSize; /* Minimum LZW CodeSize for image data      */
    GIFBYTE HDFPalette[256][3];
    GIFBYTE GIDDump[9]; /* GifImageDescriptor dump                  */

    GIFBYTE *Image; /* Decompressed Raster Image                */
    GIFBYTE *GIFImage;
} GIFIMAGEDESC;

/*
**  GIF 89a Graphic Control Extension Block
*/
typedef struct _GifGraphicControlExtension {
    GIFBYTE GCEDump[5]; /* Graphic Control Extension Dump           */
} GIFGRAPHICCONTROL;

/*
**  GIF 89a Plain Text Extension Block
*/
typedef struct _GifPlainTextExtension {
    GIFBYTE  PTEDump[15];   /* Plain Text Extension Dump                */
    GIFBYTE *PlainTextData; /* Plain Text data sub-blocks               */
    GIFWORD  DataSize;
} GIFPLAINTEXT;

/*
**  GIF 89a Application Extension Block
*/
typedef struct _GifApplicationExtension {
    GIFBYTE  AEDump[14];      /* Application Extension Dump               */
    GIFBYTE *ApplicationData; /* Application data sub-blocks              */
    GIFWORD  DataSize;
} GIFAPPLICATION;

/*
**  GIF 89a Comment Extension Block
*/
typedef struct _GifCommentExtension {
    GIFBYTE  CEDump[2];   /* Comment Extension Dump                   */
    GIFBYTE *CommentData; /* Comment data sub-blocks                  */
    GIFWORD  DataSize;
    GIFBYTE  Terminator; /* Block Terminator (always 0)              */
} GIFCOMMENT;

/*
** GIF to HDF Memory Struct
** Purpose : The gif to hdf structure is used to pass all the
**           gif data to the memory, which gets caught by the hdf driver
**           Its the drivers job to put the data in the appropriate places
**           in the HDF file.
**           I have assumed that the ImageDescriptors and GraphicControls follow
**           one another, ie. I have not associated them with each other. The driver
**           must assume a 1-1 correspondence. The same discussion with plain text
**           extension.
*/
typedef struct _GifToMem {
    GIFHEAD            *GifHeader;
    GIFIMAGEDESC      **GifImageDesc;
    GIFGRAPHICCONTROL **GifGraphicControlExtension;
    GIFPLAINTEXT      **GifPlainTextExtension;
    GIFAPPLICATION    **GifApplicationExtension;
    GIFCOMMENT        **GifCommentExtension;
} GIFTOMEM;

/*
**  Function Prototypes
*/

/* GIF2MEM.C */
int Gif2Mem(GIFBYTE *, GIFTOMEM *);

/* GIFREAD.C */
int ReadGifHeader(GIFHEAD *, GIFBYTE **);
int ReadGifImageDesc(GIFIMAGEDESC *, GIFBYTE **);
int ReadGifGraphicControl(GIFGRAPHICCONTROL *, GIFBYTE **);
int ReadGifPlainText(GIFPLAINTEXT *, GIFBYTE **);
int ReadGifApplication(GIFAPPLICATION *, GIFBYTE **);
int ReadGifComment(GIFCOMMENT *, GIFBYTE **);

/* HDFGIFWR.C */
int hdfWriteGIF(FILE *fp, GIFBYTE *pic, int ptype, int w, int h, const GIFBYTE *rmap, const GIFBYTE *gmap,
                const GIFBYTE *bmap, const GIFBYTE *pc2ncmap, int numcols, int colorstyle, int BitsPerPixel);

/* WRITEHDF.C */
int WriteHDF(GIFTOMEM, GIFCHAR *);

/* Function:    ReadHDF
** Return:      0 on completion without error, -1 on error
** Input:       GIFCHAR *h5_file - HDF file name
**              GIFCHAR *dset_name - Name of the HDF Image dataset
**              GIFCHAR *pal_name - Name of the HDF palette
** Output:      GIFBYTE* data - the HDF Image to be converted
**              GIFBYTE  palette[256][3] - the corresponding palette
**              hsize_t* image_size - the size of each dimension of the image
*/
int ReadHDF(GIFBYTE **data, GIFBYTE palette[256][3], hsize_t *image_size, GIFCHAR *h5_file,
            GIFCHAR *dset_name, GIFCHAR *pal_name);

GIFBYTE *Decompress(GIFIMAGEDESC *, GIFHEAD *);
GIFBYTE  GetByte(const GIFBYTE *);
GIFWORD  GetWord(GIFBYTE *);

void cleanup(GIFBYTE *);

#endif /* GIF_H_ */