This is ppmtomap.c in view mode; [Download] [Up]
/* ppmtomap.c - read a portable pixmap and produce a minimal size portable ** pixmap containing all colors. ** ** Based on ppmtogif.c ** ** By Marcel Wijkstra < wijkstra@fwi.uva.nl> ** ** ** Copyright (C) 1989 by Jef Poskanzer. ** ** Permission to use, copy, modify, and distribute this software and its ** documentation for any purpose and without fee is hereby granted, provided ** that the above copyright notice appear in all copies and that both that ** copyright notice and this permission notice appear in supporting ** documentation. This software is provided "as is" without express or ** implied warranty. ** ** The Graphics Interchange Format(c) is the Copyright property of ** CompuServe Incorporated. GIF(sm) is a Service Mark property of ** CompuServe Incorporated. */ #include <math.h> #include "ppm.h" #include "ppmcmap.h" #define MAXCOLORS 65536 /* May be smaller, may be larger (?) */ static int Red[MAXCOLORS],Green[MAXCOLORS],Blue[MAXCOLORS]; int main( argc, argv ) int argc; char* argv[]; { FILE* ifp; pixel **pixels; pixel *pixelrow; int colors; int argn, rows, cols, i,j,k,l, BitsPerPixel; int sort, square; char *mapfile; pixval maxval; colorhist_vector chv; char* usage = "[-sort] [-square] [ppmfile]"; ppm_init( &argc, argv ); argn = 1; sort = 0; square = 0; while ( argn < argc && argv[argn][0] == '-' && argv[argn][1] != '\0' ) { if ( pm_keymatch( argv[argn], "-sort", 3 ) ) sort = 1; else if ( pm_keymatch( argv[argn], "-square", 3 ) ) square = 1; else pm_usage( usage ); ++argn; } if ( argn < argc ) { ifp = pm_openr( argv[argn] ); ++argn; } else ifp = stdin; if ( argn != argc ) pm_usage( usage ); pixels = ppm_readppm( ifp, &cols, &rows, &maxval ); pm_close( ifp ); /* Figure out the colormap. */ chv = ppm_computecolorhist( pixels, cols, rows, MAXCOLORS, &colors ); if ( chv == (colorhist_vector) 0 ) pm_error( "too many colors - try doing a 'ppmquant %d'", MAXCOLORS ); pm_message( "%d colors found", colors ); for ( i = 0; i < colors; ++i ) { Red[i] = PPM_GETR( chv[i].color ); Green[i] = PPM_GETG( chv[i].color ); Blue[i] = PPM_GETB( chv[i].color ); } /* Sort the colormap */ if (sort) { pm_message("sorting colormap"); for (i=0;i<colors;i++) for (j=i+1;j<colors;j++) l=maxval+1; if (((Red[i]*l)+Green[i])*l+Blue[i] > ((Red[j]*l)+Green[j])*l+Blue[j]) { k=Red[i]; Red[i]=Red[j]; Red[j]=k; k=Green[i]; Green[i]=Green[j]; Green[j]=k; k=Blue[i]; Blue[i]=Blue[j]; Blue[j]=k; } } #if 0 ppm_init(&argc, argv); #endif if (!square) { pixelrow = ((pixel*) pm_allocrow( colors, sizeof(pixel) )); for (i=0;i<colors;i++) PPM_ASSIGN(pixelrow[i], (pixval)Red[i], (pixval)Green[i], (pixval)Blue[i]); ppm_writeppminit(stdout, colors, 1, maxval, 0); ppm_writeppmrow(stdout, pixelrow, colors, maxval, 0); } else { cols = (int)sqrt((float)colors); rows = colors/cols; ppm_writeppminit(stdout, cols, rows, maxval, 0); pixelrow = ((pixel*) pm_allocrow(cols, sizeof(pixel) )); for (i=0;i<rows;i++) { for (j=0;j<cols;j++) { k=i*cols+j; PPM_ASSIGN(pixelrow[j], (pixval)Red[k], (pixval)Green[k], (pixval)Blue[k]); } ppm_writeppmrow(stdout, pixelrow, cols, maxval, 0); } if (colors%cols) { k=i*cols; for (j=0;j<colors%cols;j++,k++) PPM_ASSIGN(pixelrow[j], (pixval)Red[k], (pixval)Green[k], (pixval)Blue[k]); for (;j<cols;j++) PPM_ASSIGN(pixelrow[j], (pixval)Red[k], (pixval)Green[k], (pixval)Blue[k]); ppm_writeppmrow(stdout, pixelrow, cols, maxval, 0); } } pm_close(stdout); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.