Annotation of researchv9/X11/src/X.V11R1/clients/puzzle/pmap.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *     $Source: /orpheus/u1/X11/NRFPT/puzzle/RCS/pmap.c,v $
                      3:  *     $Header: pmap.c,v 1.1 87/09/08 17:26:40 swick Exp $
                      4:  */
                      5: 
                      6: #ifndef lint
                      7: static char *rcsid_pmap_c = "$Header: pmap.c,v 1.1 87/09/08 17:26:40 swick Exp $";
                      8: #endif lint
                      9: 
                     10: /*
                     11: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                     12: ;
                     13: ; File:                pmap.c
                     14: ; SCCS:         %A% %G% %U%
                     15: ; Description:  Pixel Map I/O in C
                     16: ; Author:       Jack Palevich, VGD, ITL, DCC, HP Labs
                     17: ; Created:      29-Jan-86
                     18: ; Modified:     7-Jul-86 12:31:59 (Jack Palevich)
                     19: ; Language:     Text
                     20: ; Package:      PSL
                     21: ; Status:       Experimental (Do Not Distribute)
                     22: ;
                     23: ; (c) Copyright 1986, Hewlett-Packard Company, all rights reserved.
                     24: ;
                     25: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                     26: */
                     27: 
                     28: #include <stdio.h>
                     29: #include <string.h>
                     30: #include "pmap.h"
                     31: 
                     32: /*
                     33: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                     34: %  File i/o for pixel maps
                     35: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                     36: %
                     37: % "PMAP" file format is an ad-hoc standard developed for storing pixel maps on
                     38: %        secondary storage and for transfering pixel maps between C, Pascal programs
                     39: %        and the Prism environment.
                     40: % 
                     41: % A "PMAP" file consists of a 512-byte header block followed by one or more
                     42: %              512-byte blocks of data.
                     43: %
                     44: % The header block consists of the following information:
                     45: %
                     46: % byte(s)        Information
                     47: % =======        ===========
                     48: % 0..1           The number of pixels in the X direction (1..65535)
                     49: % 2..3           The number of pixels in the Y direction (1..65535)
                     50: % 4..7           The number of bytes in the whole data section (1..2^32-1)
                     51: % 8..9           The number of bits per pixel (1..32)
                     52: % 10..11         The type of pixel (0..6) where:
                     53: %                0 is undefined
                     54: %                1 is BMM, 1 bit/pixel
                     55: %                2 is GSM, 4 bits/pixel
                     56: %                3 is GSM', 8 bits/pixel
                     57: %                4 is BMC, 8 bits/pixel
                     58: %                5 is GSC, 32 bits/pixel
                     59: %                6 is GSC', 32 bits/pixel (Gator-c display)
                     60: %               7 is 2 bits per pixel
                     61: %               8 is YF, 16 bits/pixel, stored in files as two planes, Y, then F.
                     62: % 
                     63: % 12..13         The number of bytes per row of pixels; the stride (1..65535)
                     64: % 14..15         The version of encoding used (currently 0) (0..65535)
                     65: % 16..19         The ASCII letters PMAP, as a signature. (Check this first!)
                     66: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                     67: */
                     68: 
                     69: unsigned char pixel_map_bpp[] = { 0, 1, 4, 8, 8, 32, 32, 2, 16};
                     70: 
                     71: /*
                     72:  * FILE *pixel_map_open(pixel_map, file_name)
                     73:  *
                     74:  * Determine the dimensions of the pixel map, and fill in the w, h, and type
                     75:  * parts of the pixel map structure
                     76:  * returns a file descripter if no error, else returns NULL
                     77:  * If the file exists, but is not a PMAP file, then we return NULL.
                     78:  */
                     79: 
                     80: FILE *pixel_map_open(pm, file_name)
                     81:        pixel_map *pm;
                     82:        char *file_name;
                     83: {
                     84:        FILE *fp;
                     85:        unsigned char buf[512];
                     86: 
                     87:        if ((fp = fopen(file_name,"r")) == NULL)
                     88:                return(fp);
                     89: 
                     90:        if (fread(buf, 1, 512, fp) != 512 ||            /* can we read it? */
                     91:                pixel_map_parse_header(pm, buf) == 0) {
                     92:                fclose(fp);
                     93:                return(NULL);
                     94:                }
                     95:        return(fp);
                     96:        }
                     97: 
                     98: /*     isphead.h - declaration for HP-ISP image file header    */
                     99: 
                    100: /*     Ho John Lee, HP Labs    10-6-84                         */
                    101: 
                    102: #define SHORT 2
                    103: #define LONG 4
                    104: 
                    105: typedef struct
                    106:        {
                    107:        short   filetype;       /* mark what kind of file we have */
                    108:        short   bpp;            /* bits per pixel, 1, 4, 8, 24, 32 */
                    109:        short   rows;           /* up to 1024 */
                    110:        short   cols;           /* up to 1024 */
                    111:        short   vectortype;     /* so far, 0 = rectangular blocks */
                    112:        short   vectorsize;     /* so far, 16 for 4x4 square blocks */
                    113:        long    nvectors;       /* up to 65536 */
                    114:        short   brows;          /* number of block rows */
                    115:        short   bcols;          /* number of block cols */
                    116:        short   vrows;          /* number of vector rows */
                    117:        short   vcols;          /* number of vector cols */
                    118:        short   packed;         /* format of data */
                    119:        char    reserved[128 - 11*SHORT - LONG];
                    120:                                /* pad variable space to 128 bytes      */
                    121:        char    user[128];      /* user application space               */
                    122:        char    comment[256];   /* rest of 1st block for comments       */
                    123:        } ISP_file_header;
                    124: 
                    125: #define FHDRSIZE       sizeof(ISP_file_header)
                    126: 
                    127: /*
                    128:  * int pixel_map_parse_header(pixel_map, header)
                    129:  *
                    130:  * Determine the dimensions of the pixel map, and fill in the w, h, and type
                    131:  * parts of the pixel map structure.
                    132:  * (header is a 512 byte buffer).
                    133:  * Reads packed ISP and Glamor PMAP formats.
                    134:  * returns 1 if no problem.
                    135:  * If the data is not a PMAP or ISP header, we return 0.
                    136:  *
                    137:  * BUGS: buffer must be word aligned, or else ISP files will generate bus errors.
                    138:  */
                    139: 
                    140: int pixel_map_parse_header(pm, buf)
                    141:        pixel_map *pm;
                    142:        unsigned char *buf;
                    143: {
                    144:        ISP_file_header *isp;
                    145: 
                    146:        if (strncmp((char *) buf+16, "PMAP", 4) == 0) { /* check if it's a PMAP file */
                    147:                /* it is a PMAP file. */
                    148:                if (buf[14] != 0 || buf[15] != 0) /* check encoding = 0 */
                    149:                        return(0);
                    150: 
                    151:                /* get pixel data */
                    152:                pm->w = (buf[0] << 8) | buf[1];
                    153:                pm->h = (buf[2] << 8) | buf[3];
                    154:                pm->type = (buf[10] << 8) | buf[11];
                    155:                pm->stride = (buf[12] << 8) | buf[13];
                    156:                pm->bpp = (buf[8] << 8) | buf[9];
                    157:                return(1);
                    158:                }
                    159: 
                    160:        /* check if it's an ISP file */
                    161:        isp = (ISP_file_header *) buf;
                    162: 
                    163:        if (isp->filetype == 0 &&
                    164:                (isp->bpp >= 8 ||
                    165:                isp->packed == 1)) { /* it MIGHT be an ISP file.... */
                    166:                pm->w = isp->cols;
                    167:                pm->h = isp->rows;
                    168:                pm->bpp = isp->bpp;
                    169:                switch(pm->bpp) {
                    170:                case 1: pm->type = 1; break;
                    171:                case 2: pm->type = 7; break;
                    172:                case 4: pm->type = 2; break;
                    173:                case 8: pm->type = 3; break;
                    174:                case 32: pm->type = 5; break;
                    175:                default:
                    176:                        /* not an ISP file */
                    177: 
                    178:                        return(0);                      
                    179:                        break;
                    180:                }
                    181:                pm->stride = (pm->w * pm->bpp) >> 3;
                    182:                return(1);
                    183:                } /* if */
                    184:        return(0);
                    185: }
                    186: 
                    187: int pixel_map_read(pm, fp)
                    188:        pixel_map *pm;
                    189:        FILE *fp;
                    190: {
                    191:        return pm-> h == fread(pm->pixels, pm->stride, pm->h, fp);
                    192:        }
                    193: 
                    194: /*
                    195:  * pixel_map_write -- returns 1 if successful, else returns 0
                    196:  */
                    197: 
                    198: int pixel_map_write(pm, fp)
                    199:        pixel_map *pm;
                    200:        FILE *fp;
                    201: {
                    202:        char block[512];
                    203:        short unsigned int h, w, stride, type, *block_2b;
                    204:        unsigned int size, *block_4b;
                    205: 
                    206:        block_2b = (short unsigned int *) block;
                    207:        block_4b = (unsigned int *) block;
                    208: 
                    209:        w = pm->w;
                    210:        h = pm->h;
                    211:        stride = pm->stride;
                    212:        type = pm->type;
                    213:        size=h*stride;
                    214:        
                    215:        block_2b[0] = w;
                    216:        block_2b[1] = h;
                    217:        block_4b[1] = size;
                    218: 
                    219:        block_2b[4] = pixel_map_bpp[type];
                    220:        block_2b[5] = type;
                    221: 
                    222:        block_2b[6] = stride;
                    223:        block_2b[7] = 0;
                    224:        block[16] = 'P';
                    225:        block[17] = 'M';
                    226:        block[18] = 'A';
                    227:        block[19] = 'P';
                    228: 
                    229:        return (512 == fwrite(block, 1, 512, fp)
                    230:                && size == fwrite(pm->pixels, 1, size, fp));
                    231:        }
                    232:                                                  
                    233: int pixel_map_close(fp)
                    234:        FILE *fp;
                    235: {
                    236:        return fclose(fp);
                    237:        }
                    238: 
                    239: char *pixel_map_alloc(pm)
                    240:        pixel_map *pm;
                    241: {
                    242:        char *calloc();
                    243:        if(pm->stride == 0)
                    244:                pm->stride =
                    245:                        (31 + pm->w * pixel_map_bpp[pm->type]) >> 3;
                    246:        return (pm->pixels = calloc(pm->h, pm->stride));
                    247:        }
                    248: 
                    249: int pixel_map_free(pm)
                    250:        pixel_map *pm;
                    251: {
                    252:        free(pm->pixels);
                    253:        free(pm);
                    254:        }
                    255: 
                    256: pixel_map *new_pixel_map()
                    257: {
                    258:        pixel_map *joe;
                    259:        joe = (pixel_map *) calloc(1, sizeof(pixel_map));
                    260:        return(joe);
                    261:        }
                    262: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.