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
|
/* rast.h - header file for Sun raster files
**
** The format of a Sun raster file is as follows. First, a struct
** rasterfile. Note the 32-bit magic number at the beginning; this
** identifies the file type and lets you figure out whether you need
** to do little-endian / big-endian byte-swapping or not. (The PBMPLUS
** implementation does not do byte-swapping; instead, it reads all
** multi-byte values a byte at a time.)
**
** After the struct is an optional colormap. If ras_maptype is RMT_NONE,
** no map is present; if it's RMT_EQUAL_RGB then the map consists of
** three unsigned-char arrays ras_maplength long, one each for r g and b.
** I don't know what RMT_RAW means. Black and white bitmaps are stored
** as ras_maptype == RMT_NONE and ras_depth == 1, with the bits stored
** eight to a byte MSB first.
**
** Finally comes the image data. If ras_type is RT_OLD or RT_STANDARD,
** the data is just plain old uncompressed bytes, padded out to a multiple
** of 16 bits in each row. If ras_type is RT_BYTE_ENCODED, a run-length
** compression scheme is used: an escape-byte of 128 indicates a run;
** the next byte is a count, and the one after that is the byte to be
** replicated. The one exception to this is if the count is 1; then
** there is no third byte in the packet, it means to put a single 128
** in the data stream.
*/
#ifndef RAST_H_INCLUDED
#define RAST_H_INCLUDED
#define PIX_ERR -1
struct rasterfile {
long ras_magic;
#define RAS_MAGIC 0x59a66a95
long ras_width;
long ras_height;
long ras_depth;
long ras_length;
long ras_type;
#define RT_OLD 0 /* Raw pixrect image in 68000 byte order */
#define RT_STANDARD 1 /* Raw pixrect image in 68000 byte order */
#define RT_BYTE_ENCODED 2 /* Run-length compression of bytes */
#define RT_FORMAT_RGB 3 /* XRGB or RGB instead of XBGR or BGR */
#define RT_FORMAT_TIFF 4 /* tiff <-> standard rasterfile */
#define RT_FORMAT_IFF 5 /* iff (TAAC format) <-> standard rasterfile */
#define RT_EXPERIMENTAL 0xffff /* Reserved for testing */
long ras_maptype;
#define RMT_NONE 0
#define RMT_EQUAL_RGB 1
#define RMT_RAW 2
long ras_maplength;
};
struct pixrectops {
int (*pro_rop)();
int (*pro_stencil)();
int (*pro_batchrop)();
int (*pro_nop)();
int (*pro_destroy)();
int (*pro_get)();
int (*pro_put)();
int (*pro_vector)();
struct pixrect* (*pro_region)();
int (*pro_putcolormap)();
int (*pro_getcolormap)();
int (*pro_putattributes)();
int (*pro_getattributes)();
};
struct pr_size {
int x, y;
};
struct pr_pos {
int x, y;
};
struct pixrect {
struct pixrectops* pr_ops;
struct pr_size pr_size;
int pr_depth;
struct mpr_data* pr_data; /* work-alike only handles memory pixrects */
};
struct mpr_data {
int md_linebytes;
unsigned char* md_image; /* note, byte not short -- avoid pr_flip() */
struct pr_pos md_offset;
short md_primary;
short md_flags;
};
typedef struct {
int type;
int length;
unsigned char* map[3];
} colormap_t;
/* And the routine definitions. */
struct pixrect *
mem_create(int const w,
int const h,
int const depth);
void
mem_free(struct pixrect * const p);
int
pr_dump(struct pixrect * const p,
FILE * const out,
colormap_t * const colormap,
int const type,
int const copy_flag);
int
pr_load_header(FILE * const in,
struct rasterfile * const hP);
int
pr_load_colormap(FILE * const in,
struct rasterfile * const hP,
colormap_t * const colormap);
struct pixrect *
pr_load_image(FILE * const in,
struct rasterfile * const hP,
colormap_t * const colormap);
#endif
|