/*------------------------------------------------------------------------
 *
 * Copyright (c) 1997-1998 by Cornell University.
 * 
 * See the file "license.txt" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * kernel.c
 *
 * Matthew Chiu machiu@cs.cornell.edu
 *
 * Usage : kernel inputPGM outputPGM
 *
 * Perform a convolution on the input PGM.
 *
 *------------------------------------------------------------------------
 */
#include "dvmbasic.h"
#include "dvmpnm.h"
#include "dvmkernel.h"

void ReadPGM(char *, PnmHdr **, ByteImage **);
void WritePGM(PnmHdr *, ByteImage *, char *);

int main(int argc, char *argv[])
{
    PnmHdr *hdr;
    ByteImage *byte, *t1, *t2, *result;
    int w, h;
    Kernel *k;
    int table[4][4] = {{1, 1, 1, 1}, {1, 0, 0, 1}, {1, 0, 0, 1}, {1, 1, 1, 1}};

    if (argc < 2) {
        fprintf(stderr, "usage : %s input output", argv[0]);
	exit(1);
    }
    
    /*
     * Read the input image.
     */
    ReadPGM(argv[1], &hdr, &byte);

    /*
     * Initialize the convolution kernel.
     */
    k = KernelNew(4, 4);
    KernelSetValues(k, &(table[0][0]));
    KernelSetDivFactor(k, 12);
    KernelSetOffset(k, 0);

    /*
     * Prepare the output image.
     */
    w = PnmHdrGetWidth(hdr);
    h = PnmHdrGetHeight(hdr);
    t1 = ByteNew(w+3, h+3);
    t2 = ByteClip(t1, 2, 2, w, h);
    ByteCopy(byte, t2);
    ByteExtend(t1, 3, 3);
    
    /*
     * Performs the convolution.
     */
    result = ByteNew(w, h);
    KernelApply(k, t1, result);

    /*
     * Output the result.
     */
    WritePGM(hdr, result, argv[2]);

    /*
     * Clean up and we are done.
     */
    ByteFree(result);
    ByteFree(byte);
    ByteFree(t1);
    ByteFree(t2);
    KernelFree(k);
    PnmHdrFree(hdr);

    return 0;
}