Blame analyzer/pbmminkowski.c

Packit 78deda
/* pbmminkowsky.c - read a portable bitmap and calculate the Minkowski Integrals
Packit 78deda
**
Packit 78deda
** Copyright (C) 2000 by Luuk van Dijk/Mind over Matter
Packit 78deda
**
Packit 78deda
** Based on pbmlife.c,
Packit 78deda
** Copyright (C) 1988,1 1991 by Jef Poskanzer.
Packit 78deda
**
Packit 78deda
** Permission to use, copy, modify, and distribute this software and its
Packit 78deda
** documentation for any purpose and without fee is hereby granted, provided
Packit 78deda
** that the above copyright notice appear in all copies and that both that
Packit 78deda
** copyright notice and this permission notice appear in supporting
Packit 78deda
** documentation.  This software is provided "as is" without express or
Packit 78deda
** implied warranty.
Packit 78deda
*/
Packit 78deda
Packit 78deda
#include "pbm.h"
Packit 78deda
Packit 78deda
#define ISWHITE(x) ((x) == PBM_WHITE)
Packit 78deda
Packit 78deda
Packit 78deda
int main(int argc, const char ** argv) {
Packit 78deda
Packit 78deda
    FILE * ifP;
Packit 78deda
Packit 78deda
    bit * prevrow;
Packit 78deda
    bit * thisrow;
Packit 78deda
    bit * tmprow;
Packit 78deda
  
Packit 78deda
    int row;
Packit 78deda
    int col; 
Packit 78deda
Packit 78deda
    int countTile;
Packit 78deda
    int countEdgeX;
Packit 78deda
    int countEdgeY;
Packit 78deda
    int countVertex;
Packit 78deda
  
Packit 78deda
    int rows;
Packit 78deda
    int cols;
Packit 78deda
    int format;
Packit 78deda
Packit 78deda
    int area, perimeter, eulerchi;
Packit 78deda
Packit 78deda
Packit 78deda
    pm_proginit(&argc, argv);
Packit 78deda
  
Packit 78deda
    if (argc > 2)
Packit 78deda
        pm_usage("[pbmfile]");
Packit 78deda
  
Packit 78deda
    if (argc == 2)
Packit 78deda
        ifP = pm_openr(argv[1]);
Packit 78deda
    else
Packit 78deda
        ifP = stdin;
Packit 78deda
  
Packit 78deda
    pbm_readpbminit(ifP, &cols, &rows, &format);
Packit 78deda
Packit 78deda
    prevrow = pbm_allocrow(cols);
Packit 78deda
    thisrow = pbm_allocrow(cols);
Packit 78deda
Packit 78deda
Packit 78deda
    /* first row */
Packit 78deda
Packit 78deda
    pbm_readpbmrow(ifP, thisrow, cols, format);
Packit 78deda
Packit 78deda
    countTile   = 0;
Packit 78deda
    countEdgeX  = 0;
Packit 78deda
    countEdgeY  = 0;
Packit 78deda
    countVertex = 0;
Packit 78deda
Packit 78deda
    /* tiles */
Packit 78deda
Packit 78deda
    for (col = 0; col < cols; ++col) 
Packit 78deda
        if (ISWHITE(thisrow[col]))
Packit 78deda
            ++countTile;
Packit 78deda
  
Packit 78deda
    /* shortcut: for the first row, edgeY == countTile */
Packit 78deda
    countEdgeY = countTile;
Packit 78deda
Packit 78deda
    /* x-edges */
Packit 78deda
Packit 78deda
    if (ISWHITE(thisrow[0]))
Packit 78deda
        ++countEdgeX;
Packit 78deda
Packit 78deda
    for (col = 0; col < cols-1; ++col) 
Packit 78deda
        if (ISWHITE(thisrow[col]) || ISWHITE(thisrow[col+1]))
Packit 78deda
            ++countEdgeX;
Packit 78deda
Packit 78deda
    if (ISWHITE(thisrow[cols-1]))
Packit 78deda
        ++countEdgeX;
Packit 78deda
Packit 78deda
    /* shortcut: for the first row, countVertex == countEdgeX */
Packit 78deda
  
Packit 78deda
    countVertex = countEdgeX;
Packit 78deda
  
Packit 78deda
Packit 78deda
    for (row = 1; row < rows; ++row) {  
Packit 78deda
    
Packit 78deda
        tmprow  = prevrow; 
Packit 78deda
        prevrow = thisrow;
Packit 78deda
        thisrow = tmprow;
Packit 78deda
 
Packit 78deda
        pbm_readpbmrow(ifP, thisrow, cols, format);
Packit 78deda
  
Packit 78deda
        /* tiles */
Packit 78deda
Packit 78deda
        for (col = 0; col < cols; ++col) 
Packit 78deda
            if (ISWHITE(thisrow[col]))
Packit 78deda
                ++countTile;
Packit 78deda
    
Packit 78deda
        /* y-edges */
Packit 78deda
Packit 78deda
        for (col = 0; col < cols; ++col) 
Packit 78deda
            if (ISWHITE(thisrow[col]) || ISWHITE(prevrow[col]))
Packit 78deda
                ++countEdgeY;
Packit 78deda
    
Packit 78deda
        /* x-edges */
Packit 78deda
Packit 78deda
        if (ISWHITE(thisrow[0]))
Packit 78deda
            ++countEdgeX;
Packit 78deda
Packit 78deda
        for (col = 0; col < cols-1; ++col) 
Packit 78deda
            if (ISWHITE(thisrow[col]) || ISWHITE(thisrow[col+1]))
Packit 78deda
                ++countEdgeX;
Packit 78deda
    
Packit 78deda
        if (ISWHITE(thisrow[cols-1]))
Packit 78deda
            ++countEdgeX;
Packit 78deda
    
Packit 78deda
        /* vertices */
Packit 78deda
Packit 78deda
        if (ISWHITE(thisrow[0]) || ISWHITE(prevrow[0]))
Packit 78deda
            ++countVertex;
Packit 78deda
Packit 78deda
        for (col = 0; col < cols-1; ++col) 
Packit 78deda
            if (ISWHITE(thisrow[col]) || ISWHITE(thisrow[col+1]) 
Packit 78deda
                || ISWHITE(prevrow[col]) || ISWHITE(prevrow[col+1]))
Packit 78deda
                ++countVertex;
Packit 78deda
Packit 78deda
        if (ISWHITE(thisrow[cols-1]) || ISWHITE(prevrow[cols-1]))
Packit 78deda
            ++countVertex;
Packit 78deda
Packit 78deda
	  
Packit 78deda
    } /* for row */
Packit 78deda
Packit 78deda
    /* now thisrow contains the top row*/
Packit 78deda
    /* tiles and x-edges have been counted, now y-edges and top
Packit 78deda
       vertices remain
Packit 78deda
    */
Packit 78deda
Packit 78deda
  
Packit 78deda
    /* y-edges */
Packit 78deda
Packit 78deda
    for (col = 0; col < cols; ++col) 
Packit 78deda
        if (ISWHITE(thisrow[col]))
Packit 78deda
            ++countEdgeY;
Packit 78deda
Packit 78deda
    /* vertices */
Packit 78deda
  
Packit 78deda
    if (ISWHITE(thisrow[0]))
Packit 78deda
        ++countVertex;
Packit 78deda
Packit 78deda
    for (col = 0; col < cols-1; ++col) 
Packit 78deda
        if (ISWHITE(thisrow[col]) || ISWHITE(thisrow[col+1]))
Packit 78deda
            ++countVertex;
Packit 78deda
Packit 78deda
    if (ISWHITE(thisrow[cols-1]))
Packit 78deda
        ++countVertex;
Packit 78deda
Packit 78deda
    /* cleanup */
Packit 78deda
Packit 78deda
    pm_close(ifP);
Packit 78deda
Packit 78deda
    /* print results */
Packit 78deda
Packit 78deda
    printf("   tiles:\t%d\n x-edges:\t%d\n y-edges:\t%d\nvertices:\t%d\n",
Packit 78deda
           countTile, countEdgeX, countEdgeY,countVertex);
Packit 78deda
Packit 78deda
    area      = countTile;
Packit 78deda
    perimeter = 2*countEdgeX + 2*countEdgeY - 4*countTile;
Packit 78deda
    eulerchi  = countTile - countEdgeX - countEdgeY + countVertex;
Packit 78deda
Packit 78deda
    printf("    area:\t%d\nperimeter:\t%d\n eulerchi:\t%d\n",
Packit 78deda
           area, perimeter, eulerchi );
Packit 78deda
  
Packit 78deda
    return 0;
Packit 78deda
}
Packit 78deda