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

1.1       root        1: /*
                      2:  *     $Source: /orpheus/u1/X11/NRFPT/puzzle/RCS/VEGview.c,v $
                      3:  *     $Header: VEGview.c,v 1.1 87/09/08 17:25:06 swick Exp $
                      4:  */
                      5: 
                      6: #ifndef lint
                      7: static char *rcsid_VEGview_c = "$Header: VEGview.c,v 1.1 87/09/08 17:25:06 swick Exp $";
                      8: #endif lint
                      9: 
                     10: 
                     11: #define DEBUG
                     12: 
                     13: /*
                     14:  * VEGview (c) 1987 Hewlett-Packard Labs.
                     15:  *
                     16:  * Author: Jack Palevich
                     17:  *
                     18:  * View Video Enhanced Graphics images on X-Windows
                     19:  * Inspired by Ed Moy's Xdisp program
                     20:  */
                     21: 
                     22: #include <stdio.h>
                     23: #include <sys/types.h>
                     24: #include <sys/file.h>
                     25: #include <fcntl.h>
                     26: 
                     27: #include <X11/Xlib.h>
                     28: #include <X11/Xatom.h>
                     29: 
                     30: #include "pmap.h"
                     31: #include "VEGview.h"
                     32: 
                     33: #define PM_DISPLAY     0
                     34: #define PM_CONVERT     1
                     35: #define IFPMD if(program_mode == PM_DISPLAY)
                     36: #define IFPMC if(program_mode == PM_CONVERT)
                     37: 
                     38: extern Display         *dpy;
                     39: extern int     screen;
                     40: extern GC      gc;
                     41: extern Colormap PuzzleColormap;
                     42: 
                     43: Pixmap VEGsetup(RasterFile,width,height)
                     44: char *RasterFile;
                     45: int *width, *height;
                     46: {
                     47: 
                     48:     int shades, red_shades, green_shades, blue_shades;
                     49:     int i,j;
                     50:     int numColors;
                     51:     unsigned char *xmap, *data;
                     52:     XColor *colormap;
                     53:     pixel_map *pm;
                     54:     Pixmap PicturePixmap;
                     55: 
                     56:     read_raster_file(&pm,RasterFile);
                     57:    
                     58:     switch ((*pm).type) {
                     59:       case 3: shades = 16;
                     60:              reduce_grey(pm, shades, &xmap, &colormap, &numColors);
                     61:              break;
                     62:       case 6: red_shades = 3;
                     63:              green_shades = 4;
                     64:              blue_shades = 2;
                     65:              reduce_color(pm, red_shades, green_shades, blue_shades, 
                     66:                     &xmap, &colormap, &numColors);
                     67:              break;
                     68:       default:fprintf(stderr, "Can't interpret this type of PMAP.\n");
                     69:              exit(1);
                     70:              break;
                     71:     }
                     72: 
                     73:     *width  = (*pm).w;
                     74:     *height = (*pm).h;
                     75: 
                     76:     if (get_ro_colors(colormap, numColors))
                     77:        exit(1);
                     78: 
                     79:    
                     80:     /* Convert from virtual color_map to actual color_map */
                     81: 
                     82:     for ( j = 0; j < pm->h; j++) {
                     83:        data = xmap + pm->w * j;
                     84:        for (i = 0; i < pm->w; i++)
                     85:            data[i] = colormap[data[i]].pixel;
                     86:     }
                     87: 
                     88:     /* Try to cache the data as a Pixmap on the server */
                     89: 
                     90:     {
                     91:        XImage image;
                     92: 
                     93:        image.width = pm->w;
                     94:        image.height = pm->h;
                     95:        image.xoffset = 0;
                     96:        image.format = ZPixmap;
                     97:        image.data = (char *) xmap;
                     98:        image.byte_order = MSBFirst;
                     99:        image.bitmap_unit = 8;
                    100:        image.depth = 8;
                    101:        image.bytes_per_line = pm->w;
                    102:        image.bits_per_pixel = 8;
                    103: 
                    104:        PicturePixmap = XCreatePixmap(dpy,RootWindow(dpy,screen),
                    105:                                      image.width,image.height,8);
                    106:        XPutImage(dpy,PicturePixmap,gc,&image,0,0,0,0,
                    107:                  image.width,image.height);
                    108:     }
                    109:     return(PicturePixmap);
                    110: }   
                    111: 
                    112: /* Reduce the 8 bpp pixel map to at most 'shades' shades of
                    113:  * grey, by using error diffusion.
                    114:  * Floyd & Steinberg / "An Adaptive Algorithm for Spatial Greyscale "
                    115:  * Proceeding of the S.I.D.  Vol. 17/2 Second Quarter 1976
                    116:  *  x x x              A = 7/16 of the error
                    117:  *  x p A              B = 1/16 of the error
                    118:  *  D C B              C = 5/16 of the error
                    119:  *                     D = 3/16 of the error
                    120:  * pixel_map *pm - source pixel map
                    121:  * int shades - number of shades of grey requested
                    122:  * unsigned char **xmap - pointer to where to return pointer to reduced image
                    123:  * Color *color_map - color map to fill in with shades we use.
                    124:  * int *numColors - number of colors actually used.
                    125:  */
                    126: 
                    127: reduce_grey(pm, shades, xmap, color_map_p, num_colors)
                    128: pixel_map *pm;
                    129: int shades;
                    130: unsigned char **xmap;
                    131: XColor **color_map_p;
                    132: int *num_colors;
                    133: {
                    134:     int w, h, scale, h_scale, i, j, x, y, n, m;
                    135:     short e, e1, e3, e5, e7, ea, eb;
                    136:     unsigned char to_shade[256], *crow;
                    137:     short *nrow, *nrow_p;
                    138:     int *there;
                    139:     float f;
                    140:     unsigned char *data;
                    141:     unsigned char *vgrey;
                    142:     XColor *color_map;
                    143: 
                    144:     w = pm->w;
                    145:     h = pm->h;
                    146:     nrow_p = (short *) calloc(w+2, sizeof(*nrow));
                    147:     nrow = nrow_p + 1; /* vector is -1..w */
                    148: 
                    149:     /* Fill to_shade table */
                    150:     if ( shades < 2 ) return(0);
                    151:     scale = 255 / (shades - 1);
                    152:     for ( i = 0; i < 256; i++) {
                    153:        f = i / 255.0;
                    154:        n = f * (shades-1) + 0.5;
                    155:        m = n * scale;
                    156:        if ( m > 255) m = 255;
                    157:        to_shade[i] = m;
                    158:     }
                    159: 
                    160:     /* Error diffuse */
                    161: 
                    162:     for ( y = 0; y < h; y++ ) {
                    163:        crow = (unsigned char *) (pm->pixels + (pm->stride * y));
                    164:        eb = 0; /* Traveling 'B' error term */
                    165:        ea = 0; /* Traveling 'A' error term */
                    166:        for ( x = 0; x < w; x++ ) {
                    167:            n = crow[x] + nrow[x] + ea;
                    168:            m = to_shade[n < 0 ? 0 : (n > 255 ? 255 : n)];
                    169:            crow[x] = m;
                    170:            e = n - m;
                    171:            e1 = e / 16;
                    172:            e3 = e1 + e1 + e1;
                    173:            e5 = e3 + e1 + e1;
                    174:            e7 = e - e5 - e3 - e1;
                    175:            nrow[x-1] += e3; /* 'D' term */
                    176:            nrow[x] = eb + e5; /* 'C' term and last 'B' term */
                    177:            eb = e1; /* new 'B' term */
                    178:            ea = e7; /* new 'A' term */
                    179:        } /* each pixel */
                    180:     } /* each row */
                    181:     free(nrow_p);
                    182:     
                    183:     /* Find out how many colors we actually used */
                    184: 
                    185:     there = (int *) calloc(256, sizeof (*there));
                    186: 
                    187:     for ( j = 0; j < pm->h; j++) {
                    188:        data = (unsigned char *) pm->pixels + pm->stride * j;
                    189:        for (i = 0; i < pm->w; i++) {
                    190:            there[data[i]]++;
                    191:        }
                    192:     }
                    193: 
                    194:     /* Convert to a virtual color map */
                    195: 
                    196:     vgrey = (unsigned char *) calloc(shades, sizeof(*vgrey));
                    197: 
                    198:     i = 0;
                    199:     for ( j = 0; j < 256; j++ ) {
                    200:        if ( there[j] ) {
                    201:            /* A new color */
                    202:            there[j] = i;
                    203:            vgrey[i] = j;
                    204:            i++;
                    205:        }
                    206:     }
                    207: 
                    208:     color_map = (XColor *) calloc(i, sizeof(XColor));
                    209: 
                    210:     *color_map_p = color_map;
                    211: 
                    212:     *num_colors = i;
                    213: 
                    214:     for ( j = 0; j < i; j++) {
                    215:        color_map[j].red =
                    216:            color_map[j].green =
                    217:                color_map[j].blue =
                    218:                    vgrey[j] << 8;
                    219:     }
                    220: 
                    221:     free(vgrey);
                    222: 
                    223:     for ( j = 0; j < pm->h; j++) {
                    224:        data = (unsigned char *) pm->pixels + pm->stride * j;
                    225:        for (i = 0; i < pm->w; i++) {
                    226:            data[i] = there[data[i]];
                    227:        }
                    228:     }
                    229: 
                    230:     free(there);
                    231: 
                    232:     *xmap = (unsigned char *) pm->pixels;
                    233: 
                    234: }
                    235: 
                    236: 
                    237: read_raster_file(ppm, name)
                    238: pixel_map **ppm;
                    239: char *name;
                    240: {
                    241:     pixel_map *pm;
                    242:     FILE *is;
                    243: 
                    244:     pm = new_pixel_map();
                    245:     *ppm = pm;
                    246: 
                    247:     if (NULL == (is = pixel_map_open(pm, name))) {
                    248:        fprintf(stderr, "Couldn't open %s\n", name);
                    249:        return(NULL);
                    250:     }
                    251:     if (NULL == pixel_map_alloc(pm)) {
                    252:        fprintf(stderr, "Couldn't allocate storage for pixel map\n");
                    253:        fclose(is);
                    254:        return(NULL);
                    255:     }
                    256:     if (0 == pixel_map_read(pm, is)) {
                    257:        fprintf(stderr, "Couldn't read pixel map\n");
                    258:        fclose(is);
                    259:        return(NULL);
                    260:     }
                    261:     fclose(is);
                    262:     
                    263:     if ( pm->type == YF_TYPE) {
                    264:        pm->type = 3;
                    265:        pm->stride = pm->stride / 2;
                    266:     }
                    267: }
                    268: 
                    269: get_ro_colors(color_map, numColors)
                    270: XColor *color_map;
                    271: int numColors;
                    272: {
                    273:     int i;
                    274:     XColor color;
                    275: 
                    276:     for (i = 0; i < numColors; i++) {
                    277:        /* Need a read-only color for this value */
                    278:        if (!XAllocColor(dpy,PuzzleColormap,&color_map[i])) {
                    279:            fprintf(stderr, "not enough colors (asked for %d, got %d).\n",
                    280:                    numColors, i);
                    281:            return (-1);
                    282:        }
                    283: #ifdef DEBUG
                    284:        else
                    285:            printf("color %d pixel value is %d\n",i,color_map[i].pixel);
                    286: #endif DEBUG
                    287:     }
                    288:     return(0);
                    289: }

unix.superglobalmegacorp.com

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