Blame converter/other/pbmtopgm.c

Packit 78deda
/* pbmtopgm.c - convert PBM to PGM by totalling pixels over sample area
Packit 78deda
 * AJCD 12/12/90
Packit 78deda
 */
Packit 78deda
Packit 78deda
#include <stdio.h>
Packit 78deda
Packit 78deda
#include "pm_c_util.h"
Packit 78deda
#include "pgm.h"
Packit 78deda
Packit 78deda
int
Packit 78deda
main(int argc, char *argv[]) {
Packit 78deda
Packit 78deda
    gray *outrow, maxval;
Packit 78deda
    int right, left, down, up;
Packit 78deda
    bit **inbits;
Packit 78deda
    int rows, cols;
Packit 78deda
    FILE *ifd;
Packit 78deda
    int row;
Packit 78deda
    int width, height;
Packit 78deda
    const char * const usage = "<w> <h> [pbmfile]";
Packit 78deda
   
Packit 78deda
Packit 78deda
    pgm_init( &argc, argv );
Packit 78deda
Packit 78deda
    if (argc > 4 || argc < 3)
Packit 78deda
        pm_usage(usage);
Packit 78deda
Packit 78deda
    width = atoi(argv[1]);
Packit 78deda
    height = atoi(argv[2]);
Packit 78deda
    if (width < 1 || height < 1)
Packit 78deda
        pm_error("width and height must be > 0");
Packit 78deda
    left=width/2; right=width-left;
Packit 78deda
    up=width/2; down=height-up;
Packit 78deda
Packit 78deda
    if (argc == 4)
Packit 78deda
        ifd = pm_openr(argv[3]);
Packit 78deda
    else
Packit 78deda
        ifd = stdin ;
Packit 78deda
Packit 78deda
    inbits = pbm_readpbm(ifd, &cols, &rows) ;
Packit 78deda
    
Packit 78deda
    if (width > cols)
Packit 78deda
        pm_error("You specified a sample width (%u columns) which is greater "
Packit 78deda
                 "than the image width (%u columns)", height, rows);
Packit 78deda
    if (height > rows)
Packit 78deda
        pm_error("You specified a sample height (%u rows) which is greater "
Packit 78deda
                 "than the image height (%u rows)", height, rows);
Packit 78deda
Packit 78deda
    outrow = pgm_allocrow(cols) ;
Packit 78deda
    maxval = MIN(PGM_OVERALLMAXVAL, width*height);
Packit 78deda
    pgm_writepgminit(stdout, cols, rows, maxval, 0) ;
Packit 78deda
Packit 78deda
    for (row = 0; row < rows; row++) {
Packit 78deda
        int const t = (row > up) ? (row-up) : 0;
Packit 78deda
        int const b = (row+down < rows) ? (row+down) : rows;
Packit 78deda
        int const onv = height - (t-row+up) - (row+down-b);
Packit 78deda
        unsigned int col;
Packit 78deda
        for (col = 0; col < cols; col++) {
Packit 78deda
            int const l = (col > left) ? (col-left) : 0;
Packit 78deda
            int const r = (col+right < cols) ? (col+right) : cols;
Packit 78deda
            int const onh = width - (l-col+left) - (col+right-r);
Packit 78deda
            int value;
Packit 78deda
            int x;
Packit 78deda
Packit 78deda
            value = 0;  /* initial value */
Packit 78deda
Packit 78deda
            for (x = l; x < r; ++x) {
Packit 78deda
                int y;
Packit 78deda
                for (y = t; y < b; ++y)
Packit 78deda
                    if (inbits[y][x] == PBM_WHITE) 
Packit 78deda
                        ++value;
Packit 78deda
            }
Packit 78deda
            outrow[col] = maxval*value/(onh*onv);
Packit 78deda
        }
Packit 78deda
        pgm_writepgmrow(stdout, outrow, cols, maxval, 0) ;
Packit 78deda
    }
Packit 78deda
    pm_close(ifd);
Packit 78deda
Packit 78deda
    return 0;
Packit 78deda
}