#ifndef XIM_H_INCLUDED #define XIM_H_INCLUDED /* xim.h - header file for Xim files ** ** Taken from the X.V11R4 version of XimHeader.h: ** ** Author: Philip R. Thompson ** Address: phils@athena.mit.edu, 9-526 ** Note: size of header should be 1024 (1K) bytes. ** $Header: /mit/phils/X/RCS/XimHeader.h,v 1.7 89/11/09 17:26:54 phils Exp Locker: phils $ ** $Date: 89/11/09 17:26:54 $ ** $Source: /mit/phils/X/RCS/XimHeader.h,v $ */ #define IMAGE_VERSION 3 #ifndef _BYTE typedef unsigned char byte; #define _BYTE 1 #endif /* External ascii file format. */ typedef struct ImageHeader { char file_version[8]; /* header version */ char header_size[8]; /* Size of file header in bytes */ char image_width[8]; /* Width of the raster image */ char image_height[8]; /* Height of the raster image */ char num_colors[8]; /* Actual number of entries in c_map */ char num_channels[3]; /* 0 or 1 = pixmap, 3 = RG&B buffers */ char bytes_per_line[5]; /* bytes per scanline */ char num_pictures[4]; /* Number of pictures in file */ char bits_per_channel[4]; /* usually 1 or 8 */ char alpha_channel[4]; /* Alpha channel flag */ char runlength[4]; /* Runlength encoded flag */ char author[48]; /* Name of who made it */ char date[32]; /* Date and time image was made */ char program[16]; /* Program that created this file */ char comment[96]; /* other viewing info. for this image */ unsigned char c_map[256][3]; /* RGB values of the pixmap indices */ } ImageHeader, XimAsciiHeader; /* Internal binary format. */ typedef struct Color { byte pixel, red, grn, blu; } Color; typedef struct XimImage { int width; /* width of the image in pixels */ int height; /* height of the image in pixels */ unsigned datasize; /* size of one channel of data */ short nchannels; /* number data channels in image */ short bits_channel; /* usually 1 or 8 */ short bytes_per_line; /* bytes to hold one scanline */ byte* data; /* pixmap or red channel data */ byte* grn_data; /* green channel data */ byte* blu_data; /* blue channel data */ byte* other; /* other (alpha) data */ unsigned alpha_flag :1; /* alpha channel flag */ unsigned packed_flag:1; /* data packed in one chunk of memory */ unsigned runlen_flag:1; /* runlength encoded data flag */ unsigned : 0; /* future flags, word alignment */ short tpics, npics; /* number of images, total & left in file */ short ncolors; /* " " colors in the color table */ Color* colors; /* colortable, one byte per r/g/b & pixel */ const char* author; /* author credit, copyright, etc */ const char* date; /* date image was made, grabbed, etc. */ const char* program; /* program used to make this */ short ncomments; /* number of comments strings */ char** comments; /* pointers to null terminated strings */ char* offset; /* original offset in machine memory */ float chroma_red[2]; /* x, y image chromacity coords */ float chroma_grn[2]; float chroma_blu[2]; float chroma_wht[2]; float gamma; /* image storage gamma */ } XimImage; /* Future external ascii variable length header - under review. */ #if (IMAGE_VERSION == 4) typedef struct XimAsciiHeader { char file_version[4]; /* header version */ char header_size[8]; /* Size of file header (fixed part only) */ char image_height[8]; /* Height of the raster image in pixels */ char image_width[8]; /* Width of the raster image in pixels */ char bytes_line[8]; /* Actual # of bytes separating scanlines */ char bits_channel[4]; /* Bits per channel (usually 1 or 8) */ char num_channels[4]; /* 1 = pixmap, 3 = RG&B buffers */ char alpha_channel[2]; /* Alpha channel flag */ char num_colors[4]; /* Number of entries in c_map (if any) */ char num_pictures[4]; /* Number of images in file */ char runlength_flag[2]; /* Runlength encoded flag */ char future_flags[8]; char author[48]; /* Name of who made it, from passwd entry */ char date[32]; /* Unix format date */ char program[32]; /* Program that created this */ char gamma[12]; /* image storage gamma */ char chroma_red[24]; /* image red primary chromaticity coords. */ char chroma_grn[24]; /* " green " " " */ char chroma_blu[24]; /* " blue " " " */ char chroma_wht[24]; /* " white point " " */ char comment_length[8] /* Total length of comments */ /* char* comment; Null separated comments */ /* unsigned char c_map[]; RGB Colortable, (ncolors * 3 bytes) */ } XimAsciiHeader; #endif /*IMAGE_VERSION 4*/ #ifndef rnd #define rnd(x) ((int)((float)(x) + 0.5)) /* round a float to an int */ #endif /* Note: * - All data is in char's in order to maintain easily portability * across machines, and some human readability. * - Images may be stored as pixmaps (8 bits/pixel) or as separate * red, green, blue channel data (24+ bits/pixel). * - An alpha channel is optional and is found after every num_channels * of data. * - Pixmaps or RGB (and alpha) channel data are stored respectively * after the header. * - If num_channels = 1, a pixmap is assumed and the colormap in the * header is used. * - Data size = image_width * image_height. */ #endif